diff --git a/.gitmodules b/.gitmodules index e7a26b39535..a70d89e4ebb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "daemon/libs/breakpad"] path = daemon/libs/breakpad url = https://github.com/Unvanquished/breakpad.git +[submodule "libs/libRocket"] + path = libs/libRocket + url = https://github.com/Unvanquished/libRocket.git diff --git a/.travis.yml b/.travis.yml index 2c87ff820d2..e443e8d75f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ matrix: install: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo rm -rf /opt/python; fi # Delete conflicting python - - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install software-properties-common; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get -qq install software-properties-common; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository ppa:george-edison55/cmake-3.x -y; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get -qq update; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get -qq install diff --git a/CMakeLists.txt b/CMakeLists.txt index 78add48a441..07f94a53491 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,8 +53,8 @@ if (BUILD_CGAME AND (BUILD_GAME_NATIVE_DLL OR BUILD_GAME_NATIVE_EXE OR NACL)) find_package(Freetype REQUIRED) find_package(Lua REQUIRED) endif() + include(${CMAKE_CURRENT_SOURCE_DIR}/libRocket.cmake) include_directories(${FREETYPE_INCLUDE_DIRS} ${LUA_INCLUDE_DIR}) - add_subdirectory(${LIB_DIR}/libRocket) set_target_properties(ROCKET_LIB PROPERTIES FOLDER "libs") include_directories(${ROCKET_INCLUDE_DIRS}) endif() diff --git a/daemon/src/common/Color.cpp b/daemon/src/common/Color.cpp index e0f5768eb4b..62b8aa4d39b 100644 --- a/daemon/src/common/Color.cpp +++ b/daemon/src/common/Color.cpp @@ -34,19 +34,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Color { -Color Black = { 0.00, 0.00, 0.00, 1.00 }; -Color Red = { 1.00, 0.00, 0.00, 1.00 }; -Color Green = { 0.00, 1.00, 0.00, 1.00 }; -Color Blue = { 0.00, 0.00, 1.00, 1.00 }; -Color Yellow = { 1.00, 1.00, 0.00, 1.00 }; -Color Orange = { 1.00, 0.50, 0.00, 1.00 }; -Color Magenta = { 1.00, 0.00, 1.00, 1.00 }; -Color Cyan = { 0.00, 1.00, 1.00, 1.00 }; -Color White = { 1.00, 1.00, 1.00, 1.00 }; -Color LtGrey = { 0.75, 0.75, 0.75, 1.00 }; -Color MdGrey = { 0.50, 0.50, 0.50, 1.00 }; -Color LtOrange = { 0.50, 0.25, 0.00, 1.00 }; - static Color g_color_table[ 32 ] = { { 0.20f, 0.20f, 0.20f, 1.00f }, // 0 - black 0 diff --git a/daemon/src/common/Color.h b/daemon/src/common/Color.h index 9224fc640b5..36c7796485c 100644 --- a/daemon/src/common/Color.h +++ b/daemon/src/common/Color.h @@ -352,18 +352,18 @@ enum { }; // enum } // namespace Constants -extern Color Black; -extern Color Red; -extern Color Green; -extern Color Blue; -extern Color Yellow; -extern Color Orange; -extern Color Magenta; -extern Color Cyan; -extern Color White; -extern Color LtGrey; -extern Color MdGrey; -extern Color LtOrange; +const Color Black = { 0.00, 0.00, 0.00, 1.00 }; +const Color Red = { 1.00, 0.00, 0.00, 1.00 }; +const Color Green = { 0.00, 1.00, 0.00, 1.00 }; +const Color Blue = { 0.00, 0.00, 1.00, 1.00 }; +const Color Yellow = { 1.00, 1.00, 0.00, 1.00 }; +const Color Orange = { 1.00, 0.50, 0.00, 1.00 }; +const Color Magenta = { 1.00, 0.00, 1.00, 1.00 }; +const Color Cyan = { 0.00, 1.00, 1.00, 1.00 }; +const Color White = { 1.00, 1.00, 1.00, 1.00 }; +const Color LtGrey = { 0.75, 0.75, 0.75, 1.00 }; +const Color MdGrey = { 0.50, 0.50, 0.50, 1.00 }; +const Color LtOrange = { 0.50, 0.25, 0.00, 1.00 }; /* * Token for parsing colored strings diff --git a/daemon/src/engine/client/cl_console.cpp b/daemon/src/engine/client/cl_console.cpp index db957f44812..8033e73efdc 100644 --- a/daemon/src/engine/client/cl_console.cpp +++ b/daemon/src/engine/client/cl_console.cpp @@ -336,7 +336,7 @@ bool Con_CheckResize() // Quick case for empty lines if ( line.empty() ) { - old_lines.emplace_back(); + consoleState.lines.emplace_back(); continue; } diff --git a/daemon/src/engine/renderer/tr_bsp.cpp b/daemon/src/engine/renderer/tr_bsp.cpp index 4bf6b87782a..839e3aa3cc7 100644 --- a/daemon/src/engine/renderer/tr_bsp.cpp +++ b/daemon/src/engine/renderer/tr_bsp.cpp @@ -3900,9 +3900,52 @@ void R_LoadLightGrid( lump_t *l ) if ( l->filelen != w->numLightGridPoints * sizeof( dgridPoint_t ) ) { - Log::Warn("light grid mismatch" ); - w->lightGridData1 = nullptr; - w->lightGridData2 = nullptr; + Log::Warn("light grid mismatch, default light grid used\n" ); + + // generate default 1x1x1 light grid + w->lightGridSize[ 0 ] = 100000.0f; + w->lightGridSize[ 1 ] = 100000.0f; + w->lightGridSize[ 2 ] = 100000.0f; + w->lightGridInverseSize[ 0 ] = 1.0f / w->lightGridSize[ 0 ]; + w->lightGridInverseSize[ 1 ] = 1.0f / w->lightGridSize[ 1 ]; + w->lightGridInverseSize[ 2 ] = 1.0f / w->lightGridSize[ 2 ]; + + VectorSet( w->lightGridOrigin, 0.0f, 0.0f, 0.0f ); + + VectorMA( w->lightGridOrigin, -0.5f, w->lightGridSize, + w->lightGridGLOrigin ); + + VectorSet( w->lightGridBounds, 1, 1, 1 ); + + w->lightGridGLScale[ 0 ] = w->lightGridInverseSize[ 0 ]; + w->lightGridGLScale[ 1 ] = w->lightGridInverseSize[ 1 ]; + w->lightGridGLScale[ 2 ] = w->lightGridInverseSize[ 2 ]; + + gridPoint1 = (bspGridPoint1_t *) ri.Hunk_Alloc( sizeof( *gridPoint1 ) + sizeof( *gridPoint2 ), ha_pref::h_low ); + gridPoint2 = (bspGridPoint2_t *) (gridPoint1 + w->numLightGridPoints); + + // default some white light from above + gridPoint1->ambient[ 0 ] = 32; + gridPoint1->ambient[ 1 ] = 32; + gridPoint1->ambient[ 2 ] = 32; + gridPoint2->directed[ 0 ] = 96; + gridPoint2->directed[ 1 ] = 96; + gridPoint2->directed[ 2 ] = 96; + gridPoint1->lightVecX = 128; + gridPoint2->lightVecY = 128; + + w->lightGridData1 = gridPoint1; + w->lightGridData2 = gridPoint2; + + tr.lightGrid1Image = R_Create3DImage("", (const byte *)w->lightGridData1, + w->lightGridBounds[ 0 ], w->lightGridBounds[ 1 ], + w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE | IF_NOCOMPRESSION, + filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_EDGE_CLAMP ); + tr.lightGrid2Image = R_Create3DImage("", (const byte *)w->lightGridData2, + w->lightGridBounds[ 0 ], w->lightGridBounds[ 1 ], + w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE | IF_NOCOMPRESSION, + filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_EDGE_CLAMP ); + return; } diff --git a/libRocket.cmake b/libRocket.cmake new file mode 100644 index 00000000000..08c11d6e9b4 --- /dev/null +++ b/libRocket.cmake @@ -0,0 +1,549 @@ +# Create libRocket. + +set(LIBROCKET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/libRocket) + +set(Core_HDR_FILES + ${LIBROCKET_DIR}/Source/Core/Clock.h + ${LIBROCKET_DIR}/Source/Core/ContextInstancerDefault.h + ${LIBROCKET_DIR}/Source/Core/DebugFont.h + ${LIBROCKET_DIR}/Source/Core/DecoratorNone.h + ${LIBROCKET_DIR}/Source/Core/DecoratorNoneInstancer.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledBox.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledBoxInstancer.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiled.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledHorizontal.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledHorizontalInstancer.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledImage.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledImageInstancer.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledInstancer.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledVertical.h + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledVerticalInstancer.h + ${LIBROCKET_DIR}/Source/Core/DocumentHeader.h + ${LIBROCKET_DIR}/Source/Core/ElementBackground.h + ${LIBROCKET_DIR}/Source/Core/ElementBorder.h + ${LIBROCKET_DIR}/Source/Core/ElementDecoration.h + ${LIBROCKET_DIR}/Source/Core/ElementDefinition.h + ${LIBROCKET_DIR}/Source/Core/ElementHandle.h + ${LIBROCKET_DIR}/Source/Core/ElementImage.h + ${LIBROCKET_DIR}/Source/Core/ElementStyleCache.h + ${LIBROCKET_DIR}/Source/Core/ElementStyle.h + ${LIBROCKET_DIR}/Source/Core/ElementTextDefault.h + ${LIBROCKET_DIR}/Source/Core/EventDispatcher.h + ${LIBROCKET_DIR}/Source/Core/EventInstancerDefault.h + ${LIBROCKET_DIR}/Source/Core/EventIterators.h + ${LIBROCKET_DIR}/Source/Core/FileInterfaceDefault.h + ${LIBROCKET_DIR}/Source/Core/FontEffectNone.h + ${LIBROCKET_DIR}/Source/Core/FontEffectNoneInstancer.h + ${LIBROCKET_DIR}/Source/Core/FontEffectOutline.h + ${LIBROCKET_DIR}/Source/Core/FontEffectOutlineInstancer.h + ${LIBROCKET_DIR}/Source/Core/FontEffectShadow.h + ${LIBROCKET_DIR}/Source/Core/FontEffectShadowInstancer.h + ${LIBROCKET_DIR}/Source/Core/FontFace.h + ${LIBROCKET_DIR}/Source/Core/FontFaceLayer.h + ${LIBROCKET_DIR}/Source/Core/FontFamily.h + ${LIBROCKET_DIR}/Source/Core/GeometryDatabase.h + ${LIBROCKET_DIR}/Source/Core/LayoutBlockBox.h + ${LIBROCKET_DIR}/Source/Core/LayoutBlockBoxSpace.h + ${LIBROCKET_DIR}/Source/Core/LayoutEngine.h + ${LIBROCKET_DIR}/Source/Core/LayoutInlineBox.h + ${LIBROCKET_DIR}/Source/Core/LayoutInlineBoxText.h + ${LIBROCKET_DIR}/Source/Core/LayoutLineBox.h + ${LIBROCKET_DIR}/Source/Core/PluginRegistry.h + ${LIBROCKET_DIR}/Source/Core/Pool.h + ${LIBROCKET_DIR}/Source/Core/precompiled.h + ${LIBROCKET_DIR}/Source/Core/PropertyParserColour.h + ${LIBROCKET_DIR}/Source/Core/PropertyParserKeyword.h + ${LIBROCKET_DIR}/Source/Core/PropertyParserNumber.h + ${LIBROCKET_DIR}/Source/Core/PropertyParserString.h + ${LIBROCKET_DIR}/Source/Core/PropertyShorthandDefinition.h + ${LIBROCKET_DIR}/Source/Core/StreamFile.h + ${LIBROCKET_DIR}/Source/Core/StringCache.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetFactory.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNode.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorEmpty.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorFirstChild.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorFirstOfType.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelector.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorLastChild.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorLastOfType.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthChild.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthLastChild.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthLastOfType.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthOfType.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorOnlyChild.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorOnlyOfType.h + ${LIBROCKET_DIR}/Source/Core/StyleSheetParser.h + ${LIBROCKET_DIR}/Source/Core/TemplateCache.h + ${LIBROCKET_DIR}/Source/Core/Template.h + ${LIBROCKET_DIR}/Source/Core/TextureDatabase.h + ${LIBROCKET_DIR}/Source/Core/TextureLayout.h + ${LIBROCKET_DIR}/Source/Core/TextureLayoutRectangle.h + ${LIBROCKET_DIR}/Source/Core/TextureLayoutRow.h + ${LIBROCKET_DIR}/Source/Core/TextureLayoutTexture.h + ${LIBROCKET_DIR}/Source/Core/TextureResource.h + ${LIBROCKET_DIR}/Source/Core/WidgetSlider.h + ${LIBROCKET_DIR}/Source/Core/WidgetSliderScroll.h + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerBody.h + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerDefault.h + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerHead.h + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerTemplate.h + ${LIBROCKET_DIR}/Source/Core/XMLParseTools.h + ${LIBROCKET_DIR}/Include/Rocket/Core.h +) + +set(Core_PUB_HDR_FILES + ${LIBROCKET_DIR}/Include/Rocket/Core/BaseXMLParser.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Box.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Colour.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Colour.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/Context.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ContextInstancer.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ConvolutionFilter.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Core.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Debug.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Decorator.h + ${LIBROCKET_DIR}/Include/Rocket/Core/DecoratorInstancer.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Dictionary.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Dictionary.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementDocument.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Element.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Element.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementInstancerGeneric.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementInstancerGeneric.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementInstancer.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementReference.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementScroll.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementText.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ElementUtilities.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Event.h + ${LIBROCKET_DIR}/Include/Rocket/Core/EventInstancer.h + ${LIBROCKET_DIR}/Include/Rocket/Core/EventListener.h + ${LIBROCKET_DIR}/Include/Rocket/Core/EventListenerInstancer.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Factory.h + ${LIBROCKET_DIR}/Include/Rocket/Core/FileInterface.h + ${LIBROCKET_DIR}/Include/Rocket/Core/FontDatabase.h + ${LIBROCKET_DIR}/Include/Rocket/Core/FontEffect.h + ${LIBROCKET_DIR}/Include/Rocket/Core/FontEffectInstancer.h + ${LIBROCKET_DIR}/Include/Rocket/Core/FontFaceHandle.h + ${LIBROCKET_DIR}/Include/Rocket/Core/FontGlyph.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Font.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Geometry.h + ${LIBROCKET_DIR}/Include/Rocket/Core/GeometryUtilities.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Header.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Input.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Log.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Math.h + ${LIBROCKET_DIR}/Include/Rocket/Core/MathTypes.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Platform.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Plugin.h + ${LIBROCKET_DIR}/Include/Rocket/Core/PropertyDefinition.h + ${LIBROCKET_DIR}/Include/Rocket/Core/PropertyDictionary.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Property.h + ${LIBROCKET_DIR}/Include/Rocket/Core/PropertyParser.h + ${LIBROCKET_DIR}/Include/Rocket/Core/PropertySpecification.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ReferenceCountable.h + ${LIBROCKET_DIR}/Include/Rocket/Core/RenderInterface.h + ${LIBROCKET_DIR}/Include/Rocket/Core/ScriptInterface.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Stream.h + ${LIBROCKET_DIR}/Include/Rocket/Core/StreamMemory.h + ${LIBROCKET_DIR}/Include/Rocket/Core/StringBase.h + ${LIBROCKET_DIR}/Include/Rocket/Core/StringBase.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/String.h + ${LIBROCKET_DIR}/Include/Rocket/Core/StringUtilities.h + ${LIBROCKET_DIR}/Include/Rocket/Core/StyleSheet.h + ${LIBROCKET_DIR}/Include/Rocket/Core/StyleSheetKeywords.h + ${LIBROCKET_DIR}/Include/Rocket/Core/StyleSheetSpecification.h + ${LIBROCKET_DIR}/Include/Rocket/Core/SystemInterface.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Texture.h + ${LIBROCKET_DIR}/Include/Rocket/Core/TypeConverter.h + ${LIBROCKET_DIR}/Include/Rocket/Core/TypeConverter.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/Types.h + ${LIBROCKET_DIR}/Include/Rocket/Core/UnicodeRange.h + ${LIBROCKET_DIR}/Include/Rocket/Core/URL.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Variant.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Variant.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/Vector2.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Vector2.inl + ${LIBROCKET_DIR}/Include/Rocket/Core/Vertex.h + ${LIBROCKET_DIR}/Include/Rocket/Core/WString.h + ${LIBROCKET_DIR}/Include/Rocket/Core/XMLNodeHandler.h + ${LIBROCKET_DIR}/Include/Rocket/Core/XMLParser.h +) + +set(Core_SRC_FILES + ${LIBROCKET_DIR}/Source/Core/BaseXMLParser.cpp + ${LIBROCKET_DIR}/Source/Core/Box.cpp + ${LIBROCKET_DIR}/Source/Core/Clock.cpp + ${LIBROCKET_DIR}/Source/Core/Context.cpp + ${LIBROCKET_DIR}/Source/Core/ContextInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/ContextInstancerDefault.cpp + ${LIBROCKET_DIR}/Source/Core/ConvolutionFilter.cpp + ${LIBROCKET_DIR}/Source/Core/Core.cpp + ${LIBROCKET_DIR}/Source/Core/Decorator.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorNone.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorNoneInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledBox.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledBoxInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiled.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledHorizontal.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledHorizontalInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledImage.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledImageInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledVertical.cpp + ${LIBROCKET_DIR}/Source/Core/DecoratorTiledVerticalInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/Dictionary.cpp + ${LIBROCKET_DIR}/Source/Core/DocumentHeader.cpp + ${LIBROCKET_DIR}/Source/Core/ElementBackground.cpp + ${LIBROCKET_DIR}/Source/Core/ElementBorder.cpp + ${LIBROCKET_DIR}/Source/Core/Element.cpp + ${LIBROCKET_DIR}/Source/Core/ElementDecoration.cpp + ${LIBROCKET_DIR}/Source/Core/ElementDefinition.cpp + ${LIBROCKET_DIR}/Source/Core/ElementDocument.cpp + ${LIBROCKET_DIR}/Source/Core/ElementHandle.cpp + ${LIBROCKET_DIR}/Source/Core/ElementImage.cpp + ${LIBROCKET_DIR}/Source/Core/ElementInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/ElementReference.cpp + ${LIBROCKET_DIR}/Source/Core/ElementScroll.cpp + ${LIBROCKET_DIR}/Source/Core/ElementStyleCache.cpp + ${LIBROCKET_DIR}/Source/Core/ElementStyle.cpp + ${LIBROCKET_DIR}/Source/Core/ElementText.cpp + ${LIBROCKET_DIR}/Source/Core/ElementTextDefault.cpp + ${LIBROCKET_DIR}/Source/Core/ElementUtilities.cpp + ${LIBROCKET_DIR}/Source/Core/Event.cpp + ${LIBROCKET_DIR}/Source/Core/EventDispatcher.cpp + ${LIBROCKET_DIR}/Source/Core/EventInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/EventInstancerDefault.cpp + ${LIBROCKET_DIR}/Source/Core/EventListenerInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/Factory.cpp + ${LIBROCKET_DIR}/Source/Core/FileInterface.cpp + ${LIBROCKET_DIR}/Source/Core/FileInterfaceDefault.cpp + ${LIBROCKET_DIR}/Source/Core/FontDatabase.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffect.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffectInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffectNone.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffectNoneInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffectOutline.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffectOutlineInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffectShadow.cpp + ${LIBROCKET_DIR}/Source/Core/FontEffectShadowInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/FontFace.cpp + ${LIBROCKET_DIR}/Source/Core/FontFaceHandle.cpp + ${LIBROCKET_DIR}/Source/Core/FontFaceLayer.cpp + ${LIBROCKET_DIR}/Source/Core/FontFamily.cpp + ${LIBROCKET_DIR}/Source/Core/Geometry.cpp + ${LIBROCKET_DIR}/Source/Core/GeometryDatabase.cpp + ${LIBROCKET_DIR}/Source/Core/GeometryUtilities.cpp + ${LIBROCKET_DIR}/Source/Core/LayoutBlockBox.cpp + ${LIBROCKET_DIR}/Source/Core/LayoutBlockBoxSpace.cpp + ${LIBROCKET_DIR}/Source/Core/LayoutEngine.cpp + ${LIBROCKET_DIR}/Source/Core/LayoutInlineBox.cpp + ${LIBROCKET_DIR}/Source/Core/LayoutInlineBoxText.cpp + ${LIBROCKET_DIR}/Source/Core/LayoutLineBox.cpp + ${LIBROCKET_DIR}/Source/Core/Log.cpp + ${LIBROCKET_DIR}/Source/Core/Math.cpp + ${LIBROCKET_DIR}/Source/Core/Plugin.cpp + ${LIBROCKET_DIR}/Source/Core/PluginRegistry.cpp + ${LIBROCKET_DIR}/Source/Core/precompiled.cpp + ${LIBROCKET_DIR}/Source/Core/Property.cpp + ${LIBROCKET_DIR}/Source/Core/PropertyDefinition.cpp + ${LIBROCKET_DIR}/Source/Core/PropertyDictionary.cpp + ${LIBROCKET_DIR}/Source/Core/PropertyParserColour.cpp + ${LIBROCKET_DIR}/Source/Core/PropertyParserKeyword.cpp + ${LIBROCKET_DIR}/Source/Core/PropertyParserNumber.cpp + ${LIBROCKET_DIR}/Source/Core/PropertyParserString.cpp + ${LIBROCKET_DIR}/Source/Core/PropertySpecification.cpp + ${LIBROCKET_DIR}/Source/Core/ReferenceCountable.cpp + ${LIBROCKET_DIR}/Source/Core/RenderInterface.cpp + ${LIBROCKET_DIR}/Source/Core/Stream.cpp + ${LIBROCKET_DIR}/Source/Core/StreamFile.cpp + ${LIBROCKET_DIR}/Source/Core/StreamMemory.cpp + ${LIBROCKET_DIR}/Source/Core/StringCache.cpp + ${LIBROCKET_DIR}/Source/Core/String.cpp + ${LIBROCKET_DIR}/Source/Core/StringUtilities.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheet.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetFactory.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNode.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelector.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorEmpty.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorFirstChild.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorLastChild.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorLastOfType.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthChild.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthLastChild.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthLastOfType.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorNthOfType.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetParser.cpp + ${LIBROCKET_DIR}/Source/Core/StyleSheetSpecification.cpp + ${LIBROCKET_DIR}/Source/Core/SystemInterface.cpp + ${LIBROCKET_DIR}/Source/Core/TemplateCache.cpp + ${LIBROCKET_DIR}/Source/Core/Template.cpp + ${LIBROCKET_DIR}/Source/Core/Texture.cpp + ${LIBROCKET_DIR}/Source/Core/TextureDatabase.cpp + ${LIBROCKET_DIR}/Source/Core/TextureLayout.cpp + ${LIBROCKET_DIR}/Source/Core/TextureLayoutRectangle.cpp + ${LIBROCKET_DIR}/Source/Core/TextureLayoutRow.cpp + ${LIBROCKET_DIR}/Source/Core/TextureLayoutTexture.cpp + ${LIBROCKET_DIR}/Source/Core/TextureResource.cpp + ${LIBROCKET_DIR}/Source/Core/UnicodeRange.cpp + ${LIBROCKET_DIR}/Source/Core/URL.cpp + ${LIBROCKET_DIR}/Source/Core/Variant.cpp + ${LIBROCKET_DIR}/Source/Core/WidgetSlider.cpp + ${LIBROCKET_DIR}/Source/Core/WidgetSliderScroll.cpp + ${LIBROCKET_DIR}/Source/Core/WString.cpp + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerBody.cpp + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandler.cpp + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerDefault.cpp + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerHead.cpp + ${LIBROCKET_DIR}/Source/Core/XMLNodeHandlerTemplate.cpp + ${LIBROCKET_DIR}/Source/Core/XMLParser.cpp + ${LIBROCKET_DIR}/Source/Core/XMLParseTools.cpp +) + +set(Controls_HDR_FILES + ${LIBROCKET_DIR}/Source/Controls/ElementTextSelection.h + ${LIBROCKET_DIR}/Source/Controls/InputTypeButton.h + ${LIBROCKET_DIR}/Source/Controls/InputTypeCheckbox.h + ${LIBROCKET_DIR}/Source/Controls/InputType.h + ${LIBROCKET_DIR}/Source/Controls/InputTypeRadio.h + ${LIBROCKET_DIR}/Source/Controls/InputTypeRange.h + ${LIBROCKET_DIR}/Source/Controls/InputTypeSubmit.h + ${LIBROCKET_DIR}/Source/Controls/InputTypeText.h + ${LIBROCKET_DIR}/Source/Controls/WidgetDropDown.h + ${LIBROCKET_DIR}/Source/Controls/WidgetSlider.h + ${LIBROCKET_DIR}/Source/Controls/WidgetSliderInput.h + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInput.h + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInputMultiLine.h + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInputSingleLine.h + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInputSingleLinePassword.h + ${LIBROCKET_DIR}/Source/Controls/XMLNodeHandlerDataGrid.h + ${LIBROCKET_DIR}/Source/Controls/XMLNodeHandlerTabSet.h + ${LIBROCKET_DIR}/Source/Controls/XMLNodeHandlerTextArea.h + ${LIBROCKET_DIR}/Include/Rocket/Controls.h +) + +set(Controls_PUB_HDR_FILES + ${LIBROCKET_DIR}/Include/Rocket/Controls/Clipboard.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/Controls.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/DataFormatter.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/DataQuery.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/DataSource.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/DataSourceListener.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementDataGridCell.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementDataGridExpandButton.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementDataGrid.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementDataGridRow.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementFormControlDataSelect.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementFormControl.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementFormControlInput.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementFormControlSelect.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementFormControlTextArea.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementForm.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/ElementTabSet.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/Header.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/SelectOption.h +) + +set(Controls_SRC_FILES + ${LIBROCKET_DIR}/Source/Controls/Clipboard.cpp + ${LIBROCKET_DIR}/Source/Controls/Controls.cpp + ${LIBROCKET_DIR}/Source/Controls/DataFormatter.cpp + ${LIBROCKET_DIR}/Source/Controls/DataQuery.cpp + ${LIBROCKET_DIR}/Source/Controls/DataSource.cpp + ${LIBROCKET_DIR}/Source/Controls/DataSourceListener.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementDataGridCell.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementDataGrid.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementDataGridExpandButton.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementDataGridRow.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementFormControl.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementFormControlDataSelect.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementFormControlInput.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementFormControlSelect.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementFormControlTextArea.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementForm.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementTabSet.cpp + ${LIBROCKET_DIR}/Source/Controls/ElementTextSelection.cpp + ${LIBROCKET_DIR}/Source/Controls/InputTypeButton.cpp + ${LIBROCKET_DIR}/Source/Controls/InputTypeCheckbox.cpp + ${LIBROCKET_DIR}/Source/Controls/InputType.cpp + ${LIBROCKET_DIR}/Source/Controls/InputTypeRadio.cpp + ${LIBROCKET_DIR}/Source/Controls/InputTypeRange.cpp + ${LIBROCKET_DIR}/Source/Controls/InputTypeSubmit.cpp + ${LIBROCKET_DIR}/Source/Controls/InputTypeText.cpp + ${LIBROCKET_DIR}/Source/Controls/SelectOption.cpp + ${LIBROCKET_DIR}/Source/Controls/WidgetDropDown.cpp + ${LIBROCKET_DIR}/Source/Controls/WidgetSlider.cpp + ${LIBROCKET_DIR}/Source/Controls/WidgetSliderInput.cpp + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInput.cpp + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInputMultiLine.cpp + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInputSingleLine.cpp + ${LIBROCKET_DIR}/Source/Controls/WidgetTextInputSingleLinePassword.cpp + ${LIBROCKET_DIR}/Source/Controls/XMLNodeHandlerDataGrid.cpp + ${LIBROCKET_DIR}/Source/Controls/XMLNodeHandlerTabSet.cpp + ${LIBROCKET_DIR}/Source/Controls/XMLNodeHandlerTextArea.cpp +) + +set(Debugger_HDR_FILES + ${LIBROCKET_DIR}/Source/Debugger/BeaconSource.h + ${LIBROCKET_DIR}/Source/Debugger/CommonSource.h + ${LIBROCKET_DIR}/Source/Debugger/ElementContextHook.h + ${LIBROCKET_DIR}/Source/Debugger/ElementInfo.h + ${LIBROCKET_DIR}/Source/Debugger/ElementLog.h + ${LIBROCKET_DIR}/Source/Debugger/FontSource.h + ${LIBROCKET_DIR}/Source/Debugger/Geometry.h + ${LIBROCKET_DIR}/Source/Debugger/InfoSource.h + ${LIBROCKET_DIR}/Source/Debugger/LogSource.h + ${LIBROCKET_DIR}/Source/Debugger/MenuSource.h + ${LIBROCKET_DIR}/Source/Debugger/Plugin.h + ${LIBROCKET_DIR}/Source/Debugger/SystemInterface.h + ${LIBROCKET_DIR}/Include/Rocket/Debugger.h +) + +set(Debugger_PUB_HDR_FILES + ${LIBROCKET_DIR}/Include/Rocket/Debugger/Debugger.h + ${LIBROCKET_DIR}/Include/Rocket/Debugger/Header.h +) + +set(Debugger_SRC_FILES + ${LIBROCKET_DIR}/Source/Debugger/Debugger.cpp + ${LIBROCKET_DIR}/Source/Debugger/ElementContextHook.cpp + ${LIBROCKET_DIR}/Source/Debugger/ElementInfo.cpp + ${LIBROCKET_DIR}/Source/Debugger/ElementLog.cpp + ${LIBROCKET_DIR}/Source/Debugger/Geometry.cpp + ${LIBROCKET_DIR}/Source/Debugger/Plugin.cpp + ${LIBROCKET_DIR}/Source/Debugger/SystemInterface.cpp +) + +set(LuaCore_HDR_FILES + ${LIBROCKET_DIR}/Source/Core/Lua/Colourb.h + ${LIBROCKET_DIR}/Source/Core/Lua/Colourf.h + ${LIBROCKET_DIR}/Source/Core/Lua/ContextDocumentsProxy.h + ${LIBROCKET_DIR}/Source/Core/Lua/Context.h + ${LIBROCKET_DIR}/Source/Core/Lua/Document.h + ${LIBROCKET_DIR}/Source/Core/Lua/ElementAttributesProxy.h + ${LIBROCKET_DIR}/Source/Core/Lua/ElementChildNodesProxy.h + ${LIBROCKET_DIR}/Source/Core/Lua/Element.h + ${LIBROCKET_DIR}/Source/Core/Lua/ElementInstancer.h + ${LIBROCKET_DIR}/Source/Core/Lua/ElementStyleProxy.h + ${LIBROCKET_DIR}/Source/Core/Lua/ElementText.h + ${LIBROCKET_DIR}/Source/Core/Lua/Event.h + ${LIBROCKET_DIR}/Source/Core/Lua/EventParametersProxy.h + ${LIBROCKET_DIR}/Source/Core/Lua/GlobalLuaFunctions.h + ${LIBROCKET_DIR}/Source/Core/Lua/Log.h + ${LIBROCKET_DIR}/Source/Core/Lua/LuaDocumentElementInstancer.h + ${LIBROCKET_DIR}/Source/Core/Lua/LuaDocument.h + ${LIBROCKET_DIR}/Source/Core/Lua/LuaElement.h + ${LIBROCKET_DIR}/Source/Core/Lua/LuaElementInstancer.h + ${LIBROCKET_DIR}/Source/Core/Lua/LuaEventListener.h + ${LIBROCKET_DIR}/Source/Core/Lua/LuaEventListenerInstancer.h + ${LIBROCKET_DIR}/Source/Core/Lua/precompiled.h + ${LIBROCKET_DIR}/Source/Core/Lua/RocketContextsProxy.h + ${LIBROCKET_DIR}/Source/Core/Lua/Rocket.h + ${LIBROCKET_DIR}/Source/Core/Lua/Vector2f.h + ${LIBROCKET_DIR}/Source/Core/Lua/Vector2i.h +) + +set(LuaCore_PUB_HDR_FILES + ${LIBROCKET_DIR}/Include/Rocket/Core/Lua/Header.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Lua/Interpreter.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Lua/LuaType.h + ${LIBROCKET_DIR}/Include/Rocket/Core/Lua/Utilities.h +) + +set(LuaCore_SRC_FILES + ${LIBROCKET_DIR}/Source/Core/Lua/Colourb.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Colourf.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Context.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/ContextDocumentsProxy.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Document.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/ElementAttributesProxy.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/ElementChildNodesProxy.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Element.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/ElementInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/ElementStyleProxy.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/ElementText.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Event.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/EventParametersProxy.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/GlobalLuaFunctions.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Interpreter.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Log.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/LuaDocument.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/LuaDocumentElementInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/LuaElementInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/LuaEventListener.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/LuaEventListenerInstancer.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/precompiled.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/RocketContextsProxy.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Rocket.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Utilities.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Vector2f.cpp + ${LIBROCKET_DIR}/Source/Core/Lua/Vector2i.cpp +) + +set(LuaControls_HDR_FILES + ${LIBROCKET_DIR}/Source/Controls/Lua/As.h + ${LIBROCKET_DIR}/Source/Controls/Lua/DataFormatter.h + ${LIBROCKET_DIR}/Source/Controls/Lua/DataSource.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementDataGrid.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementDataGridRow.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlDataSelect.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControl.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlInput.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlSelect.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlTextArea.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementForm.h + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementTabSet.h + ${LIBROCKET_DIR}/Source/Controls/Lua/LuaDataFormatter.h + ${LIBROCKET_DIR}/Source/Controls/Lua/LuaDataSource.h + ${LIBROCKET_DIR}/Source/Controls/Lua/precompiled.h + ${LIBROCKET_DIR}/Source/Controls/Lua/SelectOptionsProxy.h +) + +set(LuaControls_PUB_HDR_FILES + ${LIBROCKET_DIR}/Include/Rocket/Controls/Lua/Controls.h + ${LIBROCKET_DIR}/Include/Rocket/Controls/Lua/Header.h +) + +set(LuaControls_SRC_FILES + ${LIBROCKET_DIR}/Source/Controls/Lua/Controls.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/DataFormatter.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/DataSource.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementDataGrid.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementDataGridRow.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControl.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlDataSelect.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlInput.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlSelect.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementFormControlTextArea.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementForm.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/ElementTabSet.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/LuaDataFormatter.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/LuaDataSource.cpp + ${LIBROCKET_DIR}/Source/Controls/Lua/SelectOptionsProxy.cpp +) + +if (NOT FREETYPE_INCLUDE_DIRS) + find_package(Freetype REQUIRED) +endif() +include_directories(${FREETYPE_INCLUDE_DIRS}) + +set(ROCKET_INCLUDE_DIRS ${LIBROCKET_DIR}/Include) +include_directories(${ROCKET_INCLUDE_DIRS}) +add_library(ROCKET_LIB STATIC + ${Core_HDR_FILES} ${Core_PUB_HDR_FILES} ${Core_SRC_FILES} + ${Controls_HDR_FILES} ${Controls_PUB_HDR_FILES} ${Controls_SRC_FILES} + ${Debugger_HDR_FILES} ${Debugger_PUB_HDR_FILES} ${Debugger_SRC_FILES} + ${LuaCore_HDR_FILES} ${LuaCore_PUB_HDR_FILES} ${LuaCore_SRC_FILES} + ${LuaControls_HDR_FILES} ${LuaControls_PUB_HDR_FILES} ${LuaControls_SRC_FILES} +) + +set_property(TARGET ROCKET_LIB PROPERTY +COMPILE_DEFINITIONS ROCKET_STATIC_LIB LUA_COMPAT_APIINTCASTS +) +set_target_properties(ROCKET_LIB PROPERTIES + POSITION_INDEPENDENT_CODE 1 +) diff --git a/libs/libRocket b/libs/libRocket new file mode 160000 index 00000000000..cbf5cf5d821 --- /dev/null +++ b/libs/libRocket @@ -0,0 +1 @@ +Subproject commit cbf5cf5d8210f8945c4cdbdfffabd62b3cdeeb4f diff --git a/libs/libRocket/CMakeLists.txt b/libs/libRocket/CMakeLists.txt deleted file mode 100644 index 01963b45aec..00000000000 --- a/libs/libRocket/CMakeLists.txt +++ /dev/null @@ -1,547 +0,0 @@ -# Create libRocket. - -set(Core_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorFirstOfType.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledBoxInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementStyle.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementStyleCache.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ContextInstancerDefault.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserKeyword.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementDefinition.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorOnlyChild.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorNoneInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledHorizontal.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledImageInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PluginRegistry.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorEmpty.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetParser.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerTemplate.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyShorthandDefinition.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthOfType.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementTextDefault.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelector.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectShadowInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorLastOfType.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayoutRow.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementBackground.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserString.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureResource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNode.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Clock.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledImage.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledVerticalInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorLastChild.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementHandle.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/EventDispatcher.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Pool.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TemplateCache.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Template.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/EventIterators.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerBody.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutBlockBox.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/WidgetSlider.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutInlineBoxText.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontFaceLayer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementImage.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontFamily.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiled.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserColour.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLParseTools.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/WidgetSliderScroll.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutBlockBoxSpace.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DocumentHeader.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/precompiled.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthLastChild.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorFirstChild.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutLineBox.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DebugFont.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectNone.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectShadow.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureDatabase.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserNumber.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledVertical.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthChild.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayoutRectangle.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutInlineBox.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/GeometryDatabase.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectOutlineInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayoutTexture.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontFace.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayout.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/EventInstancerDefault.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementBorder.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerHead.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementDecoration.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StreamFile.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutEngine.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectOutline.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetFactory.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthLastOfType.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FileInterfaceDefault.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerDefault.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorNone.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledHorizontalInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StringCache.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectNoneInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledBox.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorOnlyOfType.h -) - -set(Core_PUB_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/FontEffect.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/TypeConverter.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ElementScroll.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/SystemInterface.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Colour.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Box.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ConvolutionFilter.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/EventListenerInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ElementInstancerGeneric.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/FileInterface.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/MathTypes.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ElementInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/PropertySpecification.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Property.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Plugin.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ElementReference.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/StreamMemory.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/WString.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/EventListener.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/PropertyDefinition.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Decorator.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Texture.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/PropertyDictionary.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/StyleSheet.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/FontGlyph.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ReferenceCountable.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/StringUtilities.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Vertex.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ElementUtilities.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Factory.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Stream.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/GeometryUtilities.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Vector2.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/StyleSheetSpecification.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/RenderInterface.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/StyleSheetKeywords.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Core.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/FontDatabase.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Header.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Dictionary.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Types.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/XMLParser.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ElementDocument.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/BaseXMLParser.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Debug.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/URL.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Input.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Event.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Geometry.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Font.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ElementText.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/String.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Element.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ScriptInterface.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/StringBase.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/EventInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/DecoratorInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Context.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/FontEffectInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Variant.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Math.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Log.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Platform.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/XMLNodeHandler.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/PropertyParser.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/ContextInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/UnicodeRange.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/FontFaceHandle.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core.h -) - -set(Core_SRC_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StreamMemory.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledVertical.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/EventInstancerDefault.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementHandle.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerBody.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureDatabase.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledBox.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetParser.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Core.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Template.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandler.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/String.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ReferenceCountable.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorLastOfType.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementBackground.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledHorizontal.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/EventDispatcher.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/EventListenerInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StringCache.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementUtilities.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TemplateCache.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledBoxInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Event.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Clock.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/GeometryDatabase.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementDecoration.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffect.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FileInterfaceDefault.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerTemplate.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ConvolutionFilter.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiled.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerHead.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DocumentHeader.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ContextInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Decorator.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/BaseXMLParser.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Box.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyDefinition.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Math.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementText.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/precompiled.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetSpecification.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectNone.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PluginRegistry.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/RenderInterface.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ContextInstancerDefault.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutInlineBoxText.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayout.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyDictionary.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Context.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutEngine.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/WidgetSlider.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Property.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementStyle.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementStyleCache.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorNoneInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Element.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectOutlineInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontDatabase.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Texture.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementScroll.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontFaceLayer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/UnicodeRange.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FileInterface.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthLastChild.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectShadow.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetFactory.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorLastChild.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutBlockBoxSpace.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectNoneInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontFace.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Vector2.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserKeyword.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNode.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementDocument.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorEmpty.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledImageInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectOutline.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontFamily.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/WString.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/URL.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontEffectShadowInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledHorizontalInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorNone.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StreamFile.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Dictionary.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledImage.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/EventInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayoutRow.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertySpecification.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/FontFaceHandle.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/SystemInterface.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementBorder.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Plugin.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutLineBox.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayoutRectangle.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureResource.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutBlockBox.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthOfType.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementImage.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelector.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/GeometryUtilities.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthLastOfType.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/WidgetSliderScroll.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLParseTools.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementTextDefault.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserNumber.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLNodeHandlerDefault.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/TextureLayoutTexture.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Stream.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/XMLParser.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheet.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorFirstChild.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StringUtilities.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Log.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Variant.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorNthChild.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Geometry.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/DecoratorTiledVerticalInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementReference.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserString.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/PropertyParserColour.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Factory.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/ElementDefinition.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/LayoutInlineBox.cpp -) - -set(Controls_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetDropDown.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeRange.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetSliderInput.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInputSingleLine.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInput.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeButton.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetSlider.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInputMultiLine.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/XMLNodeHandlerTabSet.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeCheckbox.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeSubmit.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeRadio.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementTextSelection.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputType.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/XMLNodeHandlerDataGrid.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/XMLNodeHandlerTextArea.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInputSingleLinePassword.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeText.h -) - -set(Controls_PUB_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/DataQuery.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementFormControlDataSelect.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementFormControlTextArea.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementTabSet.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/Controls.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementFormControlSelect.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/SelectOption.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementFormControlInput.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementFormControl.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/Header.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/DataSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementDataGrid.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementDataGridExpandButton.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementDataGridRow.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/Clipboard.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/DataFormatter.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/DataSourceListener.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementForm.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/ElementDataGridCell.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls.h -) - -set(Controls_SRC_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/SelectOption.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInputSingleLinePassword.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/XMLNodeHandlerDataGrid.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/XMLNodeHandlerTextArea.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetDropDown.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementTabSet.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementFormControlTextArea.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Clipboard.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInputMultiLine.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/DataSourceListener.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetSliderInput.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementFormControlDataSelect.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeSubmit.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInput.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Controls.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeRadio.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementDataGridRow.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementFormControlSelect.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetSlider.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementDataGridExpandButton.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeText.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeCheckbox.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputType.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementFormControlInput.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementDataGrid.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementTextSelection.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/XMLNodeHandlerTabSet.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/DataQuery.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementForm.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeButton.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/InputTypeRange.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementDataGridCell.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/ElementFormControl.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/WidgetTextInputSingleLine.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/DataFormatter.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/DataSource.cpp -) - -set(Debugger_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/ElementLog.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/SystemInterface.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/InfoSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/Plugin.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/LogSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/ElementInfo.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/BeaconSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/Geometry.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/MenuSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/ElementContextHook.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/CommonSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/FontSource.h -) - -set(Debugger_PUB_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Debugger/Header.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Debugger/Debugger.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Debugger.h -) - -set(Debugger_SRC_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/ElementInfo.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/Debugger.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/ElementLog.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/ElementContextHook.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/SystemInterface.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/Plugin.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Debugger/Geometry.cpp -) - -set(LuaCore_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Colourb.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Colourf.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Context.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ContextDocumentsProxy.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Document.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Element.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementAttributesProxy.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementChildNodesProxy.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementStyleProxy.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementText.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Event.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/EventParametersProxy.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/GlobalLuaFunctions.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Log.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaDocument.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaDocumentElementInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaElement.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaElementInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaEventListener.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaEventListenerInstancer.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/precompiled.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Rocket.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/RocketContextsProxy.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Vector2f.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Vector2i.h -) - -set(LuaCore_PUB_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Lua/Header.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Lua/Interpreter.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Lua/LuaType.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Core/Lua/Utilities.h -) - -set(LuaCore_SRC_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Colourb.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Colourf.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Context.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ContextDocumentsProxy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Document.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Element.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementAttributesProxy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementChildNodesProxy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementStyleProxy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/ElementText.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Event.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/EventParametersProxy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/GlobalLuaFunctions.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Interpreter.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Log.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaDocument.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaDocumentElementInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaElementInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaEventListener.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/LuaEventListenerInstancer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/precompiled.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Rocket.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/RocketContextsProxy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Utilities.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Vector2f.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Core/Lua/Vector2i.cpp -) - -set(LuaControls_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/As.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/DataFormatter.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/DataSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementDataGrid.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementDataGridRow.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementForm.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControl.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlDataSelect.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlInput.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlSelect.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlTextArea.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementTabSet.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/LuaDataFormatter.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/LuaDataSource.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/precompiled.h - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/SelectOptionsProxy.h -) - -set(LuaControls_PUB_HDR_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/Lua/Controls.h - ${CMAKE_CURRENT_SOURCE_DIR}/Include/Rocket/Controls/Lua/Header.h -) - -set(LuaControls_SRC_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/Controls.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/DataFormatter.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/DataSource.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementDataGrid.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementDataGridRow.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementForm.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControl.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlDataSelect.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlInput.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlSelect.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementFormControlTextArea.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/ElementTabSet.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/LuaDataFormatter.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/LuaDataSource.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source/Controls/Lua/SelectOptionsProxy.cpp -) - - -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "Release/${GAMELIB_OUTPUT_DIR}") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "Debug/${GAMELIB_OUTPUT_DIR}") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "MinSizeRel/${GAMELIB_OUTPUT_DIR}") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "RelWithDebInfo/${GAMELIB_OUTPUT_DIR}") - -if (NOT FREETYPE_INCLUDE_DIRS) - find_package(Freetype REQUIRED) -endif() -include_directories(${FREETYPE_INCLUDE_DIRS}) - -set(ROCKET_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/Include) -set(ROCKET_INCLUDE_DIRS ${ROCKET_INCLUDE_DIRS} PARENT_SCOPE) -include_directories(${ROCKET_INCLUDE_DIRS}) -add_library(ROCKET_LIB STATIC - ${Core_HDR_FILES} ${Core_PUB_HDR_FILES} ${Core_SRC_FILES} - ${Controls_HDR_FILES} ${Controls_PUB_HDR_FILES} ${Controls_SRC_FILES} - ${Debugger_HDR_FILES} ${Debugger_PUB_HDR_FILES} ${Debugger_SRC_FILES} - ${LuaCore_HDR_FILES} ${LuaCore_PUB_HDR_FILES} ${LuaCore_SRC_FILES} - ${LuaControls_HDR_FILES} ${LuaControls_PUB_HDR_FILES} ${LuaControls_SRC_FILES} -) - -set_property(TARGET ROCKET_LIB PROPERTY -COMPILE_DEFINITIONS ROCKET_STATIC_LIB LUA_COMPAT_APIINTCASTS -) -set_target_properties(ROCKET_LIB PROPERTIES - POSITION_INDEPENDENT_CODE 1 -) diff --git a/libs/libRocket/Include/Rocket/Controls.h b/libs/libRocket/Include/Rocket/Controls.h deleted file mode 100644 index 68b9cf40679..00000000000 --- a/libs/libRocket/Include/Rocket/Controls.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLS_H -#define ROCKETCONTROLS_H - -#include "Controls/Controls.h" - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/Clipboard.h b/libs/libRocket/Include/Rocket/Controls/Clipboard.h deleted file mode 100644 index b80df7d70e6..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/Clipboard.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSCLIPBOARD_H -#define ROCKETCONTROLSCLIPBOARD_H - -#include "../Core/WString.h" - -namespace Rocket { -namespace Controls { - -/** - The clipboard temporarily stores text that is cut or copied from a text widget. - - @author Peter Curry - */ - -class Clipboard -{ -public: - /// Get the current contents of the clipboard. - static Rocket::Core::WString Get(); - - /// Set the contents of the clipboard. - static void Set(const Rocket::Core::WString& content); - - #if defined ROCKET_PLATFORM_WIN32 - /// Set the window handle of the application. This shouldn't need to be called unless the host - /// application opens multiple windows, or opens and closes windows, etc. - static void SetHWND(void* hwnd); - #endif -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/Controls.h b/libs/libRocket/Include/Rocket/Controls/Controls.h deleted file mode 100644 index a0f002649bf..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/Controls.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSCONTROLS_H -#define ROCKETCONTROLSCONTROLS_H - -#include "DataFormatter.h" -#include "ElementDataGrid.h" -#include "ElementDataGridCell.h" -#include "ElementDataGridExpandButton.h" -#include "ElementDataGridRow.h" -#include "ElementForm.h" -#include "ElementFormControl.h" -#include "ElementFormControlDataSelect.h" -#include "ElementFormControlInput.h" -#include "ElementFormControlSelect.h" -#include "ElementFormControlTextArea.h" -#include "ElementTabSet.h" -#include "SelectOption.h" - -namespace Rocket { -namespace Controls { - -/// Registers the instancers for the custom controls. -ROCKETCONTROLS_API void Initialise(); - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/DataFormatter.h b/libs/libRocket/Include/Rocket/Controls/DataFormatter.h deleted file mode 100644 index 27154ef992f..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/DataFormatter.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSDATAFORMATTER_H -#define ROCKETCONTROLSDATAFORMATTER_H - -#include "../Core/ScriptInterface.h" -#include "../Core/String.h" -#include "Header.h" - -namespace Rocket { -namespace Controls { - -class Element; - -/** - Abstract base class for a data formatter. A data formatter takes raw data - and processes it into a final string. They are usually used in conjunction - with a data source and a datagrid. - - @author Robert Curry - */ - -class ROCKETCONTROLS_API DataFormatter -{ -public: - DataFormatter(const Rocket::Core::String& name = ""); - virtual ~DataFormatter(); - - /// Returns the name by which this data formatter is referenced by. - /// @return The name of this data formatter. - const Rocket::Core::String& GetDataFormatterName(); - /// Returns a data formatter with the given name. - /// @parameter [in] data_formatter_name The name of the data formatter to - /// be returned. - /// @return If the data formatter with the specified name has been - /// constructed, a pointer to it will be returned. Otherwise, NULL. - static DataFormatter* GetDataFormatter(const Rocket::Core::String& data_formatter_name); - - /// Formats the raw results of a data source request into RML. - /// @param[out] formatted_data The formatted RML. - /// @param[in] raw_data A list of the raw data fields. - virtual void FormatData(Rocket::Core::String& formatted_data, const Rocket::Core::StringList& raw_data) = 0; - - virtual void* GetScriptObject() const; - -private: - Rocket::Core::String name; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/DataQuery.h b/libs/libRocket/Include/Rocket/Controls/DataQuery.h deleted file mode 100644 index 8c1c69595f4..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/DataQuery.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSDATAQUERY_H -#define ROCKETCONTROLSDATAQUERY_H - -#include "Header.h" -#include "../Core/TypeConverter.h" -#include "../Core/Log.h" - -namespace Rocket { -namespace Controls { - -class DataSource; - -/** - DataQuery - @author Robert Curry - - Represents a request for information from an DataSource, encapsulates the result and offers - mechanisms to iterate through the returned rows. -*/ - -class ROCKETCONTROLS_API DataQuery -{ -public: - DataQuery(); - DataQuery(DataSource* data_source, const Rocket::Core::String& table, const Rocket::Core::String& fields, int offset = 0, int limit = -1, const Rocket::Core::String& order = ""); - virtual ~DataQuery(); - - void ExecuteQuery(DataSource* data_source, const Rocket::Core::String& table, const Rocket::Core::String& fields, int offset = 0, int limit = -1, const Rocket::Core::String& order = ""); - bool NextRow(); - - bool IsFieldSet(const Rocket::Core::String& field) const; - - template< typename T > - T Get(const Rocket::Core::String& field_name, const T& default_value) const - { - FieldIndices::const_iterator itr = field_indices.find(field_name); - if (itr == field_indices.end()) - { - Rocket::Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Field %s not found in query", field_name.CString()); - return default_value; - } - - T return_value = default_value; - - GetInto((*itr).second, return_value); - - return return_value; - } - - template< typename T > - bool GetInto(const Rocket::Core::String& field_name, T& value) const - { - FieldIndices::const_iterator itr = field_indices.find(field_name); - if (itr == field_indices.end()) - { - Rocket::Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Field %s not found in query", field_name.CString()); - return false; - } - - return GetInto((*itr).second, value); - } - - template< typename T > - T Get(const size_t field_index, const T& default_value) const - { - T return_value = default_value; - - GetInto(field_index, return_value); - - return return_value; - } - - template< typename T > - bool GetInto(const size_t field_index, T& value) const - { - if (field_index < rows[current_row].size()) - { - return Rocket::Core::TypeConverter< Rocket::Core::String, T >::Convert(rows[current_row][field_index], value); - } - - return false; - } - - size_t GetNumFields() - { - return rows[current_row].size(); - } - -private: - Rocket::Core::StringList fields; - - DataSource* data_source; - Rocket::Core::String table; - int current_row; - int offset; - int limit; - - typedef std::vector< Rocket::Core::StringList > Rows; - Rows rows; - typedef std::map< Rocket::Core::String, size_t > FieldIndices; - FieldIndices field_indices; - - void LoadRow(); -}; - -} -} - -#endif // ROCKETCONTROLSDATAQUERY_H diff --git a/libs/libRocket/Include/Rocket/Controls/DataSource.h b/libs/libRocket/Include/Rocket/Controls/DataSource.h deleted file mode 100644 index 48d9362b825..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/DataSource.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSDATASOURCE_H -#define ROCKETCONTROLSDATASOURCE_H - -#include "Header.h" -#include "../Core/String.h" -#include -#include - -namespace Rocket { -namespace Controls { - -class DataSourceListener; - -/** - Generic object that provides a database-like interface for requesting rows from a table. - @author Robert Curry - */ - -class ROCKETCONTROLS_API DataSource -{ - public: - DataSource(const Rocket::Core::String& name = ""); - virtual ~DataSource(); - - const Rocket::Core::String& GetDataSourceName(); - static DataSource* GetDataSource(const Rocket::Core::String& data_source_name); - - /// Fetches the contents of one row of a table within the data source. - /// @param[out] row The list of values in the table. - /// @param[in] table The name of the table to query. - /// @param[in] row_index The index of the desired row. - /// @param[in] columns The list of desired columns within the row. - virtual void GetRow(Rocket::Core::StringList& row, const Rocket::Core::String& table, int row_index, const Rocket::Core::StringList& columns) = 0; - /// Fetches the number of rows within one of this data source's tables. - /// @param[in] table The name of the table to query. - /// @return The number of rows within the specified table. - virtual int GetNumRows(const Rocket::Core::String& table) = 0; - - void AttachListener(DataSourceListener* listener); - void DetachListener(DataSourceListener* listener); - - virtual void* GetScriptObject() const; - - static const Rocket::Core::String CHILD_SOURCE; - static const Rocket::Core::String DEPTH; - static const Rocket::Core::String NUM_CHILDREN; - - protected: - /// Tells all attached listeners that one or more rows have been added to the data source. - /// @param[in] table The name of the table to have rows added to it. - /// @param[in] first_row_added The index of the first row added. - /// @param[in] num_rows_added The number of rows added (including the first row). - void NotifyRowAdd(const Rocket::Core::String& table, int first_row_added, int num_rows_added); - - /// Tells all attached listeners that one or more rows have been removed from the data source. - /// @param[in] table The name of the table to have rows removed from it. - /// @param[in] first_row_removed The index of the first row removed. - /// @param[in] num_rows_removed The number of rows removed (including the first row). - void NotifyRowRemove(const Rocket::Core::String& table, int first_row_removed, int num_rows_removed); - - /// Tells all attached listeners that one or more rows have been changed in the data source. - /// @param[in] table The name of the table to have rows changed in it. - /// @param[in] first_row_changed The index of the first row changed. - /// @param[in] num_rows_changed The number of rows changed (including the first row). - void NotifyRowChange(const Rocket::Core::String& table, int first_row_changed, int num_rows_changed); - - /// Tells all attached listeners that the row structure has completely changed in the data source. - /// @param[in] table The name of the table to have rows changed in it. - void NotifyRowChange(const Rocket::Core::String& table); - - /// Helper function for building a result set. - typedef std::map< Rocket::Core::String, Rocket::Core::String > RowMap; - void BuildRowEntries(Rocket::Core::StringList& row, const RowMap& row_map, const Rocket::Core::StringList& columns); - - private: - Core::String name; - - typedef std::list< DataSourceListener* > ListenerList; - ListenerList listeners; -}; - -} -} - -#endif // ROCKETCONTROLSDATASOURCE_H - diff --git a/libs/libRocket/Include/Rocket/Controls/DataSourceListener.h b/libs/libRocket/Include/Rocket/Controls/DataSourceListener.h deleted file mode 100644 index 918af39585e..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/DataSourceListener.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSDATASOURCELISTENER_H -#define ROCKETCONTROLSDATASOURCELISTENER_H - -#include "Header.h" -#include "../Core/String.h" - -namespace Rocket { -namespace Controls { - -class DataSource; - -/** - Interface for objects wishing to listen to data source events. Listeners should use the - AttachListener() on DataSource to begin observing a data source. - - @author Robert Curry - */ - -class ROCKETCONTROLS_API DataSourceListener -{ -public: - DataSourceListener(); - virtual ~DataSourceListener(); - - /// Notification of the destruction of an observed data source. - /// @param[in] data_source Data source being destroyed. - virtual void OnDataSourceDestroy(DataSource* data_source); - /// Notification of the addition of one or more rows to an observed data source's table. - /// @param[in] data_source Data source being changed. - /// @param[in] table The name of the changing table within the data source. - /// @param[in] first_row_added Index of the first new row. - /// @param[in] num_rows_added Number of new sequential rows being added. - virtual void OnRowAdd(DataSource* data_source, const Rocket::Core::String& table, int first_row_added, int num_rows_added); - /// Notification of the removal of one or more rows from an observed data source's table. - /// @param[in] data_source Data source being changed. - /// @param[in] table The name of the changing table within the data source. - /// @param[in] first_row_removed Index of the first removed row. - /// @param[in] num_rows_removed Number of new sequential rows being removed. - virtual void OnRowRemove(DataSource* data_source, const Rocket::Core::String& table, int first_row_removed, int num_rows_removed); - /// Notification of the changing of one or more rows from an observed data source's table. - /// @param[in] data_source Data source being changed. - /// @param[in] table The name of the changing table within the data source. - /// @param[in] first_row_removed Index of the first changed row. - /// @param[in] num_rows_removed Number of new sequential rows being changed. - virtual void OnRowChange(DataSource* data_source, const Rocket::Core::String& table, int first_row_changed, int num_rows_changed); - /// Notification of the change of all of the data of an observed data source's table. - /// @param[in] data_source Data source being changed. - /// @param[in] table The name of the changing table within the data source. - virtual void OnRowChange(DataSource* data_source, const Rocket::Core::String& table); - -protected: - /// Sets up data source and table from a given Rocket::Core::String. - /// @param[out] data_source A pointer to a data_source that gets loaded with the specified data source. - /// @param[out] table_name A reference to an Rocket::Core::String that gets loaded with the specified data table. - /// @param[in] data_source_name The data source and table in SOURCE.TABLE format. - /// @return True if the data source name was in the correct format, and the data source was found. - bool ParseDataSource(DataSource*& data_source, Rocket::Core::String& table_name, const Rocket::Core::String& data_source_name); -}; - -} -} - -#endif // ROCKETCONTROLSDATASOURCELISTENER_H - diff --git a/libs/libRocket/Include/Rocket/Controls/ElementDataGrid.h b/libs/libRocket/Include/Rocket/Controls/ElementDataGrid.h deleted file mode 100644 index c6fc892002d..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementDataGrid.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTDATAGRID_H -#define ROCKETCONTROLSELEMENTDATAGRID_H - -#include "Header.h" -#include "DataSourceListener.h" -#include "../Core/Element.h" - -namespace Rocket { -namespace Controls { - -class DataFormatter; -class ElementDataGridRow; - -/** - A table driven from a data source. - - @author Robert Curry - */ - -class ROCKETCONTROLS_API ElementDataGrid : public Core::Element, public DataSourceListener -{ -public: - ElementDataGrid(const Rocket::Core::String& tag); - virtual ~ElementDataGrid(); - - /// Sets a new data source for the contents of the data grid. - /// @param[in] data_source_name The name of the new data source. - void SetDataSource(const Rocket::Core::String& data_source_name); - - /** - A column inside a table. - - @author Robert Curry - */ - struct Column - { - /// The list of fields that this column reads from the data source for - /// each row. - Rocket::Core::StringList fields; - - /// The data formatter this is used to process the field information - /// into what is finally displayed in the data grid. - DataFormatter* formatter; - /// The header that is displayed at the top of the column, in the - /// header row. - Core::Element* header; - - /// The width of this column. - float current_width; - - /// Whether this column has a forced refresh when a child node changes. - /// This is to allow the expand/collapse buttons to be added or removed - /// when a child node is added. - bool refresh_on_child_change; - }; - - /// Adds a column to the table. - /// @param[in] fields A comma-separated list of fields that this column reads from the data source. - /// @param[in] formatter The name of the data formatter to be used to format the raw column data into RML. - /// @param[in] initial_width The initial width, in pixels, of the column. - /// @param[in] header_rml The RML to use as the column header. - /// @return True if the column was added successfully, false if not. - bool AddColumn(const Rocket::Core::String& fields, const Rocket::Core::String& formatter, float initial_width, const Rocket::Core::String& header_rml); - /// Adds a column to the table. - /// @param[in] fields A comma-separated list of fields that this column reads from the data source. - /// @param[in] formatter The name of the data formatter to be used to format the raw column data into RML. - /// @param[in] initial_width The initial width, in pixels, of the column. - /// @param[in] header_element The element hierarchy to use as the column header. - void AddColumn(const Rocket::Core::String& fields, const Rocket::Core::String& formatter, float initial_width, Core::Element* header_element); - /// Returns the number of columns in this table - int GetNumColumns(); - /// Returns the column at the specified index. - const Column* GetColumn(int column_index); - /// Returns a CSV string containing all the fields that each column requires, in order. - const Rocket::Core::String& GetAllColumnFields(); - - /// Adds a new row to the table. This is only called from child rows. - /// @param[in] parent The parent row that the row is being added under. - /// @param[in] index The index of the child, relative to its parent. - /// @return A pointer to the newly created row. - ElementDataGridRow* AddRow(ElementDataGridRow* parent, int index); - /// Removes a series of rows from the table. - /// @param[in] index The index of the first row, relative to the table. - /// @param[in] num_rows The number of rows to remove. Defaults to one. - void RemoveRows(int index, int num_rows = 1); - - /// Returns the number of rows in the table - int GetNumRows() const; - /// Returns the row at the given index in the table. - /// @param[in] index The index of the row, relative to the table. - ElementDataGridRow* GetRow(int index) const; - -protected: - virtual void OnUpdate(); - - virtual void ProcessEvent(Core::Event& event); - - /// Gets the markup and content of the element. - /// @param content[out] The content of the element. - virtual void GetInnerRML(Rocket::Core::String& content) const; - -private: - typedef std::vector< Column > ColumnList; - typedef std::vector< ElementDataGridRow* > RowList; - - ColumnList columns; - Rocket::Core::String column_fields; - - // The row that contains the header elements of the table. - ElementDataGridRow* header; - - // The root row, all the top level rows are children under this. Not - // actually rendered, has "display: none". - ElementDataGridRow* root; - // If this is non-empty, then in the previous update the data source was set - // and we must set it this update. - Rocket::Core::String new_data_source; - - // The block element that contains all our rows. Only used for applying styles. - Core::Element* body; - // Stores if the body has already been made visible by having enough rows added. - bool body_visible; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementDataGridCell.h b/libs/libRocket/Include/Rocket/Controls/ElementDataGridCell.h deleted file mode 100644 index 433bf27cca7..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementDataGridCell.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTDATAGRIDCELL_H -#define ROCKETCONTROLSELEMENTDATAGRIDCELL_H - -#include "../Core/Element.h" -#include "../Core/EventListener.h" -#include "Header.h" - -namespace Rocket { -namespace Controls { - -/** - The class for cells inside a data table row. - - @author Robert Curry - */ - -class ROCKETCONTROLS_API ElementDataGridCell : public Core::Element, public Core::EventListener -{ -public: - ElementDataGridCell(const Rocket::Core::String& tag); - virtual ~ElementDataGridCell(); - - void Initialise(int column, Core::Element* header); - int GetColumn(); - -protected: - virtual void ProcessEvent(Core::Event& event); - -private: - int column; - Core::Element* header; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementDataGridExpandButton.h b/libs/libRocket/Include/Rocket/Controls/ElementDataGridExpandButton.h deleted file mode 100644 index 3067c36f171..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementDataGridExpandButton.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTDATAGRIDEXPANDBUTTON_H -#define ROCKETCONTROLSELEMENTDATAGRIDEXPANDBUTTON_H - -#include "../Core/Element.h" -#include "Header.h" - -namespace Rocket { -namespace Controls { - -/** - @author Robert Curry - */ - -class ROCKETCONTROLS_API ElementDataGridExpandButton : public Core::Element -{ -public: - ElementDataGridExpandButton(const Rocket::Core::String& tag); - virtual ~ElementDataGridExpandButton(); - -protected: - void ProcessEvent(Core::Event& event); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementDataGridRow.h b/libs/libRocket/Include/Rocket/Controls/ElementDataGridRow.h deleted file mode 100644 index 5865fcbf75c..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementDataGridRow.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTDATAGRIDROW_H -#define ROCKETCONTROLSELEMENTDATAGRIDROW_H - -#include "Header.h" -#include "DataSourceListener.h" -#include "DataQuery.h" -#include "../Core/Element.h" -#include - -namespace Rocket { -namespace Controls { - -class ElementDataGrid; - -/** - Class for rows inside a data table. Used for both the header and the individual rows. - - @author Robert Curry - */ - -class ROCKETCONTROLS_API ElementDataGridRow : public Core::Element, public DataSourceListener -{ -friend class ElementDataGrid; - -public: - ElementDataGridRow(const Rocket::Core::String& tag); - virtual ~ElementDataGridRow(); - - void Initialise(ElementDataGrid* parent_grid, ElementDataGridRow* parent_row = NULL, int child_index = -1, ElementDataGridRow* header_row = NULL, int depth = -1); - void SetChildIndex(int child_index); - int GetDepth(); - - void SetDataSource(const Rocket::Core::String& data_source_name); - - /// Checks dirty children and cells, and loads them if necessary. - /// @return True if any children were updated. - bool UpdateChildren(); - - /// Returns the number of children that aren't dirty (have been loaded) - int GetNumLoadedChildren(); - - // Removes all the child cells and fetches them again from the data - // source. - void RefreshRows(); - - /// Returns whether this row is expanded or not. - bool IsRowExpanded(); - /// Shows all of this row's descendants. - void ExpandRow(); - /// Hides all of this row's descendants. - void CollapseRow(); - /// Expands the row if collapsed, or collapses the row if expanded. - void ToggleRow(); - - /// Returns the index of this row, relative to its parent. - int GetParentRelativeIndex(); - /// Returns the index of this row, relative to the table rather than its parent. - int GetTableRelativeIndex(); - /// Returns the parent row of this row. - ElementDataGridRow* GetParentRow(); - /// Returns the grid that this row belongs to. - ElementDataGrid* GetParentGrid(); - -protected: - virtual void OnDataSourceDestroy(DataSource* data_source); - virtual void OnRowAdd(DataSource* data_source, const Rocket::Core::String& table, int first_row_added, int num_rows_added); - virtual void OnRowRemove(DataSource* data_source, const Rocket::Core::String& table, int first_row_removed, int num_rows_removed); - virtual void OnRowChange(DataSource* data_source, const Rocket::Core::String& table, int first_row_changed, int num_rows_changed); - virtual void OnRowChange(DataSource* data_source, const Rocket::Core::String& table); - -private: - typedef std::queue< ElementDataGridRow* > RowQueue; - typedef std::vector< ElementDataGridRow* > RowList; - - // Called when a row change (addition or removal) occurs in one of our - // children. Causes the table row index to be dirtied on all following - // children. - void ChildChanged(int child_index); - // Checks if any columns are dependent on the number of children - // present, and refreshes them from the data source if they are. - void RefreshChildDependentCells(); - - // Forces the row to recalculate its relative table index the next time - // it is requested. - void DirtyTableRelativeIndex(); - // Works out what the table relative index is for a given child. - int GetChildTableRelativeIndex(int child_index); - - // Adds children underneath this row, and fetches their contents (and - // possible children) from the row's data source. If first_row is left - // as the default -1, the rows are appended at the end of the list. - void AddChildren(int first_row_added = -1, int num_rows_added = 1); - // Removes this rows children, and their children, etc, from the table. - // If the num_rows_removed parameter is left as the -1 default, it'll - // default to the rest of the children after the first row. - void RemoveChildren(int first_row_removed = 0, int num_rows_removed = -1); - // Marks children as dirty and dispatches the event. - void ChangeChildren(int first_row_changed = 0, int num_rows_changed = -1); - // Returns the number of rows under this row (children, grandchildren, etc) - int GetNumDescendants(); - - // Adds or refreshes the cell contents, and undirties the row's cells. - void Load(const Rocket::Controls::DataQuery& row_information); - // Finds all children that have cell information missing (either though being - // refreshed or not being loaded yet) and reloads them. - void LoadChildren(float time_slice); - // Loads a specific set of children. Called by the above function. - void LoadChildren(int first_row_to_load, int num_rows_to_load, Rocket::Core::Time time_slice); - - // If the cells need reloading, this takes care of it. If any children - // need updating, they are added to the queue. - void UpdateCellsAndChildren(RowQueue& dirty_rows); - - // Sets the dirty_cells flag on this row, and lets our ancestors know. - void DirtyCells(); - // Sets the dirty children flag on this row and the row's ancestors. - void DirtyRow(); - // This row has one or more cells that need loading. - bool dirty_cells; - // This row has one or more children that have either dirty flag set. - bool dirty_children; - - // Shows this row, and, if this was was expanded before it was hidden, its children as well. - void Show(); - // Hides this row and all descendants. - void Hide(); - bool row_expanded; - - int table_relative_index; - bool table_relative_index_dirty; - - ElementDataGrid* parent_grid; - - ElementDataGridRow* parent_row; - int child_index; - int depth; - - RowList children; - - // The data source and table that the children are fetched from. - DataSource* data_source; - Rocket::Core::String data_table; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementForm.h b/libs/libRocket/Include/Rocket/Controls/ElementForm.h deleted file mode 100644 index 85d1b7d04c8..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementForm.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTFORM_H -#define ROCKETCONTROLSELEMENTFORM_H - -#include "../Core/Element.h" -#include "Header.h" - -namespace Rocket { -namespace Controls { - -/** - A specialisation of the generic Core::Element representing a form element. - - @author Peter Curry - */ - -class ROCKETCONTROLS_API ElementForm : public Core::Element -{ -public: - /// Constructs a new ElementForm. This should not be called directly; use the Factory instead. - /// @param[in] tag The tag the element was declared as in RML. - ElementForm(const Rocket::Core::String& tag); - virtual ~ElementForm(); - - /// Submits the form. - /// @param[in] name The name of the item doing the submit - /// @param[in] submit_value The value to send through as the 'submit' parameter. - void Submit(const Rocket::Core::String& name = "", const Rocket::Core::String& submit_value = ""); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementFormControl.h b/libs/libRocket/Include/Rocket/Controls/ElementFormControl.h deleted file mode 100644 index d942148cfae..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementFormControl.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTFORMCONTROL_H -#define ROCKETCONTROLSELEMENTFORMCONTROL_H - -#include "../Core/Element.h" -#include "Header.h" - -namespace Rocket { -namespace Controls { - -/** - A generic specialisation of the generic Core::Element for all input controls. - - @author Peter Curry - */ - -class ROCKETCONTROLS_API ElementFormControl : public Core::Element -{ -public: - /// Constructs a new ElementFormControl. This should not be called directly; use the Factory - /// instead. - /// @param[in] tag The tag the element was declared as in RML. - ElementFormControl(const Rocket::Core::String& tag); - virtual ~ElementFormControl(); - - /// Returns the name of the form control. This is not guaranteed to be unique, and in the case of some form - /// controls (such as radio buttons) most likely will not be. - /// @return The name of the form control. - Rocket::Core::String GetName() const; - /// Sets the name of the form control. - /// @param[in] name The new name of the form control. - void SetName(const Rocket::Core::String& name); - - /// Returns a string representation of the current value of the form control. - /// @return The value of the form control. - virtual Rocket::Core::String GetValue() const = 0; - /// Sets the current value of the form control. - /// @param[in] value The new value of the form control. - virtual void SetValue(const Rocket::Core::String& value) = 0; - /// Returns if this value should be submitted with the form. - /// @return True if the value should be be submitted with the form, false otherwise. - virtual bool IsSubmitted(); - - /// Returns the disabled status of the form control. - /// @return True if the element is disabled, false otherwise. - bool IsDisabled() const; - /// Sets the disabled status of the form control. - /// @param[in] disable True to disable the element, false to enable. - void SetDisabled(bool disable); - -protected: - /// Checks for changes to the 'disabled' attribute. - /// @param[in] changed_attributes List of changed attributes on the element. - virtual void OnAttributeChange(const Core::AttributeNameList& changed_attributes); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementFormControlDataSelect.h b/libs/libRocket/Include/Rocket/Controls/ElementFormControlDataSelect.h deleted file mode 100644 index 8166c44f182..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementFormControlDataSelect.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTFORMCONTROLDATASELECT_H -#define ROCKETCONTROLSELEMENTFORMCONTROLDATASELECT_H - -#include "Header.h" -#include "ElementFormControlSelect.h" -#include "DataSourceListener.h" - -namespace Rocket { -namespace Controls { - -class DataSource; - -/** - A drop-down select form control driven from a data source. - - @author Peter Curry - */ - -class ROCKETCONTROLS_API ElementFormControlDataSelect : public ElementFormControlSelect, public DataSourceListener -{ -public: - /// Constructs a new ElementFormControlDataSelect. This should not be called directly; use the - /// Factory instead. - /// @param[in] tag The tag the element was declared as in RML. - ElementFormControlDataSelect(const Rocket::Core::String& tag); - virtual ~ElementFormControlDataSelect(); - - /// Sets the data source the control's options are driven from. - /// @param[in] data_source The name of the new data source. - void SetDataSource(const Rocket::Core::String& data_source); - -protected: - /// If a new data source has been set on the control, this will attach to it and build the - /// initial options. - virtual void OnUpdate(); - - /// Checks for changes to the data source or formatting attributes. - /// @param[in] changed_attributes List of changed attributes on the element. - virtual void OnAttributeChange(const Core::AttributeNameList& changed_attributes); - - /// Detaches from the data source and rebuilds the options. - virtual void OnDataSourceDestroy(DataSource* data_source); - /// Rebuilds the available options from the data source. - virtual void OnRowAdd(DataSource* data_source, const Rocket::Core::String& table, int first_row_added, int num_rows_added); - /// Rebuilds the available options from the data source. - virtual void OnRowRemove(DataSource* data_source, const Rocket::Core::String& table, int first_row_removed, int num_rows_removed); - /// Rebuilds the available options from the data source. - virtual void OnRowChange(DataSource* data_source, const Rocket::Core::String& table, int first_row_changed, int num_rows_changed); - /// Rebuilds the available options from the data source. - virtual void OnRowChange(DataSource* data_source, const Rocket::Core::String& table); - -private: - // Builds the option list from the data source. - void BuildOptions(); - - DataSource* data_source; - Rocket::Core::String data_table; - - bool initialised; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementFormControlInput.h b/libs/libRocket/Include/Rocket/Controls/ElementFormControlInput.h deleted file mode 100644 index 598fab8ad8e..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementFormControlInput.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTFORMCONTROLINPUT_H -#define ROCKETCONTROLSELEMENTFORMCONTROLINPUT_H - -#include "Header.h" -#include "ElementFormControl.h" - -namespace Rocket { -namespace Controls { - -class InputType; - -/** - A form control for the generic input element. All functionality is handled through an input type interface. - - @author Peter Curry - */ - -class ROCKETCONTROLS_API ElementFormControlInput : public ElementFormControl -{ -public: - /// Constructs a new ElementFormControlInput. This should not be called directly; use the - /// Factory instead. - /// @param[in] tag The tag the element was declared as in RML. - ElementFormControlInput(const Rocket::Core::String& tag); - virtual ~ElementFormControlInput(); - - /// Returns a string representation of the current value of the form control. - /// @return The value of the form control. - virtual Rocket::Core::String GetValue() const; - /// Sets the current value of the form control. - /// @param value[in] The new value of the form control. - virtual void SetValue(const Rocket::Core::String& value); - /// Returns if this value's type should be submitted with the form. - /// @return True if the form control is to be submitted, false otherwise. - virtual bool IsSubmitted(); - -protected: - /// Updates the element's underlying type. - virtual void OnUpdate(); - /// Renders the element's underlying type. - virtual void OnRender(); - - /// Checks for necessary functional changes in the control as a result of changed attributes. - /// @param[in] changed_attributes The list of changed attributes. - virtual void OnAttributeChange(const Core::AttributeNameList& changed_attributes); - /// Called when properties on the control are changed. - /// @param[in] changed_properties The properties changed on the element. - virtual void OnPropertyChange(const Core::PropertyNameList& changed_properties); - - /// If we are the added element, this will pass the call onto our type handler. - /// @param[in] child The new member of the hierarchy. - virtual void OnChildAdd(Rocket::Core::Element* child); - /// If we are the removed element, this will pass the call onto our type handler. - /// @param[in] child The member of the hierarchy that was just removed. - virtual void OnChildRemove(Rocket::Core::Element* child); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); - -private: - InputType* type; - Rocket::Core::String type_name; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementFormControlSelect.h b/libs/libRocket/Include/Rocket/Controls/ElementFormControlSelect.h deleted file mode 100644 index 6bf95f96581..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementFormControlSelect.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTFORMCONTROLSELECT_H -#define ROCKETCONTROLSELEMENTFORMCONTROLSELECT_H - -#include "Header.h" -#include "ElementFormControl.h" -#include "SelectOption.h" - -namespace Rocket { -namespace Controls { - -class WidgetDropDown; - -/** - A drop-down select form control. - - @author Peter Curry - */ - -class ROCKETCONTROLS_API ElementFormControlSelect : public ElementFormControl -{ -public: - /// Constructs a new ElementFormControlSelect. This should not be called directly; use the - /// Factory instead. - /// @param[in] tag The tag the element was declared as in RML. - ElementFormControlSelect(const Rocket::Core::String& tag); - virtual ~ElementFormControlSelect(); - - /// Returns a string representation of the current value of the form control. - /// @return The value of the form control. - virtual Rocket::Core::String GetValue() const; - /// Sets the current value of the form control. - /// @param[in] value The new value of the form control. - virtual void SetValue(const Rocket::Core::String& value); - - /// Sets the index of the selection. If the new index lies outside of the bounds, it will be clamped. - /// @param[in] selection The new selection index. - void SetSelection(int selection); - /// Returns the index of the currently selected item. - /// @return The index of the currently selected item. - int GetSelection() const; - - /// Returns one of the select control's option elements. - /// @param[in] The index of the desired option element. - /// @return The option element at the given index. This will be NULL if the index is out of bounds. - SelectOption* GetOption(int index); - /// Returns the number of options in the select control. - /// @return The number of options. - int GetNumOptions(); - - /// Adds a new option to the select control. - /// @param[in] rml The RML content used to represent the option. This is usually a simple string, but can include RML tags. - /// @param[in] value The value of the option. This is used to identify the option, but does not necessarily need to be unique. - /// @param[in] before The index of the element to insert the new option before. If out of bounds of the control's option list (the default) the new option will be added at the end of the list. - /// @param[in] selectable If true this option can be selected. If false, this option is not selectable. - /// @return The index of the new option. - int Add(const Rocket::Core::String& rml, const Rocket::Core::String& value, int before = -1, bool selectable = true); - /// Removes an option from the select control. - /// @param[in] index The index of the option to remove. If this is outside of the bounds of the control's option list, no option will be removed. - void Remove(int index); - - /// Removes all options from the select control. - void RemoveAll(); - -protected: - /// Moves all children to be under control of the widget. - virtual void OnUpdate(); - /// Updates the layout of the widget's elements. - virtual void OnRender(); - - /// Forces an internal layout. - virtual void OnLayout(); - - /// Returns true to mark this element as replaced. - /// @param[out] intrinsic_dimensions Set to the arbitrary dimensions of 128 x 16 just to give this element a size. Resize with the 'width' and 'height' properties. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& intrinsic_dimensions); - - WidgetDropDown* widget; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementFormControlTextArea.h b/libs/libRocket/Include/Rocket/Controls/ElementFormControlTextArea.h deleted file mode 100644 index be68dbfa81a..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementFormControlTextArea.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTFORMCONTROLTEXTAREA_H -#define ROCKETCONTROLSELEMENTFORMCONTROLTEXTAREA_H - -#include "Header.h" -#include "ElementFormControl.h" - -namespace Rocket { -namespace Controls { - -class WidgetTextInput; - -/** - Default Rocket implemention of a text area. - - @author Peter Curry - */ - -class ROCKETCONTROLS_API ElementFormControlTextArea : public ElementFormControl -{ -public: - /// Constructs a new ElementFormControlTextArea. This should not be called directly; use the - /// Factory instead. - /// @param[in] tag The tag the element was declared as in RML. - ElementFormControlTextArea(const Rocket::Core::String& tag); - virtual ~ElementFormControlTextArea(); - - /// Returns a string representation of the current value of the form control. This is the value of the control - /// regardless of whether it has been selected / checked (as appropriate for the control). - /// @return The value of the form control. - virtual Rocket::Core::String GetValue() const; - /// Sets the current value of the form control. - /// @param[in] value The new value of the form control. - virtual void SetValue(const Rocket::Core::String& value); - - /// Sets the number of characters visible across the text area. Note that this will only be precise when using - /// a fixed-width font. - /// @param[in] size The number of visible characters. - void SetNumColumns(int num_columns); - /// Returns the approximate number of characters visible at once. - /// @return The number of visible characters. - int GetNumColumns() const; - - /// Sets the number of visible lines of text in the text area. - /// @param[in] num_rows The new number of visible lines of text. - void SetNumRows(int num_rows); - /// Returns the number of visible lines of text in the text area. - /// @return The number of visible lines of text. - int GetNumRows() const; - - /// Sets the maximum length (in characters) of this text area. - /// @param[in] max_length The new maximum length of the text area. A number lower than zero will mean infinite - /// characters. - void SetMaxLength(int max_length); - /// Returns the maximum length (in characters) of this text area. - /// @return The maximum number of characters allowed in this text area. - int GetMaxLength() const; - - /// Enables or disables word-wrapping in the text area. - /// @param[in] word_wrap True to enable word-wrapping, false to disable. - void SetWordWrap(bool word_wrap); - /// Returns the state of word-wrapping in the text area. - /// @return True if the text area is word-wrapping, false otherwise. - bool GetWordWrap(); - - /// Returns the control's inherent size, based on the length of the input field and the current font size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); - -protected: - /// Updates the control's widget. - void OnUpdate(); - /// Renders the control's widget. - void OnRender(); - /// Formats the element. - void OnLayout(); - - /// Called when attributes on the element are changed. - virtual void OnAttributeChange(const Core::AttributeNameList& changed_attributes); - /// Called when properties on the control are changed. - /// @param[in] changed_properties The properties changed on the element. - virtual void OnPropertyChange(const Core::PropertyNameList& changed_properties); - - /// Returns the text content of the element. - /// @param[out] content The content of the element. - virtual void GetInnerRML(Rocket::Core::String& content) const; - -private: - WidgetTextInput* widget; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/ElementTabSet.h b/libs/libRocket/Include/Rocket/Controls/ElementTabSet.h deleted file mode 100644 index a35fe427da5..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/ElementTabSet.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTTABSET_H -#define ROCKETCONTROLSELEMENTTABSET_H - -#include "../Core/Element.h" -#include "../Core/EventListener.h" -#include "Header.h" - -namespace Rocket { -namespace Controls { - -/** - A tabulated set of panels. - - @author Lloyd Weehuizen - */ - -class ROCKETCONTROLS_API ElementTabSet : public Core::Element, public Core::EventListener -{ -public: - ElementTabSet(const Rocket::Core::String& tag); - ~ElementTabSet(); - - /// Sets the specifed tab index's tab title RML. - /// @param[in] tab_index The tab index to set. If it doesn't already exist, it will be created. - /// @param[in] rml The RML to set on the tab title. - void SetTab(int tab_index, const Rocket::Core::String& rml); - /// Sets the specifed tab index's tab panel RML. - /// @param[in] tab_index The tab index to set. If it doesn't already exist, it will be created. - /// @param[in] rml The RML to set on the tab panel. - void SetPanel(int tab_index, const Rocket::Core::String& rml); - - /// Set the specifed tab index's title element. - /// @param[in] tab_index The tab index to set. If it doesn't already exist, it will be created. - /// @param[in] element The root of the element tree to set as the tab title. - void SetTab(int tab_index, Core::Element* element); - /// Set the specified tab index's body element. - /// @param[in] tab_index The tab index to set. If it doesn't already exist, it will be created. - /// @param[in] element The root of the element tree to set as the window. - void SetPanel(int tab_index, Core::Element* element); - - /// Remove one of the tab set's panels and its corresponding tab. - /// @param[in] tab_index The tab index to remove. If no tab matches this index, nothing will be removed. - void RemoveTab(int tab_index); - - /// Retrieve the number of tabs in the tabset. - /// @return The number of tabs. - int GetNumTabs(); - - /// Sets the currently active (visible) tab index. - /// @param[in] tab_index Index of the tab to display. - void SetActiveTab(int tab_index); - - /// Get the current active tab index. - /// @return The index of the active tab. - int GetActiveTab() const; - - /// Process the incoming event. - void ProcessEvent(Core::Event& event); - - /// Called when the listener has been attached to a new Element - void OnAttach(Element* element); - - /// Called when the listener has been detached from a Element - void OnDetach(Element* element); - -protected: - // Catch child add/removes so we can correctly set up their events. - virtual void OnChildAdd(Core::Element* child); - virtual void OnChildRemove(Core::Element* child); - -private: - Core::Element* GetChildByTag(const Rocket::Core::String& tag); - - int active_tab; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/Header.h b/libs/libRocket/Include/Rocket/Controls/Header.h deleted file mode 100644 index 19d714480b8..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/Header.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSHEADER_H -#define ROCKETCONTROLSHEADER_H - -#include "../Core/Platform.h" - -#ifdef STATIC_LIB - #define ROCKET_STATIC_LIB - #pragma message("DEPRECATED: STATIC_LIB macro has been deprecated in favor of ROCKET_STATIC_LIB and support will be removed in a future release") -#endif - -#if !defined ROCKET_STATIC_LIB - #ifdef ROCKET_PLATFORM_WIN32 - #ifdef RocketControls_EXPORTS - #define ROCKETCONTROLS_API __declspec(dllexport) - #else - #define ROCKETCONTROLS_API __declspec(dllimport) - #endif - #else - #define ROCKETCONTROLS_API __attribute__((visibility("default"))) - #endif -#else - #define ROCKETCONTROLS_API -#endif - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/Lua/Controls.h b/libs/libRocket/Include/Rocket/Controls/Lua/Controls.h deleted file mode 100644 index 20123703d3d..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/Lua/Controls.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUACONTROLS_H -#define ROCKETCONTROLSLUACONTROLS_H - -#include - -namespace Rocket { -namespace Controls { -namespace Lua { -/** Doxygen doesn't like to get the namespace, so the full name is -@c Rocket::Controls::Lua::RegisterTypes. -This will define all of the types from RocketControls for Lua. -@sa Rocket::Core::Lua::Interpreter::RegisterCoreTypes(lua_State*) -@relatesalso Rocket::Core::Lua::Interpreter*/ -void ROCKETLUA_API RegisterTypes(lua_State* L); -} -} -} -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/Lua/Header.h b/libs/libRocket/Include/Rocket/Controls/Lua/Header.h deleted file mode 100644 index 8c5e503860e..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/Lua/Header.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAHEADER_H -#define ROCKETCONTROLSLUAHEADER_H - -#include - -#ifdef ROCKETLUA_API -#undef ROCKETLUA_API -#endif - -#ifdef STATIC_LIB - #define ROCKET_STATIC_LIB - #pragma message("DEPRECATED: STATIC_LIB macro has been deprecated in favor of ROCKET_STATIC_LIB and support will be removed in a future release") -#endif - -#if !defined ROCKET_STATIC_LIB - #ifdef ROCKET_PLATFORM_WIN32 - #if defined RocketCoreLua_EXPORTS - #define ROCKETLUA_API __declspec(dllexport) - #elif defined RocketControlsLua_EXPORTS - #define ROCKETLUA_API __declspec(dllexport) - #else - #define ROCKETLUA_API __declspec(dllimport) - #endif - #else - #define ROCKETLUA_API __attribute__((visibility("default"))) - #endif -#else - #define ROCKETLUA_API -#endif - -#endif diff --git a/libs/libRocket/Include/Rocket/Controls/SelectOption.h b/libs/libRocket/Include/Rocket/Controls/SelectOption.h deleted file mode 100644 index 96e834c23b8..00000000000 --- a/libs/libRocket/Include/Rocket/Controls/SelectOption.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSSELECTOPTION_H -#define ROCKETCONTROLSSELECTOPTION_H - -#include "Header.h" -#include "../Core/String.h" - -namespace Rocket { -namespace Core { - -class Element; - -} - -namespace Controls { - -/** - Represents individual options within a select control. - - @author Peter Curry - */ - -class ROCKETCONTROLS_API SelectOption -{ -public: - SelectOption(Core::Element* element, const Rocket::Core::String& value, bool selectable); - ~SelectOption(); - - /// Returns the element that represents the option visually. - /// @return The option's element. - Core::Element* GetElement(); - /// Returns the value of the option. - /// @return The option's value. - const Rocket::Core::String& GetValue() const; - - /// Returns true if the item is selectable. - /// @return True if the item is selectable. - bool IsSelectable() { return selectable; } - -private: - Core::Element* element; - Rocket::Core::String value; - bool selectable; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core.h b/libs/libRocket/Include/Rocket/Core.h deleted file mode 100644 index 62c73b48af7..00000000000 --- a/libs/libRocket/Include/Rocket/Core.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORE_H -#define ROCKETCORE_H - -#include "Core/Core.h" - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/BaseXMLParser.h b/libs/libRocket/Include/Rocket/Core/BaseXMLParser.h deleted file mode 100644 index a58292234ba..00000000000 --- a/libs/libRocket/Include/Rocket/Core/BaseXMLParser.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREBASEXMLPARSER_H -#define ROCKETCOREBASEXMLPARSER_H - -#include "Header.h" -#include "Types.h" -#include "Dictionary.h" -#include - -namespace Rocket { -namespace Core { - -class Stream; - -typedef Dictionary XMLAttributes; - -/** - @author Peter Curry - */ - -class ROCKETCORE_API BaseXMLParser -{ - public: - BaseXMLParser(); - virtual ~BaseXMLParser(); - - /// Registers a tag as containing general character data. This will mean the contents of the tag will be parsed - /// similarly to a CDATA tag (ie, no other markup will be recognised until the section's closing tag is found). - /// @param[in] tag The tag to register as containing generic character data. - void RegisterCDATATag(const String& tag); - - /// Parses the given stream as an XML file, and calls the handlers when - /// interesting phenomena are encountered. - void Parse(Stream* stream); - - /// Get the line number in the stream. - /// @return The line currently being processed in the XML stream. - int GetLineNumber(); - - /// Called when the parser finds the beginning of an element tag. - virtual void HandleElementStart(const String& name, const XMLAttributes& attributes); - /// Called when the parser finds the end of an element tag. - virtual void HandleElementEnd(const String& name); - /// Called when the parser encounters data. - virtual void HandleData(const String& data); - - protected: - // The stream we're reading the XML from. - Stream* xml_source; - - private: - void ReadHeader(); - void ReadBody(); - - bool ReadOpenTag(); - bool ReadCloseTag(); - bool ReadAttributes(XMLAttributes& attributes); - bool ReadCDATA(const char* terminator = NULL); - - // Reads from the stream until a complete word is found. - // @param[out] word Word thats been found - // @param[in] terminators List of characters that terminate the search - bool FindWord(String& word, const char* terminators = NULL); - // Reads from the stream until the given character set is found. All - // intervening characters will be returned in data. - bool FindString(const unsigned char* string, String& data); - // Returns true if the next sequence of characters in the stream - // matches the given string. If consume is set and this returns true, - // the characters will be consumed. - bool PeekString(const unsigned char* string, bool consume = true); - - // Fill the buffer as much as possible, without removing any content that is still pending - bool FillBuffer(); - - unsigned char* read; - unsigned char* buffer; - int buffer_size; - int buffer_used; - int line_number; - int open_tag_depth; - - // The element attributes being read. - XMLAttributes attributes; - // The loose data being read. - String data; - - std::set< String > cdata_tags; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Box.h b/libs/libRocket/Include/Rocket/Core/Box.h deleted file mode 100644 index 140a034bda2..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Box.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREBOX_H -#define ROCKETCOREBOX_H - -#include "Types.h" - -namespace Rocket { -namespace Core { - -/** - Stores a box with four sized areas; content, padding, a border and margin. See - http://www.w3.org/TR/REC-CSS2/box.html#box-dimensions for a diagram. - - @author Peter Curry - */ - -class ROCKETCORE_API Box -{ -public: - enum Area - { - MARGIN = 0, - BORDER = 1, - PADDING = 2, - CONTENT = 3, - NUM_AREAS = 3, // ignores CONTENT - }; - - enum Edge - { - TOP = 0, - RIGHT = 1, - BOTTOM = 2, - LEFT = 3, - NUM_EDGES = 4 - }; - - /// Initialises a zero-sized box. - Box(); - /// Initialises a box with a default content area and no padding, borders and margins. - Box(const Vector2f& content); - ~Box(); - - /// Returns the offset of this box. This will usually be (0, 0). - /// @return The box's offset. - const Vector2f& GetOffset() const; - /// Returns the top-left position of one of the box's areas, relative to the top-left of the border area. This - /// means the position of the margin area is likely to be negative. - /// @param area[in] The desired area. - /// @return The position of the area. - Vector2f GetPosition(Area area = Box::CONTENT) const; - /// Returns the size of one of the box's areas. This will include all inner areas. - /// @param area[in] The desired area. - /// @return The size of the requested area. - Vector2f GetSize(Area area = Box::CONTENT) const; - - /// Sets the offset of the box, relative usually to the owning element. This should only be set for auxiliary - /// boxes of an element. - /// @param offset[in] The offset of the box from the primary box. - void SetOffset(const Vector2f& offset); - /// Sets the size of the content area. - /// @param content[in] The size of the new content area. - void SetContent(const Vector2f& content); - /// Sets the size of one of the edges of one of the box's outer areas. - /// @param area[in] The area to change. - /// @param edge[in] The area edge to change. - /// @param size[in] The new size of the area segment. - void SetEdge(Area area, Edge edge, float size); - - /// Returns the size of one of the area edges. - /// @param area[in] The desired area. - /// @param edge[in] The desired edge. - /// @return The size of the requested area edge. - float GetEdge(Area area, Edge edge) const; - /// Returns the cumulative size of one edge up to one of the box's areas. - /// @param area[in] The area to measure up to (and including). So, MARGIN will return the width of the margin, and PADDING will be the sum of the margin, border and padding. - /// @param edge[in] The desired edge. - /// @return The cumulative size of the edge. - float GetCumulativeEdge(Area area, Edge edge) const; - - /// Compares the size of the content area and the other area edges. - /// @return True if the boxes represent the same area. - bool operator==(const Box& rhs) const; - /// Compares the size of the content area and the other area edges. - /// @return True if the boxes do not represent the same area. - bool operator!=(const Box& rhs) const; - -private: - Vector2f content; - float area_edges[NUM_AREAS][NUM_EDGES]; - - Vector2f offset; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Colour.h b/libs/libRocket/Include/Rocket/Core/Colour.h deleted file mode 100644 index 8d154a56c5d..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Colour.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORECOLOUR_H -#define ROCKETCORECOLOUR_H - -#include "Header.h" - -namespace Rocket { -namespace Core { - -/** - Templated class for a four-component RGBA colour. - - @author Peter Curry - */ - -template < typename ColourType, int AlphaDefault > -class Colour -{ -public: - /// Lightweight, non-initialising constructor. - inline Colour(); - /// Initialising constructor. - /// @param[in] red Initial red value of the colour. - /// @param[in] green Initial green value of the colour. - /// @param[in] blue Initial blue value of the colour. - /// @param[in] alpha Initial alpha value of the colour. - inline Colour(ColourType red, ColourType green, ColourType blue, ColourType alpha = AlphaDefault); - - /// Returns the sum of this colour and another. This does not saturate the channels. - /// @param[in] rhs The colour to add this to. - /// @return The sum of the two colours. - inline Colour operator+(const Colour& rhs) const; - /// Returns the result of subtracting another colour from this colour. - /// @param[in] rhs The colour to subtract from this colour. - /// @return The result of the subtraction. - inline Colour operator-(const Colour& rhs) const; - /// Returns the result of multiplying this colour by another. - /// @param[in] rhs The colour to multiply by. - /// @return The result of the multiplication. - Colour operator*(const Colour& rhs) const; - /// Returns the result of multiplying this colour component-wise by a scalar. - /// @param[in] rhs The scalar value to multiply by. - /// @return The result of the scale. - inline Colour operator*(float rhs) const; - /// Returns the result of dividing this colour component-wise by a scalar. - /// @param[in] rhs The scalar value to divide by. - /// @return The result of the scale. - inline Colour operator/(float rhs) const; - - /// Adds another colour to this in-place. This does not saturate the channels. - /// @param[in] rhs The colour to add. - inline void operator+=(const Colour& rhs); - /// Subtracts another colour from this in-place. - /// @param[in] rhs The colour to subtract. - inline void operator-=(const Colour& rhs); - /// Multiplies this colour component-wise with another in-place. - /// @param[in] rhs The colour to multiply by. - /// @return This colour, post-operation. - void operator*=(const Colour& rhs); - /// Scales this colour component-wise in-place. - /// @param[in] rhs The value to scale this colours's components by. - inline void operator*=(float rhs); - /// Scales this colour component-wise in-place by the inverse of a value. - /// @param[in] rhs The value to divide this colour's components by. - inline void operator/=(float rhs); - - /// Equality operator. - /// @param[in] rhs The colour to compare this against. - /// @return True if the two colours are equal, false otherwise. - inline bool operator==(const Colour& rhs) { return red == rhs.red && green == rhs.green && blue == rhs.blue && alpha == rhs.alpha; } - /// Inequality operator. - /// @param[in] rhs The colour to compare this against. - /// @return True if the two colours are not equal, false otherwise. - inline bool operator!=(const Colour& rhs) { return red != rhs.red || green != rhs.green || blue != rhs.blue || alpha != rhs.alpha; } - - /// Auto-cast operator. - /// @return A pointer to the first value. - inline operator const ColourType*() const { return &red; } - /// Constant auto-cast operator. - /// @return A constant pointer to the first value. - inline operator ColourType*() { return &red; } - - ColourType red, green, blue, alpha; -}; - -} -} - -namespace Rocket { -namespace Core { - -#include "Colour.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Colour.inl b/libs/libRocket/Include/Rocket/Core/Colour.inl deleted file mode 100644 index d9344eb2886..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Colour.inl +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -// Lightweight, non-initialising constructor. -template < typename ColourType, int AlphaDefault > -Colour< ColourType, AlphaDefault >::Colour() -{ -} - -// Initialising constructor. -template < typename ColourType, int AlphaDefault > -Colour< ColourType, AlphaDefault >::Colour(ColourType _red, ColourType _green, ColourType _blue, ColourType _alpha) -{ - red = _red; - green = _green; - blue = _blue; - alpha = _alpha; -} - -// Returns the sum of this colour and another. This does not saturate the channels. -template < typename ColourType, int AlphaDefault > -Colour< ColourType, AlphaDefault > Colour< ColourType, AlphaDefault >::operator+(const Colour< ColourType, AlphaDefault >& rhs) const -{ - return Colour< ColourType, AlphaDefault >(red + rhs.red, green + rhs.green, blue + rhs.blue, alpha + rhs.alpha); -} - -// Returns the result of subtracting another colour from this colour. -template < typename ColourType, int AlphaDefault > -Colour< ColourType, AlphaDefault > Colour< ColourType, AlphaDefault >::operator-(const Colour< ColourType, AlphaDefault >& rhs) const -{ - return Colour< ColourType, AlphaDefault >(red - rhs.red, green - rhs.green, blue - rhs.blue, alpha - rhs.alpha); -} - -// Returns the result of multiplying this colour component-wise by a scalar. -template < typename ColourType, int AlphaDefault > -Colour< ColourType, AlphaDefault > Colour< ColourType, AlphaDefault >::operator*(float rhs) const -{ - return Colour((ColourType) (red * rhs), (ColourType) (green * rhs), (ColourType) (blue * rhs), (ColourType) (alpha * rhs)); -} - -// Returns the result of dividing this colour component-wise by a scalar. -template < typename ColourType, int AlphaDefault > -Colour< ColourType, AlphaDefault > Colour< ColourType, AlphaDefault >::operator/(float rhs) const -{ - return Colour((ColourType) (red / rhs), (ColourType) (green / rhs), (ColourType) (blue / rhs), (ColourType) (alpha / rhs)); -} - -// Adds another colour to this in-place. This does not saturate the channels. -template < typename ColourType, int AlphaDefault > -void Colour< ColourType, AlphaDefault >::operator+=(const Colour& rhs) -{ - red += rhs.red; - green += rhs.green; - blue += rhs.blue; - alpha += rhs.alpha; -} - -// Subtracts another colour from this in-place. -template < typename ColourType, int AlphaDefault > -void Colour< ColourType, AlphaDefault >::operator-=(const Colour& rhs) -{ - red -= rhs.red; - green -= rhs.green; - blue -= rhs.blue; - alpha -= rhs.alpha; -} - -// Scales this colour component-wise in-place. -template < typename ColourType, int AlphaDefault > -void Colour< ColourType, AlphaDefault >::operator*=(float rhs) -{ - red = (ColourType)(red * rhs); - green = (ColourType)(green * rhs); - blue = (ColourType)(blue * rhs); - alpha = (ColourType)(alpha * rhs); -} - -// Scales this colour component-wise in-place by the inverse of a value. -template < typename ColourType, int AlphaDefault > -void Colour< ColourType, AlphaDefault >::operator/=(float rhs) -{ - *this *= (1.0f / rhs); -} - -template < > -Colour< float, 1 > ROCKETCORE_API Colour< float, 1 >::operator*(const Colour< float, 1 >& rhs) const; - -template < > -Colour< byte, 255 > ROCKETCORE_API Colour< byte, 255 >::operator*(const Colour< byte, 255 >& rhs) const; - -template < > -void ROCKETCORE_API Colour< float, 1 >::operator*=(const Colour& rhs); - -template < > -void ROCKETCORE_API Colour< byte, 255 >::operator*=(const Colour& rhs); diff --git a/libs/libRocket/Include/Rocket/Core/Context.h b/libs/libRocket/Include/Rocket/Core/Context.h deleted file mode 100644 index 3183fcd2356..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Context.h +++ /dev/null @@ -1,341 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORECONTEXT_H -#define ROCKETCORECONTEXT_H - -#include "Header.h" -#include "Types.h" -#include "ReferenceCountable.h" -#include "ElementReference.h" -#include "Input.h" -#include "String.h" -#include "ScriptInterface.h" - -namespace Rocket { -namespace Core { - -class Stream; -class Dictionary; - -} -} - -namespace Rocket { -namespace Core { - -class ContextInstancer; -class ElementDocument; -class EventListener; -class RenderInterface; - -/** - A context for storing, rendering and processing RML documents. Multiple contexts can exist simultaneously. - - @author Peter Curry - */ - -class ROCKETCORE_API Context : public ScriptInterface -{ -public: - /// Constructs a new, uninitialised context. This should not be called directly, use Core::CreateContext() - /// instead. - /// @param[in] name The name of the context. - Context(const String& name); - /// Destroys a context. - virtual ~Context(); - - /// Returns the name of the context. - /// @return The context's name. - const String& GetName() const; - - /// Changes the dimensions of the context. - /// @param[in] dimensions The new dimensions of the context. - void SetDimensions(const Vector2i& dimensions); - /// Returns the dimensions of the context. - /// @return The current dimensions of the context. - const Vector2i& GetDimensions() const; - - /// Updates all elements in the context's documents. - bool Update(); - /// Renders all visible elements in the context's documents. - bool Render(); - - /// Creates a new, empty document and places it into this context. - /// @param[in] tag The document type to create. - /// @return The new document, or NULL if no document could be created. The document is returned with a reference owned by the caller. - ElementDocument* CreateDocument(const String& tag = "body"); - /// Load a document into the context. - /// @param[in] document_path The path to the document to load. - /// @return The loaded document, or NULL if no document was loaded. The document is returned with a reference owned by the caller. - ElementDocument* LoadDocument(const String& document_path); - /// Load a document into the context. - /// @param[in] document_stream The opened stream, ready to read. - /// @return The loaded document, or NULL if no document was loaded. The document is returned with a reference owned by the caller. - ElementDocument* LoadDocument(Stream* document_stream); - /// Load a document into the context. - /// @param[in] string The string containing the document RML. - /// @return The loaded document, or NULL if no document was loaded. The document is returned with a reference owned by the caller. - ElementDocument* LoadDocumentFromMemory(const String& string); - /// Unload the given document. - /// @param[in] document The document to unload. - void UnloadDocument(ElementDocument* document); - /// Unloads all loaded documents. - void UnloadAllDocuments(); - - /// Adds a previously-loaded cursor document as a mouse cursor within this context. This allows you to share - /// cursors between contexts. - /// @param[in] cursor_document The document to add as a cursor into this context. - void AddMouseCursor(ElementDocument* cursor_document); - /// Loads a document as a mouse cursor within this context. - /// @param[in] cursor_document_path The path to the document to load as a cursor. - /// @return The loaded cursor document, or NULL if no document was loaded. The document is returned with a reference owned by the caller. - ElementDocument* LoadMouseCursor(const String& cursor_document_path); - /// Unload the given cursor. - /// @param[in] cursor_name The name of cursor to unload. - void UnloadMouseCursor(const String& cursor_name); - /// Unloads all currently loaded cursors. - void UnloadAllMouseCursors(); - /// Sets a cursor as the active cursor. - /// @param[in] cursor_name The name of the cursor to activate. - /// @return True if a cursor exists with the given name, false if not. - bool SetMouseCursor(const String& cursor_name); - /// Shows or hides the cursor. - /// @param[in] show True to show the cursor, false to hide it. - void ShowMouseCursor(bool show); - - /// Returns the first document in the context with the given id. - /// @param[in] id The id of the desired document. - /// @return The document (if it was found), or NULL if no document exists with the ID. The document is returned with a borrowed reference. - ElementDocument* GetDocument(const String& id); - /// Returns a document in the context by index. - /// @param[in] index The index of the desired document. - /// @return The document (if one exists with this index), or NULL if the index was invalid. The document is returned with a borrowed reference. - ElementDocument* GetDocument(int index); - /// Returns the number of documents in the context. - /// @return The number of documents in the context. - int GetNumDocuments() const; - - /// Returns the hover element. - /// @return The element the mouse cursor is hovering over. The element is returned with a borrowed reference. - Element* GetHoverElement(); - - /// Returns the focus element. - /// @return The element with input focus. The element is returned with a borrowed reference. - Element* GetFocusElement(); - - /// Returns the root element that holds all the documents - /// @return The root element. The element is returned with a borrowed reference. - Element* GetRootElement(); - - /// Brings the document to the front of the document stack. - /// @param[in] document The document to pull to the front of the stack. - void PullDocumentToFront(ElementDocument* document); - /// Sends the document to the back of the document stack. - /// @param[in] document The document to push to the bottom of the stack. - void PushDocumentToBack(ElementDocument* document); - - /// Adds an event listener to the context's root element. - /// @param[in] event The name of the event to attach to. - /// @param[in] listener Listener object to be attached. - /// @param[in] in_capture_phase True if the listener is to be attached to the capture phase, false for the bubble phase. - void AddEventListener(const String& event, EventListener* listener, bool in_capture_phase = false); - /// Removes an event listener from the context's root element. - /// @param[in] event The name of the event to detach from. - /// @param[in] listener Listener object to be detached. - /// @param[in] in_capture_phase True to detach from the capture phase, false from the bubble phase. - void RemoveEventListener(const String& event, EventListener* listener, bool in_capture_phase = false); - - /// Sends a key down event into this context. - /// @param[in] key_identifier The key pressed. - /// @param[in] key_modifier_state The state of key modifiers (shift, control, caps-lock, etc) keys; this should be generated by ORing together members of the Input::KeyModifier enumeration. - /// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was. - bool ProcessKeyDown(Input::KeyIdentifier key_identifier, int key_modifier_state); - /// Sends a key up event into this context. - /// @param[in] key_identifier The key released. - /// @param[in] key_modifier_state The state of key modifiers (shift, control, caps-lock, etc) keys; this should be generated by ORing together members of the Input::KeyModifier enumeration. - /// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was. - bool ProcessKeyUp(Input::KeyIdentifier key_identifier, int key_modifier_state); - - /// Sends a single character of text as text input into this context. - /// @param[in] character The UCS-2 character to send into this context. - /// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was. - bool ProcessTextInput(word character); - /// Sends a string of text as text input into this context. - /// @param[in] string The UCS-2 string to send into this context. - /// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was. - bool ProcessTextInput(const String& string); - - /// Sends a mouse movement event into this context. - /// @param[in] x The x-coordinate of the mouse cursor, in window-coordinates (ie, 0 should be the left of the client area). - /// @param[in] y The y-coordinate of the mouse cursor, in window-coordinates (ie, 0 should be the top of the client area). - /// @param[in] key_modifier_state The state of key modifiers (shift, control, caps-lock, etc) keys; this should be generated by ORing together members of the Input::KeyModifier enumeration. - void ProcessMouseMove(int x, int y, int key_modifier_state); - /// Sends a mouse-button down event into this context. - /// @param[in] button_index The index of the button that was pressed; 0 for the left button, 1 for right, and any others from 2 onwards. - /// @param[in] key_modifier_state The state of key modifiers (shift, control, caps-lock, etc) keys; this should be generated by ORing together members of the Input::KeyModifier enumeration. - void ProcessMouseButtonDown(int button_index, int key_modifier_state); - /// Sends a mouse-button up event into this context. - /// @param[in] button_index The index of the button that was release; 0 for the left button, 1 for right, and any others from 2 onwards. - /// @param[in] key_modifier_state The state of key modifiers (shift, control, caps-lock, etc) keys; this should be generated by ORing together members of the Input::KeyModifier enumeration. - void ProcessMouseButtonUp(int button_index, int key_modifier_state); - /// Sends a mouse-wheel movement event into this context. - /// @param[in] wheel_delta The mouse-wheel movement this frame. Rocket treats a negative delta as up movement (away from the user), positive as down. - /// @param[in] key_modifier_state The state of key modifiers (shift, control, caps-lock, etc) keys; this should be generated by ORing together members of the Input::KeyModifier enumeration. - /// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was. - bool ProcessMouseWheel(int wheel_delta, int key_modifier_state); - - /// Gets the context's render interface. - /// @return The render interface the context renders through. - RenderInterface* GetRenderInterface() const; - /// Gets the current clipping region for the render traversal - /// @param[out] origin The clipping origin - /// @param[out] dimensions The clipping dimensions - bool GetActiveClipRegion(Vector2i& origin, Vector2i& dimensions) const; - /// Sets the current clipping region for the render traversal - /// @param[out] origin The clipping origin - /// @param[out] dimensions The clipping dimensions - void SetActiveClipRegion(const Vector2i& origin, const Vector2i& dimensions); - - /// Sets the instancer to use for releasing this object. - /// @param[in] instancer The context's instancer. - void SetInstancer(ContextInstancer* instancer); - -protected: - virtual void OnReferenceDeactivate(); - -private: - String name; - Vector2i dimensions; - - ContextInstancer* instancer; - - typedef std::set< ElementReference > ElementSet; - typedef std::vector< ElementReference > ElementList; - // Set of elements that are currently in hover state. - ElementSet hover_chain; - // List of elements that are currently in active state. - ElementList active_chain; - // History of windows that have had focus - ElementList document_focus_history; - - // Documents that have been unloaded from the context but not yet released. - ElementList unloaded_documents; - - // Root of the element tree. - Element* root; - // The element that current has input focus. - ElementReference focus; - // The top-most element being hovered over. - ElementReference hover; - // The element that was being hovered over when the primary mouse button was pressed most recently. - ElementReference active; - - // The element that was clicked on last. - Element* last_click_element; - // The time the last click occured. - float last_click_time; - - typedef std::map< String, ElementDocument* > CursorMap; - CursorMap cursors; - ElementReference default_cursor; - ElementReference active_cursor; - bool show_cursor; - - ElementDocument* cursor_proxy; - - // The element that is currently being dragged (or about to be dragged). - ElementReference drag; - // True if a drag has begun (ie, the ondragstart event has been fired for the drag element), false otherwise. - bool drag_started; - // True if the current drag is a verbose drag (ie, sends ondragover, ondragout, ondragdrop, etc, events). - bool drag_verbose; - // Used when dragging a cloned object. - Element* drag_clone; - - // The element currently being dragged over; this is equivalent to hover, but only set while an element is being - // dragged, and excludes the dragged element. - ElementReference drag_hover; - // Set of elements that are currently being dragged over; this differs from the hover state as the dragged element - // itself can't be part of it. - ElementSet drag_hover_chain; - - // Input state; stored from the most recent input events we receive from the application. - Vector2i mouse_position; - - // The render interface this context renders through. - RenderInterface* render_interface; - Vector2i clip_origin; - Vector2i clip_dimensions; - - // Internal callback for when an element is removed from the hierarchy. - void OnElementRemove(Element* element); - // Internal callback for when a new element gains focus. - bool OnFocusChange(Element* element); - - // Generates an event for faking clicks on an element. - void GenerateClickEvent(Element* element); - - // Updates the current hover elements, sending required events. - void UpdateHoverChain(const Dictionary& parameters, const Dictionary& drag_parameters, const Vector2i& old_mouse_position); - // Returns the youngest descendent of the given element which is under the given point in screen coordinates. - // @param[in] point The point to test. - // @param[in] ignore_element If set, this element and its descendents will be ignored. - // @param[in] element Used internally. - // @return The element under the point, or NULL if nothing is. - Element* GetElementAtPoint(const Vector2f& point, const Element* ignore_element = NULL, Element* element = NULL); - - // Creates the drag clone from the given element. The old drag clone will be released if - // necessary. - // @param[in] element The element to clone. - void CreateDragClone(Element* element); - // Releases the drag clone, if one exists. - void ReleaseDragClone(); - - // Builds the parameters for a generic key event. - void GenerateKeyEventParameters(Dictionary& parameters, Input::KeyIdentifier key_identifier); - // Builds the parameters for a generic mouse event. - void GenerateMouseEventParameters(Dictionary& parameters, int button_index = -1); - // Builds the parameters for the key modifier state. - void GenerateKeyModifierEventParameters(Dictionary& parameters, int key_modifier_state); - // Builds the parameters for a drag event. - void GenerateDragEventParameters(Dictionary& parameters); - - // Releases all unloaded documents pending destruction. - void ReleaseUnloadedDocuments(); - - // Sends the specified event to all elements in new_items that don't appear in old_items. - static void SendEvents(const ElementSet& old_items, const ElementSet& new_items, const String& event, const Dictionary& parameters, bool interruptible); - - friend class Element; - friend ROCKETCORE_API Context* CreateContext(const String&, const Vector2i&, RenderInterface*); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ContextInstancer.h b/libs/libRocket/Include/Rocket/Core/ContextInstancer.h deleted file mode 100644 index 913ca6ddf05..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ContextInstancer.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORECONTEXTINSTANCER_H -#define ROCKETCORECONTEXTINSTANCER_H - -#include "ReferenceCountable.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Context; -class Event; - -/** - Abstract instancer interface for instancing contexts. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API ContextInstancer : public ReferenceCountable -{ -public: - virtual ~ContextInstancer(); - - /// Instances a context. - /// @param[in] name Name of this context. - /// @return The instanced context. - virtual Context* InstanceContext(const String& name) = 0; - - /// Releases a context previously created by this context. - /// @param[in] context The context to release. - virtual void ReleaseContext(Context* context) = 0; - - /// Releases this context instancer - virtual void Release() = 0; - -private: - virtual void OnReferenceDeactivate(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ConvolutionFilter.h b/libs/libRocket/Include/Rocket/Core/ConvolutionFilter.h deleted file mode 100644 index 41874239431..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ConvolutionFilter.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORECONVOLUTIONFILTER_H -#define ROCKETCORECONVOLUTIONFILTER_H - -namespace Rocket { -namespace Core { - -/** - A programmable convolution filter, designed to aid in the generation of texture data by custom - FontEffect types. - - @author Peter Curry - */ - -class ConvolutionFilter -{ -public: - enum FilterOperation - { - // The result is the median value of all the filtered pixels. - MEDIAN, - // The result is the smallest value of all filtered pixels. - DILATION, - // The result is the largest value of all the filtered pixels. - EROSION - }; - - ConvolutionFilter(); - ~ConvolutionFilter(); - - /// Initialises the filter. A filter must be initialised and populated with values before use. - /// @param[in] kernel_size The size of the filter's kernel each side of the origin. So, for example, a filter initialised with a size of 1 will store 9 values. - /// @param[in] operation The operation the filter conducts to determine the result. - bool Initialise(int kernel_size, FilterOperation operation = MEDIAN); - - /// Returns a reference to one of the rows of the filter kernel. - /// @param[in] index The index of the desired row. - /// @return The row of kernel values. - float* operator[](int index); - - /// Runs the convolution filter. The filter will operate on each pixel in the destination - /// surface, setting its opacity to the result the filter on the source opacity values. The - /// colour values will remain unchanged. - /// @param[in] destination The RGBA-encoded destination buffer. - /// @param[in] destination_dimensions The size of the destination region (in pixels). - /// @param[in] destination_stride The stride (in bytes) of the destination region. - /// @param[in] source The opacity information for the source buffer. - /// @param[in] source_dimensions The size of the source region (in pixels). The stride is assumed to be equivalent to the horizontal width. - /// @param[in] source_offset The offset of the source region from the destination region. This is usually the same as the kernel size. - void Run(byte* destination, const Vector2i& destination_dimensions, int destination_stride, const byte* source, const Vector2i& source_dimensions, const Vector2i& source_offset) const; - -private: - int kernel_size; - float* kernel; - - FilterOperation operation; -}; - -} -} - -#endif - diff --git a/libs/libRocket/Include/Rocket/Core/Core.h b/libs/libRocket/Include/Rocket/Core/Core.h deleted file mode 100644 index 439fc57678a..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Core.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORECORE_H -#define ROCKETCORECORE_H - -#include "Types.h" -#include "Math.h" -#include "Header.h" -#include "Box.h" -#include "Context.h" -#include "ContextInstancer.h" -#include "Decorator.h" -#include "DecoratorInstancer.h" -#include "Element.h" -#include "ElementDocument.h" -#include "ElementInstancer.h" -#include "ElementInstancerGeneric.h" -#include "ElementReference.h" -#include "ElementScroll.h" -#include "ElementText.h" -#include "ElementUtilities.h" -#include "Event.h" -#include "EventInstancer.h" -#include "EventListener.h" -#include "EventListenerInstancer.h" -#include "Factory.h" -#include "FileInterface.h" -#include "Font.h" -#include "FontDatabase.h" -#include "FontEffect.h" -#include "FontGlyph.h" -#include "Geometry.h" -#include "GeometryUtilities.h" -#include "Input.h" -#include "Log.h" -#include "Plugin.h" -#include "Property.h" -#include "PropertyDefinition.h" -#include "PropertyDictionary.h" -#include "PropertyParser.h" -#include "PropertySpecification.h" -#include "RenderInterface.h" -#include "String.h" -#include "StyleSheet.h" -#include "StyleSheetKeywords.h" -#include "StyleSheetSpecification.h" -#include "SystemInterface.h" -#include "Texture.h" -#include "Types.h" -#include "Vertex.h" -#include "XMLNodeHandler.h" -#include "XMLParser.h" - -namespace Rocket { -namespace Core { - -class Plugin; - -/** - Rocket library core API. - - @author Peter Curry - */ - -/// Initialises Rocket. -ROCKETCORE_API bool Initialise(); -/// Shutdown Rocket. -ROCKETCORE_API void Shutdown(); - -/// Returns the version of this Rocket library. -/// @return The version number. -ROCKETCORE_API String GetVersion(); - -/// Sets the interface through which all system requests are made. This must be called before Initialise(). -/// @param[in] system_interface The application-specified logging interface. -ROCKETCORE_API void SetSystemInterface(SystemInterface* system_interface); -/// Returns Rocket's system interface. -/// @return Rocket's system interface. -ROCKETCORE_API SystemInterface* GetSystemInterface(); - -/// Sets the interface through which all rendering requests are made. This is not required to be called, but if it is -/// it must be called before Initialise(). If no render interface is specified, then all contexts must have a custom -/// render interface. -/// @param[in] render_interface Render interface implementation. -ROCKETCORE_API void SetRenderInterface(RenderInterface* render_interface); -/// Returns Rocket's default's render interface. -/// @return Rocket's render interface. -ROCKETCORE_API RenderInterface* GetRenderInterface(); - -/// Sets the interface through which all file I/O requests are made. This is not required to be called, but if it is it -/// must be called before Initialise(). -/// @param[in] file_interface The application-specified file interface -ROCKETCORE_API void SetFileInterface(FileInterface* file_interface); -/// Returns Rocket's file interface. -/// @return Rocket's file interface. -ROCKETCORE_API FileInterface* GetFileInterface(); - -/// Creates a new element context. -/// @param[in] name The new name of the context. This must be unique. -/// @param[in] dimensions The initial dimensions of the new context. -/// @param[in] render_interface The custom render interface to use, or NULL to use the default. -/// @return The new context, or NULL if the context could not be created. -ROCKETCORE_API Context* CreateContext(const String& name, const Vector2i& dimensions, RenderInterface* render_interface = NULL); -/// Fetches a previously constructed context by name. -/// @param[in] name The name of the desired context. -/// @return The desired context, or NULL if no context exists with the given name. -ROCKETCORE_API Context* GetContext(const String& name); -/// Fetches a context by index. -/// @param[in] index The index of the desired context. If this is outside of the valid range of contexts, it will be clamped. -/// @return The requested context, or NULL if no contexts exist. -ROCKETCORE_API Context* GetContext(int index); -/// Returns the number of active contexts. -/// @return The total number of active Rocket contexts. -ROCKETCORE_API int GetNumContexts(); - -/// Registers a generic Rocket plugin. -ROCKETCORE_API void RegisterPlugin(Plugin* plugin); - -/// Forces all compiled geometry handles generated by libRocket to be released. -ROCKETCORE_API void ReleaseCompiledGeometries(); -/// Forces all texture handles loaded and generated by libRocket to be released. -ROCKETCORE_API void ReleaseTextures(); - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Debug.h b/libs/libRocket/Include/Rocket/Core/Debug.h deleted file mode 100644 index ea58313c9b1..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Debug.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDEBUG_H -#define ROCKETCOREDEBUG_H - -#include "Header.h" - -// Define for breakpointing. -#if defined (ROCKET_PLATFORM_WIN32) - #if defined (__MINGW32__) - #define ROCKET_BREAK {asm("int $0x03");} - #elif defined (_MSC_VER) - #define ROCKET_BREAK {__debugbreak();} - #else - #define ROCKET_BREAK - #endif -#elif defined (ROCKET_PLATFORM_LINUX) - #if defined __GNUC__ - #define ROCKET_BREAK {__builtin_trap();} - #else - #define ROCKET_BREAK - #endif -#elif defined (ROCKET_PLATFORM_MACOSX) - #define ROCKET_BREAK {__builtin_trap();} -#endif - - - -// Define the LT_ASSERT and ROCKET_VERIFY macros. -#if !defined ROCKET_DEBUG -#define ROCKET_ASSERT(x) -#define ROCKET_ASSERTMSG(x, m) -#define ROCKET_ERROR -#define ROCKET_ERRORMSG(m) -#define ROCKET_VERIFY(x) x -#else -namespace Rocket { -namespace Core { - -bool ROCKETCORE_API Assert(const char* message, const char* file, int line); -#define ROCKET_ASSERT(x) \ -if (!(x)) \ -{ \ - if (!Rocket::Core::Assert("ROCKET_ASSERT("#x")", __FILE__, __LINE__ )) \ - { \ - ROCKET_BREAK; \ - } \ -} -#define ROCKET_ASSERTMSG(x, m) \ -if (!(x)) \ -{ \ - if (!Rocket::Core::Assert(m, __FILE__, __LINE__ )) \ - { \ - ROCKET_BREAK; \ - } \ -} -#define ROCKET_ERROR \ -if (!Rocket::Core::Assert("ROCKET_ERROR", __FILE__, __LINE__)) \ -{ \ - ROCKET_BREAK; \ -} -#define ROCKET_ERRORMSG(m) \ -if (!Rocket::Core::Assert(m, __FILE__, __LINE__)) \ -{ \ - ROCKET_BREAK; \ -} -#define ROCKET_VERIFY(x) ROCKET_ASSERT(x) - -} -} -#endif - -namespace Rocket { -namespace Core { - -template struct STATIC_ASSERTION_FAILURE; -template <> struct STATIC_ASSERTION_FAILURE{}; - -} -} -#define ROCKET_STATIC_ASSERT(cond, msg) Rocket::Core::STATIC_ASSERTION_FAILURE msg; (void)&msg; - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Decorator.h b/libs/libRocket/Include/Rocket/Core/Decorator.h deleted file mode 100644 index 9be5a5b107c..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Decorator.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATOR_H -#define ROCKETCOREDECORATOR_H - -#include "ReferenceCountable.h" -#include -#include "Header.h" -#include "Texture.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - -class DecoratorInstancer; -class Element; -class PropertyDictionary; -class Property; -struct Texture; -class TextureResource; - -/** - The abstract base class for any visual object that can be attached to any element. - - @author Peter Curry - */ - -class ROCKETCORE_API Decorator : public ReferenceCountable -{ -public: - Decorator(); - virtual ~Decorator(); - - /// Called on a decorator to generate any required per-element data for a newly decorated element. - /// @param[in] element The newly decorated element. - /// @return A handle to a decorator-defined data handle, or NULL if none is needed for the element. - virtual DecoratorDataHandle GenerateElementData(Element* element) = 0; - /// Called to release element data generated by this decorator. - /// @param[in] element_data The element data handle to release. - virtual void ReleaseElementData(DecoratorDataHandle element_data) = 0; - - /// Sets the z-index of the decorator. A decorator with a higher z-index will be rendered after a decorator - /// with a lower z-index. By default, all decorators have a z-index of 0. - /// @param[in] z-index The new z-index of the decorator. - void SetZIndex(float z_index); - /// Returns the decorator's z-index. - /// @return The z-index of the decorator. - float GetZIndex() const; - - /// Sets the specificity of the decorator. - /// @param[in] specificity The specificity of the decorator. - void SetSpecificity(int specificity); - /// Returns the specificity of the decorator. This is used when multiple pseudo-classes are active on an - /// element, each with similarly-named decorators. - /// @return The specificity of the decorator. - int GetSpecificity() const; - - /// Called to render the decorator on an element. - /// @param[in] element The element to render the decorator on. - /// @param[in] element_data The handle to the data generated by the decorator for the element. - virtual void RenderElement(Element* element, DecoratorDataHandle element_data) = 0; - - /// Value specifying an invalid or non-existent Decorator data handle. - static const DecoratorDataHandle INVALID_DECORATORDATAHANDLE = 0; - -protected: - /// Releases the decorator through its instancer. - virtual void OnReferenceDeactivate(); - - /// Attempts to load a texture into the list of textures in use by the decorator. - /// @param[in] texture_name The name of the texture to load. - /// @param[in] rcss_path The RCSS file the decorator definition was loaded from; this is used to resolve relative paths. - /// @return The index of the texture if the load was successful, or -1 if the load failed. - int LoadTexture(const String& texture_name, const String& rcss_path); - /// Returns one of the decorator's previously loaded textures. - /// @param[in] index The index of the desired texture. - /// @return The texture at the appropriate index, or NULL if the index was invalid. - const Texture* GetTexture(int index = 0) const; - - /// Returns the floating-point value of a numerical property from a dictionary of properties, resolving it - /// against a base value if it is a relative property. - /// @param[in] properties The user-supplied dictionary of properties. - /// @param[in] name The name of the desired property. This must be a numerical property. - /// @return The fully-resolved value of the property, or 0 if an error occured. - float ResolveProperty(const PropertyDictionary& properties, const String& name, float base_value) const; - -private: - DecoratorInstancer* instancer; - - // The z-index of this decorator, used to resolve render order when multiple decorators are rendered - // simultaneously on the same element. - float z_index; - // The maximum specificity of the properties used to define the decorator. - int specificity; - - // Stores a list of textures in use by this decorator. - std::vector< Texture > textures; - - friend class Factory; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/DecoratorInstancer.h b/libs/libRocket/Include/Rocket/Core/DecoratorInstancer.h deleted file mode 100644 index 17ab802e7cd..00000000000 --- a/libs/libRocket/Include/Rocket/Core/DecoratorInstancer.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORINSTANCER_H -#define ROCKETCOREDECORATORINSTANCER_H - -#include "ReferenceCountable.h" -#include "Header.h" -#include "PropertyDictionary.h" -#include "PropertySpecification.h" - -namespace Rocket { -namespace Core { - -class Decorator; - -/** - An element instancer provides a method for allocating and deallocating decorators. - - It is important at the same instancer that allocated a decorator releases it. This ensures there are no issues with - memory from different DLLs getting mixed up. - - @author Peter Curry - */ - -class ROCKETCORE_API DecoratorInstancer : public ReferenceCountable -{ -public: - DecoratorInstancer(); - virtual ~DecoratorInstancer(); - - /// Instances a decorator given the property tag and attributes from the RCSS file. - /// @param[in] name The type of decorator desired. For example, "background-decorator: simple;" is declared as type "simple". - /// @param[in] properties All RCSS properties associated with the decorator. - /// @return The decorator if it was instanced successfully, NULL if an error occured. - virtual Decorator* InstanceDecorator(const String& name, const PropertyDictionary& properties) = 0; - /// Releases the given decorator. - /// @param[in] decorator Decorator to release. This is guaranteed to have been constructed by this instancer. - virtual void ReleaseDecorator(Decorator* decorator) = 0; - - /// Releases the instancer. - virtual void Release() = 0; - - /// Returns the property specification associated with the instancer. - const PropertySpecification& GetPropertySpecification() const; - -protected: - /// Registers a property for the decorator. - /// @param[in] property_name The name of the new property (how it is specified through RCSS). - /// @param[in] default_value The default value to be used. - /// @return The new property definition, ready to have parsers attached. - PropertyDefinition& RegisterProperty(const String& property_name, const String& default_value); - /// Registers a shorthand property definition. - /// @param[in] shorthand_name The name to register the new shorthand property under. - /// @param[in] properties A comma-separated list of the properties this definition is shorthand for. The order in which they are specified here is the order in which the values will be processed. - /// @param[in] type The type of shorthand to declare. - /// @param True if all the property names exist, false otherwise. - bool RegisterShorthand(const String& shorthand_name, const String& property_names, PropertySpecification::ShorthandType type = PropertySpecification::AUTO); - - // Releases the instancer. - virtual void OnReferenceDeactivate(); - -private: - PropertySpecification properties; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Dictionary.h b/libs/libRocket/Include/Rocket/Core/Dictionary.h deleted file mode 100644 index 065d13e0b9f..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Dictionary.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDICTIONARY_H -#define ROCKETCOREDICTIONARY_H - -#include "Header.h" -#include "Variant.h" - -namespace Rocket { -namespace Core { - -/** - A dictionay is a container of variants. - It uses a hash table to maintain a string key to variant mapping. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API Dictionary -{ -public: - Dictionary(); - Dictionary(const Dictionary &dict); - ~Dictionary(); - - /// Store an item in the dictionary - void Set(const String& key, const Variant &value); - - /// Templated set eases setting of values - template - inline void Set(const String& key, const T& value); - - /// Get an item from the dictionary - Variant* Get(const String& key) const; - Variant* operator[](const String& key) const; - - /// Get a value from the dictionary, if it doesn't exist - /// use the supplied default value - template - inline T Get(const String& key, const T& default_val) const; - - /// Get a value from the dictionary, returns if the - /// value was found or not. - template - inline bool GetInto(const String& key, T& value) const; - - /// Remove an item from the dictionary - bool Remove(const String& key); - - /// Iterate through a dictionary - bool Iterate(int &pos, String& key, Variant* &value) const; - template - bool Iterate(int &pos, String& key, T& value) const; - - /// Reserve the specified number of entries in the dictionary - bool Reserve(int size); - - /// Empty the dictionary - void Clear(); - - /// Is the dictionary empty? - bool IsEmpty() const; - - /// Items in the dict - int Size() const; - - /// Merges another dictionary into this one. Any existing values stored against similar keys will be updated. - void Merge(const Dictionary& dict); - - // Copy - void operator=(const Dictionary &dict); - -private: - unsigned int num_full; // Active + # Dummy - unsigned int num_used; // Active - - /* DICTIONARY_MINSIZE is the minimum size of a dictionary. This many slots are - * allocated directly in the dict object (in the small_table member). - * It must be a power of 2, and at least 4. 8 allows dicts with no more - * than 5 active entries to live in small_table (and so avoid an - * additional malloc); instrumentation suggested this suffices for the - * majority of dicts (consisting mostly of usually-small instance dicts and - * usually-small dicts created to pass keyword arguments). - */ - static const int DICTIONARY_MINSIZE = 8; - - // Individual entry in a dictionary - struct DictionaryEntry - { - DictionaryEntry() : hash(0) {} - Hash hash; // Cached hash of key - String key; // key in plain text - Variant value; // Value for this entry - }; - - /* The table contains mask + 1 slots, and that's a power of 2. - * We store the mask instead of the size because the mask is more - * frequently needed. - */ - unsigned int mask; - - // Small dictionaries just use this, saves mallocs for small tables - DictionaryEntry small_table[DICTIONARY_MINSIZE]; - - /// Pointer to table in use, may be malloc'd or may point to smallTable - DictionaryEntry* table; - - /// Insert an item - void Insert(const String& key, Hash hash, const Variant& value); - - /// Retrieve an item - DictionaryEntry* Retrieve(const String& key, Hash hash) const; - - /// Reset to small dictionary - void ResetToMinimumSize(); - - // Copy another dict - void Copy(const Dictionary &dict); -}; - -#include "Dictionary.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Dictionary.inl b/libs/libRocket/Include/Rocket/Core/Dictionary.inl deleted file mode 100644 index c7d28aa2ea6..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Dictionary.inl +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -template< typename T > -inline void Dictionary::Set(const String& key, const T& value) -{ - Set(key, Variant(value)); -} - -template< typename T > -inline T Dictionary::Get(const String& key, const T& default_value) const -{ - T value; - if (!GetInto(key, value)) - return default_value; - - return value; -} - - -template -inline bool Dictionary::GetInto(const String& key, T& value) const -{ - Variant* variant = Get(key); - if (!variant) - return false; - - return variant->GetInto(value); -} - -template -inline bool Dictionary::Iterate(int &pos, String& key, T& value) const -{ - Variant* variant; - bool iterate = Iterate(pos, key, variant); - if (iterate) - variant->GetInto(value); - return iterate; -} diff --git a/libs/libRocket/Include/Rocket/Core/Element.h b/libs/libRocket/Include/Rocket/Core/Element.h deleted file mode 100644 index a4fb43d91cd..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Element.h +++ /dev/null @@ -1,729 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENT_H -#define ROCKETCOREELEMENT_H - -#include "ReferenceCountable.h" -#include "ScriptInterface.h" -#include "Header.h" -#include "Box.h" -#include "Event.h" -#include "Property.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - class Dictionary; -} -} - -namespace Rocket { -namespace Core { - -class Context; -class Decorator; -class ElementInstancer; -class EventDispatcher; -class EventListener; -class ElementBackground; -class ElementBorder; -class ElementDecoration; -class ElementDefinition; -class ElementDocument; -class ElementScroll; -class ElementStyle; -class FontFaceHandle; -class PropertyDictionary; -class RenderInterface; -class StyleSheet; - -/** - A generic element in the DOM tree. - - @author Peter Curry - */ - -class ROCKETCORE_API Element : public ScriptInterface -{ -public: - /// Constructs a new libRocket element. This should not be called directly; use the Factory - /// instead. - /// @param[in] tag The tag the element was declared as in RML. - Element(const String& tag); - virtual ~Element(); - - void Update(); - void Render(); - - /// Clones this element, returning a new, unparented element. - Element* Clone() const; - - /** @name Classes - */ - //@{ - /// Sets or removes a class on the element. - /// @param[in] class_name The name of the class to add or remove from the class list. - /// @param[in] activate True if the class is to be added, false to be removed. - void SetClass(const String& class_name, bool activate); - /// Checks if a class is set on the element. - /// @param[in] class_name The name of the class to check for. - /// @return True if the class is set on the element, false otherwise. - bool IsClassSet(const String& class_name) const; - /// Specifies the entire list of classes for this element. This will replace any others specified. - /// @param[in] class_names The list of class names to set on the style, separated by spaces. - void SetClassNames(const String& class_names); - /// Return the active class list. - /// @return The space-separated list of classes active on the element. - String GetClassNames() const; - //@} - - /// Returns the active style sheet for this element. This may be NULL. - /// @return The element's style sheet. - virtual StyleSheet* GetStyleSheet() const; - - /// Returns the element's definition, updating if necessary. - /// @return The element's definition. - const ElementDefinition* GetDefinition(); - - /// Fills a string with the full address of this element. - /// @param[in] include_pseudo_classes True if the address is to include the pseudo-classes of the leaf element. - /// @return The address of the element, including its full parentage. - String GetAddress(bool include_pseudo_classes = false) const; - - /// Sets the position of this element, as a two-dimensional offset from another element. - /// @param[in] offset The offset (in pixels) of our primary box's top-left border corner from our offset parent's top-left border corner. - /// @param[in] offset_parent The element this element is being positioned relative to. - /// @param[in] offset_fixed True if the element is fixed in place (and will not scroll), false if not. - void SetOffset(const Vector2f& offset, Element* offset_parent, bool offset_fixed = false); - /// Returns the position of the top-left corner of one of the areas of this element's primary box, relative to its - /// offset parent's top-left border corner. - /// @param[in] area The desired area position. - /// @return The relative offset. - Vector2f GetRelativeOffset(Box::Area area = Box::CONTENT); - /// Returns the position of the top-left corner of one of the areas of this element's primary box, relative to - /// the element root. - /// @param[in] area The desired area position. - /// @return The absolute offset. - Vector2f GetAbsoluteOffset(Box::Area area = Box::CONTENT); - - /// Sets an alternate area to use as the client area. - /// @param[in] client_area The box area to use as the element's client area. - void SetClientArea(Box::Area client_area); - /// Returns the area the element uses as its client area. - /// @return The box area used as the element's client area. - Box::Area GetClientArea() const; - - /// Sets the dimensions of the element's internal content. This is the tightest fitting box surrounding all of - /// this element's logical children, plus the element's padding. - /// @param[in] content_offset The offset of the box's internal content. - /// @param[in] content_box The dimensions of the box's internal content. - void SetContentBox(const Vector2f& content_offset, const Vector2f& content_box); - /// Sets the box describing the size of the element, and removes all others. - /// @param[in] box The new dimensions box for the element. - void SetBox(const Box& box); - /// Adds a box to the end of the list describing this element's geometry. - /// @param[in] box The auxiliary box for the element. - void AddBox(const Box& box); - /// Returns one of the boxes describing the size of the element. - /// @param[in] index The index of the desired box. If this is outside of the bounds of the element's list of boxes, it will be clamped. - /// @return The requested box. - const Box& GetBox(int index = 0); - /// Returns the number of boxes making up this element's geometry. - /// @return the number of boxes making up this element's geometry. - int GetNumBoxes(); - - /// Returns the baseline of the element, in pixels offset from the bottom of the element's content area. - /// @return The element's baseline. A negative baseline will be further 'up' the element, a positive on further 'down'. The default element will return 0. - virtual float GetBaseline() const; - /// Gets the intrinsic dimensions of this element, if it is of a type that has an inherent size. This size will - /// only be overriden by a styled width or height. - /// @param[in] dimensions The dimensions to size, if appropriate. - /// @return True if the element has intrinsic dimensions, false otherwise. The default element will return false. - virtual bool GetIntrinsicDimensions(Vector2f& dimensions); - - /// Checks if a given point in screen coordinates lies within the bordered area of this element. - /// @param[in] point The point to test. - /// @return True if the element is within this element, false otherwise. - virtual bool IsPointWithinElement(const Vector2f& point); - - /// Returns the visibility of the element. - /// @return True if the element is visible, false otherwise. - bool IsVisible() const; - /// Returns the z-index of the element. - /// @return The element's z-index. - float GetZIndex() const; - - /// Returns the element's font face handle. - /// @return The element's font face handle. - FontFaceHandle* GetFontFaceHandle() const; - - /** @name Properties - */ - //@{ - /// Sets a local property override on the element. - /// @param[in] name The name of the new property. - /// @param[in] value The new property to set. - /// @return True if the property parsed successfully, false otherwise. - bool SetProperty(const String& name, const String& value); - /// Sets a local property override on the element to a pre-parsed value. - /// @param[in] name The name of the new property. - /// @param[in] property The parsed property to set. - /// @return True if the property was set successfully, false otherwise. - bool SetProperty(const String& name, const Property& property); - /// Removes a local property override on the element; its value will revert to that defined in - /// the style sheet. - /// @param[in] name The name of the local property definition to remove. - void RemoveProperty(const String& name); - /// Returns one of this element's properties. If this element is not defined this property, or a parent cannot - /// be found that we can inherit the property from, the default value will be returned. - /// @param[in] name The name of the property to fetch the value for. - /// @return The value of this property for this element, or NULL if no property exists with the given name. - const Property* GetProperty(const String& name); - /// Returns the values of one of this element's properties. - /// @param[in] name The name of the property to get. - /// @return The value of this property. - template < typename T > - T GetProperty(const String& name); - /// Returns one of this element's properties. If this element is not defined this property, NULL will be - /// returned. - /// @param[in] name The name of the property to fetch the value for. - /// @return The value of this property for this element, or NULL if this property has not been explicitly defined for this element. - const Property* GetLocalProperty(const String& name); - /// Resolves one of this element's properties. If the value is a number or px, this is returned. If it's a - /// percentage then it is resolved based on the second argument (the base value). - /// @param[in] name The name of the property to resolve the value for. - /// @param[in] base_value The value that is scaled by the percentage value, if it is a percentage. - /// @return The value of this property for this element. - float ResolveProperty(const String& name, float base_value); - /// Resolves one of this element's non-inherited properties. If the value is a number or px, this is returned. If it's a - /// percentage then it is resolved based on the second argument (the base value). - /// @param[in] name The property to resolve the value for. - /// @param[in] base_value The value that is scaled by the percentage value, if it is a percentage. - /// @return The value of this property for this element. - float ResolveProperty(const Property *property, float base_value); - - /// Returns 'border-width' properties from element's style or local cache. - void GetBorderWidthProperties(const Property **border_top_width, const Property **border_bottom_width, const Property **border_left_width, const Property **border_right_width); - /// Returns 'margin' properties from element's style or local cache. - void GetMarginProperties(const Property **margin_top, const Property **margin_bottom, const Property **margin_left, const Property **margin_right); - /// Returns 'padding' properties from element's style or local cache. - void GetPaddingProperties(const Property **padding_top, const Property **padding_bottom, const Property **padding_left, const Property **padding_right); - /// Returns 'width' and 'height' properties from element's style or local cache. - void GetDimensionProperties(const Property **width, const Property **height); - /// Returns local 'width' and 'height' properties from element's style or local cache, - /// ignoring default values. - void GetLocalDimensionProperties(const Property **width, const Property **height); - /// Returns 'overflow' properties' values from element's style or local cache. - void GetOverflow(int *overflow_x, int *overflow_y); - /// Returns 'position' property value from element's style or local cache. - int GetPosition(); - /// Returns 'float' property value from element's style or local cache. - int GetFloat(); - /// Returns 'display' property value from element's style or local cache. - int GetDisplay(); - /// Returns 'white-space' property value from element's style or local cache. - int GetWhitespace(); - - /// Returns 'line-height' property value from element's style or local cache. - const Property *GetLineHeightProperty(); - /// Returns 'text-align' property value from element's style or local cache. - int GetTextAlign(); - /// Returns 'text-transform' property value from element's style or local cache. - int GetTextTransform(); - /// Returns 'vertical-align' property value from element's style or local cache. - const Property *GetVerticalAlignProperty(); - - /// Iterates over the properties defined on this element. - /// @param[inout] index Index of the property to fetch. This is incremented to the next valid index after the fetch. Indices are not necessarily incremental. - /// @param[out] pseudo_classes The pseudo-classes the property is defined by. - /// @param[out] name The name of the property at the specified index. - /// @param[out] property The property at the specified index. - /// @return True if a property was successfully fetched. - bool IterateProperties(int& index, PseudoClassList& pseudo_classes, String& name, const Property*& property) const; - ///@} - - /** @name Pseudo-classes - */ - //@{ - /// Sets or removes a pseudo-class on the element. - /// @param[in] pseudo_class The pseudo class to activate or deactivate. - /// @param[in] activate True if the pseudo-class is to be activated, false to be deactivated. - void SetPseudoClass(const String& pseudo_class, bool activate); - /// Checks if a specific pseudo-class has been set on the element. - /// @param[in] pseudo_class The name of the pseudo-class to check for. - /// @return True if the pseudo-class is set on the element, false if not. - bool IsPseudoClassSet(const String& pseudo_class) const; - /// Checks if a complete set of pseudo-classes are set on the element. - /// @param[in] pseudo_classes The set of pseudo-classes to check for. - /// @return True if all of the pseudo-classes are set, false if not. - bool ArePseudoClassesSet(const PseudoClassList& pseudo_classes) const; - /// Gets a list of the current active pseudo-classes. - /// @return The list of active pseudo-classes. - const PseudoClassList& GetActivePseudoClasses() const; - //@} - - /** @name Attributes - */ - //@{ - /// Sets an attribute on the element. - /// @param[in] name Name of the attribute. - /// @param[in] value Value of the attribute. - template< typename T > - void SetAttribute(const String& name, const T& value); - /// Gets the specified attribute. - /// @param[in] name Name of the attribute to retrieve. - /// @return A variant representing the attribute, or NULL if the attribute doesn't exist. - Variant* GetAttribute(const String& name) const; - /// Gets the specified attribute, with default value. - /// @param[in] name Name of the attribute to retrieve. - /// @param[in] default_value Value to return if the attribute doesn't exist. - template< typename T > - T GetAttribute(const String& name, const T& default_value) const; - /// Checks if the element has a certain attribute. - /// @param[in] name The name of the attribute to check for. - /// @return True if the element has the given attribute, false if not. - bool HasAttribute(const String& name); - /// Removes the attribute from the element. - /// @param[in] name Name of the attribute. - void RemoveAttribute(const String& name); - /// Set a group of attributes. - /// @param[in] attributes Attributes to set. - void SetAttributes(const ElementAttributes* attributes); - /// Iterates over the attributes. - /// @param[inout] index Index to fetch. This is incremented after the fetch. - /// @param[out] name Name of the attribute at the specified index - /// @param[out] value Value of the attribute at the specified index. - /// @return True if an attribute was successfully fetched. - template< typename T > - bool IterateAttributes(int& index, String& name, T& value) const; - /// Returns the number of attributes on the element. - /// @return The number of attributes on the element. - int GetNumAttributes() const; - //@} - - /** @name Decorators - */ - //@{ - /// Iterates over all decorators attached to the element. Note that all decorators are iterated - /// over, not just active ones. - /// @param[inout] index Index to fetch. This is incremented after the fetch. - /// @param[out] pseudo_classes The pseudo-classes the decorator required to be active before it renders. - /// @param[out] name The name of the decorator at the specified index. - /// @param[out] decorator The decorator at the specified index. - /// @param[out] decorator_data This element's handle to any data is has stored against the decorator. - /// @return True if a decorator was successfully fetched, false if not. - bool IterateDecorators(int& index, PseudoClassList& pseudo_classes, String& name, Decorator*& decorator, DecoratorDataHandle& decorator_data); - //@} - - /// Gets the outer-most focus element down the tree from this node. - /// @return Outer-most focus element. - Element* GetFocusLeafNode(); - - /// Returns the element's context. - /// @return The context this element's document exists within. - Context* GetContext(); - - /** @name DOM Properties - */ - //@{ - - /// Gets the name of the element. - /// @return The name of the element. - const String& GetTagName() const; - - /// Gets the id of the element. - /// @return The element's id. - const String& GetId() const; - /// Sets the id of the element. - /// @param[in] id The new id of the element. - void SetId(const String& id); - - /// Gets the horizontal offset from the context's left edge to element's left border edge. - /// @return The horizontal offset of the element within its context, in pixels. - float GetAbsoluteLeft(); - /// Gets the vertical offset from the context's top edge to element's top border edge. - /// @return The vertical offset of the element within its context, in pixels. - float GetAbsoluteTop(); - - /// Gets the horizontal offset from the element's left border edge to the left edge of its client area. This is - /// usually the edge of the padding, but may be the content area for some replaced elements. - /// @return The horizontal offset of the element's client area, in pixels. - float GetClientLeft(); - /// Gets the vertical offset from the element's top border edge to the top edge of its client area. This is - /// usually the edge of the padding, but may be the content area for some replaced elements. - /// @return The vertical offset of the element's client area, in pixels. - float GetClientTop(); - /// Gets the width of the element's client area. This is usually the padded area less the vertical scrollbar - /// width, but may be the content area for some replaced elements. - /// @return The width of the element's client area, usually including padding but not the vertical scrollbar width, border or margin. - float GetClientWidth(); - /// Gets the height of the element's client area. This is usually the padded area less the horizontal scrollbar - /// height, but may be the content area for some replaced elements. - /// @return The inner height of the element, usually including padding but not the horizontal scrollbar height, border or margin. - float GetClientHeight(); - - /// Returns the element from which all offset calculations are currently computed. - /// @return This element's offset parent. - Element* GetOffsetParent(); - /// Gets the distance from this element's left border to its offset parent's left border. - /// @return The horizontal distance (in pixels) from this element's offset parent to itself. - float GetOffsetLeft(); - /// Gets the distance from this element's top border to its offset parent's top border. - /// @return The vertical distance (in pixels) from this element's offset parent to itself. - float GetOffsetTop(); - /// Gets the width of the element, including the client area, padding, borders and scrollbars, but not margins. - /// @return The width of the rendered element, in pixels. - float GetOffsetWidth(); - /// Gets the height of the element, including the client area, padding, borders and scrollbars, but not margins. - /// @return The height of the rendered element, in pixels. - float GetOffsetHeight(); - - /// Gets the left scroll offset of the element. - /// @return The element's left scroll offset. - float GetScrollLeft(); - /// Sets the left scroll offset of the element. - /// @param[in] scroll_left The element's new left scroll offset. - void SetScrollLeft(float scroll_left); - /// Gets the top scroll offset of the element. - /// @return The element's top scroll offset. - float GetScrollTop(); - /// Sets the top scroll offset of the element. - /// @param[in] scroll_top The element's new top scroll offset. - void SetScrollTop(float scroll_top); - /// Gets the width of the scrollable content of the element; it includes the element padding but not its margin. - /// @return The width (in pixels) of the of the scrollable content of the element. - float GetScrollWidth(); - /// Gets the height of the scrollable content of the element; it includes the element padding but not its margin. - /// @return The height (in pixels) of the of the scrollable content of the element. - float GetScrollHeight(); - - /// Gets the object representing the declarations of an element's style attributes. - /// @return The element's style. - ElementStyle* GetStyle(); - - /// Gets the document this element belongs to. - /// @return This element's document. - virtual ElementDocument* GetOwnerDocument(); - - /// Gets this element's parent node. - /// @return This element's parent. - Element* GetParentNode() const; - - /// Gets the element immediately following this one in the tree. - /// @return This element's next sibling element, or NULL if there is no sibling element. - Element* GetNextSibling() const; - /// Gets the element immediately preceding this one in the tree. - /// @return This element's previous sibling element, or NULL if there is no sibling element. - Element* GetPreviousSibling() const; - - /// Returns the first child of this element. - /// @return This element's first child, or NULL if it contains no children. - Element* GetFirstChild() const; - /// Gets the last child of this element. - /// @return This element's last child, or NULL if it contains no children. - Element* GetLastChild() const; - /// Get the child element at the given index. - /// @param[in] index Index of child to get. - /// @return The child element at the given index. - Element* GetChild(int index) const; - /// Get the current number of children in this element - /// @param[in] include_non_dom_elements True if the caller wants to include the non DOM children. Only set this to true if you know what you're doing! - /// @return The number of children. - int GetNumChildren(bool include_non_dom_elements = false) const; - - /// Gets the markup and content of the element. - /// @param[out] content The content of the element. - virtual void GetInnerRML(String& content) const; - /// Gets the markup and content of the element. - /// @return The content of the element. - String GetInnerRML() const; - /// Sets the markup and content of the element. All existing children will be replaced. - /// @param[in] rml The new content of the element. - void SetInnerRML(const String& rml); - - //@} - - /** @name DOM Methods - */ - //@{ - - /// Gives focus to the current element. - /// @return True if the change focus request was successful - bool Focus(); - /// Removes focus from from this element. - void Blur(); - /// Fakes a mouse click on this element. - void Click(); - - /// Adds an event listener to this element. - /// @param[in] event Event to attach to. - /// @param[in] listener The listener object to be attached. - /// @param[in] in_capture_phase True to attach in the capture phase, false in bubble phase. - void AddEventListener(const String& event, EventListener* listener, bool in_capture_phase = false); - /// Removes an event listener from this element. - /// @param[in] event Event to detach from. - /// @param[in] listener The listener object to be detached. - /// @param[in] in_capture_phase True to detach from the capture phase, false from the bubble phase. - void RemoveEventListener(const String& event, EventListener* listener, bool in_capture_phase = false); - /// Sends an event to this element. - /// @param[in] event Name of the event in string form. - /// @param[in] parameters The event parameters. - /// @param[in] interruptible True if the propagation of the event be stopped. - /// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was. - bool DispatchEvent(const String& event, const Dictionary& parameters, bool interruptible = false); - - /// Scrolls the parent element's contents so that this element is visible. - /// @param[in] align_with_top If true, the element will align itself to the top of the parent element's window. If false, the element will be aligned to the bottom of the parent element's window. - void ScrollIntoView(bool align_with_top = true); - - /// Append a child to this element. - /// @param[in] element The element to append as a child. - /// @param[in] dom_element True if the element is to be part of the DOM, false otherwise. Only set this to false if you know what you're doing! - void AppendChild(Element* element, bool dom_element = true); - /// Adds a child to this element, directly after the adjacent element. The new element inherits the DOM/non-DOM - /// status from the adjacent element. - /// @param[in] element Element to insert into the this element. - /// @param[in] adjacent_element The element to insert directly before. - void InsertBefore(Element* element, Element* adjacent_element); - /// Replaces the second node with the first node. - /// @param[in] inserted_element The element that will be inserted and replace the other element. - /// @param[in] replaced_element The existing element that will be replaced. If this doesn't exist, inserted_element will be appended. - /// @return True if the replaced_element was found, false otherwise. - bool ReplaceChild(Element* inserted_element, Element* replaced_element); - /// Remove a child element from this element. - /// @param[in] The element to remove. - /// @returns True if the element was found and removed. - bool RemoveChild(Element* element); - /// Returns whether or not this element has any DOM children. - /// @return True if the element has at least one DOM child, false otherwise. - bool HasChildNodes() const; - - /// Get a child element by its ID. - /// @param[in] id Id of the the child element - /// @return The child of this element with the given ID, or NULL if no such child exists. - Element* GetElementById(const String& id); - /// Get all descendant elements with the given tag. - /// @param[out] elements Resulting elements. - /// @param[in] tag Tag to search for. - void GetElementsByTagName(ElementList& elements, const String& tag); - /// Get all descendant elements with the given class set on them. - /// @param[out] elements Resulting elements. - /// @param[in] tag Tag to search for. - void GetElementsByClassName(ElementList& elements, const String& class_name); - //@} - - /** - @name Internal Functions - */ - //@{ - /// Access the event dispatcher for this element. - /// @return The element's dispatcher. - EventDispatcher* GetEventDispatcher() const; - /// Access the element background. - /// @return The element's background. - ElementBackground* GetElementBackground() const; - /// Access the element border. - /// @return The element's boder. - ElementBorder* GetElementBorder() const; - /// Access the element decorators. - /// @return The element decoration. - ElementDecoration* GetElementDecoration() const; - /// Returns the element's scrollbar functionality. - /// @return The element's scrolling functionality. - ElementScroll* GetElementScroll() const; - //@} - - /// Returns true if this element requires clipping - int GetClippingIgnoreDepth(); - /// Returns true if this element has clipping enabled - bool IsClippingEnabled(); - - /// Gets the render interface owned by this element's context. - /// @return The element's context's render interface. - RenderInterface* GetRenderInterface(); - - /// Sets the instancer to use for releasing this element. - /// @param[in] instancer Instancer to set on this element. - void SetInstancer(ElementInstancer* instancer); - - /// Called for every event sent to this element or one of its descendants. - /// @param[in] event The event to process. - virtual void ProcessEvent(Event& event); - - /// Update the element's layout if required. - void UpdateLayout(); - -protected: - /// Forces the element to generate a local stacking context, regardless of the value of its z-index - /// property. - void ForceLocalStackingContext(); - - /// Called during the update loop after children are updated. - virtual void OnUpdate(); - /// Called during render after backgrounds, borders, decorators, but before children, are rendered. - virtual void OnRender(); - - /// Called during a layout operation, when the element is being positioned and sized. - virtual void OnLayout(); - - /// Called when attributes on the element are changed. - /// @param[in] changed_attributes The attributes changed on the element. - virtual void OnAttributeChange(const AttributeNameList& changed_attributes); - /// Called when properties on the element are changed. - /// @param[in] changed_properties The properties changed on the element. - virtual void OnPropertyChange(const PropertyNameList& changed_properties); - - /// Called when a child node has been added somewhere in the hierarchy. - // @param[in] child The element that has been added. This may be this element. - virtual void OnChildAdd(Element* child); - /// Called when a child node has been removed somewhere in the hierarchy. - // @param[in] child The element that has been removed. This may be this element. - virtual void OnChildRemove(Element* child); - - /// Forces a re-layout of this element, and any other elements required. - virtual void DirtyLayout(); - - /// Returns true if the element has been marked as needing a re-layout. - virtual bool IsLayoutDirty(); - - /// Increment/Decrement the layout lock - virtual void LockLayout(bool lock); - - /// Forces a reevaluation of applicable font effects. - virtual void DirtyFont(); - - /// Returns the RML of this element and all children. - /// @param[out] content The content of this element and those under it, in XML form. - virtual void GetRML(String& content); - - virtual void OnReferenceDeactivate(); - -private: - void SetParent(Element* parent); - - void ReleaseDeletedElements(); - void ReleaseElements(ElementList& elements); - - void DirtyOffset(); - void UpdateOffset(); - - void BuildLocalStackingContext(); - void BuildStackingContext(ElementList* stacking_context); - void DirtyStackingContext(); - - void DirtyStructure(); - - // Original tag this element came from. - String tag; - - // The optional, unique ID of this object. - String id; - - // Instancer that created us, used for destruction. - ElementInstancer* instancer; - - // Parent element. - Element* parent; - // Currently focused child object - Element* focus; - // The owning document - ElementDocument* owner_document; - - // The event dispatcher for this element. - EventDispatcher* event_dispatcher; - // Style information for this element. - ElementStyle* style; - // Background functionality for this element. - ElementBackground* background; - // Border functionality for this element. - ElementBorder* border; - // Decorator information for this element. - ElementDecoration* decoration; - // Scrollbar information for this element. - ElementScroll* scroll; - // Attributes on this element. - ElementAttributes attributes; - - // The offset of the element, and the element it is offset from. - Element* offset_parent; - Vector2f relative_offset_base; // the base offset from the parent - Vector2f relative_offset_position; // the offset of a relatively positioned element - bool offset_fixed; - - mutable Vector2f absolute_offset; - mutable bool offset_dirty; - - // The offset this element adds to its logical children due to scrolling content. - Vector2f scroll_offset; - - // The size of the element. - typedef std::vector< Box > BoxList; - BoxList boxes; - // And of the element's internal content. - Vector2f content_offset; - Vector2f content_box; - - // Defines what box area represents the element's client area; this is usually padding, but may be content. - Box::Area client_area; - - // True if the element is visible and active. - bool visible; - - ElementList children; - int num_non_dom_children; - - ElementList active_children; - ElementList deleted_children; - - float z_index; - bool local_stacking_context; - bool local_stacking_context_forced; - - ElementList stacking_context; - bool stacking_context_dirty; - - // The element's font face; used to render text and resolve em / ex properties. - FontFaceHandle* font_face_handle; - - // Cached rendering information - int clipping_ignore_depth; - bool clipping_enabled; - bool clipping_state_dirty; - - friend class Context; - friend class ElementStyle; - friend class LayoutEngine; - friend class LayoutInlineBox; -}; - -#include "Element.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Element.inl b/libs/libRocket/Include/Rocket/Core/Element.inl deleted file mode 100644 index 453b8597d37..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Element.inl +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -// Returns the values of one of this element's properties. -// We can assume the property will exist based on the RCSS inheritance. -template < typename T > -T Element::GetProperty(const String& name) -{ - const Property* property = GetProperty(name); - ROCKET_ASSERTMSG(property, "Invalid property name."); - return property->Get< T >(); -} - -// Sets an attribute on the element. -template< typename T > -void Element::SetAttribute(const String& name, const T& value) -{ - attributes.Set(name, value); - AttributeNameList changed_attributes; - changed_attributes.insert(name); - - OnAttributeChange(changed_attributes); -} - -// Gets the specified attribute, with default value. -template< typename T > -T Element::GetAttribute(const String& name, const T& default_value) const -{ - return attributes.Get(name, default_value); -} - -// Iterates over the attributes. -template< typename T > -bool Element::IterateAttributes(int& index, String& name, T& value) const -{ - return attributes.Iterate(index, name, value); -} diff --git a/libs/libRocket/Include/Rocket/Core/ElementDocument.h b/libs/libRocket/Include/Rocket/Core/ElementDocument.h deleted file mode 100644 index 024e371eae8..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementDocument.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTDOCUMENT_H -#define ROCKETCOREELEMENTDOCUMENT_H - -#include "Element.h" - -namespace Rocket { -namespace Core { - -class Stream; - -} -} - -namespace Rocket { -namespace Core { - -class Context; -class DocumentHeader; -class ElementText; -class StyleSheet; - -/** - Represents a document in the dom tree. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API ElementDocument : public Element -{ -public: - ElementDocument(const String& tag); - virtual ~ElementDocument(); - - /// Process given document header - void ProcessHeader(const DocumentHeader* header); - - /// Returns itself as the current document - virtual ElementDocument* GetOwnerDocument(); - - /// Returns the document's context. - /// @return The context this document exists within. - Context* GetContext(); - - /// Sets the document's title. - /// @param[in] title The new title of the document. - void SetTitle(const String& title); - /// Returns the title of this document. - /// @return The document's title. - const String& GetTitle() const; - - /// Returns the source address of this document. - /// @return The source of this document, usually a file name. - const String& GetSourceURL() const; - - /// Sets the style sheet this document, and all of its children, uses. - /// @param[in] style_sheet The style sheet to set on the document. - void SetStyleSheet(StyleSheet* style_sheet); - /// Returns the document's style sheet. - /// @return The document's style sheet. - virtual StyleSheet* GetStyleSheet() const; - - /// Brings the document to the front of the document stack. - void PullToFront(); - /// Sends the document to the back of the document stack. - void PushToBack(); - - /** - Flags used for displaying the document. - */ - enum FocusFlags - { - NONE = 0, - FOCUS = (1 << 1), - MODAL = (1 << 2) - }; - - /// Show the document. - /// @param[in] focus_flags Flags controlling the changing of focus. Leave as FOCUS to switch focus to the document. - void Show(int focus_flags = FOCUS); - /// Hide the document. - void Hide(); - /// Close the document. - void Close(); - - /// Creates the named element. - /// @param[in] name The tag name of the element. - Element* CreateElement(const String& name); - /// Create a text element with the given text content. - /// @param[in] text The text content of the text element. - ElementText* CreateTextNode(const String& text); - - /// Does the document have modal display set. - /// @return True if the document is hogging focus. - bool IsModal() const; - - /// Load a script into the document. Note that the base implementation does nothing, scripting language addons hook - /// this method. - /// @param[in] stream Stream of code to process. - /// @param[in] source_name Name of the the script the source comes from, useful for debug information. - virtual void LoadScript(Stream* stream, const String& source_name); - - /// Updates the layout if necessary. - inline void UpdateLayout() { if (layout_dirty && lock_layout == 0) _UpdateLayout(); } - /// Updates the position of the document based on the style properties. - void UpdatePosition(); - - /// Increment/Decrement the layout lock - void LockLayout(bool lock); - -protected: - /// Refreshes the document layout if required. - virtual void OnUpdate(); - - /// Repositions the document if necessary. - virtual void OnPropertyChange(const PropertyNameList& changed_properties); - - /// Sets the dirty flag on the layout so the document will format its children before the next render. - virtual void DirtyLayout(); - - /// Returns true if the document has been marked as needing a re-layout. - virtual bool IsLayoutDirty(); - - /// Processes the 'onpropertychange' event, checking for a change in position or size. - virtual void ProcessEvent(Event& event); - -private: - // Find the next element to focus, starting at the current element - bool FocusNextTabElement(Element* current_element, bool forward); - /// Searches forwards or backwards for a focusable element in the given substree - bool SearchFocusSubtree(Element* element, bool forward); - - // Title of the document - String title; - - // The original path this document came from - String source_url; - - // The document's style sheet. - StyleSheet* style_sheet; - - Context* context; - - // Is the current display modal - bool modal; - - // Is the layout dirty? - bool layout_dirty; - int lock_layout; - - friend class Context; - friend class Factory; - - void _UpdateLayout(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ElementInstancer.h b/libs/libRocket/Include/Rocket/Core/ElementInstancer.h deleted file mode 100644 index fb66f7d8906..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementInstancer.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTINSTANCER_H -#define ROCKETCOREELEMENTINSTANCER_H - -#include "ReferenceCountable.h" -#include "XMLParser.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Element; - -/** - An element instancer provides a method for allocating - an deallocating elements. - - Node handlers are reference counted, so that the same handler - can be used for multiple tags. - - It is important at the same instancer that allocated - the element releases it. This ensures there are no - issues with memory from different DLLs getting mixed up. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API ElementInstancer : public ReferenceCountable -{ -public: - virtual ~ElementInstancer(); - - /// Instances an element given the tag name and attributes. - /// @param[in] parent The element the new element is destined to be parented to. - /// @param[in] tag The tag of the element to instance. - /// @param[in] attributes Dictionary of attributes. - virtual Element* InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) = 0; - /// Releases an element instanced by this instancer. - /// @param[in] element The element to release. - virtual void ReleaseElement(Element* element) = 0; - /// Release the instancer. - virtual void Release() = 0; - -protected: - virtual void OnReferenceDeactivate(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ElementInstancerGeneric.h b/libs/libRocket/Include/Rocket/Core/ElementInstancerGeneric.h deleted file mode 100644 index 897f0f4a498..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementInstancerGeneric.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTINSTANCERGENERIC_H -#define ROCKETCOREELEMENTINSTANCERGENERIC_H - -#include "ElementInstancer.h" - -namespace Rocket { -namespace Core { - -/** - Generic Instancer that creates a plain old Element - - This instancer is used for most elements and is by default - registered as the "*" fallback handler. - - @author Lloyd Weehuizen - */ - -template -class ElementInstancerGeneric : public ElementInstancer -{ -public: - virtual ~ElementInstancerGeneric(); - - /// Instances an element given the tag name and attributes - /// @param tag Name of the element to instance - /// @param attributes vector of name value pairs - virtual Element* InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes); - - /// Releases the given element - /// @param element to release - virtual void ReleaseElement(Element* element); - - /// Release the instancer - virtual void Release(); -}; - -#include "ElementInstancerGeneric.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ElementInstancerGeneric.inl b/libs/libRocket/Include/Rocket/Core/ElementInstancerGeneric.inl deleted file mode 100644 index 00e1c3e8d74..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementInstancerGeneric.inl +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -template -ElementInstancerGeneric::~ElementInstancerGeneric() -{ -} - -// Instances an element given the tag name and attributes -template -Element* ElementInstancerGeneric::InstanceElement(Element* /*parent*/, const String& tag, const XMLAttributes& /*attributes*/) -{ - return new T(tag); -} - - - -// Releases the given element -template -void ElementInstancerGeneric::ReleaseElement(Element* element) -{ - delete element; -} - - - -// Release the instancer -template -void ElementInstancerGeneric::Release() -{ - delete this; -} diff --git a/libs/libRocket/Include/Rocket/Core/ElementReference.h b/libs/libRocket/Include/Rocket/Core/ElementReference.h deleted file mode 100644 index adaaa9c546d..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementReference.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTREFERENCE_H -#define ROCKETCOREELEMENTREFERENCE_H - -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Element; - -/** - A smart pointer for RKTElements. - - @author Peter Curry - */ - -class ROCKETCORE_API ElementReference -{ -public: - ElementReference(Element* element = NULL); - ElementReference(const ElementReference& copy); - ~ElementReference(); - - /// Returns true if this reference is bound to an element. - /// @return True if this reference points to a non-NULL element, false otherwise. - operator bool() const; - - /// Assigns a new element for this reference to point to. - /// @param element[in] The new element. - /// @return This element reference. - ElementReference& operator=(Element* element); - /// Assigns a new element for this reference, from another reference. - /// @param element_reference[in] The element reference to copy. - /// @return This element reference. - ElementReference& operator=(const ElementReference& element_reference); - - /// Returns a reference to the underlying element. - /// @return The underlying element. This may be NULL. - Element* operator*(); - /// Returns a reference to the underlying element. - /// @return The underlying element. This may be NULL. - Element* operator->(); - - /// Equality operator for the reference. Used for STL containers. - /// @param rhs[in] The other element to use in the comparison. - /// @return True if the elements are equivalent, false otherwise. - bool operator==(const ElementReference& rhs) const; - /// Equality operator for the reference. - /// @param rhs[in] The other element to use in the comparison. - /// @return True if the elements are equivalent, false otherwise. - bool operator==(const Element* rhs) const; - - /// Less-than operator for the reference. Used for STL containers. - /// @param rhs[in] The other element to use in the comparison. - /// @return True if this element is less than the other element, false otherwise. - bool operator<(const ElementReference& rhs) const; - - /// Inequality operator for the reference. - /// @param rhs[in] The other element to use in the comparison. - /// @return False if the elements are equivalent, true otherwise. - bool operator!=(const ElementReference& rhs) const; - /// Inequality operator for the reference. - /// @param rhs[in] A raw element to use in the comparison. - /// @return False if the elements are equivalent, true otherwise. - bool operator!=(const Element* rhs) const; - -private: - Element* element; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ElementScroll.h b/libs/libRocket/Include/Rocket/Core/ElementScroll.h deleted file mode 100644 index bacef01a193..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementScroll.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTSCROLL_H -#define ROCKETCOREELEMENTSCROLL_H - -#include "Header.h" -#include "EventListener.h" - -namespace Rocket { -namespace Core { - -class Element; -class WidgetSliderScroll; - -/** - Manages an element's scrollbars and scrolling state. - - @author Peter Curry - */ - -class ROCKETCORE_API ElementScroll : public EventListener -{ -public: - enum Orientation - { - VERTICAL = 0, - HORIZONTAL = 1 - }; - - ElementScroll(Element* element); - virtual ~ElementScroll(); - - /// Updates the increment / decrement arrows. - void Update(); - - /// Enables and sizes one of the scrollbars. - /// @param[in] orientation Which scrollbar (vertical or horizontal) to enable. - /// @param[in] element_width The current computed width of the element, used only to resolve percentage properties. - void EnableScrollbar(Orientation orientation, float element_width); - /// Disables and hides one of the scrollbars. - /// @param[in] orientation Which scrollbar (vertical or horizontal) to disable. - void DisableScrollbar(Orientation orientation); - - /// Updates the position of the scrollbar. - /// @param[in] orientation Which scrollbar (vertical or horizontal) to update). - void UpdateScrollbar(Orientation orientation); - - /// Returns one of the scrollbar elements. - /// @param[in] orientation Which scrollbar to return. - /// @return The requested scrollbar, or NULL if it does not exist. - Element* GetScrollbar(Orientation orientation); - /// Returns the size, in pixels, of one of the scrollbars; for a vertical scrollbar, this is width, for a horizontal scrollbar, this is height. - /// @param[in] orientation Which scrollbar (vertical or horizontal) to query. - /// @return The size of the scrollbar, or 0 if the scrollbar is disabled. - float GetScrollbarSize(Orientation orientation); - - /// Formats the enabled scrollbars based on the current size of the host element. - void FormatScrollbars(); - -protected: - /// Handles the 'onchange' events for the scrollbars. - void ProcessEvent(Event& event); - -private: - struct Scrollbar - { - Scrollbar(); - ~Scrollbar(); - - Element* element; - WidgetSliderScroll* widget; - bool enabled; - float size; - }; - - // Creates one of the scroll component's scrollbar. - bool CreateScrollbar(Orientation orientation); - // Creates the scrollbar corner. - bool CreateCorner(); - - Element* element; - - Scrollbar scrollbars[2]; - Element* corner; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ElementText.h b/libs/libRocket/Include/Rocket/Core/ElementText.h deleted file mode 100644 index 796dfe2b851..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementText.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTTEXT_H -#define ROCKETCOREELEMENTTEXT_H - -#include "Header.h" -#include "Element.h" -#include "WString.h" - -namespace Rocket { -namespace Core { - -/** - Rocket's text-element interface. - - @author Peter Curry - */ - -class ROCKETCORE_API ElementText : public Element -{ -public: - ElementText(const String& tag); - virtual ~ElementText(); - - /// Sets the raw string this text element contains. The actual rendered text may be different due to whitespace - /// formatting. - /// @param[in] text The new string to set on this element. - virtual void SetText(const WString& text) = 0; - /// Returns the raw string this text element contains. - /// @return This element's raw text. - virtual const WString& GetText() const = 0; - - /// Generates a token of text from this element, returning only the width. - /// @param[out] token_width The window (in pixels) of the token. - /// @param[in] token_begin The first character to be included in the token. - /// @return True if the token is the end of the element's text, false if not. - virtual bool GenerateToken(float& token_width, int token_begin) = 0; - /// Generates a line of text rendered from this element. - /// @param[out] line The characters making up the line, with white-space characters collapsed and endlines processed appropriately. - /// @param[out] line_length The number of characters from the source string consumed making up this string; this may very well be different from line.size()! - /// @param[out] line_width The width (in pixels) of the generated line. - /// @param[in] line_begin The index of the first character to be rendered in the line. - /// @param[in] maximum_line_width The width (in pixels) of space allowed for the line, or -1 for unlimited space. - /// @param[in] right_spacing_width The width (in pixels) of the spacing (consisting of margins, padding, etc) that must be remaining on the right of the line if the last of the text is rendered onto this line. - /// @param[in] trim_whitespace_prefix If we're collapsing whitespace, whether or not to remove all prefixing whitespace or collapse it down to a single space. - /// @return True if the line reached the end of the element's text, false if not. - virtual bool GenerateLine(WString& line, int& line_length, float& line_width, int line_begin, float maximum_line_width, float right_spacing_width, bool trim_whitespace_prefix) = 0; - - /// Clears all lines of generated text and prepares the element for generating new lines. - virtual void ClearLines() = 0; - /// Adds a new line into the text element. - /// @param[in] line_position The position of this line, as an offset from the first line. - /// @param[in] line The contents of the line. - virtual void AddLine(const Vector2f& line_position, const WString& line) = 0; - - /// Prevents the element from dirtying its document's layout when its text is changed. - virtual void SuppressAutoLayout() = 0; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ElementUtilities.h b/libs/libRocket/Include/Rocket/Core/ElementUtilities.h deleted file mode 100644 index 64312985074..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ElementUtilities.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTUTILITIES_H -#define ROCKETCOREELEMENTUTILITIES_H - -#include "Header.h" -#include "Box.h" -#include "WString.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - -class Context; -class FontFaceHandle; -class RenderInterface; - -/** - Utility functions for dealing with elements. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API ElementUtilities -{ -public: - enum PositionAnchor - { - TOP = 1 << 0, - BOTTOM = 1 << 1, - LEFT = 1 << 2, - RIGHT = 1 << 3, - - TOP_LEFT = TOP | LEFT, - TOP_RIGHT = TOP | RIGHT, - BOTTOM_LEFT = BOTTOM | LEFT, - BOTTOM_RIGHT = BOTTOM | RIGHT - }; - - /// Get the element with the given id. - /// @param[in] root_element First element to check. - /// @param[in] id ID of the element to look for. - static Element* GetElementById(Element* root_element, const String& id); - /// Get all elements with the given tag. - /// @param[out] elements Resulting elements. - /// @param[in] root_element First element to check. - /// @param[in] tag Tag to search for. - static void GetElementsByTagName(ElementList& elements, Element* root_element, const String& tag); - /// Get all elements with the given class set on them. - /// @param[out] elements Resulting elements. - /// @param[in] root_element First element to check. - /// @param[in] tag Class name to search for. - static void GetElementsByClassName(ElementList& elements, Element* root_element, const String& class_name); - - /// Returns an element's font face. - /// @param[in] element The element to determine the font face for. - /// @return The element's font face. This will be NULL if no valid RCSS font styles have been set up for this element. - static FontFaceHandle* GetFontFaceHandle(Element* element); - /// Returns an element's font size, if it has a font defined. - /// @param[in] element The element to determine the font size for. - /// @return The font size as determined by the element's font, or 0 if it has no font specified. - static int GetFontSize(Element* element); - /// Returns an element's line height, if it has a font defined. - /// @param[in] element The element to determine the line height for. - /// @return The line height as specified by the element's font and line height styles. - static int GetLineHeight(Element* element); - /// Returns the width of a string rendered within the context of the given element. - /// @param[in] element The element to measure the string from. - /// @param[in] string The string to measure. - /// @return The string width, in pixels. - static int GetStringWidth(Element* element, const WString& string); - - /// Bind and instance all event attributes on the given element onto the element - /// @param element Element to bind events on - static void BindEventAttributes(Element* element); - - /// Generates the clipping region for an element. - /// @param[out] clip_origin The origin, in context coordinates, of the origin of the element's clipping window. - /// @param[out] clip_dimensions The size, in context coordinates, of the element's clipping window. - /// @param[in] element The element to generate the clipping region for. - /// @return True if a clipping region exists for the element and clip_origin and clip_window were set, false if not. - static bool GetClippingRegion(Vector2i& clip_origin, Vector2i& clip_dimensions, Element* element); - /// Sets the clipping region from an element and its ancestors. - /// @param[in] element The element to generate the clipping region from. - /// @param[in] context The context of the element; if this is not supplied, it will be derived from the element. - /// @return The visibility of the given element within its clipping region. - static bool SetClippingRegion(Element* element, Context* context = NULL); - /// Applies the clip region from the render interface to the renderer - /// @param[in] context The context to read the clip region from - /// @param[in] render_interface The render interface to update. - static void ApplyActiveClipRegion(Context* context, RenderInterface* render_interface); - - /// Formats the contents of an element. This does not need to be called for ordinary elements, but can be useful - /// for non-DOM elements of custom elements. - /// @param[in] element The element to lay out. - /// @param[in] containing_block The size of the element's containing block. - static bool FormatElement(Element* element, const Vector2f& containing_block); - - /// Generates the box for an element. - /// @param[out] box The box to be built. - /// @param[in] containing_block The dimensions of the content area of the block containing the element. - /// @param[in] element The element to build the box for. - /// @param[in] inline_element True if the element is placed in an inline context, false if not. - static void BuildBox(Box& box, const Vector2f& containing_block, Element* element, bool inline_element = false); - - /// Sizes and positions an element within its parent. Any relative values will be evaluated against the size of the - /// element parent's content area. - /// @param element[in] The element to size and position. - /// @param offset[in] The offset of the element inside its parent's content area. - static bool PositionElement(Element* element, const Vector2f& offset); - /// Sizes an element, and positions it within its parent offset from the borders of its content area. Any relative - /// values will be evaluated against the size of the element parent's content area. - /// @param element[in] The element to size and position. - /// @param offset[in] The offset from the parent's borders. - /// @param anchor[in] Defines which corner or edge the border is to be positioned relative to. - static bool PositionElement(Element* element, const Vector2f& offset, PositionAnchor anchor); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Event.h b/libs/libRocket/Include/Rocket/Core/Event.h deleted file mode 100644 index 793e194f6de..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Event.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREEVENT_H -#define ROCKETCOREEVENT_H - -#include "Dictionary.h" -#include "ScriptInterface.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Element; -class EventInstancer; - -/** - An event that propogates through the element hierarchy. Events follow the DOM3 event specification. See - http://www.w3.org/TR/DOM-Level-3-Events/events.html. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API Event : public ScriptInterface -{ -public: - /// Constructor - Event(); - /// Constructor - /// @param[in] target The target element of this event - /// @param[in] type The event type - /// @param[in] parameters The event parameters - /// @param[in] interruptible Can this event have is propagation stopped? - Event(Element* target, const String& type, const Dictionary& parameters, bool interruptible = false); - /// Destructor - virtual ~Event(); - - enum EventPhase { PHASE_UNKNOWN, PHASE_CAPTURE, PHASE_TARGET, PHASE_BUBBLE }; - - /// Get the current propagation phase. - /// @return Current phase the event is in. - EventPhase GetPhase() const; - /// Set the current propagation phase - /// @param phase Switch the phase the event is in - void SetPhase(EventPhase phase); - - /// Set the current element in the propagation. - /// @param[in] element The current element. - void SetCurrentElement(Element* element); - /// Get the current element in the propagation. - /// @return The current element in propagation. - Element* GetCurrentElement() const; - - /// Get the target element - /// @return The target element of this event - Element* GetTargetElement() const; - - /// Get the event type. - /// @return The event type. - const String& GetType() const; - /// Checks if the event is of a certain type. - /// @param type The name of the type to check for. - /// @return True if the event is of the requested type, false otherwise. - bool operator==(const String& type) const; - - /// Has the event been stopped? - /// @return True if the event is still propogating - bool IsPropagating() const; - /// Stops the propagation of the event wherever it is - void StopPropagation(); - - /// Returns the value of one of the event's parameters. - /// @param key[in] The name of the desired parameter. - /// @return The value of the requested parameter. - template < typename T > - T GetParameter(const String& key, const T& default_value) - { - return parameters.Get(key, default_value); - } - /// Access the dictionary of parameters - /// @return The dictionary of parameters - const Dictionary* GetParameters() const; - - /// Release this event. - virtual void OnReferenceDeactivate(); - -protected: - String type; - Dictionary parameters; - - Element* target_element; - Element* current_element; - -private: - bool interruptible; - bool interruped; - - EventPhase phase; - - EventInstancer* instancer; - - friend class Factory; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/EventInstancer.h b/libs/libRocket/Include/Rocket/Core/EventInstancer.h deleted file mode 100644 index bafb8a96fb8..00000000000 --- a/libs/libRocket/Include/Rocket/Core/EventInstancer.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREEVENTINSTANCER_H -#define ROCKETCOREEVENTINSTANCER_H - -#include "ReferenceCountable.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Element; -class Event; - -/** - Abstract instancer interface for instancing events. This is required to be overridden for scripting systems. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API EventInstancer : public ReferenceCountable -{ -public: - virtual ~EventInstancer(); - - /// Instance an event object. - /// @param[in] target Target element of this event. - /// @param[in] name Name of this event. - /// @param[in] parameters Additional parameters for this event. - /// @param[in] interruptible If the event propagation can be stopped. - virtual Event* InstanceEvent(Element* target, const String& name, const Dictionary& parameters, bool interruptible) = 0; - - /// Releases an event instanced by this instancer. - /// @param[in] event The event to release. - virtual void ReleaseEvent(Event* event) = 0; - - /// Releases this event instancer. - virtual void Release() = 0; - -private: - virtual void OnReferenceDeactivate(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/EventListener.h b/libs/libRocket/Include/Rocket/Core/EventListener.h deleted file mode 100644 index c3775d57294..00000000000 --- a/libs/libRocket/Include/Rocket/Core/EventListener.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREEVENTLISTENER_H -#define ROCKETCOREEVENTLISTENER_H - -#include "Header.h" -#include "Event.h" - -namespace Rocket { -namespace Core { - -class Event; -class Element; - -/** - Abstract interface class for handling events. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API EventListener -{ -public: - virtual ~EventListener() {} - - /// Process the incoming Event - virtual void ProcessEvent(Event& event) = 0; - - /// Called when the listener has been attached to a new Element - virtual void OnAttach(Element* ROCKET_UNUSED_PARAMETER(element)) - { - ROCKET_UNUSED(element); - } - - /// Called when the listener has been detached from a Element - virtual void OnDetach(Element* ROCKET_UNUSED_PARAMETER(element)) - { - ROCKET_UNUSED(element); - } -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/EventListenerInstancer.h b/libs/libRocket/Include/Rocket/Core/EventListenerInstancer.h deleted file mode 100644 index 9bfaf762860..00000000000 --- a/libs/libRocket/Include/Rocket/Core/EventListenerInstancer.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREEVENTLISTENERINSTANCER_H -#define ROCKETCOREEVENTLISTENERINSTANCER_H - -#include "ReferenceCountable.h" -#include "String.h" -#include "Header.h" -#include "Element.h" - -namespace Rocket { -namespace Core { - -class EventListener; - -/** - Abstract instancer interface for instancing event listeners. This is required to be overridden for scripting - systems. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API EventListenerInstancer : public ReferenceCountable -{ -public: - virtual ~EventListenerInstancer(); - - /// Instance an event listener object. - /// @param value Value of the event. - /// @param element Element that triggers the events. - virtual EventListener* InstanceEventListener(const String& value, Element* element) = 0; - - /// Releases this event listener instancer. - virtual void Release() = 0; - -protected: - virtual void OnReferenceDeactivate(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Factory.h b/libs/libRocket/Include/Rocket/Core/Factory.h deleted file mode 100644 index 009052cb845..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Factory.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFACTORY_H -#define ROCKETCOREFACTORY_H - -#include "XMLParser.h" -#include "Header.h" -#include - -namespace Rocket { -namespace Core { - -class Context; -class ContextInstancer; -class Decorator; -class DecoratorInstancer; -class Element; -class ElementDocument; -class ElementInstancer; -class Event; -class EventInstancer; -class EventListener; -class EventListenerInstancer; -class FontEffect; -class FontEffectInstancer; -class StyleSheet; -class PropertyDictionary; - -/** - The Factory contains a registry of instancers for different types. - - All instantiation of these rocket types should go through the factory - so that scripting API's can bind in new types. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API Factory -{ -public: - /// Initialise the element factory - static bool Initialise(); - /// Cleanup and shutdown the factory - static void Shutdown(); - - /// Registers the instancer to use when instancing contexts. - /// @param[in] instancer The new context instancer. - static ContextInstancer* RegisterContextInstancer(ContextInstancer* instancer); - /// Instances a new context. - /// @param[in] name The name of the new context. - /// @return The new context, or NULL if no context could be created. - static Context* InstanceContext(const String& name); - - /// Registers an element instancer that will be used to instance an element when the specified tag is encountered. - /// @param[in] name Name of the instancer; elements with this as their tag will use this instancer. - /// @param[in] instancer The instancer to call when the tag is encountered. - /// @return The added instancer if the registration was successful, NULL otherwise. - static ElementInstancer* RegisterElementInstancer(const String& name, ElementInstancer* instancer); - /// Returns the element instancer for the specified tag. - /// @param[in] tag Name of the tag to get the instancer for. - /// @return The requested element instancer, or NULL if no such instancer is registered. - static ElementInstancer* GetElementInstancer(const String& tag); - /// Instances a single element. - /// @param[in] parent The parent of the new element, or NULL for a root tag. - /// @param[in] instancer The name of the instancer to create the element with. - /// @param[in] tag The tag of the element to be instanced. - /// @param[in] attributes The attributes to instance the element with. - /// @return The instanced element, or NULL if the instancing failed. - static Element* InstanceElement(Element* parent, const String& instancer, const String& tag, const XMLAttributes& attributes); - - /// Instances a single text element containing a string. The string is assumed to contain no RML markup, but will - /// be translated and therefore may have some introduced. In this case more than one element may be instanced. - /// @param[in] parent The element any instanced elements will be parented to. - /// @param[in] text The text to instance the element (or elements) from. - /// @return True if the string was parsed without error, false otherwise. - static bool InstanceElementText(Element* parent, const String& text); - /// Instances an element tree based on the stream. - /// @param[in] parent The element the stream elements will be added to. - /// @param[in] stream The stream to read the element RML from. - /// @return True if the stream was parsed without error, false otherwise. - static bool InstanceElementStream(Element* parent, Stream* stream); - /// Instances a document from a stream. - /// @param[in] context The context that is creating the document. - /// @param[in] stream The stream to instance from. - /// @return The instanced document, or NULL if an error occurred. - static ElementDocument* InstanceDocumentStream(Rocket::Core::Context* context, Stream* stream); - - /// Registers an instancer that will be used to instance decorators. - /// @param[in] name The name of the decorator the instancer will be called for. - /// @param[in] instancer The instancer to call when the decorator name is encountered. - /// @return The added instancer if the registration was successful, NULL otherwise. - static DecoratorInstancer* RegisterDecoratorInstancer(const String& name, DecoratorInstancer* instancer); - /// Attempts to instance a decorator from an instancer registered with the factory. - /// @param[in] name The name of the desired decorator type. - /// @param[in] properties The properties associated with the decorator. - /// @return The newly instanced decorator, or NULL if the decorator could not be instanced. - static Decorator* InstanceDecorator(const String& name, const PropertyDictionary& properties); - - /// Registers an instancer that will be used to instance font effects. - /// @param[in] name The name of the font effect the instancer will be called for. - /// @param[in] instancer The instancer to call when the font effect name is encountered. - /// @return The added instancer if the registration was successful, NULL otherwise. - static FontEffectInstancer* RegisterFontEffectInstancer(const String& name, FontEffectInstancer* instancer); - /// Attempts to instance a font effect from an instancer registered with the factory. - /// @param[in] name The name of the desired font effect type. - /// @param[in] properties The properties associated with the font effect. - /// @return The newly instanced font effect, or NULL if the font effect could not be instanced. - static FontEffect* InstanceFontEffect(const String& name, const PropertyDictionary& properties); - - /// Creates a style sheet from a user-generated string. - /// @param[in] string The contents of the style sheet. - /// @return A pointer to the newly created style sheet. - static StyleSheet* InstanceStyleSheetString(const String& string); - /// Creates a style sheet from a file. - /// @param[in] file_name The location of the style sheet file. - /// @return A pointer to the newly created style sheet. - static StyleSheet* InstanceStyleSheetFile(const String& file_name); - /// Creates a style sheet from an Stream. - /// @param[in] stream A pointer to the stream containing the style sheet's contents. - /// @return A pointer to the newly created style sheet. - static StyleSheet* InstanceStyleSheetStream(Stream* stream); - /// Clears the style sheet cache. This will force style sheets to be reloaded. - static void ClearStyleSheetCache(); - /// Clears the template cache. This will force template to be reloaded. - static void ClearTemplateCache(); - - /// Registers an instancer for all events. - /// @param[in] instancer The instancer to be called. - /// @return The registered instanced on success, NULL on failure. - static EventInstancer* RegisterEventInstancer(EventInstancer* instancer); - /// Instance and event object - /// @param[in] target Target element of this event. - /// @param[in] name Name of this event. - /// @param[in] parameters Additional parameters for this event. - /// @param[in] interruptible If the event propagation can be stopped. - /// @return The instanced event. - static Event* InstanceEvent(Element* target, const String& name, const Dictionary& parameters, bool interruptible); - - /// Register the instancer to be used for all event listeners. - /// @return The registered instancer on success, NULL on failure. - static EventListenerInstancer* RegisterEventListenerInstancer(EventListenerInstancer* instancer); - /// Instance an event listener with the given string. This is used for instancing listeners for the on* events from - /// RML. - /// @param[in] value The parameters to the event listener. - /// @return The instanced event listener. - static EventListener* InstanceEventListener(const String& value, Element* element); - -private: - Factory(); - ~Factory(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/FileInterface.h b/libs/libRocket/Include/Rocket/Core/FileInterface.h deleted file mode 100644 index 48ef826be78..00000000000 --- a/libs/libRocket/Include/Rocket/Core/FileInterface.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFILEINTERFACE_H -#define ROCKETCOREFILEINTERFACE_H - -#include "Header.h" -#include "Types.h" -#include "ReferenceCountable.h" - -namespace Rocket { -namespace Core { - -/** - The abstract base class for application-specific file I/O. - - By default, Rocket will use a file interface implementing the standard C file functions. If this is not sufficient, - or your application wants more control over file I/O, this class should be derived, instanced, and installed - through Core::SetFileInterface() before you initialise Rocket. - - @author Peter Curry - */ - -class ROCKETCORE_API FileInterface : public ReferenceCountable -{ -public: - FileInterface(); - virtual ~FileInterface(); - - /// Opens a file. - /// @param file The file handle to write to. - /// @return A valid file handle, or NULL on failure - virtual FileHandle Open(const String& path) = 0; - /// Closes a previously opened file. - /// @param file The file handle previously opened through Open(). - virtual void Close(FileHandle file) = 0; - - /// Reads data from a previously opened file. - /// @param buffer The buffer to be read into. - /// @param size The number of bytes to read into the buffer. - /// @param file The handle of the file. - /// @return The total number of bytes read into the buffer. - virtual size_t Read(void* buffer, size_t size, FileHandle file) = 0; - /// Seeks to a point in a previously opened file. - /// @param file The handle of the file to seek. - /// @param offset The number of bytes to seek. - /// @param origin One of either SEEK_SET (seek from the beginning of the file), SEEK_END (seek from the end of the file) or SEEK_CUR (seek from the current file position). - /// @return True if the operation completed successfully, false otherwise. - virtual bool Seek(FileHandle file, long offset, int origin) = 0; - /// Returns the current position of the file pointer. - /// @param file The handle of the file to be queried. - /// @return The number of bytes from the origin of the file. - virtual size_t Tell(FileHandle file) = 0; - - /// Returns the length of the file. - /// The default implementation uses Seek & Tell. - /// @param file The handle of the file to be queried. - /// @return The length of the file in bytes. - virtual size_t Length(FileHandle file); - - /// Called when this file interface is released. - virtual void Release(); - -protected: - virtual void OnReferenceDeactivate(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Font.h b/libs/libRocket/Include/Rocket/Core/Font.h deleted file mode 100644 index 1a75184a613..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Font.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONT_H -#define ROCKETCOREFONT_H - -namespace Rocket { -namespace Core { - -namespace Font -{ - enum Style - { - STYLE_NORMAL = 0, - STYLE_ITALIC = 1, - NUM_STYLES = 2 - }; - - enum Weight - { - WEIGHT_NORMAL = 0, - WEIGHT_BOLD = 1, - NUM_WEIGHTS = 2 - }; - - enum Line - { - UNDERLINE = 0, - OVERLINE = 1, - STRIKE_THROUGH = 2 - }; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/FontDatabase.h b/libs/libRocket/Include/Rocket/Core/FontDatabase.h deleted file mode 100644 index 5a73588924c..00000000000 --- a/libs/libRocket/Include/Rocket/Core/FontDatabase.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTDATABASE_H -#define ROCKETCOREFONTDATABASE_H - -#include "StringUtilities.h" -#include "Header.h" -#include "Font.h" - -namespace Rocket { -namespace Core { - -class FontEffect; -class FontFamily; -class FontFaceHandle; -class PropertyDictionary; - -/** - The font database contains all font families currently in use by Rocket. - - @author Peter Curry - */ - -class ROCKETCORE_API FontDatabase -{ -public: - static bool Initialise(); - static void Shutdown(); - - /// Adds a new font face to the database. The face's family, style and weight will be determined from the face itself. - /// @param[in] file_name The file to load the face from. - /// @return True if the face was loaded successfully, false otherwise. - static bool LoadFontFace(const String& file_name); - /// Adds a new font face to the database, ignoring any family, style and weight information stored in the face itself. - /// @param[in] file_name The file to load the face from. - /// @param[in] family The family to add the face to. - /// @param[in] style The style of the face (normal or italic). - /// @param[in] weight The weight of the face (normal or bold). - /// @return True if the face was loaded successfully, false otherwise. - static bool LoadFontFace(const String& file_name, const String& family, Font::Style style, Font::Weight weight); - /// Adds a new font face to the database, loading from memory. The face's family, style and weight will be determined from the face itself. - /// @param[in] data The font data. - /// @param[in] data_length Length of the data. - /// @return True if the face was loaded successfully, false otherwise. - static bool LoadFontFace(const byte* data, int data_length); - /// Adds a new font face to the database, loading from memory. - /// @param[in] data The font data. - /// @param[in] data_length Length of the data. - /// @param[in] family The family to add the face to. - /// @param[in] style The style of the face (normal or italic). - /// @param[in] weight The weight of the face (normal or bold). - /// @return True if the face was loaded successfully, false otherwise. - static bool LoadFontFace(const byte* data, int data_length, const String& family, Font::Style style, Font::Weight weight); - - /// Returns a handle to a font face that can be used to position and render text. This will return the closest match - /// it can find, but in the event a font family is requested that does not exist, NULL will be returned instead of a - /// valid handle. - /// @param[in] family The family of the desired font handle. - /// @param[in] charset The set of characters required in the font face, as a comma-separated list of unicode ranges. - /// @param[in] style The style of the desired font handle. - /// @param[in] weight The weight of the desired font handle. - /// @param[in] size The size of desired handle, in points. - /// @return A valid handle if a matching (or closely matching) font face was found, NULL otherwise. - static FontFaceHandle* GetFontFaceHandle(const String& family, const String& charset, Font::Style style, Font::Weight weight, int size); - - /// Returns a font effect, either a newly-instanced effect from the factory or an identical - /// shared effect. - /// @param[in] name The name of the desired font effect type. - /// @param[in] properties The properties associated with the font effect. - /// @return The requested font effect, or NULL if the font effect could not be found or instanced. - static FontEffect* GetFontEffect(const String& name, const PropertyDictionary& properties); - - /// Removes a font effect from the font database's cache. - /// @param[in] The effect to release. - static void ReleaseFontEffect(const FontEffect* effect); - - /// Sets backup face for all fonts to use - /// @param[in] path Path of the font face to use - static void SetBackupFace(const String& path); - - /// Gets the backup face - static void* GetBackupFace(void); - -private: - FontDatabase(void); - ~FontDatabase(void); - - // Adds a loaded face to the appropriate font family. - bool AddFace(void* face, const String& family, Font::Style style, Font::Weight weight, bool release_stream); - // Loads a FreeType face. - void* LoadFace(const String& file_name); - // Loads a FreeType face from memory. - void* LoadFace(const byte* data, int data_length, const String& source, bool local_data); - - typedef std::map< String, FontFamily*, StringUtilities::StringComparei > FontFamilyMap; - FontFamilyMap font_families; - void* backup_face; - - static FontDatabase* instance; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/FontEffect.h b/libs/libRocket/Include/Rocket/Core/FontEffect.h deleted file mode 100644 index 7bbb6a7d2e3..00000000000 --- a/libs/libRocket/Include/Rocket/Core/FontEffect.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTEFFECT_H -#define ROCKETCOREFONTEFFECT_H - -#include "FontGlyph.h" - -namespace Rocket { -namespace Core { - -class FontEffectInstancer; - -/** - @author Peter Curry - */ - -class FontEffect : public ReferenceCountable -{ -public: - FontEffect(); - virtual ~FontEffect(); - - /// Returns the name of the effect; this is the type that instanced the effect. - /// @return The effect's name. - const String& GetName() const; - - /// Asks the font effect if it requires, and will generate, its own unique texture. If it does - /// not, it will share the font's base layer's textures instead. - /// @return True if the effect generates its own textures, false if not. The default implementation returns false. - virtual bool HasUniqueTexture() const; - - /// Requests the effect for a size and position of a single glyph's bitmap. - /// @param[out] origin The desired origin of the effect's glyph bitmap, as a pixel offset from its original origin. This defaults to (0, 0). - /// @param[out] dimensions The desired dimensions of the effect's glyph bitmap, in pixels. This defaults to the dimensions of the glyph's original bitmap. If the font effect is not generating a unique texture, this will be ignored. - /// @param[in] glyph The glyph the effect is being asked to size. - /// @return False if the effect is not providing support for the glyph, true otherwise. - virtual bool GetGlyphMetrics(Vector2i& origin, Vector2i& dimensions, const FontGlyph& glyph) const; - - /// Requests the effect to generate the texture data for a single glyph's bitmap. The default implementation does - /// nothing. - /// @param[out] destination_data The top-left corner of the glyph's 32-bit, RGBA-ordered, destination texture. Note that they glyph shares its texture with other glyphs. - /// @param[in] destination_dimensions The dimensions of the glyph's area on its texture. - /// @param[in] destination_stride The stride of the glyph's texture. - /// @param[in] glyph The glyph the effect is being asked to generate an effect texture for. - virtual void GenerateGlyphTexture(byte* destination_data, const Vector2i& destination_dimensions, int destination_stride, const FontGlyph& glyph) const; - - /// Sets the colour of the effect's geometry. - /// @param[in] colour The effect's colour. - void SetColour(const Colourb& colour); - /// Returns the effect's colour. - /// @return The colour of the effect. - const Colourb& GetColour() const; - - /// Sets the z-index of the font effect. An effect with a higher z-index will be rendered after - /// an effect with a lower z-index. By default, all effects have a z-index of 0. - /// @param[in] z-index The new z-index of the effect. - void SetZIndex(float z_index); - /// Returns the font effect's z-index. - /// @return The z-index of the effect. - float GetZIndex() const; - - /// Sets the specificity of the font effect. - /// @param[in] specificity The specificity of the effect. - void SetSpecificity(int specificity); - /// Returns the specificity of the font effect. This is used when multiple pseudo-classes are - /// active on an element, each with similarly-named font effects. - /// @return The specificity of the effect. - int GetSpecificity() const; - - /// Returns the font effect's generation key. - /// @return A hash of the effect's properties used to generate the geometry and texture data. - const String& GetGenerationKey() const; - -protected: - /// Releases the effect through its instancer. - virtual void OnReferenceDeactivate(); - -private: - FontEffectInstancer* instancer; - - // The name of the effect. - String name; - - // The colour of the effect's geometry. - Colourb colour; - - // The z-index of this font effect, used to resolve render order when multiple font effects are rendered. - float z_index; - // The maximum specificity of the properties used to define the font effect. - int specificity; - - // A string identifying the properties that affected the generation of the effect's geometry and texture data. - String generation_key; - - friend class Factory; -}; - -typedef std::vector< FontEffect* > FontEffectList; -typedef std::map< String, FontEffect* > FontEffectMap; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/FontEffectInstancer.h b/libs/libRocket/Include/Rocket/Core/FontEffectInstancer.h deleted file mode 100644 index 9a9b1086012..00000000000 --- a/libs/libRocket/Include/Rocket/Core/FontEffectInstancer.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTEFFECTINSTANCER_H -#define ROCKETCOREFONTEFFECTINSTANCER_H - -#include "ReferenceCountable.h" -#include "Header.h" -#include "PropertyDictionary.h" -#include "PropertySpecification.h" - -namespace Rocket { -namespace Core { - -class FontEffect; - -/** - A font effect instancer provides a method for allocating and deallocating font effects. - - It is important at the same instancer that allocated a font effect releases it. This ensures there are no issues - with memory from different DLLs getting mixed up. - - @author Peter Curry - */ - -class ROCKETCORE_API FontEffectInstancer : public ReferenceCountable -{ -public: - FontEffectInstancer(); - virtual ~FontEffectInstancer(); - - /// Instances a font effect given the property tag and attributes from the RCSS file. - /// @param[in] name The type of font effect desired. For example, "title-font-effect: outline;" is declared as type "outline". - /// @param[in] properties All RCSS properties associated with the font effect. - /// @return The font effect if it was instanced successfully, NULL if an error occured. - virtual FontEffect* InstanceFontEffect(const String& name, const PropertyDictionary& properties) = 0; - /// Releases the given font effect. - /// @param[in] font_effect Font effect to release. This is guaranteed to have been constructed by this instancer. - virtual void ReleaseFontEffect(FontEffect* font_effect) = 0; - - /// Releases the instancer. - virtual void Release() = 0; - - /// Returns the property specification associated with the instancer. - const PropertySpecification& GetPropertySpecification() const; - -protected: - /// Registers a property for the font effect. - /// @param[in] property_name The name of the new property (how it is specified through RCSS). - /// @param[in] default_value The default value to be used. - /// @param[in] affects_generation True if this property affects the effect's texture data or glyph size, false if not. - /// @return The new property definition, ready to have parsers attached. - PropertyDefinition& RegisterProperty(const String& property_name, const String& default_value, bool affects_generation = true); - /// Registers a shorthand property definition. - /// @param[in] shorthand_name The name to register the new shorthand property under. - /// @param[in] properties A comma-separated list of the properties this definition is shorthand for. The order in which they are specified here is the order in which the values will be processed. - /// @param[in] type The type of shorthand to declare. - /// @param True if all the property names exist, false otherwise. - bool RegisterShorthand(const String& shorthand_name, const String& property_names, PropertySpecification::ShorthandType type = PropertySpecification::AUTO); - - // Releases the instancer. - virtual void OnReferenceDeactivate(); - -private: - PropertySpecification properties; - - // Properties that define the geometry. - std::set< String > volatile_properties; - - friend class Factory; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/FontFaceHandle.h b/libs/libRocket/Include/Rocket/Core/FontFaceHandle.h deleted file mode 100644 index d0e868bf44f..00000000000 --- a/libs/libRocket/Include/Rocket/Core/FontFaceHandle.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTFACEHANDLE_H -#define ROCKETCOREFONTFACEHANDLE_H - -// HACK: Include cstdint here, for some reasons it is enough for the -// whole librocket code. -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include FT_FREETYPE_H -#include FT_SIZES_H - -namespace Rocket { -namespace Core { - -class FontFaceLayer; - -/** - @author Peter Curry - */ - -class FontFaceHandle : public ReferenceCountable -{ -public: - FontFaceHandle(); - virtual ~FontFaceHandle(); - - /// Initialises the handle so it is able to render text. - /// @param[in] ft_face The FreeType face that this handle is rendering. - /// @param[in] charset The comma-separated list of unicode ranges this handle must support. - /// @param[in] size The size, in points, of the face this handle should render at. - /// @return True if the handle initialised successfully and is ready for rendering, false if an error occured. - bool Initialise(FT_Face ft_face, const String& charset, int size); - - /// Returns the average advance of all glyphs in this font face. - /// @return An approximate width of the characters in this font face. - int GetCharacterWidth() const; - - /// Returns the point size of this font face. - /// @return The face's point size. - int GetSize() const; - /// Returns the pixel height of a lower-case x in this font face. - /// @return The height of a lower-case x. - int GetXHeight() const; - /// Returns the default height between this font face's baselines. - /// @return The default line height. - int GetLineHeight() const; - - /// Returns the font's baseline, as a pixel offset from the bottom of the font. - /// @return The font's baseline. - int GetBaseline() const; - - /// Returns the font's glyphs. - /// @return The font's glyphs. - const FontGlyphMap& GetGlyphs() const; - - /// Returns the width a string will take up if rendered with this handle. - /// @param[in] string The string to measure. - /// @param[in] prior_character The optionally-specified character that immediately precedes the string. This may have an impact on the string width due to kerning. - /// @return The width, in pixels, this string will occupy if rendered with this handle. - int GetStringWidth(const WString& string, word prior_character = 0); - - /// Generates, if required, the layer configuration for a given array of font effects. - /// @param[in] font_effects The list of font effects to generate the configuration for. - /// @return The index to use when generating geometry using this configuration. - int GenerateLayerConfiguration(FontEffectMap& font_effects); - /// Generates the texture data for a layer (for the texture database). - /// @param[out] texture_data The pointer to be set to the generated texture data. - /// @param[out] texture_dimensions The dimensions of the texture. - /// @param[out] texture_samples Pixel size of the texture, in bytes. - /// @param[in] layer_id The id of the layer to request the texture data from. - /// @param[in] texture_id The index of the texture within the layer to generate. - bool GenerateLayerTexture(const byte*& texture_data, Vector2i& texture_dimensions, int &texture_samples, FontEffect* layer_id, int layout_id, int texture_id); - - /// Generates the geometry required to render a single line of text. - /// @param[out] geometry An array of geometries to generate the geometry into. - /// @param[in] string The string to render. - /// @param[in] position The position of the baseline of the first character to render. - /// @param[in] colour The colour to render the text. - /// @return The width, in pixels, of the string geometry. - int GenerateString(GeometryList& geometry, const WString& string, const Vector2f& position, const Colourb& colour, int layer_configuration = 0) const; - /// Generates the geometry required to render a line above, below or through a line of text. - /// @param[out] geometry The geometry to append the newly created geometry into. - /// @param[in] position The position of the baseline of the lined text. - /// @param[in] width The width of the string to line. - /// @param[in] height The height to render the line at. - /// @param[in] colour The colour to draw the line in. - void GenerateLine(Geometry* geometry, const Vector2f& position, int width, Font::Line height, const Colourb& colour) const; - - /// Returns the font face's raw charset (the charset range as a string). - /// @return The font face's charset. - const String& GetRawCharset() const; - /// Returns the font face's charset. - /// @return The font face's charset. - const UnicodeRangeList& GetCharset() const; - -protected: - /// Destroys the handle. - virtual void OnReferenceDeactivate(); - -private: - void GenerateMetrics(void); - - bool BuildGlyphMap( const Rocket::Core::UnicodeRange &unicode_range ); - void BuildGlyph(FontGlyph& glyph, FT_GlyphSlot ft_glyph); - - int GetKerning(word lhs, word rhs) const; - - // Generates (or shares) a layer derived from a font effect. - FontFaceLayer* GenerateLayer(FontEffect* font_effect); - - typedef std::map< word, int > GlyphKerningMap; - typedef std::map< word, GlyphKerningMap > FontKerningMap; - - FT_Size ft_size; - FT_Size backup_size; - uint8_t fonts_generated[ 0xFFFF / 256 / 8 ]; - - FontGlyphMap glyphs; - - typedef std::map< const FontEffect*, FontFaceLayer* > FontLayerMap; - typedef std::map< String, FontFaceLayer* > FontLayerCache; - typedef std::vector< FontFaceLayer* > LayerConfiguration; - typedef std::vector< LayerConfiguration > LayerConfigurationList; - - // The list of all font layers, index by the effect that instanced them. - FontFaceLayer* base_layer; - FontLayerMap layers; - // Each font layer that generated geometry or textures, indexed by the respective generation - // key. - FontLayerCache layer_cache; - - // All configurations currently in use on this handle. New configurations will be generated as - // required. - LayerConfigurationList layer_configurations; - - // The average advance (in pixels) of all of this face's glyphs. - int average_advance; - - int size; - int x_height; - int line_height; - int baseline; - - float underline_position; - float underline_thickness; - - String raw_charset; - UnicodeRangeList charset; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/FontGlyph.h b/libs/libRocket/Include/Rocket/Core/FontGlyph.h deleted file mode 100644 index 975df5519e6..00000000000 --- a/libs/libRocket/Include/Rocket/Core/FontGlyph.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTGLYPH_H -#define ROCKETCOREFONTGLYPH_H - -#include -#include - -namespace Rocket { -namespace Core { - -/** - Metrics and bitmap data for a single glyph within a font face. - - @author Peter Curry - */ - -class FontGlyph -{ -public: - /// The unicode code point for this glyph. - word character; - - /// The glyph's bounding box. Not to be confused with the dimensions of the glyph's bitmap! - Vector2i dimensions; - /// The distance from the cursor (positioned vertically on the baseline) to the top-left corner - /// of this glyph's bitmap. - Vector2i bearing; - /// The glyph's advance; this is how far the cursor will be moved along after rendering this - /// character. - int advance; - - /// 8-bit opacity information for the glyph's bitmap. The size of the data is given by the - /// dimensions, below. This will be NULL if the glyph has no bitmap data. - byte* bitmap_data; - /// The dimensions of the glyph's bitmap. - Vector2i bitmap_dimensions; -}; - -typedef std::unordered_map< word, FontGlyph > FontGlyphMap; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Geometry.h b/libs/libRocket/Include/Rocket/Core/Geometry.h deleted file mode 100644 index 8f9070850f2..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Geometry.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREGEOMETRY_H -#define ROCKETCOREGEOMETRY_H - -#include "Header.h" -#include "Vertex.h" - -namespace Rocket { -namespace Core { - -class Context; -class Element; -class RenderInterface; -struct Texture; - -/** - A helper object for holding an array of vertices and indices, and compiling it as necessary when rendered. - - @author Peter Curry - */ - -class ROCKETCORE_API Geometry -{ -public: - Geometry(Element* host_element = NULL); - Geometry(Context* host_context); - ~Geometry(); - - /// Set the host element for this geometry; this should be passed in the constructor if possible. - /// @param[in] host_element The new host element for the geometry. - void SetHostElement(Element* host_element); - - /// Attempts to compile the geometry if appropriate, then renders the geometry, compiled if it can. - /// @param[in] translation The translation of the geometry. - void Render(const Vector2f& translation); - - /// Returns the geometry's vertices. If these are written to, Release() should be called to force a recompile. - /// @return The geometry's vertex array. - std::vector< Vertex >& GetVertices(); - /// Returns the geometry's indices. If these are written to, Release() should be called to force a recompile. - /// @return The geometry's index array. - std::vector< int >& GetIndices(); - - /// Gets the geometry's texture. - /// @return The geometry's texture. - const Texture* GetTexture() const; - /// Sets the geometry's texture. - void SetTexture(const Texture* texture); - - /// Releases any previously-compiled geometry, and forces any new geometry to have a compile attempted. - /// @param[in] clear_buffers True to also clear the vertex and index buffers, false to leave intact. - void Release(bool clear_buffers = false); - -private: - // Returns the host context's render interface. - RenderInterface* GetRenderInterface(); - - Context* host_context; - Element* host_element; - - std::vector< Vertex > vertices; - std::vector< int > indices; - const Texture* texture; - - CompiledGeometryHandle compiled_geometry; - bool compile_attempted; - bool fixed_texcoords; -}; - -typedef std::vector< Geometry > GeometryList; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/GeometryUtilities.h b/libs/libRocket/Include/Rocket/Core/GeometryUtilities.h deleted file mode 100644 index 8ac876a9319..00000000000 --- a/libs/libRocket/Include/Rocket/Core/GeometryUtilities.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREGEOMETRYUTILITIES_H -#define ROCKETCOREGEOMETRYUTILITIES_H - -#include "Header.h" -#include "Types.h" -#include "Vertex.h" - -namespace Rocket { -namespace Core { - -/** - A class containing helper functions for rendering geometry. - - @author Robert Curry - */ - -class ROCKETCORE_API GeometryUtilities -{ -public: - /// Generates a quad from a position, size and colour. - /// @param[out] vertices An array of at least four vertices that the generated vertex data will be written into. - /// @param[out] indices An array of at least six indices that the generated index data will be written into. - /// @param[in] origin The origin of the quad to generate. - /// @param[in] dimensions The dimensions of the quad to generate. - /// @param[in] colour The colour to be assigned to each of the quad's vertices. - /// @param[in] index_offset The offset to be added to the generated indices; this should be the number of vertices already in the array. - static void GenerateQuad(Vertex* vertices, int* indices, const Vector2f& origin, const Vector2f& dimensions, const Colourb& colour, int index_offset = 0); - /// Generates a quad from a position, size, colour and texture coordinates. - /// @param[out] vertices An array of at least four vertices that the generated vertex data will be written into. - /// @param[out] indices An array of at least six indices that the generated index data will be written into. - /// @param[in] origin The origin of the quad to generate. - /// @param[in] dimensions The dimensions of the quad to generate. - /// @param[in] colour The colour to be assigned to each of the quad's vertices. - /// @param[in] top_left_texcoord The texture coordinates at the top-left of the quad. - /// @param[in] bottom_right_texcoord The texture coordinates at the bottom-right of the quad. - /// @param[in] index_offset The offset to be added to the generated indices; this should be the number of vertices already in the array. - static void GenerateQuad(Vertex* vertices, int* indices, const Vector2f& origin, const Vector2f& dimensions, const Colourb& colour, const Vector2f& top_left_texcoord, const Vector2f& bottom_right_texcoord, int index_offset = 0); - -private: - GeometryUtilities(); - ~GeometryUtilities(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Header.h b/libs/libRocket/Include/Rocket/Core/Header.h deleted file mode 100644 index 00ffae77e35..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Header.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREHEADER_H -#define ROCKETCOREHEADER_H - -#include "Platform.h" - -// Note: Changing a ROCKETCORE_API_INLINE method -// breaks ABI compatibility!! - -#ifdef STATIC_LIB - #define ROCKET_STATIC_LIB - #pragma message("DEPRECATED: STATIC_LIB macro has been deprecated in favor of ROCKET_STATIC_LIB and support will be removed in a future release") -#endif - -#if !defined ROCKET_STATIC_LIB - #if defined ROCKET_PLATFORM_WIN32 - #if defined RocketCore_EXPORTS - #define ROCKETCORE_API __declspec(dllexport) - // Note: Changing a ROCKETCORE_API_INLINE method - // breaks ABI compatibility!! - - // This results in an exported method from the DLL - // that may be inlined in DLL clients, or if not - // possible the client may choose to import the copy - // in the DLL if it can not be inlined. - #define ROCKETCORE_API_INLINE __declspec(dllexport) inline - #else - #define ROCKETCORE_API __declspec(dllimport) - // Note: Changing a ROCKETCORE_API_INLINE method - // breaks ABI compatibility!! - - // Based on the warnngs emitted by GCC/MinGW if using - // dllimport and inline together, the information at - // http://msdn.microsoft.com/en-us/library/xa0d9ste.aspx - // using dllimport inline is tricky. - #if defined(_MSC_VER) - // VisualStudio dllimport inline is supported - // and may be expanded to inline code when the - // /Ob1 or /Ob2 options are given for inline - // expansion, or pulled from the DLL if it can - // not be inlined. - #define ROCKETCORE_API_INLINE __declspec(dllimport) inline - #else - // MinGW 32/64 dllimport inline is not supported - // and dllimport is ignored, so we avoid using - // it here to squelch compiler generated - // warnings. - #define ROCKETCORE_API_INLINE inline - #endif - #endif - #else - #define ROCKETCORE_API __attribute__((visibility("default"))) - // Note: Changing a ROCKETCORE_API_INLINE method - // breaks ABI compatibility!! - #define ROCKETCORE_API_INLINE __attribute__((visibility("default"))) inline - #endif -#else - #define ROCKETCORE_API - // Note: Changing a ROCKETCORE_API_INLINE method - // breaks ABI compatibility!! - #define ROCKETCORE_API_INLINE inline -#endif - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Input.h b/libs/libRocket/Include/Rocket/Core/Input.h deleted file mode 100644 index e733857bb8c..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Input.h +++ /dev/null @@ -1,275 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREINPUT_H -#define ROCKETCOREINPUT_H - -namespace Rocket { -namespace Core { - -/* - Enumerants for sending input events into Rocket. - - @author Peter Curry - */ - -namespace Input -{ - enum KeyIdentifier - { - KI_UNKNOWN = 0, - - KI_SPACE = 1, - - KI_0 = 2, - KI_1 = 3, - KI_2 = 4, - KI_3 = 5, - KI_4 = 6, - KI_5 = 7, - KI_6 = 8, - KI_7 = 9, - KI_8 = 10, - KI_9 = 11, - - KI_A = 12, - KI_B = 13, - KI_C = 14, - KI_D = 15, - KI_E = 16, - KI_F = 17, - KI_G = 18, - KI_H = 19, - KI_I = 20, - KI_J = 21, - KI_K = 22, - KI_L = 23, - KI_M = 24, - KI_N = 25, - KI_O = 26, - KI_P = 27, - KI_Q = 28, - KI_R = 29, - KI_S = 30, - KI_T = 31, - KI_U = 32, - KI_V = 33, - KI_W = 34, - KI_X = 35, - KI_Y = 36, - KI_Z = 37, - - KI_OEM_1 = 38, // US standard keyboard; the ';:' key. - KI_OEM_PLUS = 39, // Any region; the '=+' key. - KI_OEM_COMMA = 40, // Any region; the ',<' key. - KI_OEM_MINUS = 41, // Any region; the '-_' key. - KI_OEM_PERIOD = 42, // Any region; the '.>' key. - KI_OEM_2 = 43, // Any region; the '/?' key. - KI_OEM_3 = 44, // Any region; the '`~' key. - - KI_OEM_4 = 45, // US standard keyboard; the '[{' key. - KI_OEM_5 = 46, // US standard keyboard; the '\|' key. - KI_OEM_6 = 47, // US standard keyboard; the ']}' key. - KI_OEM_7 = 48, // US standard keyboard; the ''"' key. - KI_OEM_8 = 49, - - KI_OEM_102 = 50, // RT 102-key keyboard; the '<>' or '\|' key. - - KI_NUMPAD0 = 51, - KI_NUMPAD1 = 52, - KI_NUMPAD2 = 53, - KI_NUMPAD3 = 54, - KI_NUMPAD4 = 55, - KI_NUMPAD5 = 56, - KI_NUMPAD6 = 57, - KI_NUMPAD7 = 58, - KI_NUMPAD8 = 59, - KI_NUMPAD9 = 60, - KI_NUMPADENTER = 61, - KI_MULTIPLY = 62, // Asterisk on the numeric keypad. - KI_ADD = 63, // Plus on the numeric keypad. - KI_SEPARATOR = 64, - KI_SUBTRACT = 65, // Minus on the numeric keypad. - KI_DECIMAL = 66, // Period on the numeric keypad. - KI_DIVIDE = 67, // Forward Slash on the numeric keypad. - - /* - * NEC PC-9800 kbd definitions - */ - KI_OEM_NEC_EQUAL = 68, // Equals key on the numeric keypad. - - KI_BACK = 69, // Backspace key. - KI_TAB = 70, // Tab key. - - KI_CLEAR = 71, - KI_RETURN = 72, - - KI_PAUSE = 73, - KI_CAPITAL = 74, // Capslock key. - - KI_KANA = 75, // IME Kana mode. - KI_HANGUL = 76, // IME Hangul mode. - KI_JUNJA = 77, // IME Junja mode. - KI_FINAL = 78, // IME final mode. - KI_HANJA = 79, // IME Hanja mode. - KI_KANJI = 80, // IME Kanji mode. - - KI_ESCAPE = 81, // Escape key. - - KI_CONVERT = 82, // IME convert. - KI_NONCONVERT = 83, // IME nonconvert. - KI_ACCEPT = 84, // IME accept. - KI_MODECHANGE = 85, // IME mode change request. - - KI_PRIOR = 86, // Page Up key. - KI_NEXT = 87, // Page Down key. - KI_END = 88, - KI_HOME = 89, - KI_LEFT = 90, // Left Arrow key. - KI_UP = 91, // Up Arrow key. - KI_RIGHT = 92, // Right Arrow key. - KI_DOWN = 93, // Down Arrow key. - KI_SELECT = 94, - KI_PRINT = 95, - KI_EXECUTE = 96, - KI_SNAPSHOT = 97, // Print Screen key. - KI_INSERT = 98, - KI_DELETE = 99, - KI_HELP = 100, - - KI_LWIN = 101, // Left Windows key. - KI_RWIN = 102, // Right Windows key. - KI_APPS = 103, // Applications key. - - KI_POWER = 104, - KI_SLEEP = 105, - KI_WAKE = 106, - - KI_F1 = 107, - KI_F2 = 108, - KI_F3 = 109, - KI_F4 = 110, - KI_F5 = 111, - KI_F6 = 112, - KI_F7 = 113, - KI_F8 = 114, - KI_F9 = 115, - KI_F10 = 116, - KI_F11 = 117, - KI_F12 = 118, - KI_F13 = 119, - KI_F14 = 120, - KI_F15 = 121, - KI_F16 = 122, - KI_F17 = 123, - KI_F18 = 124, - KI_F19 = 125, - KI_F20 = 126, - KI_F21 = 127, - KI_F22 = 128, - KI_F23 = 129, - KI_F24 = 130, - - KI_NUMLOCK = 131, // Numlock key. - KI_SCROLL = 132, // Scroll Lock key. - - /* - * Fujitsu/OASYS kbd definitions - */ - KI_OEM_FJ_JISHO = 133, // 'Dictionary' key. - KI_OEM_FJ_MASSHOU = 134, // 'Unregister word' key. - KI_OEM_FJ_TOUROKU = 135, // 'Register word' key. - KI_OEM_FJ_LOYA = 136, // 'Left OYAYUBI' key. - KI_OEM_FJ_ROYA = 137, // 'Right OYAYUBI' key. - - KI_LSHIFT = 138, - KI_RSHIFT = 139, - KI_LCONTROL = 140, - KI_RCONTROL = 141, - KI_LMENU = 142, - KI_RMENU = 143, - - KI_BROWSER_BACK = 144, - KI_BROWSER_FORWARD = 145, - KI_BROWSER_REFRESH = 146, - KI_BROWSER_STOP = 147, - KI_BROWSER_SEARCH = 148, - KI_BROWSER_FAVORITES = 149, - KI_BROWSER_HOME = 150, - - KI_VOLUME_MUTE = 151, - KI_VOLUME_DOWN = 152, - KI_VOLUME_UP = 153, - KI_MEDIA_NEXT_TRACK = 154, - KI_MEDIA_PREV_TRACK = 155, - KI_MEDIA_STOP = 156, - KI_MEDIA_PLAY_PAUSE = 157, - KI_LAUNCH_MAIL = 158, - KI_LAUNCH_MEDIA_SELECT = 159, - KI_LAUNCH_APP1 = 160, - KI_LAUNCH_APP2 = 161, - - /* - * Various extended or enhanced keyboards - */ - KI_OEM_AX = 162, - KI_ICO_HELP = 163, - KI_ICO_00 = 164, - - KI_PROCESSKEY = 165, // IME Process key. - - KI_ICO_CLEAR = 166, - - KI_ATTN = 167, - KI_CRSEL = 168, - KI_EXSEL = 169, - KI_EREOF = 170, - KI_PLAY = 171, - KI_ZOOM = 172, - KI_PA1 = 173, - KI_OEM_CLEAR = 174, - - KI_LMETA = 175, - KI_RMETA = 176 - }; - - enum KeyModifier - { - KM_CTRL = 1 << 0, // Set if at least one Ctrl key is depressed. - KM_SHIFT = 1 << 1, // Set if at least one Shift key is depressed. - KM_ALT = 1 << 2, // Set if at least one Alt key is depressed. - KM_META = 1 << 3, // Set if at least one Meta key (the command key) is depressed. - KM_CAPSLOCK = 1 << 4, // Set if caps lock is enabled. - KM_NUMLOCK = 1 << 5, // Set if num lock is enabled. - KM_SCROLLLOCK = 1 << 6 // Set if scroll lock is enabled. - }; -} - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Log.h b/libs/libRocket/Include/Rocket/Core/Log.h deleted file mode 100644 index f2aaf2d575e..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Log.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELOG_H -#define ROCKETCORELOG_H - -#include "Header.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - -/** - libRocket logging API. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API Log -{ -public: - enum Type - { - LT_ALWAYS = 0, - LT_ERROR, - LT_ASSERT, - LT_WARNING, - LT_INFO, - LT_DEBUG, - LT_MAX - }; - -public: - /// Initialises the logging interface. - /// @return True if the logging interface was successful, false if not. - static bool Initialise(); - /// Shutdown the log interface. - static void Shutdown(); - - /// Log the specified message via the registered log interface - /// @param[in] type Type of message. - /// @param[in] format The message, with sprintf-style parameters. - static void Message(Type type, const char* format, ...); - - /// Log a parse error on the specified file and line number. - /// @param[in] filename Name of the file with the parse error. - /// @param[in] line_number Line the error occured on. - /// @param[in] format The error message, with sprintf-style parameters. - static void ParseError(const String& filename, int line_number, const char* format, ...); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Lua/Header.h b/libs/libRocket/Include/Rocket/Core/Lua/Header.h deleted file mode 100644 index 417959979d1..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Lua/Header.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAHEADER_H -#define ROCKETCORELUAHEADER_H - -#include - -#ifdef ROCKETLUA_API -#undef ROCKETLUA_API -#endif - -#ifdef STATIC_LIB - #define ROCKET_STATIC_LIB - #pragma message("DEPRECATED: STATIC_LIB macro has been deprecated in favor of ROCKET_STATIC_LIB and support will be removed in a future release") -#endif - -#if !defined ROCKET_STATIC_LIB - #ifdef ROCKET_PLATFORM_WIN32 - #if defined RocketCoreLua_EXPORTS - #define ROCKETLUA_API __declspec(dllexport) - #elif defined RocketControlsLua_EXPORTS - #define ROCKETLUA_API __declspec(dllexport) - #else - #define ROCKETLUA_API __declspec(dllimport) - #endif - #else - #define ROCKETLUA_API __attribute__((visibility("default"))) - #endif -#else - #define ROCKETLUA_API -#endif - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Lua/Interpreter.h b/libs/libRocket/Include/Rocket/Core/Lua/Interpreter.h deleted file mode 100644 index 21b0285b59a..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Lua/Interpreter.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAINTERPRETER_H -#define ROCKETCORELUAINTERPRETER_H - -#include "Header.h" -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -/** - This initializes the Lua interpreter, and has functions to load the scripts or - call functions that exist in Lua. - - @author Nathan Starkey -*/ -class ROCKETLUA_API Interpreter : public Plugin -{ -public: - /** This function calls luaL_loadfile and then lua_pcall, reporting the errors (if any) - @param[in] file Fully qualified file name to execute. - @remark Somewhat misleading name if you are used to the Lua meaning of "load file". It behaves - exactly as luaL_dofile does. */ - static void LoadFile(const Rocket::Core::String& file); - /** Calls lua_dostring and reports the errors. - @param[in] code String to execute - @param[in] name Name for the code that will show up in the Log */ - static void DoString(const Rocket::Core::String& code, const Rocket::Core::String& name = ""); - /** Same as DoString, except does NOT call pcall on it. It will leave the compiled (but not executed) string - on top of the stack. It behaves exactly like luaL_loadstring, but you get to specify the name - @param[in] code String to compile - @param[in] name Name for the code that will show up in the Log */ - static void LoadString(const Rocket::Core::String& code, const Rocket::Core::String& name = ""); - - /** Clears all of the items on the stack, and pushes the function from funRef on top of the stack. Only use - this if you used lua_ref instead of luaL_ref - @param[in] funRef Lua reference that you would recieve from calling lua_ref */ - static void BeginCall(int funRef); - /** Uses lua_pcall on a function, which executes the function with params number of parameters and pushes - res number of return values on to the stack. - @pre Before you call this, your stack should look like: - [1] function to call; - [2...top] parameters to pass to the function (if any). - Or, in words, make sure to push the function on the stack before the parameters. - @post After this function, the params and function will be popped off, and 'res' - number of items will be pushed. */ - static bool ExecuteCall(int params = 0, int res = 0); - /** removes 'res' number of items from the stack - @param[in] res Number of results to remove from the stack. */ - static void EndCall(int res = 0); - - /** This will populate the global Lua table with all of the Lua core types by calling LuaType::Register - @param[in] L The lua_State to use to register the types - @remark This is called automatically inside of Interpreter::Startup(), so you do not have to - call this function upon initialization of the Interpreter. If you are using RocketControlsLua, then you - \em will need to call Rocket::Controls::Lua::RegisterTypes(lua_State*) */ - static void RegisterCoreTypes(lua_State* L); - - /** - @return The lua_State that the Interpreter created in Interpreter::Startup() - @remark This class lacks a SetLuaState for a reason. If you have to use a seperate Lua binding and want to keep the types - from libRocket, then use this lua_State; it will already have all of the libraries loaded, and all of the types defined. - Alternatively, you can call RegisterCoreTypes(lua_State*) with your own Lua state if you need them defined in it. */ - static lua_State* GetLuaState(); - - /** Creates the plugin. - @remark This is equivilent to calling Initialise(NULL). - */ - static void Initialise(); - /** Creates the plugin and adds Rocket to an existing Lua context if one is provided. - @remark Call this function only once, and special care must be taken when destroying the lua_State passed to this method. - Interpreter::Shutdown() calles lua_close on the lua_State pointer provided here, do not call Interpreter::Shutdown if you - must call lua_close yourself or if you need to continue to use the lua_State pointer provided here. Internally, it calls - Interpreter::Startup() and registers the "body" tag to generate a LuaDocument rather than a Rocket::Core::ElementDocument. - If the argument provided is NULL, a Lua context is created automatically instead. */ - static void Initialise(lua_State *L_); - - /** Stops the plugin by calling lua_close - @remark Shutdown calls lua_Close on the lua_State associated with the Interpreter. If a lua_State was provided in the - original call to Initialise, Shutdown should not be called OR you must not call lua_Close from within your code. */ - static void Shutdown(); - - /** @sa Rocket::Core::Plugin::GetEventClasses */ - virtual int GetEventClasses(); - /** @sa Rocket::Core::Plugin::OnInitialise */ - virtual void OnInitialise(); - /** Currently does nothing. You must call Interpreter::Shutdown yourself at the appropriate time. - @sa Rocket::Core::Plugin::OnShutdown */ - virtual void OnShutdown(); -private: - /** Creates a lua_State for @var L_ and calls luaL_openlibs, then calls Interpreter::RegisterCoreTypes(lua_State*) - @remark called by Interpreter::Initialise() */ - void Startup(); - - /** Lua state that Interpreter::Initialise() creates. */ - static lua_State* L_; -}; -} -} -} -#endif - diff --git a/libs/libRocket/Include/Rocket/Core/Lua/LuaType.h b/libs/libRocket/Include/Rocket/Core/Lua/LuaType.h deleted file mode 100644 index da30e6c3890..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Lua/LuaType.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUALUATYPE_H -#define ROCKETCORELUALUATYPE_H - -#include -#include - - -//As an example, if you used this macro like -//LUAMETHOD(Unit,GetId) -//it would result in code that looks like -//{ "GetId", UnitGetId }, -//Which would force you to create a global function named UnitGetId in C with the correct function signature, usually int(*)(lua_State*,type*); -#define LUAMETHOD(type,name) { #name, type##name }, - -//See above, but the method must match the function signature int(*)(lua_State*) and as example: -//LUAGETTER(Unit,Id) would mean you need a function named UnitGetAttrId -//The first stack position will be the userdata -#define LUAGETTER(type,varname) { #varname, type##GetAttr##varname }, - -//Same method signature as above, but as example: -//LUASETTER(Unit,Id) would mean you need a function named UnitSetAttrId -//The first stack position will be the userdata, and the second will be value on the other side of the equal sign -#define LUASETTER(type,varname) { #varname, type##SetAttr##varname }, - -#define CHECK_BOOL(L,narg) (lua_toboolean((L),(narg)) > 0 ? true : false ) -#define LUACHECKOBJ(obj) if((obj) == NULL) { lua_pushnil(L); return 1; } - - /** Used to remove repetitive typing at the cost of flexibility. When you use this, you @em must have - functions with the same name as defined in the macro. For example, if you used @c Element as type, you would - have to have functions named @c ElementMethods, @c ElementGetters, @c ElementSetters that return the appropriate - types. - @param is_reference_counted true if the type inherits from Rocket::Core::ReferenceCountable, false otherwise*/ -#define LUACORETYPEDEFINE(type,is_ref_counted) \ - template<> const char* GetTClassName() { return #type; } \ - template<> RegType* GetMethodTable() { return type##Methods; } \ - template<> luaL_Reg* GetAttrTable() { return type##Getters; } \ - template<> luaL_Reg* SetAttrTable() { return type##Setters; } \ - template<> bool IsReferenceCounted() { return (is_ref_counted); } \ - -//We can't use LUACORETYPEDEFINE due to namespace issues -#define LUACONTROLSTYPEDEFINE(type,is_ref_counted) \ - template<> const char* GetTClassName() { return #type; } \ - template<> RegType* GetMethodTable() { return Rocket::Controls::Lua::type##Methods; } \ - template<> luaL_Reg* GetAttrTable() { return Rocket::Controls::Lua::type##Getters; } \ - template<> luaL_Reg* SetAttrTable() { return Rocket::Controls::Lua::type##Setters; } \ - template<> bool IsReferenceCounted() { return (is_ref_counted); } \ - -/** Used to remove repetitive typing at the cost of flexibility. It creates function prototypes for -getting the name of the type, method tables, and if it is reference counted. -When you use this, you either must also use -the LUACORETYPEDEFINE macro, or make sure that the function signatures are @em exact.*/ -#define LUACORETYPEDECLARE(type) \ - template<> ROCKETLUA_API const char* GetTClassName(); \ - template<> ROCKETLUA_API RegType* GetMethodTable(); \ - template<> ROCKETLUA_API luaL_Reg* GetAttrTable(); \ - template<> ROCKETLUA_API luaL_Reg* SetAttrTable(); \ - template<> ROCKETLUA_API bool IsReferenceCounted(); \ - -/** Used to remove repetitive typing at the cost of flexibility. It creates function prototypes for -getting the name of the type, method tables, and if it is reference counted. -When you use this, you either must also use -the LUACORETYPEDEFINE macro, or make sure that the function signatures are @em exact.*/ -#define LUACONTROLSTYPEDECLARE(type) \ - template<> ROCKETLUA_API const char* GetTClassName(); \ - template<> ROCKETLUA_API RegType* GetMethodTable(); \ - template<> ROCKETLUA_API luaL_Reg* GetAttrTable(); \ - template<> ROCKETLUA_API luaL_Reg* SetAttrTable(); \ - template<> ROCKETLUA_API bool IsReferenceCounted(); \ - -namespace Rocket { -namespace Core { -namespace Lua { -//replacement for luaL_Reg that uses a different function pointer signature, but similar syntax -template -struct ROCKETLUA_API RegType -{ - const char* name; - int (*ftnptr)(lua_State*,T*); -}; - -/** For all of the methods available from Lua that call to the C functions. */ -template ROCKETLUA_API RegType* GetMethodTable(); -/** For all of the function that 'get' an attribute/property */ -template ROCKETLUA_API luaL_Reg* GetAttrTable(); -/** For all of the functions that 'set' an attribute/property */ -template ROCKETLUA_API luaL_Reg* SetAttrTable(); -/** String representation of the class */ -template ROCKETLUA_API const char* GetTClassName(); -/** bool for if it is reference counted */ -template ROCKETLUA_API bool IsReferenceCounted(); -/** gets called from the LuaType::Register function, right before @c _regfunctions. -If you want to inherit from another class, in the function you would want -to call @c _regfunctions, where method is metatable_index - 1. Anything -that has the same name in the subclass will be overwrite whatever had the -same name in the superclass. */ -template ROCKETLUA_API void ExtraInit(lua_State* L, int metatable_index); - -/** - This is mostly the definition of the Lua userdata that C++ gives to the user, plus - some helper functions. - - @author Nathan Starkey -*/ -template -class ROCKETLUA_API LuaType -{ -public: - typedef int (*ftnptr)(lua_State* L, T* ptr); - /** replacement for luaL_Reg that uses a different function pointer signature, but similar syntax */ - typedef struct { const char* name; ftnptr func; } RegType; - - /** Registers the type T as a type in the Lua global namespace by creating a - metatable with the same name as the class, setting the metatmethods, and adding the - functions from _regfunctions */ - static inline void Register(lua_State *L); - /** Pushes on to the Lua stack a userdata representing a pointer of T - @param obj[in] The object to push to the stack - @param gc[in] If the obj should be deleted or decrease reference count upon the garbage collection - metamethod being called from the object in Lua - @return Position on the stack where the userdata resides */ - static inline int push(lua_State *L, T* obj, bool gc=false); - /** Statically casts the item at the position on the Lua stack - @param narg[in] Position of the item to cast on the Lua stack - @return A pointer to an object of type T or @c NULL */ - static inline T* check(lua_State* L, int narg); - - /** For calling a C closure with upvalues. Used by the functions defined by RegType - @return The value that RegType.func returns */ - static inline int thunk(lua_State* L); - /** String representation of the pointer. Called by the __tostring metamethod */ - static inline void tostring(char* buff, void* obj); - //these are metamethods - /** The __gc metamethod. If the object was pushed by push(lua_State*,T*,bool) with the third - argument as true, it will either decrease the reference count or call delete depending on if - the type is reference counted. If the third argument to push was false, then this does nothing. - @return 0, since it pushes nothing on to the stack*/ - static inline int gc_T(lua_State* L); - /** The __tostring metamethod. - @return 1, because it pushes a string representation of the userdata on to the stack */ - static inline int tostring_T(lua_State* L); - /** The __index metamethod. Called whenever the user attempts to access a variable that is - not in the immediate table. This handles the method calls and calls tofunctions in __getters */ - static inline int index(lua_State* L); - /** The __newindex metamethod. Called when the user attempts to set a variable that is not - int the immediate table. This handles the calls to functions in __setters */ - static inline int newindex(lua_State* L); - - /** Registers methods,getters,and setters to the type. In Lua, the methods exist in the Type name's - metatable, and the getters exist in __getters and setters in __setters. The reason for __getters and __setters - is to have the objects use a 'dot' syntax for properties and a 'colon' syntax for methods.*/ - static inline void _regfunctions(lua_State* L, int meta, int method); -private: - LuaType(); //hide constructor - -}; - - -} -} -} - -#include "LuaType.inl" -#endif \ No newline at end of file diff --git a/libs/libRocket/Include/Rocket/Core/Lua/LuaType.inl b/libs/libRocket/Include/Rocket/Core/Lua/LuaType.inl deleted file mode 100644 index ec88328912f..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Lua/LuaType.inl +++ /dev/null @@ -1,357 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -//#include "precompiled.h" -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -template -void LuaType::Register(lua_State* L) -{ - //for annotations, starting at 1, but it is a relative value, not always 1 - lua_newtable(L); //[1] = table - int methods = lua_gettop(L); //methods = 1 - - luaL_newmetatable(L, GetTClassName()); //[2] = metatable named , referred in here by ClassMT - int metatable = lua_gettop(L); //metatable = 2 - - luaL_newmetatable(L, "DO NOT TRASH"); //[3] = metatable named "DO NOT TRASH" - lua_pop(L,1); //remove the above metatable -> [-1 = 2] - - //store method table in globals so that scripts can add functions written in Lua - lua_pushvalue(L, methods); //[methods = 1] -> [3] = copy (reference) of methods table - lua_setglobal(L, GetTClassName()); // -> = [3 = 1], pop top [3] - - //hide metatable from Lua getmetatable() - lua_pushvalue(L, methods); //[methods = 1] -> [3] = copy of methods table, including modifications above - lua_setfield(L, metatable, "__metatable"); //[metatable = 2] -> t[k] = v; t = [2 = ClassMT], k = "__metatable", v = [3 = 1]; pop [3] - - lua_pushcfunction(L, index); //index = cfunction -> [3] = cfunction - lua_setfield(L, metatable, "__index"); //[metatable = 2] -> t[k] = v; t = [2], k = "__index", v = cfunc; pop [3] - - lua_pushcfunction(L, newindex); - lua_setfield(L, metatable, "__newindex"); - - lua_pushcfunction(L, gc_T); - lua_setfield(L, metatable, "__gc"); - - lua_pushcfunction(L, tostring_T); - lua_setfield(L, metatable, "__tostring"); - - ExtraInit(L,metatable); //optionally implemented by individual types - - lua_newtable(L); //for method table -> [3] = this table - lua_setmetatable(L, methods); //[methods = 1] -> metatable for [1] is [3]; [3] is popped off, top = [2] - - _regfunctions(L,metatable,methods); - - lua_pop(L, 2); //remove the two items from the stack, [1 = methods] and [2 = metatable] -} - - -template -int LuaType::push(lua_State *L, T* obj, bool gc) -{ - //for annotations, starting at index 1, but it is a relative number, not always 1 - if (!obj) { lua_pushnil(L); return lua_gettop(L); } - luaL_getmetatable(L, GetTClassName()); // lookup metatable in Lua registry ->[1] = metatable of - if (lua_isnil(L, -1)) luaL_error(L, "%s missing metatable", GetTClassName()); - int mt = lua_gettop(L); //mt = 1 - T** ptrHold = (T**)lua_newuserdata(L,sizeof(T**)); //->[2] = empty userdata - int ud = lua_gettop(L); //ud = 2 - if(ptrHold != NULL) - { - *ptrHold = obj; - lua_pushvalue(L, mt); // ->[3] = copy of [1] - lua_setmetatable(L, -2); //[-2 = 2] -> [2]'s metatable = [3]; pop [3] - char name[32]; - tostring(name,obj); - lua_getfield(L,LUA_REGISTRYINDEX,"DO NOT TRASH"); //->[3] = value returned from function - if(lua_isnil(L,-1) ) //if [3] hasn't been created yet, then create it - { - luaL_newmetatable(L,"DO NOT TRASH"); //[4] = the new metatable - lua_pop(L,1); //pop [4] - } - lua_pop(L,1); //pop [3] - lua_getfield(L,LUA_REGISTRYINDEX,"DO NOT TRASH"); //->[3] = value returned from function - if(gc == false) //if we shouldn't garbage collect it, then put the name in to [3] - { - lua_pushboolean(L,1);// ->[4] = true - lua_setfield(L,-2,name); //represents t[k] = v, [-2 = 3] = t -> v = [4], k = ; pop [4] - } - else - { - //In case this is an address that has been pushed - //to lua before, we need to set it to nil - lua_pushnil(L); // ->[4] = nil - lua_setfield(L,-2,name); //represents t[k] = v, [-2 = 3] = t -> v = [4], k = ; pop [4] - } - - if(IsReferenceCounted()) - { - //If you look at the gc_T function, reference countables do not - //care about the "DO NOT TRASH" table - ((Rocket::Core::ReferenceCountable*)obj)->AddReference(); - } - - lua_pop(L,1); // -> pop [3] - } - lua_settop(L,ud); //[ud = 2] -> remove everything that is above 2, top = [2] - lua_replace(L, mt); //[mt = 1] -> move [2] to pos [1], and pop previous [1] - lua_settop(L, mt); //remove everything above [1] - return mt; // index of userdata containing pointer to T object -} - - -template -T* LuaType::check(lua_State* L, int narg) -{ - T** ptrHold = static_cast(lua_touserdata(L,narg)); - if(ptrHold == NULL) - return NULL; - return (*ptrHold); -} - - -//private members - -template -int LuaType::thunk(lua_State* L) -{ - // stack has userdata, followed by method args - T *obj = check(L, 1); // get 'self', or if you prefer, 'this' - lua_remove(L, 1); // remove self so member function args start at index 1 - // get member function from upvalue - RegType *l = static_cast(lua_touserdata(L, lua_upvalueindex(1))); - //at the moment, there isn't a case where NULL is acceptable to be used in the function, so check - //for it here, rather than individually for each function - if(obj == NULL) - { - lua_pushnil(L); - return 1; - } - else - return l->func(L,obj); // call member function -} - - - -template -void LuaType::tostring(char* buff, void* obj) -{ - sprintf(buff,"%p",obj); -} - - -template -int LuaType::gc_T(lua_State* L) -{ - T * obj = check(L,1); //[1] = this userdata - if(obj == NULL) - return 0; - if(IsReferenceCounted()) - { - // ReferenceCountables do not care about the "DO NOT TRASH" table. - // Because userdata is pushed which contains a pointer to the pointer - // of 'obj', 'obj' will be garbage collected for every time 'obj' was pushed. - ((Rocket::Core::ReferenceCountable*)obj)->RemoveReference(); - return 0; - } - lua_getfield(L,LUA_REGISTRYINDEX,"DO NOT TRASH"); //->[2] = return value from this - if(lua_istable(L,-1) ) //[-1 = 2], if it is a table - { - char name[32]; - tostring(name,obj); - lua_getfield(L,-1, std::string(name).c_str()); //[-1 = 2] -> [3] = the value returned from if exists in the table to not gc - if(lua_isnoneornil(L,-1) ) //[-1 = 3] if it doesn't exist, then we are free to garbage collect c++ side - { - if(!IsReferenceCounted()) - { - delete obj; - obj = NULL; - } - } - } - lua_pop(L,3); //balance function - return 0; -} - - -template -int LuaType::tostring_T(lua_State* L) -{ - char buff[32]; - T** ptrHold = (T**)lua_touserdata(L,1); - T *obj = *ptrHold; - sprintf(buff, "%p", obj); - lua_pushfstring(L, "%s (%s)", GetTClassName(), buff); - return 1; -} - - - -template -int LuaType::index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - lua_getglobal(L,GetTClassName()); //stack pos [3] (fairly important, just refered to as [3]) - // string form of the key. - const char* key = luaL_checkstring(L,2); - if(lua_istable(L,-1) ) //[-1 = 3] - { - lua_pushvalue(L,2); //[2] = key, [4] = copy of key - lua_rawget(L,-2); //[-2 = 3] -> pop top and push the return value to top [4] - //If the key were looking for is not in the table, retrieve its' metatables' index value. - if(lua_isnil(L,-1)) //[-1 = 4] is value from rawget above - { - //try __getters - lua_pop(L,1); //remove top item (nil) from the stack - lua_pushstring(L, "__getters"); - lua_rawget(L,-2); //[-2 = 3], ._getters -> result to [4] - lua_pushvalue(L,2); //[2 = key] -> copy to [5] - lua_rawget(L,-2); //[-2 = __getters] -> __getters[key], result to [5] - if(lua_type(L,-1) == LUA_TFUNCTION) //[-1 = 5] - { - lua_pushvalue(L,1); //push the userdata to the stack [6] - if(lua_pcall(L,1,1,0) != 0) //remove one, result is at [6] - Report(L, String(GetTClassName()).Append(".__index for ").Append(lua_tostring(L,2)).Append(": ")); - } - else - { - lua_settop(L,4); //forget everything we did above - lua_getmetatable(L,-2); //[-2 = 3] -> metatable from to top [5] - if(lua_istable(L,-1) ) //[-1 = 5] = the result of the above - { - lua_getfield(L,-1,"__index"); //[-1 = 5] = check the __index metamethod for the metatable-> push result to [6] - if(lua_isfunction(L,-1) ) //[-1 = 6] = __index metamethod - { - lua_pushvalue(L,1); //[1] = object -> [7] = object - lua_pushvalue(L,2); //[2] = key -> [8] = key - if(lua_pcall(L,2,1,0) != 0) //call function at top of stack (__index) -> pop top 2 as args; [7] = return value - Report(L, String(GetTClassName()).Append(".__index for ").Append(lua_tostring(L,2)).Append(": ")); - } - else if(lua_istable(L,-1) ) - lua_getfield(L,-1,key); //shorthand version of above -> [7] = return value - else - lua_pushnil(L); //[7] = nil - } - else - lua_pushnil(L); //[6] = nil - } - } - else if(lua_istable(L,-1) )//[-1 = 4] is value from rawget [3] - { - lua_pushvalue(L,2); //[2] = key, [5] = key - lua_rawget(L,-2); //[-2 = 3] = table of -> pop top and push the return value to top [5] - } - } - else - lua_pushnil(L); //[4] = nil - - lua_insert(L,1); //top element to position 1 -> [1] = top element as calculated in the earlier rest of the function - lua_settop(L,1); // -> [1 = -1], removes the other elements - return 1; -} - - - -template -int LuaType::newindex(lua_State* L) -{ - //[1] = obj, [2] = key, [3] = value - //look for it in __setters - lua_getglobal(L,GetTClassName()); //[4] = this table - lua_pushstring(L,"__setters"); //[5] - lua_rawget(L,-2); //[-2 = 4] -> .__setters to [5] - lua_pushvalue(L,2); //[2 = key] -> [6] = copy of key - lua_rawget(L,-2); //[-2 = __setters] -> __setters[key] to [6] - if(lua_type(L,-1) == LUA_TFUNCTION) - { - lua_pushvalue(L,1); //userdata at [7] - lua_pushvalue(L,3); //[8] = copy of [3] - if(lua_pcall(L,2,0,0) != 0) //call function, pop 2 off push 0 on - Report(L, String(GetTClassName()).Append(".__newindex for ").Append(lua_tostring(L,2)).Append(": ")); - } - else - lua_pop(L,1); //not a setter function. - lua_pop(L,2); //pop __setters and the table - return 0; -} - - -template -void LuaType::_regfunctions(lua_State* L, int meta, int methods) -{ - //fill method table with methods. - for(RegType* m = (RegType*)GetMethodTable(); m->name; m++) - { - lua_pushstring(L, m->name); // ->[1] = name of function Lua side - lua_pushlightuserdata(L, (void*)m); // ->[2] = pointer to the object containing the name and the function pointer as light userdata - lua_pushcclosure(L, thunk, 1); //thunk = function pointer -> pop 1 item from stack, [2] = closure - lua_settable(L, methods); // represents t[k] = v, t = [methods] -> pop [2 = closure] to be v, pop [1 = name] to be k - } - - - lua_getfield(L,methods, "__getters"); // -> table[1] - if(lua_isnoneornil(L,-1)) - { - lua_pop(L,1); //pop unsuccessful get - lua_newtable(L); // -> table [1] - lua_setfield(L,methods,"__getters"); // pop [1] - lua_getfield(L,methods,"__getters"); // -> table [1] - } - for(luaL_Reg* m = (luaL_Reg*)GetAttrTable(); m->name; m++) - { - lua_pushcfunction(L,m->func); // -> [2] is this function - lua_setfield(L,-2,m->name); //[-2 = 1] -> __getters.name = function - } - lua_pop(L,1); //pop __getters - - - lua_getfield(L,methods, "__setters"); // -> table[1] - if(lua_isnoneornil(L,-1)) - { - lua_pop(L,1); //pop unsuccessful get - lua_newtable(L); // -> table [1] - lua_setfield(L,methods,"__setters"); // pop [1] - lua_getfield(L,methods,"__setters"); // -> table [1] - } - for(luaL_Reg* m = (luaL_Reg*)SetAttrTable(); m->name; m++) - { - lua_pushcfunction(L,m->func); // -> [2] is this function - lua_setfield(L,-2,m->name); //[-2 = 1] -> __setters.name = function - } - lua_pop(L,1); //pop __setters -} - -} -} -} diff --git a/libs/libRocket/Include/Rocket/Core/Lua/Utilities.h b/libs/libRocket/Include/Rocket/Core/Lua/Utilities.h deleted file mode 100644 index 613cd4f5b8c..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Lua/Utilities.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAUTILITIES_H -#define ROCKETCORELUAUTILITIES_H -/* - This file is for free-floating functions that are used across more than one file. -*/ -#include -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -/** casts the variant to its specific type before pushing it to the stack -@relates Rocket::Core::Lua::LuaType */ -void ROCKETLUA_API PushVariant(lua_State* L, Variant* var); - -/** If there are errors on the top of the stack, this will print those out to the log. -@param L A Lua state, and if not passed in, will use the Interpreter's state -@param place A string that will be printed to the log right before the error message, seperated by a space. Set -this when you would get no information about where the error happens. -@relates Rocket::Core::Lua::Interpreter */ -void ROCKETLUA_API Report(lua_State* L = NULL, const Rocket::Core::String& place = ""); - -//Helper function, so that the types don't have to define individual functions themselves -// to fill the Elements.As table -template -int CastFromElementTo(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - LuaType::push(L,(ToType*)ele,false); - return 1; -} - -//Adds to the Element.As table the name of the type, and the function to use to cast -template -void AddTypeToElementAsTable(lua_State* L) -{ - int top = lua_gettop(L); - lua_getglobal(L,"Element"); - lua_getfield(L,-1,"As"); - if(!lua_isnoneornil(L,-1)) - { - lua_pushcfunction(L,CastFromElementTo); - lua_setfield(L,-2,GetTClassName()); - } - lua_settop(L,top); //pop "As" and "Element" -} -} -} -} - - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Lua/lua.hpp b/libs/libRocket/Include/Rocket/Core/Lua/lua.hpp deleted file mode 100644 index d7017f1c745..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Lua/lua.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -//The standard Lua headers - -extern "C" { -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" -} diff --git a/libs/libRocket/Include/Rocket/Core/Math.h b/libs/libRocket/Include/Rocket/Core/Math.h deleted file mode 100644 index 911a8304f5e..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Math.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREMATH_H -#define ROCKETCOREMATH_H - -#include "Header.h" - -namespace Rocket { -namespace Core { -namespace Math { - -// The constant PI. -extern ROCKETCORE_API const float ROCKET_PI; - -template < typename Type > -Type Max(Type a, Type b) -{ - return (a > b) ? a : b; -} - -template< typename Type > -Type Min(Type a, Type b) -{ - return (a < b) ? a : b; -} - -template < typename Type > -Type ClampLower(Type value, Type min) -{ - return (value < min) ? min : value; -} - -template < typename Type > -Type ClampUpper(Type value, Type max) -{ - return (value > max) ? max: value; -} - -template< typename Type > -Type Clamp(Type value, Type min, Type max) -{ - return (value < min) ? min : (value > max) ? max : value; -} - -/// Evaluates if a number is, or close to, zero. -/// @param[in] value The number to compare to zero. -/// @return True if the number if zero or close to it, false otherwise. -ROCKETCORE_API bool IsZero(float value); -/// Evaluates if two floating-point numbers are equal, or so similar that they could be considered -/// so. -/// @param[in] value_0 The first number to compare. -/// @param[in] value_1 The second number to compare. -/// @return True if the numbers are similar or equal. -ROCKETCORE_API bool AreEqual(float value_0, float value_1); - -/// Calculates the absolute value of a number. -/// @param[in] value The number of get the absolute value of. -/// @return The absolute value of the number. -ROCKETCORE_API float AbsoluteValue(float value); - -/// Calculates the cosine of an angle. -/// @param[in] angle The angle to calculate the cosine of, in radians. -/// @return The cosine of the angle. -ROCKETCORE_API float Cos(float angle); -/// Calculates the arc-cosine of an value. -/// @param[in] angle The value to calculate the arc-cosine of. -/// @return The angle, in radians. -ROCKETCORE_API float ACos(float value); -/// Calculates the sine of an angle. -/// @param[in] angle The angle to calculate the sine of, in radians. -/// @return The sine of the angle. -ROCKETCORE_API float Sin(float angle); -/// Calculates the arc-sine of an value. -/// @param[in] angle The value to calculate the arc-sine of. -/// @return The angle, in radians. -ROCKETCORE_API float ASin(float angle); -/// Calculates the tangent of an angle. -/// @param[in] angle The angle to calculate the tangent of, in radians. -/// @return The tanget of the angle. -ROCKETCORE_API float Tan(float angle); -/// Calculates the angle of a two-dimensional line. -/// @param[in] y The y-component of the line. -/// @param[in] x The x-component of the line. -/// @return The angle of the line in radians. -ROCKETCORE_API float ATan2(float y, float x); - -/// Converts an angle from radians to degrees. -/// @param[in] The angle, in radians. -/// @return The angle converted to degrees. -ROCKETCORE_API float RadiansToDegrees(float angle); -/// Converts an angle from degrees to radians. -/// @param[in] The angle, in degrees. -/// @return The angle converted to radians. -ROCKETCORE_API float DegreesToRadians(float angle); -/// Normalises and angle in radians -/// @param[in] The angle, in randians -/// @return The normalised angle -ROCKETCORE_API float NormaliseAngle(float angle); - -/// Calculates the square root of a value. -/// @param[in] value The value to calculate the square root of. This must be above zero. -/// @return The square root of the value. -ROCKETCORE_API float SquareRoot(float value); - -/// Rounds a floating-point value to the nearest integer. -/// @param[in] value The value to round. -/// @return The rounded integer. -ROCKETCORE_API int Round(float value); -/// Rounds a floating-point value up to the nearest integer. -/// @param[in] value The value to round. -/// @return The rounded integer. -ROCKETCORE_API int RoundUp(float value); -/// Rounds a floating-point value down to the nearest integer. -/// @param[in] value The value to round. -/// @return The rounded integer. -ROCKETCORE_API int RoundDown(float value); - -/// Efficiently truncates a floating-point value into an integer. -/// @param[in] value The value to truncate. -/// @return The truncated value as a signed integer. -ROCKETCORE_API int RealToInteger(float value); - -/// Converts a number to the nearest power of two, rounding up if necessary. -/// @param[in] value The value to convert to a power-of-two. -/// @return The smallest power of two that is as least as big as the input value. -ROCKETCORE_API int ToPowerOfTwo(int value); - -/// Converts from the ASCII-representation of a hexadecimal digit to decimal. -/// @param[in] hex_digit The hexadecimal digit to convert to decimal. -/// @return The digit in decimal. -ROCKETCORE_API int HexToDecimal(char hex_digit); - -/// Generates a random floating-point value between 0 and a user-specified value. -/// @param[in] max_value The limit to random value. The generated value will be guaranteed to be below this limit. -/// @return The random value. -ROCKETCORE_API float RandomReal(float max_value); -/// Generates a random integer value between 0 and a user-specified value. -/// @param[in] max_value The limit to random value. The generated value will be guaranteed to be below this limit. -/// @return The random value. -ROCKETCORE_API int RandomInteger(int max_value); -/// Generates a random boolean value, with equal chance of true or false. -/// @return The random value. -ROCKETCORE_API bool RandomBool(); - -} -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/MathTypes.h b/libs/libRocket/Include/Rocket/Core/MathTypes.h deleted file mode 100644 index e3c8ec0b900..00000000000 --- a/libs/libRocket/Include/Rocket/Core/MathTypes.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREMATHTYPES_H -#define ROCKETCOREMATHTYPES_H - -#include "Header.h" -#include "Vector2.h" -#include "Vector3.h" -#include "Vector4.h" - -namespace Rocket { -namespace Core { - -// Define common Vector2 types. -typedef Vector2< int > Vector2i; -typedef Vector2< float > Vector2f; -ROCKETCORE_API Vector2i operator*(int lhs, const Vector2i& rhs); -ROCKETCORE_API Vector2f operator*(float lhs, const Vector2f& rhs); - -// Define common Vector3 types. -typedef Vector3< int > Vector3i; -typedef Vector3< float > Vector3f; -ROCKETCORE_API Vector3i operator*(int lhs, const Vector3i& rhs); -ROCKETCORE_API Vector3f operator*(float lhs, const Vector3f& rhs); - -// Define common Vector4 types. -typedef Vector4< int > Vector4i; -typedef Vector4< float > Vector4f; -ROCKETCORE_API Vector4i operator*(int lhs, const Vector4i& rhs); -ROCKETCORE_API Vector4f operator*(float lhs, const Vector4f& rhs); - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Platform.h b/libs/libRocket/Include/Rocket/Core/Platform.h deleted file mode 100644 index 99bd47e69f7..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Platform.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPLATFORM_H -#define ROCKETCOREPLATFORM_H - -#if defined __WIN32__ || defined _WIN32 - #define ROCKET_PLATFORM_WIN32 - #define ROCKET_PLATFORM_NAME "win32" - #if !defined(__MINGW32__) - #pragma warning(disable:4355) - #endif -#elif defined __APPLE_CC__ - #define ROCKET_PLATFORM_UNIX - #define ROCKET_PLATFORM_MACOSX - #define ROCKET_PLATFORM_NAME "macosx" -#else - #define ROCKET_PLATFORM_UNIX - #define ROCKET_PLATFORM_LINUX - #define ROCKET_PLATFORM_NAME "linux" -#endif - -#if !defined NDEBUG && !defined ROCKET_DEBUG - #define ROCKET_DEBUG -#endif - -#if defined __LP64__ || defined _M_X64 || defined __MINGW64__ || defined _LP64 - #define ROCKET_ARCH_64 -#else - #define ROCKET_ARCH_32 -#endif - - -#if defined(ROCKET_PLATFORM_WIN32) && !defined(__MINGW32__) - // alignment of a member was sensitive to packing - #pragma warning(disable : 4121) - - // needs to have dll-interface to be used by clients - #pragma warning(disable : 4251) - - // assignment operator could not be generated - #pragma warning(disable : 4512) - - // was declared deprecated - #pragma warning(disable : 4996) - - #if !defined _CRT_SECURE_NO_DEPRECATE - #define _CRT_SECURE_NO_DEPRECATE - #endif -#endif - -// Wraps unused variables in methods or functions to avoid compiler warnings. This should -// be wrapped around the name of all parameters that are wrapped with ROCKET_UNUSED_PARAMETER -// to cover warnings generated by non-llvm/gcc style compilers that can't be covered with -// ROCKET_UNUSED_PARAMETER -#if defined __llvm__ -//# define ROCKET_UNUSED(x) UNUSED_ ## x __unused -# define ROCKET_UNUSED(x) -#elif defined __GNUC__ -//# define ROCKET_UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) -# define ROCKET_UNUSED(x) -#else -# define ROCKET_UNUSED(x) (void)(UNUSED_ ## x) -#endif - -// Wraps unused parameter names in method or function declarations. When used, the first lines -// of the function should contain a matching ROCKET_UNUSED call with the name of the function -// as well to cover compilers with no-op ROCKET_UNUSED_PARAMETER macros. -#if defined __llvm__ -# define ROCKET_UNUSED_PARAMETER(x) UNUSED_ ## x __attribute__((unused)) -#elif defined __GNUC__ -# define ROCKET_UNUSED_PARAMETER(x) UNUSED_ ## x __attribute__((__unused__)) -#else -# define ROCKET_UNUSED_PARAMETER(x) UNUSED_ ## x -#endif - -// ROCKET_UNUSED_ASSERT_PARAMETERS wraps method parameters which are not used in the method other than -// by a ROCKET_ASSERT check. This safely deals with debug versus release mode configurations -// and will warn if the parameter starts being used when compiled with GCC -#ifdef ROCKET_DEBUG - // In this case, the parameter is used by a ROCKET_ASSERT test, so we just pass through as is -# define ROCKET_UNUSED_ASSERT_PARAMETER(x) x -# define ROCKET_UNUSED_ASSERT(x) -#else - // If not in DEBUG builds, this parameter is unused, mark it as such -# if defined __llvm__ -# define ROCKET_UNUSED_ASSERT_PARAMETER(x) UNUSED_ ## x __attribute__((unused)) -# define ROCKET_UNUSED_ASSERT(x) -# elif defined __GNUC__ -# define ROCKET_UNUSED_ASSERT_PARAMETER(x) UNUSED_ ## x __attribute__((__unused__)) -# define ROCKET_UNUSED_ASSERT(x) -# else -# define ROCKET_UNUSED_ASSERT_PARAMETER(x) UNUSED_ ## x -# define ROCKET_UNUSED_ASSERT(x) (void)(UNUSED_ ## x) -# endif -#endif - -// Wraps functions which are not referenced or exported to avoid compiler warnings -#if defined __llvm__ -# define ROCKET_UNUSED_FUNCTION(x) __attribute__((unused)) UNUSED_ ## x -#elif defined __GNUC__ -# define ROCKET_UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x -#else -# define ROCKET_UNUSED_FUNCTION(x) UNUSED_ ## x -#endif - -// Squelchs warnings for unused enums in switch statements, this should only be used for special values -// that are known to NEVER be used. -#define ROCKET_UNUSED_SWITCH_ENUM(x) \ - case x: \ - ROCKET_ERRORMSG("Switch case for unhandled ENUM has been hit! This shouldn't happen! ENUM Name: " # x); \ - break; - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Plugin.h b/libs/libRocket/Include/Rocket/Core/Plugin.h deleted file mode 100644 index e30fc887edf..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Plugin.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPLUGIN_H -#define ROCKETCOREPLUGIN_H - -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Element; -class ElementDocument; -class Context; - -/** - Generic Interface for plugins to Rocket. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API Plugin -{ -public: - virtual ~Plugin(); - - enum EventClasses - { - EVT_BASIC = (1 << 0), // Initialise, Shutdown, ContextCreate, ContextDestroy - EVT_DOCUMENT = (1 << 1), // DocumentOpen, DocumentLoad, DocumentUnload - EVT_ELEMENT = (1 << 2), // ElementCreate, ElementDestroy - - EVT_ALL = EVT_BASIC | EVT_DOCUMENT | EVT_ELEMENT - }; - /// Called when the plugin is registered to determine - /// which of the above event types the plugin is interested in - virtual int GetEventClasses(); - - /// Called when Rocket is initialised, or immediately when the plugin registers itself if - /// Rocket has already been initialised. - virtual void OnInitialise(); - /// Called when Rocket shuts down. - virtual void OnShutdown(); - - /// Called when a new context is created. - virtual void OnContextCreate(Context* context); - /// Called when a context is destroyed. - virtual void OnContextDestroy(Context* context); - - /// Called when a document load request occurs, before the document's file is opened. - virtual void OnDocumentOpen(Context* context, const String& document_path); - /// Called when a document is successfully loaded from file or instanced, initialised and added - /// to its context. This is called before the document's 'load' event. - virtual void OnDocumentLoad(ElementDocument* document); - /// Called when a document is unloaded from its context. This is called after the document's - /// 'unload' event. - virtual void OnDocumentUnload(ElementDocument* document); - - /// Called when a new element is created. - virtual void OnElementCreate(Element* element); - /// Called when an element is destroyed. - virtual void OnElementDestroy(Element* element); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Pool.inl b/libs/libRocket/Include/Rocket/Core/Pool.inl deleted file mode 100644 index 51dcdebf2b4..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Pool.inl +++ /dev/null @@ -1,247 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -template < typename PoolType > -Pool< PoolType >::Pool(int _chunk_size, bool _grow) -{ - chunk_size = 0; - grow = _grow; - - num_allocated_objects = 0; - - pool = NULL; - first_allocated_node = NULL; - first_free_node = NULL; - - if (_chunk_size > 0) - Initialise(_chunk_size, _grow); -} - -template < typename PoolType > -Pool< PoolType >::~Pool() -{ - PoolChunk* chunk = pool; - while (chunk) - { - PoolChunk* next_chunk = chunk->next; - - delete[] chunk->chunk; - delete chunk; - - chunk = next_chunk; - } -} - -// Initialises the pool to a given size. -template < typename PoolType > -void Pool< PoolType >::Initialise(int _chunk_size, bool _grow) -{ - // Should resize the pool here ... ? - if (chunk_size > 0) - return; - - if (_chunk_size <= 0) - return; - - grow = _grow; - chunk_size = _chunk_size; - pool = NULL; - - // Create the initial chunk. - CreateChunk(); -} - -// Returns the head of the linked list of allocated objects. -template < typename PoolType > -typename Pool< PoolType >::Iterator Pool< PoolType >::Begin() -{ - return typename Pool< PoolType >::Iterator(first_allocated_node); -} - -// Attempts to allocate a deallocated object in the memory pool. -template < typename PoolType > -PoolType* Pool< PoolType >::AllocateObject() -{ - // We can't allocate a new object if the deallocated list is empty. - if (first_free_node == NULL) - { - // Attempt to grow the pool first. - if (grow) - { - CreateChunk(); - if (first_free_node == NULL) - return NULL; - } - else - return NULL; - } - - // We're about to allocate an object. - ++num_allocated_objects; - - // This one! - PoolNode* allocated_object = first_free_node; - - // Remove the newly allocated object from the list of deallocated objects. - first_free_node = first_free_node->next; - if (first_free_node != NULL) - first_free_node->previous = NULL; - - // Add the newly allocated object to the head of the list of allocated objects. - if (first_allocated_node != NULL) - { - allocated_object->previous = NULL; - allocated_object->next = first_allocated_node; - first_allocated_node->previous = allocated_object; - } - else - { - // This object is the only allocated object. - allocated_object->previous = NULL; - allocated_object->next = NULL; - } - - first_allocated_node = allocated_object; - - return new (&allocated_object->object) PoolType(); -} - -// Deallocates the object pointed to by the given iterator. -template < typename PoolType > -void Pool< PoolType >::DeallocateObject(Iterator& iterator) -{ - // We're about to deallocate an object. - --num_allocated_objects; - - PoolNode* object = iterator.node; - object->object.~PoolType(); - - // Get the previous and next pointers now, because they will be overwritten - // before we're finished. - PoolNode* previous_object = object->previous; - PoolNode* next_object = object->next; - - if (previous_object != NULL) - previous_object->next = next_object; - else - { - ROCKET_ASSERT(first_allocated_node == object); - first_allocated_node = next_object; - } - - if (next_object != NULL) - next_object->previous = previous_object; - - // Insert the freed node at the beginning of the free object list. - if (first_free_node == NULL) - { - object->previous = NULL; - object->next = NULL; - } - else - { - object->previous = NULL; - object->next = first_free_node; - } - - first_free_node = object; - - // Increment the iterator, so it points to the next active object. - iterator.node = next_object; -} - -// Deallocates the given object. -template < typename PoolType > -void Pool< PoolType >::DeallocateObject(PoolType* object) -{ - // This assumes the object has the same address as the node, which will be - // true as long as the struct definition does not change. - Iterator iterator((PoolNode*) object); - DeallocateObject(iterator); -} - -// Returns the number of objects in the pool. -template < typename PoolType > -int Pool< PoolType >::GetSize() const -{ - return chunk_size * GetNumChunks(); -} - -/// Returns the number of object chunks in the pool. -template < typename PoolType > -int Pool< PoolType >::GetNumChunks() const -{ - int num_chunks = 0; - - PoolChunk* chunk = pool; - while (chunk != NULL) - { - ++num_chunks; - chunk = chunk->next; - } - - return num_chunks; -} - -// Returns the number of allocated objects in the pool. -template < typename PoolType > -int Pool< PoolType >::GetNumAllocatedObjects() const -{ - return num_allocated_objects; -} - -// Creates a new pool chunk and appends its nodes to the beginning of the free list. -template < typename PoolType > -void Pool< PoolType >::CreateChunk() -{ - if (chunk_size <= 0) - return; - - // Create the new chunk and mark it as the first chunk. - PoolChunk* new_chunk = new PoolChunk(); - new_chunk->next = pool; - pool = new_chunk; - - // Create chunk's pool nodes. - new_chunk->chunk = new PoolNode[chunk_size]; - - // Initialise the linked list. - for (int i = 0; i < chunk_size; i++) - { - if (i == 0) - new_chunk->chunk[i].previous = NULL ; - else - new_chunk->chunk[i].previous = &new_chunk->chunk[i - 1]; - - if (i == chunk_size - 1) - new_chunk->chunk[i].next = first_free_node; - else - new_chunk->chunk[i].next = &new_chunk->chunk[i + 1]; - } - - first_free_node = new_chunk->chunk; -} diff --git a/libs/libRocket/Include/Rocket/Core/Property.h b/libs/libRocket/Include/Rocket/Core/Property.h deleted file mode 100644 index 118d172fb61..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Property.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTY_H -#define ROCKETCOREPROPERTY_H - -#include "Variant.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -class PropertyDefinition; - -/** - @author Peter Curry - */ - -class ROCKETCORE_API Property -{ -public: - enum Unit - { - UNKNOWN = 1 << 0, - - KEYWORD = 1 << 1, // generic keyword; fetch as < int > - - STRING = 1 << 2, // generic string; fetch as < String > - - // Absolute values. - NUMBER = 1 << 3, // number unsuffixed; fetch as < float > - PX = 1 << 4, // number suffixed by 'px'; fetch as < float > - COLOUR = 1 << 5, // colour; fetch as < Colourb > - ABSOLUTE_UNIT = NUMBER | PX | COLOUR, - - // Relative values. - EM = 1 << 6, // number suffixed by 'em'; fetch as < float > - PERCENT = 1 << 7, // number suffixed by '%'; fetch as < float > - - // Values based on pixels-per-inch. - INCH = 1 << 8, // number suffixed by 'in'; fetch as < float > - CM = 1 << 9, // number suffixed by 'cm'; fetch as < float > - MM = 1 << 10, // number suffixed by 'mm'; fetch as < float > - PT = 1 << 11, // number suffixed by 'pt'; fetch as < float > - PC = 1 << 12, // number suffixed by 'pc'; fetch as < float > - PPI_UNIT = INCH | CM | MM | PT | PC, - - REM = 1 << 13, // number suffixed by 'rem'; fetch as < float > - RELATIVE_UNIT = EM | REM | PERCENT - }; - - Property(); - template < typename PropertyType > - Property(PropertyType value, Unit unit, int specificity = -1) : value(Variant(value)), unit(unit), specificity(specificity) - { - definition = NULL; - parser_index = -1; - - source_line_number = 0; - } - - ~Property(); - - /// Get the value of the property as a string. - String ToString() const; - - /// Templatised accessor. - template - T Get() const - { - return value.Get(); - } - - Variant value; - Unit unit; - int specificity; - - const PropertyDefinition* definition; - int parser_index; - - String source; - int source_line_number; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/PropertyDefinition.h b/libs/libRocket/Include/Rocket/Core/PropertyDefinition.h deleted file mode 100644 index 9882812a765..00000000000 --- a/libs/libRocket/Include/Rocket/Core/PropertyDefinition.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYDEFINITION_H -#define ROCKETCOREPROPERTYDEFINITION_H - -#include "Header.h" -#include "Property.h" -#include "PropertyParser.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class ROCKETCORE_API PropertyDefinition -{ -public: - PropertyDefinition(const String& default_value, bool inherited, bool forces_layout); - virtual ~PropertyDefinition(); - - /// Registers a parser to parse values for this definition. - /// @param[in] parser_name The name of the parser (default parsers are 'string', 'keyword', 'number' and 'colour'). - /// @param[in] parser_parameters A comma-separated list of validation parameters for the parser. - /// @return This property definition. - PropertyDefinition& AddParser(const String& parser_name, const String& parser_parameters = ""); - - /// Called when parsing a RCSS declaration. - /// @param property[out] The property to set the parsed value onto. - /// @param value[in] The raw value defined for this property. - /// @return True if all values were parsed successfully, false otherwise. - bool ParseValue(Property& property, const String& value) const; - /// Called to convert a parsed property back into a value. - /// @param value[out] The string to return the value in. - /// @param property[in] The processed property to parse. - /// @return True if the property was reverse-engineered successfully, false otherwise. - bool GetValue(String& value, const Property& property) const; - - /// Returns true if this property is inherited from parent to child elements. - bool IsInherited() const; - - /// Returns true if this property forces a re-layout when changed. - bool IsLayoutForced() const; - - /// Returns the default defined for this property. - const Property* GetDefaultValue() const; - -private: - Property default_value; - bool inherited; - bool forces_layout; - - struct ParserState - { - PropertyParser* parser; - ParameterMap parameters; - }; - - std::vector< ParserState > parsers; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/PropertyDictionary.h b/libs/libRocket/Include/Rocket/Core/PropertyDictionary.h deleted file mode 100644 index 4e81e0090f3..00000000000 --- a/libs/libRocket/Include/Rocket/Core/PropertyDictionary.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYDICTIONARY_H -#define ROCKETCOREPROPERTYDICTIONARY_H - -#include "Header.h" -#include "Property.h" - -namespace Rocket { -namespace Core { - -typedef std::unordered_map< String, Property, StringHash > PropertyMap; - -/** - A dictionary to property names to values. - - @author Peter Curry - */ - -class ROCKETCORE_API PropertyDictionary -{ -public: - PropertyDictionary(); - ~PropertyDictionary(); - - /// Sets a property on the dictionary. Any existing property with a similar name will be overwritten. - /// @param[in] name The name of the property to add. - /// @param[in] property The value of the new property. - void SetProperty(const String& name, const Property& property); - /// Removes a property from the dictionary, if it exists. - /// @param[in] name The name of the property to remove. - void RemoveProperty(const String& name); - /// Returns the value of the property with the requested name, if one exists. - /// @param[in] name The name of the desired property. - const Property* GetProperty(const String& name) const; - - /// Returns the number of properties in the dictionary. - /// @return The number of properties in the dictionary. - int GetNumProperties() const; - /// Returns the map of properties in the dictionary. - /// @return The property map. - const PropertyMap& GetProperties() const; - - /// Imports into the dictionary, and optionally defines the specificity of, potentially - /// un-specified properties. In the case of name conflicts, the incoming properties will - /// overwrite the existing properties if their specificity (or their forced specificity) - /// are at least equal. - /// @param[in] property_dictionary The properties to import. - /// @param[in] specificity The specificity for all incoming properties. If this is not specified, the properties will keep their original specificity. - void Import(const PropertyDictionary& property_dictionary, int specificity = -1); - - /// Merges the contents of another fully-specified property dictionary with this one. - /// Properties defined in the new dictionary will overwrite those with the same name as - /// appropriate. - /// @param[in] property_dictionary The dictionary to merge. - /// @param[in] specificity_offset The specificities of all incoming properties will be offset by this value. - void Merge(const PropertyDictionary& property_dictionary, int specificity_offset = 0); - -private: - // Sets a property on the dictionary and its specificity if there is no name conflict, or its - // specificity (given by the parameter, not read from the property itself) is at least equal to - // the specificity of the conflicting property. - void SetProperty(const String& name, const Rocket::Core::Property& property, int specificity); - - PropertyMap properties; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/PropertyParser.h b/libs/libRocket/Include/Rocket/Core/PropertyParser.h deleted file mode 100644 index 420c50e5afd..00000000000 --- a/libs/libRocket/Include/Rocket/Core/PropertyParser.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYPARSER_H -#define ROCKETCOREPROPERTYPARSER_H - -#include "Header.h" -#include "Property.h" -#include - -namespace Rocket { -namespace Core { - -typedef std::map< String, int, StringUtilities::StringComparei > ParameterMap; - -/** - A property parser takes a property declaration in string form, validates it, and converts it to a Property. - - @author Peter Curry - */ - -class ROCKETCORE_API PropertyParser -{ -public: - virtual ~PropertyParser() - { - } - - /// Called to parse a RCSS declaration. - /// @param[out] property The property to set the parsed value on. - /// @param[in] value The raw value defined for this property. - /// @param[in] parameters The list of parameters defined for this property. - /// @return True if the value was parsed successfully, false otherwise. - virtual bool ParseValue(Property& property, const String& value, const ParameterMap& parameters) const = 0; - - /// Called when the parser is released. This should free all dynamic memory used by the parser. - virtual void Release() = 0; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/PropertySpecification.h b/libs/libRocket/Include/Rocket/Core/PropertySpecification.h deleted file mode 100644 index f98b5017ede..00000000000 --- a/libs/libRocket/Include/Rocket/Core/PropertySpecification.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYSPECIFICATION_H -#define ROCKETCOREPROPERTYSPECIFICATION_H - -#include "Header.h" -#include "Element.h" -#include "PropertyDefinition.h" - -namespace Rocket { -namespace Core { - -class PropertyDictionary; -struct PropertyShorthandDefinition; - -/** - A property specification stores a group of property definitions. - - @author Peter Curry - */ - -class ROCKETCORE_API PropertySpecification -{ -public: - enum ShorthandType - { - // Normal; properties that fail to parse fall-through to the next until they parse correctly, and any - // undeclared are not set. - FALL_THROUGH, - // A single failed parse will abort, and any undeclared are replicated from the last declared property. - REPLICATE, - // For 'padding', 'margin', etc; up four properties are expected. - BOX, - // BOX if four properties are shorthanded and they end in '-top', '-right', etc, otherwise FALL_THROUGH. - AUTO - }; - - PropertySpecification(); - ~PropertySpecification(); - - /// Registers a property with a new definition. - /// @param[in] property_name The name to register the new property under. - /// @param[in] default_value The default value to be used for an element if it has no other definition provided. - /// @param[in] inherited True if this property is inherited from parent to child, false otherwise. - /// @param[in] forces_layout True if this property requires its parent to be reformatted if changed. - /// @return The new property definition, ready to have parsers attached. - PropertyDefinition& RegisterProperty(const String& property_name, const String& default_value, bool inherited, bool forces_layout); - /// Returns a property definition. - /// @param[in] property_name The name of the desired property. - /// @return The appropriate property definition if it could be found, NULL otherwise. - const PropertyDefinition* GetProperty(const String& property_name) const; - - /// Returns the list of the names of all registered property definitions. - /// @return The list with stored property names. - const PropertyNameList& GetRegisteredProperties() const; - - /// Returns the list of the names of all registered inherited property definitions. - /// @return The list with stored property names. - const PropertyNameList& GetRegisteredInheritedProperties() const; - - /// Registers a shorthand property definition. - /// @param[in] shorthand_name The name to register the new shorthand property under. - /// @param[in] properties A comma-separated list of the properties this definition is shorthand for. The order in which they are specified here is the order in which the values will be processed. - /// @param[in] type The type of shorthand to declare. - /// @param True if all the property names exist, false otherwise. - bool RegisterShorthand(const String& shorthand_name, const String& property_names, ShorthandType type = AUTO); - /// Returns a shorthand definition. - /// @param[in] shorthand_name The name of the desired shorthand. - /// @return The appropriate shorthand definition if it could be found, NULL otherwise. - const PropertyShorthandDefinition* GetShorthand(const String& shorthand_name) const; - - /// Parses a property declaration, setting any parsed and validated properties on the given dictionary. - /// @param dictionary The property dictionary which will hold all declared properties. - /// @param property_name The name of the declared property. - /// @param property_value The values the property is being set to. - /// @return True if all properties were parsed successfully, false otherwise. - bool ParsePropertyDeclaration(PropertyDictionary& dictionary, const String& property_name, const String& property_value, const String& source_file = "", int source_line_number = 0) const; - /// Sets all undefined properties in the dictionary to their defaults. - /// @param dictionary[in] The dictionary to set the default values on. - void SetPropertyDefaults(PropertyDictionary& dictionary) const; - -private: - typedef std::unordered_map< String, PropertyDefinition*, StringHash > PropertyMap; - typedef std::map< String, PropertyShorthandDefinition* > ShorthandMap; - - PropertyMap properties; - ShorthandMap shorthands; - PropertyNameList property_names; - PropertyNameList inherited_property_names; - - bool ParsePropertyValues(StringList& values_list, const String& values, bool split_values) const; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/ConverterScriptObject.h b/libs/libRocket/Include/Rocket/Core/Python/ConverterScriptObject.h deleted file mode 100644 index 3333d4ec863..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/ConverterScriptObject.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONCONVERTERSCRIPTOBJECT_H -#define ROCKETCOREPYTHONCONVERTERSCRIPTOBJECT_H - -#include "Python.h" - -namespace Rocket { -namespace Core { -namespace Python { - -/** - Templated class for converting from a script object to a python object - - Simply construct this class in your application start up and it - will do the necessary registration of the object with the boost - type conversion repository. - - @author Lloyd Weehuizen - */ - -template -struct ConverterScriptObject -{ - ConverterScriptObject() - { - // Register custom RKTElement to python converter - boost::python::to_python_converter< T*, ConverterScriptObject< T > >(); - } - - static PyObject* convert(T* object) - { - PyObject* pyobject = Py_None; - if (object) - { - PyObject* script_object = (PyObject*)object->GetScriptObject(); - if (script_object) - { - pyobject = script_object; - } - } - - Py_INCREF(pyobject); - return pyobject; - } -}; - -} -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/ElementInstancer.h b/libs/libRocket/Include/Rocket/Core/Python/ElementInstancer.h deleted file mode 100644 index f94d56ba52a..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/ElementInstancer.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONELEMENTINSTANCER_H -#define ROCKETCOREPYTHONELEMENTINSTANCER_H - -#include "../String.h" -#include "../XMLParser.h" -#include "Python.h" -#include "../Element.h" -#include "../ElementInstancer.h" -#include "../Header.h" - -namespace Rocket { -namespace Core { -namespace Python { - -/** - Python Element Instancer - - This object provides the standard ElementInstancer - interface for instancing python elements. - - NOTE: This is all inline so that it can be used by 3rdparty plugins - - @author Lloyd Weehuizen - */ - -class ElementInstancer : public Rocket::Core::ElementInstancer -{ -public: - ElementInstancer(PyObject* _class_definition) - { - class_definition = _class_definition; - Py_INCREF(class_definition); - } - virtual ~ElementInstancer() - { - Py_DECREF(class_definition); - } - - /// Instances an element given the tag name and attributes - /// @param tag Name of the element to instance - /// @param attributes vector of name value pairs - virtual Element* InstanceElement(Element* ROCKET_UNUSED_PARAMETER(parent), const Rocket::Core::String& tag, const Rocket::Core::XMLAttributes& ROCKET_UNUSED_PARAMETER(attributes)) - { - ROCKET_UNUSED(parent); - ROCKET_UNUSED(attributes); - - // Build the arguments - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyString_FromString(tag.CString())); - - PyObject* instance = PyObject_CallObject(class_definition, args); - Py_DECREF(args); - - // Check the instance was created successfully - if (instance == NULL) - { - PyErr_Print(); - return NULL; - } - - Element* element = python::extract(python::object(python::handle<>(python::borrowed(instance)))); - - // Need to switch the Python reference count to a true C++ reference count. - element->AddReference(); // Adds to C++ and Python reference counts. - Py_DECREF( instance ); // Removes from Python. - - return element; - } - - /// Releases the given element - /// @param element to release - virtual void ReleaseElement(Element* ROCKET_UNUSED_PARAMETER(element)) - { - ROCKET_UNUSED(element); - - // Never release Python elements, Python will manage this for us. - } - - /// Release the instancer - virtual void Release() - { - delete this; - } - -private: - PyObject* class_definition; -}; - -} -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/ElementWrapper.h b/libs/libRocket/Include/Rocket/Core/Python/ElementWrapper.h deleted file mode 100644 index 7e1754c5470..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/ElementWrapper.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONELEMENTWRAPPER_H -#define ROCKETCOREPYTHONELEMENTWRAPPER_H - -namespace Rocket { -namespace Core { -namespace Python { - -/** - Python Wrapper class for Elements - - This class maintains is a standard boost wrapper class that - the self pointer for an element and provides virtual - overrides for the hook methods. - - @author Lloyd Weehuizen - */ - -template -class ElementWrapper : public T -{ -public: - ElementWrapper( PyObject* self, const char* tag ) : self( self ), T( tag ) - { - // Force remove reference, to reduce the count to 0 as python has instanced - // this object. If the call originally came from C++ (PyBRElementInstancer) - // then it will add its own reference - T::RemoveReference(); - - // If the C++ reference count is not 0 at this point, it means additional references have been added - // during the classes constructor. We have to propogate these references into python. - for (int i = 0; i < this->T::GetReferenceCount(); i++) - Py_INCREF(self); - } - virtual ~ElementWrapper() {} - - /// Return the python script object associated with this element - virtual void* GetScriptObject() const { return self; } - - // Propogate add ref's into python - virtual void AddReference() - { - Py_INCREF( self ); - - T::AddReference(); - } - - // Propogate remove ref's into python - virtual void RemoveReference() - { - T::RemoveReference(); - - Py_DECREF( self ); - } - - virtual void OnReferenceDeactivate() - { - // Ignore reference deactivated - } - -private: - // Python representation of this object - PyObject* self; -}; - -} -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/Header.h b/libs/libRocket/Include/Rocket/Core/Python/Header.h deleted file mode 100644 index 5dc43ef3e0a..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/Header.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONHEADER_H -#define ROCKETCOREPYTHONHEADER_H - -#include "../Platform.h" - -#ifdef STATIC_LIB - #define ROCKET_STATIC_LIB - #pragma message("DEPRECATED: STATIC_LIB macro has been deprecated in favor of ROCKET_STATIC_LIB and support will be removed in a future release") -#endif - -#if !defined ROCKET_STATIC_LIB -#if defined ROCKET_PLATFORM_WIN32 - #if defined RocketCorePython_EXPORTS - #define ROCKETCOREPYTHON_API __declspec(dllexport) - #else - #define ROCKETCOREPYTHON_API __declspec(dllimport) - #endif -#else - #define ROCKETCOREPYTHON_API __attribute__((visibility("default"))) -#endif -#else - #define ROCKETCOREPYTHON_API -#endif - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/NameIndexInterface.h b/libs/libRocket/Include/Rocket/Core/Python/NameIndexInterface.h deleted file mode 100644 index 5080cfcd907..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/NameIndexInterface.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONNAMEINDEXINTERFACE_H -#define ROCKETCOREPYTHONNAMEINDEXINTERFACE_H - -#include "Utilities.h" - -namespace Rocket { -namespace Core { -namespace Python { - -template < typename HostType > -class NameAccessorInvalid -{ -public: - python::object operator()(HostType& host, const char* name) - { - PyErr_SetString(PyExc_KeyError, "Invalid key."); - python::throw_error_already_set(); - - return python::object(); - } -}; - -/** - Template class for generating a lightweight proxy object for providing array-style lookups on a C++ object. - - @author Peter Curry - */ - -template < typename HostType, typename LengthAccessor, typename IndexAccessor, typename NameAccessor = NameAccessorInvalid< HostType > > -class NameIndexInterface : public python::def_visitor< NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor > > -{ -public: - NameIndexInterface() - { - } - - ~NameIndexInterface() - { - } - - /// Initialise the interface. - template < typename ClassType > - void visit(ClassType& _class) const - { - _class.def("__getitem__", &NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor >::GetItem); - _class.def("__len__", &NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor >::Len); - } - - /// Python __getitem__ override. - static python::object GetItem(HostType& host, python::object key) - { - static NameAccessor name_accessor; - static LengthAccessor length_accessor; - static IndexAccessor index_accessor; - - if (PyString_Check(key.ptr())) - { - return Rocket::Core::Python::Utilities::MakeObject(name_accessor(host, PyString_AsString(key.ptr()))); - } - else if (PyInt_Check(key.ptr())) - { - int index = PyInt_AsLong(key.ptr()); - - // Support indexing from both ends. - if (index < 0) - index = length_accessor(host) + index; - - // Throw exception if we're out of range, this is required to support python iteration. - if (index >= length_accessor(host)) - { - PyErr_SetString(PyExc_IndexError, "Index out of range."); - python::throw_error_already_set(); - } - - return Rocket::Core::Python::Utilities::MakeObject(index_accessor(host, index)); - } - - PyErr_SetString(PyExc_KeyError, "Invalid key."); - python::throw_error_already_set(); - - return python::object(); - } - - /// Python __len__ override. - static int Len(HostType& host) - { - static LengthAccessor length_accessor; - return length_accessor(host); - } -}; - -} -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/PickleTypeConverter.h b/libs/libRocket/Include/Rocket/Core/Python/PickleTypeConverter.h deleted file mode 100644 index 380ffdd3807..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/PickleTypeConverter.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPICKLETYPECONVERTER_H -#define ROCKETCOREPICKLETYPECONVERTER_H - -#include "../TypeConverter.h" - -namespace Rocket { -namespace Core { -namespace Python { - -/** - Generic Python Pickler that does string conversion using an Rocket::Core::TypeConverter. - - @author Lloyd Weehuizen - */ - -template -class PickleTypeConverter : public python::pickle_suite -{ -public: - static python::tuple getstate(python::object obj) - { - T& object = python::extract(obj)(); - - String buffer; - TypeConverter< T, String >::Convert(object, buffer); - - return python::make_tuple(buffer.CString()); - } - - static void setstate(python::object obj, python::tuple state) - { - T& object = python::extract< T& >(obj)(); - - int len = python::extract< int >(state.attr( "__len__" )()); - if (len != 1) - { - PyErr_SetObject(PyExc_ValueError, - ("expected 1-item tuple in call to __setstate__; got %s" - % state).ptr() - ); - python::throw_error_already_set(); - } - - const char* cstring = python::extract(state[0]); - String string(cstring); - TypeConverter::Convert(string, object); - } - - static bool getstate_manages_dict() - { - // Tell boost we've taken care of the dictionary - return true; - } -}; - -} -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/Python.h b/libs/libRocket/Include/Rocket/Core/Python/Python.h deleted file mode 100644 index ad90105ab52..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/Python.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHON_H -#define ROCKETCOREPYTHON_H - -// RocketCore platform header for the ROCKET_PLATFORM_* define. -#include "../Platform.h" - -// Python header includes -#include - -#ifdef ROCKET_PLATFORM_WIN32 - #pragma warning(push) - #pragma warning(disable: 4244) -#endif - -// Prevent Boost from auto-linking with the wrong library. -#define BOOST_ALL_NO_LIB -#include -// remap boost::python to python for easier access -namespace python = boost::python; - -#ifdef ROCKET_PLATFORM_WIN32 - #pragma warning(pop) -#endif - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/Utilities.h b/libs/libRocket/Include/Rocket/Core/Python/Utilities.h deleted file mode 100644 index df48d4e56a1..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/Utilities.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONUTILITIES_H -#define ROCKETCOREPYTHONUTILITIES_H - -#include "../Variant.h" -#include "Header.h" -#include "Python.h" - -namespace Rocket { -namespace Core { -namespace Python { - -class ROCKETCOREPYTHON_API Utilities -{ -public: - /// Is the specific method name callable - static bool IsCallable(PyObject* self, const char* method_name); - - /// Call a python function - /// @param[in] object Python Dictionary or Object - /// @param[in] method_name function or method name to call - /// @param[in] args Tuple of arguments - /// @returns The python result - template - static R Call(PyObject* object, const char* method_name, const python::tuple& args) - { - PyObject* result = PythonCall(object, method_name, args); - - python::converter::return_from_python converter; - return converter(result); - } - /// Call a python function - /// @param[in] object Python Dictionary or Object to lookup the method in - /// @param[in] method_name function or method name to call - /// @param[in] args Tuple of arguments - /// @returns True on success - static bool Call(PyObject* object, const char* method_name, const python::tuple& args); - - /// Creates a boost python object from an existing C++ object pointer - /// @param[in] object The C++ object to convert - /// @returns A boost::python::object referencing the same object - template< typename T > - static inline python::object MakeObject(T* object) - { - // Constructs a boost::object using a result_converter to get a pointer to the existing object - typename python::return_by_value::apply< T* >::type result_converter; - return python::object(python::handle<>(result_converter(object))); - } - /// Creates a new python object (copy) from a C++ object - /// @param[in] object The C++ object to convert - /// @returns A boost::python::object that contains a copy of the object - template< typename T > - static inline python::object MakeObject(const T& object) - { - // Constructs a boost::object copy of the C++ object - return python::object(object); - } - - /// Print any pending exceptions to stderr - /// @param[in] clear_error Clear the error flag - static void PrintError(bool clear_error = false); - - /// Converts a python object into an Rocket variant. - /// @param[out] variant The variant to convert the object into. - /// @param[in] object The python object to convert. - /// @return True if the conversion was successful, false otherwise. - static bool ConvertToVariant(Variant& variant, PyObject* object); - -private: - static PyObject* PythonCall(PyObject* object, const char* method_name, const python::tuple& args ); -}; - -// Template Specialisation for converting from a PyObject* -template<> -inline python::object Utilities::MakeObject< PyObject >(PyObject* object) -{ - return python::object(python::handle<>(python::borrowed(object))); -} - -} -} -} - -#endif - diff --git a/libs/libRocket/Include/Rocket/Core/Python/VectorInterface.h b/libs/libRocket/Include/Rocket/Core/Python/VectorInterface.h deleted file mode 100644 index 17ca063082c..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/VectorInterface.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONVECTORINTERFACE_H -#define ROCKETCOREPYTHONVECTORINTERFACE_H - -namespace Rocket { -namespace Core { -namespace Python { - -/** - Provides a list style python interface to any STL container - that can provide a vector style interface. - - Simply contruct one of these objects to register the type - with python. - - VectorInterface< std::vector< std::string > >("StringList"); - - @author Lloyd Weehuizen - */ -template -class VectorInterface -{ -public: - VectorInterface(const char* name) - { - python::class_< Container >(name) - .def("__len__", &VectorInterface< Container >::Size) - .def("__setitem__", &VectorInterface< Container >::SetItem) - .def("__delitem__", &VectorInterface< Container >::DelItem) - .def("__getitem__", &VectorInterface< Container >::GetItem, python::return_value_policy< python::return_by_value >()) - .def("__contains__", &VectorInterface< Container >::Contains) - ; - } - - static size_t Size(const Container& container) - { - return container.size(); - } - - static void SetItem(Container& container, int index, const typename Container::value_type& value) - { - if (index < 0) - index = container.size() + index; - if (index >= (int)container.size()) - container.resize(index + 1); - - container[index] = value; - } - - static void DelItem(Container& container, int index) - { - if (index >= (int)container.size()) - { - PyErr_SetString(PyExc_IndexError, String(32, "Invalid index %d", index).CString()); - python::throw_error_already_set(); - } - - container.erase(container.begin() + index); - } - - static typename Container::value_type& GetItem(Container& container, int index) - { - if (index < 0) - index = container.size() + index; - - if (index >= (int)container.size()) - { - PyErr_SetString(PyExc_IndexError, String(32, "Invalid index %d", index).CString()); - python::throw_error_already_set(); - } - - return container[index]; - } - - static bool Contains(Container& container, const typename Container::value_type& value) - { - for (typename Container::iterator itr = container.begin(); itr != container.end(); ++itr) - { - if ((*itr) == value) - return true; - } - - return false; - } -}; - -} -} -} - -#endif - diff --git a/libs/libRocket/Include/Rocket/Core/Python/Wrapper.h b/libs/libRocket/Include/Rocket/Core/Python/Wrapper.h deleted file mode 100644 index a50bf585a66..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/Wrapper.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPYTHONWRAPPER_H -#define ROCKETCOREPYTHONWRAPPER_H - -#include "../Debug.h" -#include "Python.h" - -#include - -namespace Rocket { -namespace Core { -namespace Python { - -/** - Generic Python Wrapper, using boost preprocessor iteration for constructor params - - Defines a basic wrapper, then template overloads it for each variation of the - number of arguments. - - @author Lloyd Weehuizen - */ - -struct WrapperNone {}; - -#define WRAPPER_MAX_ARGS 6 - -#define WRAPPER_TEMPLATE_ARG(z, n, d) BOOST_PP_COMMA_IF(n) typename T##n = WrapperNone - -template -class Wrapper {}; - -#undef WRAPPER_TEMPLATE_ARG - -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, WRAPPER_MAX_ARGS, )) -#include BOOST_PP_ITERATE() - -} -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Python/WrapperIter.h b/libs/libRocket/Include/Rocket/Core/Python/WrapperIter.h deleted file mode 100644 index 73f4067cce6..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Python/WrapperIter.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#if !defined(BOOST_PP_IS_ITERATING) -# error PyWrapperIter - do not include this file! -#endif - -#define N BOOST_PP_ITERATION() - -/** - Generic Python Wrapper, using Boost Preprocessor Iteration to Generate Variants - - Relies on a Rocket::Core::ReferenceCountable base class for reference counting. - - Traps ReferenceActivated/Deactivated calls and makes them behave like - they should for python based objects. - - @author Lloyd Weehuizen - */ - -#define WRAPPER_PARAM(x, n, d) , d - -template < typename T BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_PARAMS_Z(1, N, typename A) > -class Wrapper< T BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_PARAMS_Z(1, N, A) BOOST_PP_REPEAT_1( BOOST_PP_SUB(BOOST_PP_INC(WRAPPER_MAX_ARGS), N), WRAPPER_PARAM, WrapperNone) > : public T -{ -public: - Wrapper(PyObject* self BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, a)) : T(BOOST_PP_ENUM_PARAMS_Z(1, N, a)) - { - // Set self to NULL, so we can trap the reference deactivated and not pass it down - this->self = NULL; - - // We have to remove the C++ reference count that all C++ objects start with here, - // otherwise if an object is created in python and destroyed by python, the C++ ref count will - // remain 1. The PyWrapperInstancer will increase the refcount again, to ensure a correct refcount - // if the object was created by C++ - T::RemoveReference(); - - // If the C++ reference count is not 0 at this point, it means additional references have been added - // during the classes constructor. We have to propogate these references into python. - for (int i = 0; i < this->T::GetReferenceCount(); i++) - Py_INCREF(self); - - // Store self - this->self = self; - } - - Wrapper(PyObject* self, const T& other) : T(other) - { - this->self = self; - } - - virtual ~Wrapper() - { - // We should only be deleted when python says the refcnt is 0, if we - // are being deleted prematurely, something is wrong! - ROCKET_ASSERTMSG(self->ob_refcnt == 0, "Python object being cleared up prematurely, reference count not 0."); - ROCKET_ASSERT(this->T::GetReferenceCount() == 0); - } - - /// Override AddReference so we can push the call through to python - virtual void AddReference() - { - Py_INCREF(self); - - T::AddReference(); - } - - /// Overrride RemoveReference so we can push the call through to python - virtual void RemoveReference() - { - T::RemoveReference(); - - Py_DECREF(self); - } - - virtual int GetReferenceCount() - { - // C++ reference counts are always reflected in the python ref count - return self->ob_refcnt; - } - - virtual void OnReferenceDeactivate() - { - // If self is NULL, don't pass the call down, as this is the initial - // T::RemoveReference from the constructor - if (self) - T::OnReferenceDeactivate(); - } - - // Script object access - virtual void* GetScriptObject() const { return self; } - -protected: - PyObject* self; -}; - -#undef WRAPPER_PARAM - diff --git a/libs/libRocket/Include/Rocket/Core/ReferenceCountable.h b/libs/libRocket/Include/Rocket/Core/ReferenceCountable.h deleted file mode 100644 index cf8c188896e..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ReferenceCountable.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREREFERENCECOUNTABLE_H -#define ROCKETCOREREFERENCECOUNTABLE_H - -#include "Header.h" - -namespace Rocket { -namespace Core { - -/** - A base class for any class that wishes to be reference counted. - @author Robert Curry -*/ - -class ROCKETCORE_API ReferenceCountable -{ -public: - /// Constructor. - /// @param[in] initial_count The initial reference count of the object. - ReferenceCountable(int initial_count = 1); - /// Destructor. The reference count must be 0 when this is invoked. - virtual ~ReferenceCountable(); - - /// Returns the number of references outstanding against this object. - virtual int GetReferenceCount(); - /// Increases the reference count. If this pushes the count above 0, OnReferenceActivate() will be called. - virtual void AddReference(); - /// Decreases the reference count. If this pushes the count to 0, OnReferenceDeactivate() will be called. - virtual void RemoveReference(); - - /// Catches incorrect copy attempts. - ReferenceCountable& operator=(const ReferenceCountable& copy); - - /// If any reference countable objects are still allocated, this function will write a leak report to the log. - static void DumpLeakReport(); - -protected: - /// A hook method called when the reference count climbs from 0. - virtual void OnReferenceActivate(); - /// A hook method called when the reference count drops to 0. - virtual void OnReferenceDeactivate(); - -private: - // The number of references against this object. - int reference_count; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/RenderInterface.h b/libs/libRocket/Include/Rocket/Core/RenderInterface.h deleted file mode 100644 index d10013b4d07..00000000000 --- a/libs/libRocket/Include/Rocket/Core/RenderInterface.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORERENDERINTERFACE_H -#define ROCKETCORERENDERINTERFACE_H - -#include "ReferenceCountable.h" -#include "Header.h" -#include "Texture.h" -#include "Vertex.h" - -namespace Rocket { -namespace Core { - -class Context; - -/** - The abstract base class for application-specific rendering implementation. Your application must provide a concrete - implementation of this class and install it through Core::SetRenderInterface() in order for anything to be rendered. - - @author Peter Curry - */ - -class ROCKETCORE_API RenderInterface : public ReferenceCountable -{ -public: - RenderInterface(); - virtual ~RenderInterface(); - - /// Called by Rocket when it wants to render geometry that the application does not wish to optimise. Note that - /// Rocket renders everything as triangles. - /// @param[in] vertices The geometry's vertex data. - /// @param[in] num_vertices The number of vertices passed to the function. - /// @param[in] indices The geometry's index data. - /// @param[in] num_indices The number of indices passed to the function. This will always be a multiple of three. - /// @param[in] texture The texture to be applied to the geometry. This may be NULL, in which case the geometry is untextured. - /// @param[in] translation The translation to apply to the geometry. - virtual void RenderGeometry(Vertex* vertices, int num_vertices, int* indices, int num_indices, TextureHandle texture, const Vector2f& translation) = 0; - - /// Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future. - /// If supported, this should be return a pointer to an optimised, application-specific version of the data. If - /// not, do not override the function or return NULL; the simpler RenderGeometry() will be called instead. - /// @param[in] vertices The geometry's vertex data. - /// @param[in] num_vertices The number of vertices passed to the function. - /// @param[in] indices The geometry's index data. - /// @param[in] num_indices The number of indices passed to the function. This will always be a multiple of three. - /// @param[in] texture The texture to be applied to the geometry. This may be NULL, in which case the geometry is untextured. - /// @return The application-specific compiled geometry. Compiled geometry will be stored and rendered using RenderCompiledGeometry() in future calls, and released with ReleaseCompiledGeometry() when it is no longer needed. - virtual CompiledGeometryHandle CompileGeometry(Vertex* vertices, int num_vertices, int* indices, int num_indices, TextureHandle texture); - /// Called by Rocket when it wants to render application-compiled geometry. - /// @param[in] geometry The application-specific compiled geometry to render. - /// @param[in] translation The translation to apply to the geometry. - virtual void RenderCompiledGeometry(CompiledGeometryHandle geometry, const Vector2f& translation); - /// Called by Rocket when it wants to release application-compiled geometry. - /// @param[in] geometry The application-specific compiled geometry to release. - virtual void ReleaseCompiledGeometry(CompiledGeometryHandle geometry); - - /// Called by Rocket when it wants to enable or disable scissoring to clip content. - /// @param[in] enable True if scissoring is to enabled, false if it is to be disabled. - virtual void EnableScissorRegion(bool enable) = 0; - /// Called by Rocket when it wants to change the scissor region. - /// @param[in] x The left-most pixel to be rendered. All pixels to the left of this should be clipped. - /// @param[in] y The top-most pixel to be rendered. All pixels to the top of this should be clipped. - /// @param[in] width The width of the scissored region. All pixels to the right of (x + width) should be clipped. - /// @param[in] height The height of the scissored region. All pixels to below (y + height) should be clipped. - virtual void SetScissorRegion(int x, int y, int width, int height) = 0; - - /// Called by Rocket when a texture is required by the library. - /// @param[out] texture_handle The handle to write the texture handle for the loaded texture to. - /// @param[out] texture_dimensions The variable to write the dimensions of the loaded texture. - /// @param[in] source The application-defined image source, joined with the path of the referencing document. - /// @return True if the load attempt succeeded and the handle and dimensions are valid, false if not. - virtual bool LoadTexture(TextureHandle& texture_handle, Vector2i& texture_dimensions, const String& source); - /// Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels. - /// @param[out] texture_handle The handle to write the texture handle for the generated texture to. - /// @param[in] source The raw 8-bit texture data. Each pixel is made up of texture_samples 8-bit values. - /// @param[in] source_dimensions The dimensions, in pixels, of the source data. - /// @param[in] source_samples Pixel size of the texture data, in bytes. - /// @return True if the texture generation succeeded and the handle is valid, false if not. - virtual bool GenerateTexture(TextureHandle& texture_handle, const byte* source, const Vector2i& source_dimensions, int source_samples); - /// Called by Rocket when a loaded texture is no longer required. - /// @param texture The texture handle to release. - virtual void ReleaseTexture(TextureHandle texture); - - /// Returns the native horizontal texel offset for the renderer. - /// @return The renderer's horizontal texel offset. The default implementation returns 0. - virtual float GetHorizontalTexelOffset(); - /// Returns the native vertical texel offset for the renderer. - /// @return The renderer's vertical texel offset. The default implementation returns 0. - virtual float GetVerticalTexelOffset(); - - /// Returns the number of pixels per inch. - /// @returns The number of pixels per inch. The default implementation returns 100. - virtual float GetPixelsPerInch(); - - /// Called when this render interface is released. - virtual void Release(); - - /// Get the context currently being rendered. This is only valid during RenderGeometry, - /// CompileGeometry, RenderCompiledGeometry, EnableScissorRegion and SetScissorRegion. - Context* GetContext() const; - -protected: - virtual void OnReferenceDeactivate(); - -private: - Context* context; - - friend class Context; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/ScriptInterface.h b/libs/libRocket/Include/Rocket/Core/ScriptInterface.h deleted file mode 100644 index 53214c3319c..00000000000 --- a/libs/libRocket/Include/Rocket/Core/ScriptInterface.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESCRIPTINTERFACE_H -#define ROCKETCORESCRIPTINTERFACE_H - -#include "Header.h" -#include "ReferenceCountable.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - -/** - Base class for all objects that hold a scriptable object. - @author Peter Curry - */ - -class ROCKETCORE_API ScriptInterface : public ReferenceCountable -{ - public: - virtual ~ScriptInterface() - { - } - - virtual ScriptObject GetScriptObject() const - { - return NULL; - } -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Stream.h b/libs/libRocket/Include/Rocket/Core/Stream.h deleted file mode 100644 index d5c6dfc6568..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Stream.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTREAM_H -#define ROCKETCORESTREAM_H - -#include "Header.h" -#include "ReferenceCountable.h" -#include "Types.h" -#include "URL.h" -#include - -namespace Rocket { -namespace Core { - -class StreamListener; - -/** - Abstract class for a media-independent byte stream. - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API Stream : public ReferenceCountable -{ - public: - // Stream modes. - enum StreamMode - { - MODE_WRITE = 1 << 0, - MODE_APPEND = 1 << 1, - MODE_READ = 1 << 2, - MODE_ASYNC = 1 << 3, - - MODE_MASK = MODE_WRITE | MODE_APPEND | MODE_READ - }; - - Stream(); - virtual ~Stream(); - - /// Closes the stream. - virtual void Close(); - - /// Returns the mode the stream was opened in. - int GetStreamMode() const; - - /// Obtain the source url of this stream (if available) - const URL& GetSourceURL() const; - - /// Are we at the end of the stream - virtual bool IsEOS() const; - - /// Returns the size of this stream (in bytes). - virtual size_t Length() const = 0; - - /// Returns the position of the stream pointer (in bytes). - virtual size_t Tell() const = 0; - /// Sets the stream position (in bytes). - virtual bool Seek(long offset, int origin) const = 0; - - /// Read from the stream. - virtual size_t Read(void* buffer, size_t bytes) const = 0; - /// Read from the stream into another stream. - virtual size_t Read(Stream* stream, size_t bytes) const; - /// Read from the stream and append to the string buffer - virtual size_t Read(String& buffer, size_t bytes) const; - /// Read from the stream, without increasing the stream offset. - virtual size_t Peek(void* buffer, size_t bytes) const; - - /// Write to the stream at the current position. - virtual size_t Write(const void* buffer, size_t bytes) = 0; - /// Write to this stream from another stream. - virtual size_t Write(const Stream* stream, size_t bytes); - /// Write a character array to the stream. - virtual size_t Write(const char* string); - /// Write a string to the stream - virtual size_t Write(const String& string); - - /// Truncate the stream to the specified length. - virtual size_t Truncate(size_t bytes) = 0; - - /// Push onto the front of the stream. - virtual size_t PushFront(const void* buffer, size_t bytes); - /// Push onto the back of the stream. - virtual size_t PushBack(const void* buffer, size_t bytes); - - /// Pop from the front of the stream. - virtual size_t PopFront(size_t bytes); - /// Pop from the back of the stream. - virtual size_t PopBack(size_t bytes); - - /// Returns true if the stream is ready for reading, false otherwise. - /// This is usually only implemented on streams supporting asynchronous - /// operations. - virtual bool IsReadReady() = 0; - /// Returns true if the stream is ready for writing, false otherwise. - /// This is usually only implemented on streams supporting asynchronous - /// operations. - virtual bool IsWriteReady() = 0; - - protected: - - /// Sets the mode on the stream; should be called by a stream when it is opened. - void SetStreamDetails(const URL& url, int stream_mode); - - /// Deletes the stream. - virtual void OnReferenceDeactivate(); - - private: - URL url; - int stream_mode; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/StreamMemory.h b/libs/libRocket/Include/Rocket/Core/StreamMemory.h deleted file mode 100644 index 4c1eb03580b..00000000000 --- a/libs/libRocket/Include/Rocket/Core/StreamMemory.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTREAMMEMORY_H -#define ROCKETCORESTREAMMEMORY_H - -#include "Header.h" -#include "Stream.h" - -namespace Rocket { -namespace Core { - -/** - Memory Byte Stream Class - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API StreamMemory : public Stream -{ -public: - /// Empty memory stream with default size buffer - StreamMemory(); - /// Empty memory stream with specified buffer size - StreamMemory(size_t initial_size); - /// Read only memory stream based on the existing buffer - StreamMemory(const byte* buffer, size_t buffer_size); - /// Copy a memory stream - StreamMemory(const StreamMemory& copy); - virtual ~StreamMemory(); - - StreamMemory& operator=(const StreamMemory& copy); - - /// Close the stream - virtual void Close(); - - /// Are we at the end of the stream - virtual bool IsEOS() const; - - /// Size of this stream ( in bytes ) - virtual size_t Length() const; - - /// Get Stream position ( in bytes ) - size_t Tell() const; - - /// Set Stream position ( in bytes ) - bool Seek(long offset, int origin) const; - - /// Read from the stream - using Stream::Read; - virtual size_t Read(void* buffer, size_t bytes) const; - - /// Peek into the stream - virtual size_t Peek(void *buffer, size_t bytes) const; - - /// Write to the stream - using Stream::Write; - virtual size_t Write(const void* buffer, size_t bytes); - - /// Truncate the stream to the specified length - virtual size_t Truncate(size_t bytes); - - /// Push onto the front of the stream - virtual size_t PushFront(const void* buffer, size_t bytes); - - /// Pop from the front of the stream - virtual size_t PopFront(size_t bytes); - - /// Raw access to the stream - const byte* RawStream() const; - - /// Erase a section of the stream - void Erase(size_t offset, size_t bytes); - - /// Does the stream have data available for reading - virtual bool IsReadReady(); - - /// Is the stream able to accept data now - virtual bool IsWriteReady(); - - /// Sets this streams source URL, useful data that is stored - /// in memory streams that originated from files - void SetSourceURL(const URL& url); - -private: - - byte* buffer; - mutable byte* buffer_ptr; - size_t buffer_size; - size_t buffer_used; - bool owns_buffer; - - bool Reallocate(size_t size); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/String.h b/libs/libRocket/Include/Rocket/Core/String.h deleted file mode 100644 index efb1a0eade8..00000000000 --- a/libs/libRocket/Include/Rocket/Core/String.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTRING_H -#define ROCKETCORESTRING_H - -#include "Header.h" -#include "StringBase.h" -#include -#include -#include -#include - -namespace Rocket { -namespace Core { - -typedef StringBase< char > String; -typedef std::vector< String > StringList; - -struct StringHash -{ - size_t operator() (const String& s) const - { - return s.Hash(); - } -}; - -// Template specialisation of the constructor and FormatString() methods that use variable argument lists. -template<> -ROCKETCORE_API StringBase::StringBase(StringBase::size_type max_size, const char* fmt, ...); -template<> -ROCKETCORE_API int StringBase::FormatString(StringBase::size_type max_size, const char* fmt, ...); - -// Global operators for adding C strings to strings. -ROCKETCORE_API String operator+(const char* cstring, const String& string); - -// partial specialization follows - -/* !!! CHANGING THIS METHOD BREAKS ABI COMPATIBILITY DUE TO INLINING !!! */ -template<> -ROCKETCORE_API_INLINE bool StringBase< char >::operator<(const char * compare) const -{ - return strcmp( value, compare ) < 0; -} - -/* !!! CHANGING THIS METHOD BREAKS ABI COMPATIBILITY DUE TO INLINING !!! */ -template<> -ROCKETCORE_API_INLINE bool StringBase< char >::operator==(const char * compare) const -{ - return strcmp( value, compare ) == 0; -} - -/* !!! CHANGING THIS METHOD BREAKS ABI COMPATIBILITY DUE TO INLINING !!! */ -template<> -ROCKETCORE_API_INLINE bool StringBase< char >::operator!=(const char * compare) const -{ - return strcmp( value, compare ) != 0; -} - -// Redefine Windows APIs as their STDC counterparts. -#ifdef ROCKET_PLATFORM_WIN32 - #define strcasecmp stricmp - #define strncasecmp strnicmp -#endif - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/StringBase.h b/libs/libRocket/Include/Rocket/Core/StringBase.h deleted file mode 100644 index 7474abf0dea..00000000000 --- a/libs/libRocket/Include/Rocket/Core/StringBase.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTRINGBASE_H -#define ROCKETCORESTRINGBASE_H - -#include "Debug.h" -#include - -namespace Rocket { -namespace Core { - -/** - Base String Implementation - @author Lloyd Weehuizen - */ -template< typename T > -class StringBase -{ -public: - typedef size_t size_type; - static const size_type npos = (size_type)-1; - - StringBase(); - StringBase(const StringBase& copy); - StringBase(const T* string); - StringBase(const T* string_start, const T* string_end); - StringBase(size_type length, const T character); - StringBase(size_type max_length, const T* fmt, ...); - - ~StringBase(); - - /// Is the string currently empty - inline bool Empty() const; - /// Clear the string to empty - void Clear(); - - /// The length of the string - inline size_type Length() const; - /// Get the hash value of this string - inline unsigned int Hash() const; - /// Access the string as a standard C string - inline const T* CString() const; - - /// Reserve space for at least this much data - inline void Reserve(size_type size); - - /// Find the given string within this string - /// @param find The string to search for - /// @param offset Starting location of the search - size_type Find(const T* find, size_type offset = 0) const; - /// Find the given string within this string - /// @param find The string to search for - /// @param offset Starting location of the search - size_type Find(const StringBase& find, size_type offset = 0) const; - /// Reverse find the given string within this string - /// @param find The string to search for - /// @param offset Starting location of the search - size_type RFind(const T* find, size_type offset = npos) const; - /// Reverse find the given string within this string - /// @param find The string to search for - /// @param offset Starting location of the search - size_type RFind(const StringBase& find, size_type offset = npos) const; - - /// Replace all occurances of the given string with another - /// @param find The string to search for - /// @param replace The string to replace it with - StringBase Replace(const T* find, const T* replace) const; - /// Replace all occurances of the given string with another - /// @param find The string to search for - /// @param replace The string to replace it with - StringBase Replace(const StringBase& find, const StringBase& replace) const; - - /// Return a substring of this string - /// @param start The starting position - /// @param length The number of characters to copy - inline StringBase Substring(size_type start, size_type length = StringBase::npos) const; - - /// Append the given string to this string - /// @param append The string to appen - /// @param count The number of characters to append - inline StringBase& Append(const T* append, size_type count = StringBase::npos); - /// Assign the given string to this string - /// @param assign The string to assign - /// @param count The number of characters to assign - inline StringBase& Append(const StringBase& append, size_type count = StringBase::npos); - /// Append a single character - /// @param append The character to append - inline StringBase& Append(const T& append); - - /// Assign the given string to this string - /// @param assign The string to assign - /// @param length The number of characters to assign - inline StringBase& Assign(const T* assign, size_type count = StringBase::npos); - /// Assign the given string to this string - /// @param assign The string to assign - /// @param count The number of characters to assign - inline StringBase& Assign(const T* assign, const T* end); - /// Assign the given string to this string - /// @param assign The string to assign - /// @param count The number of characters to assign - inline StringBase& Assign(const StringBase& assign, size_type count = StringBase::npos); - - /// Insert a string into this string - /// @param index Index to insert the characters - /// @param insert String to insert - /// @param count Number of characters to insert - inline void Insert(size_type index, const T* insert, size_type count = StringBase::npos); - /// Insert a string into this string - /// @param index Index to insert the characters - /// @param insert String to insert - /// @param count Number of characters to insert - inline void Insert(size_type index, const StringBase& insert, size_type count = StringBase::npos); - /// Insert a character into this string - /// @param index Index to insert the characters - /// @param insert Character to insert - inline void Insert(size_type index, const T& insert); - - /// Erase characters from this string - /// @param index Index to erase the characters - /// @param length Number of characters to erase - inline void Erase(size_type index, size_type length = StringBase::npos); - - /// sprsize_typef style string formatting. - /// NOTE: This is not implemented in the base layer and requires template - /// specialisation of the specific string type - /// @param max_length Maximum length of the result - /// @param format The sprsize_typef style formatting - int FormatString(size_type max_length, const T* format, ...); - - /// Resize the string to the given size, inserts space if the string is getting bigger - /// @param size New size - void Resize(size_type size); - - /// Create a lowercase version of the string - /// @returns The lower case representation of the string - StringBase ToLower() const; - /// Create a lowercase version of the string - /// @returns The lower case representation of the string - StringBase ToUpper() const; - - inline bool operator==(const T* compare) const; - inline bool operator==(const StringBase& compare) const; - - inline bool operator!=(const T* compare) const; - inline bool operator!=(const StringBase& compare) const; - - inline bool operator<(const T* compare) const; - inline bool operator<(const StringBase& compare) const; - - inline StringBase& operator=(const T* assign); - inline StringBase& operator=(const StringBase& assign); - - inline StringBase operator+(const T* append) const; - inline StringBase operator+(const StringBase& append) const; - - inline StringBase& operator+=(const T* append); - inline StringBase& operator+=(const StringBase& append); - inline StringBase& operator+=(const T& append); - - inline const T& operator[](size_type index) const; - inline T& operator[](size_type index); - -protected: - - T* value; - size_type buffer_size; - size_type length; - mutable unsigned int hash; - static const size_type LOCAL_BUFFER_SIZE = 8; - char local_buffer[LOCAL_BUFFER_SIZE]; - - size_type GetLength(const T* string) const; - - // Copies the source string to target string - inline void Copy(T* target, const T* src, size_type length, bool terminate = false); - - // Internal implementations of the public interfaces, - // all these functions take the length of the const T*'s they're - // dealing with which *MUST* be accurate. - // Its up to the external interfaces to provide valid values for these functions - inline size_type _Find(const T* find, size_type find_length, size_type offset = 0) const; - inline size_type _RFind(const T* find, size_type find_length, size_type offset = 0) const; - inline StringBase _Replace(const T* find, size_type find_length, const T* replace, size_type replace_length) const; - inline StringBase& _Append(const T* append, size_type append_length, size_type count = StringBase::npos); - inline StringBase& _Assign(const T* assign, size_type assign_length, size_type count = StringBase::npos); - inline void _Insert(size_type index, const T* insert, size_type insert_length, size_type count = StringBase::npos); -}; - -#include "StringBase.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/StringBase.inl b/libs/libRocket/Include/Rocket/Core/StringBase.inl deleted file mode 100644 index 2353586cec3..00000000000 --- a/libs/libRocket/Include/Rocket/Core/StringBase.inl +++ /dev/null @@ -1,726 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -template< typename T > -StringBase< T >::StringBase() : value((T*)local_buffer), buffer_size(LOCAL_BUFFER_SIZE), length(0), hash(0) -{ - value[0] = 0; -} - -template< typename T > -StringBase< T >::StringBase(const StringBase< T >& copy) : value((T*)local_buffer), buffer_size(LOCAL_BUFFER_SIZE), length(0), hash(0) -{ - value[0] = 0; - *this = copy; -} - -template< typename T > -StringBase< T >::StringBase(const T* string) : value((T*)local_buffer), buffer_size(LOCAL_BUFFER_SIZE), length(0), hash(0) -{ - value[0] = 0; - *this = string; -} - -template< typename T > -StringBase< T >::StringBase(const T* string_start, const T* string_end) : value((T*)local_buffer), buffer_size(LOCAL_BUFFER_SIZE), length(0), hash(0) -{ - value[0] = 0; - length = (string_end - string_start); - - if (length > 0) - { - Reserve(length); - Copy(value, string_start, length, true); - } -} - -template< typename T > -StringBase< T >::StringBase(size_type count, const T character) : value((T*)local_buffer), buffer_size(LOCAL_BUFFER_SIZE), length(0), hash(0) -{ - value[0] = 0; - length = count; - - if (length > 0) - { - Reserve(length); - for (size_type i = 0; i < length; i++) - value[i] = character; - value[length] = '\0'; - } -} - -template< typename T > -StringBase< T >::StringBase(size_type ROCKET_UNUSED_PARAMETER(max_length), const T* ROCKET_UNUSED_PARAMETER(fmt), ...) : value((T*)local_buffer), buffer_size(LOCAL_BUFFER_SIZE), length(0), hash(0) -{ - ROCKET_UNUSED(max_length); - ROCKET_UNUSED(fmt); - - value[0] = 0; - // Can't implement this at the base level, requires template specialisation - ROCKET_ERRORMSG("Not implemented."); -} - -template< typename T > -StringBase< T >::~StringBase() -{ - if (value != (T*)local_buffer) - free(value); -} - -template< typename T > -bool StringBase< T >::Empty() const -{ - return length == 0; -} - -template< typename T > -void StringBase< T >::Clear() -{ - if (value != (T*)local_buffer) - free(value); - - length = 0; - hash = 0; - value = (T*)local_buffer; - buffer_size = LOCAL_BUFFER_SIZE; -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::Length() const -{ - return length; -} - -template< typename T > -unsigned int StringBase< T >::Hash() const -{ - if (hash == 0 && length > 0) - { - // FNV-1 hash algorithm - unsigned char* bp = (unsigned char *)value; // start of buffer - unsigned char* be = (unsigned char *)value + (length * sizeof(T)); - - // FNV-1a hash each octet in the buffer - while (bp < be) - { - // xor the bottom with the current octet - hash ^= *bp++; - - /* multiply by the 32 bit FNV magic prime mod 2^32 */ - #if !defined(__GNUC__) - const unsigned int FNV_32_PRIME = ((unsigned int)16777619); - hash *= FNV_32_PRIME; - #else - hash += (hash<<1) + (hash<<4) + (hash<<7) + (hash<<8) + (hash<<24); - #endif - } - } - return hash; -} - -template< typename T > -const T* StringBase< T >::CString() const -{ - return value; -} - -template< typename T > -void StringBase< T >::Reserve(size_type size) -{ - size_type new_size = (size + 1) * sizeof(T); - - if (buffer_size >= new_size) - return; - - // Pad out to a block of 16 bytes - const int BLOCK_SIZE = 16; - new_size = (new_size+BLOCK_SIZE-1)&(~(BLOCK_SIZE-1)); - - if (value == (T*)local_buffer) - { - T* new_value = (T*)realloc(NULL, new_size); - ROCKET_ASSERTMSG(new_value, "Could not reserve memory for String, realloc failed."); - if(new_value != NULL) - { - buffer_size = new_size; - Copy(new_value, (T*)local_buffer, LOCAL_BUFFER_SIZE / sizeof(T)); - value = new_value; - } - } - else - { - T* new_value = (T*)realloc(value, new_size); - ROCKET_ASSERTMSG(new_value, "Could not reserve memory for String, realloc failed."); - if(new_value != NULL) - { - buffer_size = new_size; - value = new_value; - } - } -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::Find(const T* find, size_type offset) const -{ - return _Find(find, GetLength(find), offset); -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::Find(const StringBase< T >& find, size_type offset) const -{ - return _Find(find.CString(), find.Length(), offset); -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::RFind(const T* find, size_type offset) const -{ - return _RFind(find, GetLength(find), offset); -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::RFind(const StringBase< T >& find, size_type offset) const -{ - return _RFind(find.CString(), find.Length(), offset); -} - -template< typename T > -StringBase< T > StringBase< T >::Replace(const T* find, const T* replace) const -{ - return _Replace(find, GetLength(find), replace, GetLength(replace)); -} - -template< typename T > -StringBase< T > StringBase< T >::Replace(const StringBase< T >& find, const StringBase< T >& replace) const -{ - return _Replace(find.CString(), find.Length(), replace.CString(), replace.Length()); -} - -template< typename T > -StringBase< T > StringBase< T >::Substring(size_type start, size_type count) const -{ - // Ensure we're not going of bounds - if (count > length - start) - count = length - start; - - if (start > length) - count = 0; - - return StringBase< T >(&value[start], &value[start + count]); -} - -template< typename T > -StringBase< T >& StringBase< T >::Append(const T* append, size_type count) -{ - return _Append(append, GetLength(append), count); -} - -template< typename T > -StringBase< T >& StringBase< T >::Append(const StringBase< T >& append, size_type count) -{ - return _Append(append.CString(), append.Length(), count); -} - -template< typename T > -StringBase< T >& StringBase< T >::Append(const T& append) -{ - T buffer[2] = { append, 0 }; - return (*this += buffer); -} - -template< typename T > -StringBase< T >& StringBase< T >::Assign(const T* assign, size_type count) -{ - size_type assign_length = GetLength(assign); - return _Assign(assign, count > assign_length ? assign_length : count); -} - -template< typename T > -StringBase< T >& StringBase< T >::Assign(const T* assign, const T* end) -{ - return _Assign(assign, end - assign); -} - -template< typename T > -StringBase< T >& StringBase< T >::Assign(const StringBase< T >& assign, size_type count) -{ - return _Assign(assign.CString(), assign.length, count); -} - -// Insert a string into this string -template< typename T > -void StringBase< T >::Insert(size_type index, const T* insert, size_type count) -{ - return _Insert(index, insert, GetLength(insert), count); -} - -// Insert a string into this string -template< typename T > -void StringBase< T >::Insert(size_type index, const StringBase< T >& insert, size_type count) -{ - return _Insert(index, insert.value, insert.length, count); -} - -// Insert a character into this string -template< typename T > -void StringBase< T >::Insert(size_type index, const T& insert) -{ - return _Insert(index, &insert, 1, 1); -} - -/// Erase characters from this string -template< typename T > -void StringBase< T >::Erase(size_type index, size_type count) -{ - if (index >= length) - return; - - if (count == npos) - { - Resize(index); - } - else - { - size_type erase_amount = count < length - index ? count : length - index; - - Copy(&value[index], &value[index + erase_amount], length - index - erase_amount, true); - - length -= erase_amount; - - if (length == 0) - Clear(); - } -} - -template< typename T > -int StringBase< T >::FormatString(size_type ROCKET_UNUSED_PARAMETER(max_length), const T* ROCKET_UNUSED_PARAMETER(fmt), ...) -{ - ROCKET_UNUSED(max_length); - ROCKET_UNUSED(fmt); - - ROCKET_ERRORMSG("Not implemented."); - return -1; -} - -template< typename T > -void StringBase< T >::Resize(size_type new_length) -{ - Reserve(new_length); - length = new_length; - value[length] = '\0'; - - if (length == 0) - Clear(); -} - -// Create a lowercase version of the string -template< typename T > -StringBase< T > StringBase< T >::ToLower() const -{ - // Loop through the string, looking for an uppercase character - size_t copy_index = npos; - for (size_t i = 0; i < length; i++) - { - if (value[i] >= 'A' && value[i] <= 'Z') - { - copy_index = i; - break; - } - } - - // If theres no lowercase letters, simply copy us direct - if (copy_index == npos) - return StringBase< T >(*this); - - StringBase< T > lowercase(CString(), CString() + copy_index); - // Otherwise trawl through the rest of the letters - for (size_t i = copy_index; i < length; i++) - { - if (value[i] >= 'A' && value[i] <= 'Z') - lowercase.Append((T)(value[i] + ('a' - 'A'))); - else - lowercase.Append(value[i]); - } - - return lowercase; -} - -// Create a lowercase version of the string -template< typename T > -StringBase< T > StringBase< T >::ToUpper() const -{ - // Loop through the string, looking for an lowercase character - size_t copy_index = npos; - for (size_t i = 0; i < length; i++) - { - if (value[i] >= 'a' && value[i] <= 'z') - { - copy_index = i; - break; - } - } - - // If theres no lowercase letters, simply copy us direct - if (copy_index == npos) - return StringBase< T >(*this); - - StringBase< T > uppercase(CString(), CString() + copy_index); - // Otherwise trawl through the rest of the letters - for (size_t i = copy_index; i < length; i++) - { - if (value[i] >= 'a' && value[i] <= 'z') - uppercase.Append((T)(value[i] - ('a' - 'A'))); - else - uppercase.Append(value[i]); - } - - return uppercase; -} - -template< typename T > -bool StringBase< T >::operator==(const T* compare) const -{ - size_type index = 0; - - while (index < length && compare[index] == value[index]) - index++; - - return index == length && compare[index] == '\0'; -} - -template< typename T > -bool StringBase< T >::operator==(const StringBase< T >& compare) const -{ - if (length != compare.length) - return false; - - if (Hash() != compare.Hash()) - return false; - - return (*this) == compare.value; -} - -template< typename T > -bool StringBase< T >::operator!=(const T* compare) const -{ - return !(*this == compare); -} - -template< typename T > -bool StringBase< T >::operator!=(const StringBase< T >& compare) const -{ - return !(*this == compare); -} - -template< typename T > -bool StringBase< T >::operator<(const T* compare) const -{ - size_type index = 0; - while (index < length && compare[index] == value[index]) - index++; - - // Check if we reached the end of the string - if (index < length) - { - // If we didn't check if we reached the end of - // the string we're comparing against, if so - // then we're not less than - if (compare[index] == 0) - return false; - - // Check the character at index - return value[index] < compare[index]; - } - else - { - // We reached the end of our string, - // if the string we're comparing with still - // has data, then we're smaller - if (compare[index] != 0) - return true; - } - - return false; -} - -template< typename T > -bool StringBase< T >::operator<(const StringBase< T >& compare) const -{ - return *this < compare.CString(); -} - -template< typename T > -StringBase< T >& StringBase< T >::operator=(const T* assign) -{ - return Assign(assign); -} - -template< typename T > -StringBase< T >& StringBase< T >::operator=(const StringBase< T >& assign) -{ - StringBase< T >&out = Assign(assign); - out.hash = assign.hash; - return out; -} - -template< typename T > -StringBase< T > StringBase< T >::operator+(const T* add) const -{ - StringBase< T > combined(*this); - combined.Append(add); - - return combined; -} - -template< typename T > -StringBase< T > StringBase< T >::operator+(const StringBase< T >& add) const -{ - StringBase< T > combined(*this); - combined.Append(add); - - return combined; -} - -template< typename T > -StringBase< T >& StringBase< T >::operator+=(const T* add) -{ - return Append(add); -} - -template< typename T > -StringBase< T >& StringBase< T >::operator+=(const StringBase< T >& add) -{ - return _Append(add.CString(), add.length); -} - -template< typename T > -StringBase< T >& StringBase< T >::operator+=(const T& add) -{ - return Append(add); -} - -template< typename T > -const T& StringBase< T >::operator[](size_type index) const -{ - ROCKET_ASSERT(index < length); - return value[index]; -} - -template< typename T > -T& StringBase< T >::operator[](size_type index) -{ - ROCKET_ASSERT(index < length); - return value[index]; -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::GetLength(const T* string) const -{ - const T* ptr = string; - - while (*ptr) - { - ptr++; - } - - return ptr - string; -} - -template< typename T > -void StringBase< T >::Copy(T* target, const T* src, size_type length, bool terminate) -{ - // Copy values - for (size_type i = 0; i < length; i++) - { - *target++ = *src++; - } - - if (terminate) - { - *target++ = 0; - } -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::_Find(const T* find, size_type find_length, size_type offset) const -{ - size_type needle_index = 0; - size_type haystack_index = offset; - - // If the find length is greater than the string we have, it can't be here - if (find_length > length) - return npos; - - // While there's still data in the haystack loop - while (value[haystack_index]) - { - // If the current haystack posize_typeer plus needle offset matches, - // advance the needle index - if (value[haystack_index + needle_index] == find[needle_index]) - { - needle_index++; - - // If we reach the end of the search term, return the current haystack index - if (needle_index == find_length) - return haystack_index; - } - else - { - // Advance haystack index by one and reset needle index. - haystack_index++; - needle_index = 0; - } - } - - return npos; -} - -template< typename T > -typename StringBase< T >::size_type StringBase< T >::_RFind(const T* find, size_type find_length, size_type offset) const -{ - ROCKET_ASSERT(find_length > 0); - - size_type needle_index = 0; - size_type haystack_index = (offset < length ? offset : length) - find_length; - - // If the find length is greater than the string we have, it can't be here - if (find_length > length) - return npos; - - // While theres still data in the haystack loop - for (;;) - { - // If the current haystack index plus needle offset matches, - // advance the needle index - if (value[haystack_index + needle_index] == find[needle_index]) - { - needle_index++; - - // If we reach the end of the search term, return the current haystack index - if (find[needle_index] == 0) - return haystack_index; - } - else - { - if (haystack_index == 0) - return npos; - - // Advance haystack index backwards - haystack_index--; - needle_index = 0; - } - } -} - -template< typename T > -StringBase< T > StringBase< T >::_Replace(const T* find, size_type find_length, const T* replace, size_type replace_length) const -{ - StringBase< T > result; - - size_type offset = 0; - // Loop until we reach the end of the string - while (offset < Length()) - { - // Look for the next search term - size_type pos = _Find(find, find_length, offset); - - // Term not found, add remainder and return - if (pos == npos) - return result + (Substring(offset).CString()); - - // Add the unchanged text and replacement after it - result += Substring(offset, pos - offset); - result._Append(replace, replace_length); - - // Advance the find position - offset = pos + find_length; - } - - hash = 0; - - return result; -} - -template< typename T > -StringBase< T >& StringBase< T >::_Append(const T* append, size_type append_length, size_type count) -{ - size_type add_length = count < append_length ? count : append_length; - - if (add_length == 0) - return *this; - - Reserve(length + add_length); - Copy(&value[length], append, add_length, true); - length += add_length; - - hash = 0; - - return *this; -} - -template< typename T > -StringBase< T >& StringBase< T >::_Assign(const T* assign, size_type assign_length, size_type count) -{ - size_type new_length = count < assign_length ? count : assign_length; - - if (new_length == 0) - { - Clear(); - } - else - { - Reserve(new_length); - Copy(value, assign, new_length, true); - } - - length = new_length; - - hash = 0; - - return *this; -} - -template< typename T > -void StringBase< T >::_Insert(size_type index, const T* insert, size_type insert_length, size_type count) -{ - if (index >= length) - { - Append(insert, count); - return; - } - - size_type add_length = count < insert_length ? count : insert_length; - - Reserve(length + add_length); - - for (size_type i = length + 1; i > index; i--) - value[i + add_length - 1] = value[i - 1]; - - Copy(&value[index], insert, add_length); - length += add_length; - - hash = 0; -} diff --git a/libs/libRocket/Include/Rocket/Core/StringUtilities.h b/libs/libRocket/Include/Rocket/Core/StringUtilities.h deleted file mode 100644 index 31a5f9ffac0..00000000000 --- a/libs/libRocket/Include/Rocket/Core/StringUtilities.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTRINGUTILITIES_H -#define ROCKETCORESTRINGUTILITIES_H - -#include "Header.h" -#include "Types.h" -#include "String.h" -#include - -namespace Rocket { -namespace Core { - -/** - Helper functions for string manipulation. - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API StringUtilities -{ -public: - /// Expands character-delimited list of values in a single string to a whitespace-trimmed list - /// of values. - /// @param[out] string_list Resulting list of values. - /// @param[in] string String to expand. - /// @param[in] delimiter Delimiter found between entries in the string list. - static void ExpandString(StringList& string_list, const String& string, const char delimiter = ','); - /// Joins a list of string values into a single string separated by a character delimiter. - /// @param[out] string Resulting concatenated string. - /// @param[in] string_list Input list of string values. - /// @param[in] delimiter Delimiter to insert between the individual values. - static void JoinString(String& string, const StringList& string_list, const char delimiter = ','); - - /// Hashes a string of data to an integer value using the FNV algorithm. - /// @param[in] data Data to hash. - /// @param[in] length Length of the string to hash. If this is -1, the data will be interpreted as a C string. - /// @return Integer hash of the data. - static Hash FNVHash(const char* data, int length = -1); - - /// Converts a character array in UTF-8 encoding to a vector of words. The UCS-2 words will be encoded as - /// either big- or little-endian, depending on the host processor. - /// @param[in] input Input string in UTF-8 encoding. - /// @param[out] output Output vector of UCS-2 characters. - /// @return True if the conversion went successfully, false if any characters had to be skipped (this will occur if they can't fit into UCS-2). - static bool UTF8toUCS2(const String& input, std::vector< word >& output); - /// Converts a vector of words in UCS-2 encoding into a character array in UTF-8 encoding. This - /// function assumes the endianness of the input words to be the same as the host processor. - /// @param[in] input Input vector in UCS-2 encoding. - /// @param[out] output Output string in UTF-8 encoding. - /// @return True if the conversion went successfully, false if not. - static bool UCS2toUTF8(const std::vector< word >& input, String& output); - /// Converts an array of words in UCS-2 encoding into a character array in UTF-8 encoding. This - /// function assumes the endianness of the input words to be the same as the host processor. - /// @param[in] input Input array of words in UCS-2 encoding. - /// @param[in] input_size Length of the input array. - /// @param[out] output Output string in UTF-8 encoding. - /// @return True if the conversion went successfully, false if not. - static bool UCS2toUTF8(const word* input, size_t input_size, String& output); - - /// Checks if a given value is a whitespace character. - /// @param[in] x The character to evaluate. - /// @return True if the character is whitespace, false otherwise. - template < typename CharacterType > - static bool IsWhitespace(CharacterType x) - { - return (x == '\r' || x == '\n' || x == ' ' || x == '\t'); - } - - /// Strip whitespace characters from the beginning and end of a string. - /// @param[in] string The string to trim. - /// @return The stripped string. - static String StripWhitespace(const String& string); - - /// Operator for STL containers using strings. - struct ROCKETCORE_API StringComparei - { - bool operator()(const String& lhs, const String& rhs) const; - }; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/StyleSheet.h b/libs/libRocket/Include/Rocket/Core/StyleSheet.h deleted file mode 100644 index ea3987daf9e..00000000000 --- a/libs/libRocket/Include/Rocket/Core/StyleSheet.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEET_H -#define ROCKETCORESTYLESHEET_H - -#include "Dictionary.h" -#include "ReferenceCountable.h" -#include -#include "PropertyDictionary.h" - -namespace Rocket { -namespace Core { - -class Element; -class ElementDefinition; -class StyleSheetNode; - -/** - StyleSheet maintains a single stylesheet definition. A stylesheet can be combined with another stylesheet to create - a new, merged stylesheet. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API StyleSheet : public ReferenceCountable -{ -public: - typedef std::set< StyleSheetNode* > NodeList; - typedef std::map< String, NodeList > NodeIndex; - - StyleSheet(); - virtual ~StyleSheet(); - - /// Loads a style from a CSS definition. - bool LoadStyleSheet(Stream* stream); - - /// Combines this style sheet with another one, producing a new sheet. - StyleSheet* CombineStyleSheet(const StyleSheet* sheet) const; - /// Builds the node index for a combined style sheet. - void BuildNodeIndex(); - - /// Returns the compiled element definition for a given element hierarchy. A reference count will be added for the - /// caller, so another should not be added. The definition should be released by removing the reference count. - ElementDefinition* GetElementDefinition(const Element* element) const; - -protected: - /// Destroys the style sheet. - virtual void OnReferenceDeactivate(); - -private: - // Root level node, attributes from special nodes like "body" get added to this node - StyleSheetNode* root; - - // The maximum specificity offset used in this style sheet to distinguish between properties in - // similarly-specific rules, but declared on different lines. When style sheets are merged, the - // more-specific style sheet (ie, coming further 'down' the include path) adds the offset of - // the less-specific style sheet onto its offset, thereby ensuring its properties take - // precedence in the event of a conflict. - int specificity_offset; - - // Map of only nodes with actual style information. - NodeIndex styled_node_index; - // Map of every node, even empty, un-styled, nodes. - NodeIndex complete_node_index; - - typedef std::map< String, ElementDefinition* > ElementDefinitionCache; - // Index of element addresses to element definitions. - mutable ElementDefinitionCache address_cache; - // Index of node sets to element definitions. - mutable ElementDefinitionCache node_cache; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/StyleSheetKeywords.h b/libs/libRocket/Include/Rocket/Core/StyleSheetKeywords.h deleted file mode 100644 index 68c61236aef..00000000000 --- a/libs/libRocket/Include/Rocket/Core/StyleSheetKeywords.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETKEYWORDS_H -#define ROCKETCORESTYLESHEETKEYWORDS_H - -namespace Rocket { -namespace Core { - -const int POSITION_STATIC = 0; -const int POSITION_RELATIVE = 1; -const int POSITION_ABSOLUTE = 2; -const int POSITION_FIXED = 3; - -const int FLOAT_NONE = 0; -const int FLOAT_LEFT = 1; -const int FLOAT_RIGHT = 2; - -const int CLEAR_NONE = 0; -const int CLEAR_LEFT = 1; -const int CLEAR_RIGHT = 2; -const int CLEAR_BOTH = 3; - -const int DISPLAY_NONE = 0; -const int DISPLAY_BLOCK = 1; -const int DISPLAY_INLINE = 2; -const int DISPLAY_INLINE_BLOCK = 3; - -const int VISIBILITY_VISIBLE = 0; -const int VISIBILITY_HIDDEN = 1; - -const int OVERFLOW_VISIBLE = 0; -const int OVERFLOW_HIDDEN = 1; -const int OVERFLOW_AUTO = 2; -const int OVERFLOW_SCROLL = 3; - -const int CLIP_AUTO = 0; -const int CLIP_NONE = 1; - -const int FONT_STYLE_NORMAL = 0; -const int FONT_STYLE_ITALIC = 1; - -const int FONT_WEIGHT_NORMAL = 0; -const int FONT_WEIGHT_BOLD = 1; - -const int TEXT_ALIGN_LEFT = 0; -const int TEXT_ALIGN_RIGHT = 1; -const int TEXT_ALIGN_CENTER = 2; -const int TEXT_ALIGN_JUSTIFY = 3; - -const int TEXT_DECORATION_NONE = 0; -const int TEXT_DECORATION_UNDERLINE = 1; -const int TEXT_DECORATION_OVERLINE = 2; -const int TEXT_DECORATION_LINE_THROUGH = 3; - -const int TEXT_TRANSFORM_NONE = 0; -const int TEXT_TRANSFORM_CAPITALIZE = 1; -const int TEXT_TRANSFORM_UPPERCASE = 2; -const int TEXT_TRANSFORM_LOWERCASE = 3; - -const int WHITE_SPACE_NORMAL = 0; -const int WHITE_SPACE_PRE = 1; -const int WHITE_SPACE_NOWRAP = 2; -const int WHITE_SPACE_PRE_WRAP = 3; -const int WHITE_SPACE_PRE_LINE = 4; - -const int VERTICAL_ALIGN_BASELINE = 0; -const int VERTICAL_ALIGN_MIDDLE = 1; -const int VERTICAL_ALIGN_SUB = 2; -const int VERTICAL_ALIGN_SUPER = 3; -const int VERTICAL_ALIGN_TEXT_TOP = 4; -const int VERTICAL_ALIGN_TEXT_BOTTOM = 5; -const int VERTICAL_ALIGN_TOP = 6; -const int VERTICAL_ALIGN_BOTTOM = 7; - -const int Z_INDEX_AUTO = 0; -const int Z_INDEX_TOP = 1; -const int Z_INDEX_BOTTOM = 2; - -const int DRAG_NONE = 0; -const int DRAG_DRAG = 1; -const int DRAG_DRAG_DROP = 2; -const int DRAG_BLOCK = 3; -const int DRAG_CLONE = 4; - -const int TAB_INDEX_NONE = 0; -const int TAB_INDEX_AUTO = 1; - -const int FOCUS_NONE = 0; -const int FOCUS_AUTO = 1; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/StyleSheetSpecification.h b/libs/libRocket/Include/Rocket/Core/StyleSheetSpecification.h deleted file mode 100644 index 5f870f746e7..00000000000 --- a/libs/libRocket/Include/Rocket/Core/StyleSheetSpecification.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETSPECIFICATION_H -#define ROCKETCORESTYLESHEETSPECIFICATION_H - -#include "Header.h" -#include "PropertySpecification.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - -class PropertyParser; - -/** - @author Peter Curry - */ - -class ROCKETCORE_API StyleSheetSpecification -{ -public: - /// Starts up the specification structure and registers default properties and type parsers. - /// @return True if the specification started up successfully, false if not. - static bool Initialise(); - /// Destroys the specification structure and releases the parsers. - static void Shutdown(); - - /// Registers a parser for use in property definitions. - /// @param[in] parser_name The name to register the new parser under. - /// @param[in] parser The parser to register. This parser will be released by the specification. - /// @return True if the parser was registered successfully, false otherwise. - static bool RegisterParser(const String& parser_name, PropertyParser* parser); - /// Returns the parser registered with a specific name. - /// @param[in] parser_name The name of the desired parser. - /// @return The parser registered under the given name, or NULL if no such parser exists. - static PropertyParser* GetParser(const String& parser_name); - - /// Registers a property with a new definition. - /// @param[in] property_name The name to register the new property under. - /// @param[in] default_value The default value to be used for an element if it has no other definition provided. - /// @param[in] inherited True if this property is inherited from parent to child, false otherwise. - /// @param[in] forces_layout True if a change in this property on an element will cause the element's layout to possibly change. - /// @return The new property definition, ready to have parsers attached. - static PropertyDefinition& RegisterProperty(const String& property_name, const String& default_value, bool inherited, bool forces_layout = false); - /// Returns a property definition. - /// @param[in] property_name The name of the desired property. - /// @return The appropriate property definition if it could be found, NULL otherwise. - static const PropertyDefinition* GetProperty(const String& property_name); - - /// Returns the list of the names of all registered property definitions. - /// @return The list with stored property names. - static const PropertyNameList & GetRegisteredProperties(); - - /// Returns the list of the names of all registered inherited property definitions. - /// @return The list with stored property names. - static const PropertyNameList & GetRegisteredInheritedProperties(); - - /// Registers a shorthand property definition. - /// @param[in] shorthand_name The name to register the new shorthand property under. - /// @param[in] properties A comma-separated list of the properties this definition is shorthand for. The order in which they are specified here is the order in which the values will be processed. - /// @param[in] type The type of shorthand to declare. - /// @param True if all the property names exist, false otherwise. - static bool RegisterShorthand(const String& shorthand_name, const String& property_names, PropertySpecification::ShorthandType type = PropertySpecification::AUTO); - /// Returns a shorthand definition. - /// @param[in] shorthand_name The name of the desired shorthand. - /// @return The appropriate shorthand definition if it could be found, NULL otherwise. - static const PropertyShorthandDefinition* GetShorthand(const String& shorthand_name); - - /// Parses a property declaration, setting any parsed and validated properties on the given dictionary. - /// @param[in] dictionary The property dictionary which will hold all declared properties. - /// @param[in] property_name The name of the declared property. - /// @param[in] property_value The values the property is being set to. - /// @param[in] source_file The file where this property was declared. Used for error reporting, debugging and relative paths for referenced assets. - /// @param[in] line_number The location of the source file where this property was declared. Used for error reporting and debugging. - /// @return True if all properties were parsed successfully, false otherwise. - static bool ParsePropertyDeclaration(PropertyDictionary& dictionary, const String& property_name, const String& property_value, const String& source_file = "", int source_line_number = 0); - -private: - StyleSheetSpecification(); - ~StyleSheetSpecification(); - - // Registers Rocket's default parsers. - void RegisterDefaultParsers(); - // Registers Rocket's default style properties. - void RegisterDefaultProperties(); - - // Parsers used by all property definitions. - typedef std::map< String, PropertyParser* > ParserMap; - ParserMap parsers; - - // The properties defined in the style sheet specification. - PropertySpecification properties; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/SystemInterface.h b/libs/libRocket/Include/Rocket/Core/SystemInterface.h deleted file mode 100644 index e6f9893b0cd..00000000000 --- a/libs/libRocket/Include/Rocket/Core/SystemInterface.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESYSTEMINTERFACE_H -#define ROCKETCORESYSTEMINTERFACE_H - -#include "Log.h" -#include "ReferenceCountable.h" -#include "String.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -/** - libRocket's System Interface. - - This class provides interfaces for Time, Translation and Logging. - - Time is the only required implementation. - - The default implemention of Translation doesn't translate anything - - The default implementation of logging logs Windows Debug Console, - or Standard Error, depending on what platform you're using. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API SystemInterface : public ReferenceCountable -{ -public: - SystemInterface(); - virtual ~SystemInterface(); - - /// Get the number of seconds elapsed since the start of the application. - /// @return Elapsed time, in seconds. - virtual float GetElapsedTime() = 0; - - /// Translate the input string into the translated string. - /// @param[out] translated Translated string ready for display. - /// @param[in] input String as received from XML. - /// @return Number of translations that occured. - virtual int TranslateString(String& translated, const String& input); - - /// Joins the path of an RML or RCSS file with the path of a resource specified within the file. - /// @param[out] translated_path The joined path. - /// @param[in] document_path The path of the source document (including the file name). - /// @param[in] path The path of the resource specified in the document. - virtual void JoinPath(String& translated_path, const String& document_path, const String& path); - - /// Log the specified message. - /// @param[in] type Type of log message, ERROR, WARNING, etc. - /// @param[in] message Message to log. - /// @return True to continue execution, false to break into the debugger. - virtual bool LogMessage(Log::Type type, const String& message); - - /// Activate keyboard (for touchscreen devices) - virtual void ActivateKeyboard(); - - /// Deactivate keyboard (for touchscreen devices) - virtual void DeactivateKeyboard(); - - /// Called when this system interface is no longer required. - virtual void Release(); - -protected: - virtual void OnReferenceDeactivate(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Texture.h b/libs/libRocket/Include/Rocket/Core/Texture.h deleted file mode 100644 index 701b2a0906a..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Texture.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORETEXTURE_H -#define ROCKETCORETEXTURE_H - -#include "Header.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - -class TextureResource; -class RenderInterface; - -/** - Abstraction of a two-dimensional texture image, with an application-specific texture handle. - - @author Peter Curry - */ - -struct ROCKETCORE_API Texture -{ -public: - /// Constructs an unloaded texture with no resource. - Texture(); - /// Constructs a texture sharing the resource of another. - Texture(const Texture&); - ~Texture(); - - /// Attempts to load a texture. - /// @param[in] source The name of the texture. - /// @param[in] source_path The path of the resource that is requesting the texture (ie, the RCSS file in which it was specified, etc). - /// @return True if the texture loaded successfully, false if not. - bool Load(const String& source, const String& source_path = ""); - - /// Returns the texture's source name. This is usually the name of the file the texture was loaded from. - /// @return The name of the this texture's source. This will be the empty string if this texture is not loaded. - String GetSource() const; - /// Returns the texture's handle. - /// @param[in] The render interface that is requesting the handle. - /// @return The texture's handle. This will be NULL if the texture isn't loaded. - TextureHandle GetHandle(RenderInterface* render_interface) const; - /// Returns the texture's dimensions. - /// @param[in] The render interface that is requesting the dimensions. - /// @return The texture's dimensions. This will be (0, 0) if the texture isn't loaded. - Vector2i GetDimensions(RenderInterface* render_interface) const; - - /// Releases this texture's resource (if any), and sets it to another texture's resource. - const Texture& operator=(const Texture&); - -private: - TextureResource* resource; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/TypeConverter.h b/libs/libRocket/Include/Rocket/Core/TypeConverter.h deleted file mode 100644 index 35cbf8e7983..00000000000 --- a/libs/libRocket/Include/Rocket/Core/TypeConverter.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORETYPECONVERTER_H -#define ROCKETCORETYPECONVERTER_H - -#include "Types.h" -#include "Log.h" -#include "Stream.h" -#include "StringUtilities.h" -#include -#include -#include - -namespace Rocket { -namespace Core { - -/** - Templatised TypeConverters with Template Specialisation. - - These converters convert from source types to destination types. - They're mainly useful in things like dictionaries and serialisers. - - @author Lloyd Weehuizen - */ - -template -class TypeConverter -{ -public: - static bool Convert(const SourceType& src, DestType& dest); -}; - -#include "TypeConverter.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/TypeConverter.inl b/libs/libRocket/Include/Rocket/Core/TypeConverter.inl deleted file mode 100644 index 545e0ae00ce..00000000000 --- a/libs/libRocket/Include/Rocket/Core/TypeConverter.inl +++ /dev/null @@ -1,382 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -template -bool TypeConverter::Convert(const SourceType& /*src*/, DestType& /*dest*/) -{ - ROCKET_ERRORMSG("No converter specified."); - return false; -} - -/// -/// Partial specialisations at the top, as they full specialisations should be prefered. -/// -template< typename T > -class TypeConverter< T, Stream > -{ -public: - static bool Convert(const T& src, Stream* dest) - { - String string_dest; - bool result = TypeConverter< T, String >::Convert(src, string_dest); - if (result) - dest->Write(string_dest); - - return result; - } -}; - -template< typename T > -class TypeConverter< Stream, T > -{ -public: - static bool Convert(Stream* src, T& dest, size_t length = String::npos) - { - String string_src; - src->Read(string_src, src->Length() < length ? src->Length() : length); - return TypeConverter< String, T >::Convert(string_src, dest); - } -}; - -/// -/// Full Specialisations -/// - -#define BASIC_CONVERTER(s, d) \ -template<> \ -class TypeConverter< s, d > \ -{ \ -public: \ - static bool Convert(const s& src, d& dest) \ - { \ - dest = (d)src; \ - return true; \ - } \ -} - -#define BASIC_CONVERTER_BOOL(s, d) \ -template<> \ -class TypeConverter< s, d > \ -{ \ -public: \ - static bool Convert(const s& src, d& dest) \ - { \ - dest = src != 0; \ - return true; \ - } \ -} - -#define PASS_THROUGH(t) BASIC_CONVERTER(t, t) - -///////////////////////////////////////////////// -// Simple pass through definitions for converting -// to the same type (direct copy) -///////////////////////////////////////////////// -PASS_THROUGH(int); -PASS_THROUGH(unsigned int); -PASS_THROUGH(float); -PASS_THROUGH(bool); -PASS_THROUGH(char); -PASS_THROUGH(word); -PASS_THROUGH(Vector2i); -PASS_THROUGH(Vector2f); -PASS_THROUGH(Colourf); -PASS_THROUGH(Colourb); -PASS_THROUGH(String); - -// Pointer types need to be typedef'd -class ScriptInterface; -typedef ScriptInterface* ScriptInterfacePtr; -PASS_THROUGH(ScriptInterfacePtr); -typedef void* voidPtr; -PASS_THROUGH(voidPtr); - -template<> -class TypeConverter< Stream, Stream > -{ -public: - static bool Convert(Stream* src, Stream* dest) - { - return src->Write(dest, src->Length()) == src->Length(); - } -}; - -///////////////////////////////////////////////// -// Simple Types -///////////////////////////////////////////////// -BASIC_CONVERTER(bool, int); -BASIC_CONVERTER(bool, unsigned int); -BASIC_CONVERTER(bool, float); - -BASIC_CONVERTER(int, unsigned int); -BASIC_CONVERTER_BOOL(int, bool); -BASIC_CONVERTER(int, float); - -BASIC_CONVERTER_BOOL(float, bool); -BASIC_CONVERTER(float, int); -BASIC_CONVERTER(float, unsigned int); - -BASIC_CONVERTER(char, word); - -///////////////////////////////////////////////// -// From string converters -///////////////////////////////////////////////// - -#define STRING_FLOAT_CONVERTER(type) \ -template<> \ -class TypeConverter< String, type > \ -{ \ -public: \ - static bool Convert(const String& src, type& dest) \ - { \ - dest = (type) atof(src.CString()); \ - return true; \ - } \ -}; -STRING_FLOAT_CONVERTER(float); -STRING_FLOAT_CONVERTER(double); - -template<> -class TypeConverter< String, int > -{ -public: - static bool Convert(const String& src, int& dest) - { - return sscanf(src.CString(), "%d", &dest) == 1; - } -}; - -template<> -class TypeConverter< String, unsigned int > -{ -public: - static bool Convert(const String& src, unsigned int& dest) - { - return sscanf(src.CString(), "%u", &dest) == 1; - } -}; - -template<> -class TypeConverter< String, byte > -{ -public: - static bool Convert(const String& src, byte& dest) - { - int value; - bool ret = sscanf(src.CString(), "%d", &value) == 1; - dest = (byte) value; - return ret && (value <= 255); - } -}; - -template<> -class TypeConverter< String, bool > -{ -public: - static bool Convert(const String& src, bool& dest) - { - String lower = src.ToLower(); - if (lower == "1" || lower == "true") - { - dest = true; - return true; - } - else if (lower == "0" || lower == "false") - { - dest = false; - return true; - } - return false; - } -}; - -template<> -class TypeConverter< String, URL > -{ -public: - static bool Convert(const String& src, URL& dest) - { - return dest.SetURL(src); - } -}; - -template< typename DestType, typename InternalType, int count > -class TypeConverterStringVector -{ -public: - static bool Convert(const String& src, DestType& dest) - { - StringList string_list; - StringUtilities::ExpandString(string_list, src); - if (string_list.size() < count) - return false; - for (int i = 0; i < count; i++) - { - if (!TypeConverter< String, InternalType >::Convert(string_list[i], dest[i])) - return false; - } - return true; - } -}; - -#define STRING_VECTOR_CONVERTER(type, internal_type, count) \ -template<> \ -class TypeConverter< String, type > \ -{ \ -public: \ - static bool Convert(const String& src, type& dest) \ - { \ - return TypeConverterStringVector< type, internal_type, count >::Convert(src, dest); \ - } \ -} - -STRING_VECTOR_CONVERTER(Vector2i, int, 2); -STRING_VECTOR_CONVERTER(Vector2f, float, 2); -STRING_VECTOR_CONVERTER(Colourf, float, 4); -STRING_VECTOR_CONVERTER(Colourb, byte, 4); - -///////////////////////////////////////////////// -// To String Converters -///////////////////////////////////////////////// - -#define FLOAT_STRING_CONVERTER(type) \ -template<> \ -class TypeConverter< type, String > \ -{ \ -public: \ - static bool Convert(const type& src, String& dest) \ - { \ - return dest.FormatString(32, "%.4f", src) > 0; \ - } \ -}; -FLOAT_STRING_CONVERTER(float); -FLOAT_STRING_CONVERTER(double); - -template<> -class TypeConverter< int, String > -{ -public: - static bool Convert(const int& src, String& dest) - { - return dest.FormatString(32, "%d", src) > 0; - } -}; - -template<> -class TypeConverter< unsigned int, String > -{ -public: - static bool Convert(const unsigned int& src, String& dest) - { - return dest.FormatString(32, "%u", src) > 0; - } -}; - -template<> -class TypeConverter< byte, String > -{ -public: - static bool Convert(const byte& src, String& dest) - { - return dest.FormatString(32, "%u", src) > 0; - } -}; - -template<> -class TypeConverter< bool, String > -{ -public: - static bool Convert(const bool& src, String& dest) - { - dest = src ? "1" : "0"; - return true; - } -}; - -template<> -class TypeConverter< char*, String > -{ -public: - static bool Convert(char* const & src, String& dest) - { - dest = src; - return true; - } -}; - -template<> -class TypeConverter< URL, String > -{ -public: - static bool Convert(const URL& src, String& dest) - { - dest = src.GetURL(); - return true; - } -}; - -template< typename SourceType, typename InternalType, int count > -class TypeConverterVectorString -{ -public: - static bool Convert(const SourceType& src, String& dest) - { - dest = ""; - for (int i = 0; i < count; i++) - { - String value; - if (!TypeConverter< InternalType, String >::Convert(src[i], value)) - return false; - - dest += value; - if (i < count - 1) - dest += ", "; - } - return true; - } -}; - -#define VECTOR_STRING_CONVERTER(type, internal_type, count) \ -template<> \ -class TypeConverter< type, String > \ -{ \ -public: \ - static bool Convert(const type& src, String& dest) \ - { \ - return TypeConverterVectorString< type, internal_type, count >::Convert(src, dest); \ - } \ -} - -VECTOR_STRING_CONVERTER(Vector2i, int, 2); -VECTOR_STRING_CONVERTER(Vector2f, float, 2); -VECTOR_STRING_CONVERTER(Colourf, float, 4); -VECTOR_STRING_CONVERTER(Colourb, byte, 4); -#undef PASS_THROUGH -#undef BASIC_CONVERTER -#undef BASIC_CONVERTER_BOOL -#undef STRING_VECTOR_CONVERTER -#undef VECTOR_STRING_CONVERTER diff --git a/libs/libRocket/Include/Rocket/Core/Types.h b/libs/libRocket/Include/Rocket/Core/Types.h deleted file mode 100644 index 1a2abd91453..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Types.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORETYPES_H -#define ROCKETCORETYPES_H - -// Define NULL as zero. -#if !defined NULL -#define NULL 0 -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "Platform.h" -#include "Debug.h" - -namespace Rocket { -namespace Core { - -// Define commonly used basic types. -typedef unsigned char byte; -typedef unsigned short word; -typedef double Time; -typedef float TimeDelta; -typedef unsigned int Hash; -typedef void* ScriptObject; - -} -} - -#ifdef ROCKET_PLATFORM_WIN32 -typedef unsigned __int64 uint64_t; -#else -#include -#endif - -#include "Colour.h" -#include "Vector2.h" -#include "String.h" - -namespace Rocket { -namespace Core { - -// Default colour types. -typedef Colour< float, 1 > Colourf; -typedef Colour< byte, 255 > Colourb; -typedef Vector2< float > Vector2f; -typedef Vector2< int > Vector2i; - - -class Element; -class Dictionary; - -// Types for external interfaces. -typedef uintptr_t FileHandle; -typedef uintptr_t TextureHandle; -typedef uintptr_t CompiledGeometryHandle; -typedef uintptr_t DecoratorDataHandle; - -// List of elements. -typedef std::vector< Element* > ElementList; -typedef std::set< String > PseudoClassList; -typedef std::set< String > PropertyNameList; -typedef std::set< String > AttributeNameList; -typedef Dictionary ElementAttributes; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/URL.h b/libs/libRocket/Include/Rocket/Core/URL.h deleted file mode 100644 index daf89a36ec6..00000000000 --- a/libs/libRocket/Include/Rocket/Core/URL.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREURL_H -#define ROCKETCOREURL_H - -#include "Header.h" -#include "String.h" -#include - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class ROCKETCORE_API URL -{ -public: - /// Constructs an empty URL. - URL(); - /// Constructs a new URL from the given string. - URL(const String& url); - /// Constructs a new URL from the given string. A little more scripting - /// engine friendly. - URL(const char* url); - /// Destroys the URL. - ~URL(); - - /// Assigns a new URL to the object. This will return false if the URL - /// is malformed. - bool SetURL(const String& url); - /// Returns the entire URL. - const String& GetURL() const; - - /// Sets the URL's protocol. - bool SetProtocol(const String& protocol); - /// Returns the protocol this URL is utilising. - const String& GetProtocol() const; - - /// Sets the URL's login - bool SetLogin( const String& login ); - /// Returns the URL's login - const String& GetLogin() const; - - /// Sets the URL's password - bool SetPassword( const String& password ); - /// Returns the URL's password - const String& GetPassword() const; - - /// Sets the URL's host. - bool SetHost(const String& host); - /// Returns the URL's host. - const String& GetHost() const; - - /// Sets the URL's port number. - bool SetPort(int port); - /// Returns the URL's port number. - int GetPort() const; - - /// Sets the URL's path. - bool SetPath(const String& path); - /// Prefixes the URL's existing path with the given prefix. - bool PrefixPath(const String& prefix); - /// Returns the URL's path. - const String& GetPath() const; - - /// Sets the URL's file name. - bool SetFileName(const String& file_name); - /// Returns the URL's file name. - const String& GetFileName() const; - - /// Sets the URL's file extension. - bool SetExtension(const String& extension); - /// Returns the URL's file extension. - const String& GetExtension() const; - - /// Access the url parameters - typedef std::map< String, String > Parameters; - const Parameters& GetParameters() const; - void SetParameter(const String& name, const String& value); - void SetParameters( const Parameters& parameters ); - void ClearParameters(); - - /// Returns the URL's path, file name and extension. - String GetPathedFileName() const; - /// Builds and returns a url query string ( key=value&key2=value2 ) - String GetQueryString() const; - - /// Less-than operator for use as a key in STL containers. - bool operator<(const URL& rhs) const; - - /// Since URLs often contain characters outside the ASCII set, - /// the URL has to be converted into a valid ASCII format and back. - static String UrlEncode(const String &value); - static String UrlDecode(const String &value); - -private: - void ConstructURL() const; - - /// Portable character check (remember EBCDIC). Do not use isalnum() because - /// its behavior is altered by the current locale. - /// See http://tools.ietf.org/html/rfc3986#section-2.3 - /// (copied from libcurl sources) - static bool IsUnreservedChar(const char c); - - mutable String url; - String protocol; - String login; - String password; - String host; - String path; - String file_name; - String extension; - - Parameters parameters; - - int port; - mutable int url_dirty; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/UnicodeRange.h b/libs/libRocket/Include/Rocket/Core/UnicodeRange.h deleted file mode 100644 index b06111d22ac..00000000000 --- a/libs/libRocket/Include/Rocket/Core/UnicodeRange.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREUNICODERANGE_H -#define ROCKETCOREUNICODERANGE_H - -namespace Rocket { -namespace Core { - -class UnicodeRange; -typedef std::vector< UnicodeRange > UnicodeRangeList; - -/** - */ - -class UnicodeRange -{ -public: - UnicodeRange(); - UnicodeRange(int min_codepoint, int max_codepoint); - - /// Initialises the range from a unicode range in string form. - /// @param[in] unicode_range The string specified the unicode range. - /// @return True if the range is valid, false otherwise. - bool Initialise(const String& unicode_range); - - /// Builds up a list of unicode ranges from a comma-separated list of unicode ranges in string form. - /// @param[out] list The returned list. - /// @param[in] unicode_range The comma-separated list of unicode ranges. - /// @return True if all values were parsed successfully and at least one value is returned in the list, false otherwise. - static bool BuildList(UnicodeRangeList& list, const String& unicode_range); - - /// Returns true if this range is wholly contained within another range. - /// @param[in] rhs The range to check against. - bool IsContained(const UnicodeRange& rhs); - /// Returns true if this range is wholly contained within another range list. - /// @param[in] rhs The range list to check against. - bool IsContained(const UnicodeRangeList& rhs); - - /// Returns true if this range is contained or contiguous with another range. - /// @param[in] rhs The range to check against. - /// @return True if the ranges are contiguous, false otherwise. - bool IsContiguous(const UnicodeRange& rhs); - /// Joins this range with another that it is contiguous with. - /// @param[in] rhs The range to join with this range. - /// @return The new, joined, range containing both the original ranges. - UnicodeRange Join(const UnicodeRange& rhs); - - unsigned int min_codepoint; - unsigned int max_codepoint; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Variant.h b/libs/libRocket/Include/Rocket/Core/Variant.h deleted file mode 100644 index 3da6a69f851..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Variant.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETVARIANT_H -#define ROCKETVARIANT_H - -#include "Header.h" -#include "Types.h" -#include "TypeConverter.h" -#include - -namespace Rocket { -namespace Core { - -/** - Variant is a container that can store a selection of basic types. The variant will store the - value in the native form corresponding to the version of Set that was called. - - Get is templated to convert from the stored form to the requested form by using a TypeConverter. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API Variant -{ -public: - Variant(); - /// Templatised constructors don't work for the copy constructor, so we have to define it - /// explicitly. - Variant(const Variant&); - /// Constructs a variant with internal data. - /// @param[in] t Data of a supported type to set on the variant. - template< typename T > - Variant(const T& t); - - ~Variant(); - - /// Type of data stored in the variant. - enum Type - { - NONE = '-', - BYTE = 'b', - CHAR = 'c', - FLOAT = 'f', - INT = 'i', - STRING = 's', - WORD = 'w', - VECTOR2 = '2', - COLOURF = 'g', - COLOURB = 'h', - SCRIPTINTERFACE = 'p', - VOIDPTR = '*', - }; - - /// Clears the data structure stored by the variant. - void Clear(); - - /// Gets the current internal representation type. - /// @return The type of data stored in the variant internally. - Type GetType() const; - - /// Shares another variant's data with this variant. - /// @param[in] copy Variant to share data. - void Set(const Variant& copy); - /// Sets a byte value on this variant. - /// @param[in] value New value to set. - void Set(const byte value); - /// Sets a signed char value on this variant. - /// @param[in] value New value to set. - void Set(const char value); - /// Sets a float value on this variant. - /// @param[in] value New value to set. - void Set(const float value); - /// Sets a signed int value on this variant. - /// @param[in] value New value to set. - void Set(const int value); - /// Sets a word value on this variant. - /// @param[in] value New value to set. - void Set(const word value); - /// Sets a constant C string value on this variant. - /// @param[in] value New value to set. - void Set(const char* value); - /// Sets a generic void* value on this variant. - /// @param[in] value New value to set. - void Set(void* value); - /// Sets an EMP string value on this variant. - /// @param[in] value New value to set. - void Set(const String& value); - /// Sets a Vector2f value on this variant. - /// @param[in] value New value to set. - void Set(const Vector2f& value); - /// Sets a Colourf value on this variant. - /// @param[in] value New value to set. - void Set(const Colourf& value); - /// Sets a Colourb value on this variant. - /// @param[in] value New value to set. - void Set(const Colourb& value); - /// Sets a script object value on this variant. - /// @param[in] value New value to set. - void Set(ScriptInterface* value); - - /// Templatised data accessor. TypeConverters will be used to attempt to convert from the - /// internal representation to the requested representation. - /// @return Data in the requested type. - template< typename T > - T Get() const; - - /// Templatised data accessor. TypeConverters will be used to attempt to convert from the - /// internal representation to the requested representation. - /// @param[out] value Data in the requested type. - /// @return True if the value was converted and returned, false if no data was stored in the variant. - template< typename T > - bool GetInto(T& value) const; - - /// Assigns another variant's internal data to this variant. - /// @param[in] copy Variant to share data. - Variant& operator=(const Variant& copy); - -private: - -#ifdef ROCKET_ARCH_64 - static const int LOCAL_DATA_SIZE = 40; // Required for Strings -#else - static const int LOCAL_DATA_SIZE = 24; -#endif - Type type; - char data[LOCAL_DATA_SIZE]; -}; - -#include "Variant.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Variant.inl b/libs/libRocket/Include/Rocket/Core/Variant.inl deleted file mode 100644 index 5f83ce70e54..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Variant.inl +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -// Constructs a variant with internal data. -template< typename T > -Variant::Variant(const T& t) : type(NONE) -{ - Set( t ); -} - -// Templatised data accessor. -template< typename T > -bool Variant::GetInto(T& value) const -{ - switch (type) - { - case BYTE: - return TypeConverter< byte, T >::Convert(*(byte*)data, value); - break; - - case CHAR: - return TypeConverter< char, T >::Convert(*(char*)data, value); - break; - - case FLOAT: - return TypeConverter< float, T >::Convert(*(float*)data, value); - break; - - case INT: - return TypeConverter< int, T >::Convert(*(int*)data, value); - break; - - case STRING: - return TypeConverter< String, T >::Convert(*(String*)data, value); - break; - - case WORD: - return TypeConverter< word, T >::Convert(*(word*)data, value); - break; - - case VECTOR2: - return TypeConverter< Vector2f, T >::Convert(*(Vector2f*)data, value); - break; - - case COLOURF: - return TypeConverter< Colourf, T >::Convert(*(Colourf*)data, value); - break; - - case COLOURB: - return TypeConverter< Colourb, T >::Convert(*(Colourb*)data, value); - break; - - case SCRIPTINTERFACE: - return TypeConverter< ScriptInterface*, T >::Convert(*(ScriptInterface**)data, value); - break; - - case VOIDPTR: - return TypeConverter< void*, T >::Convert(*(void**)data, value); - break; - - case NONE: - break; - - } - - return false; -} - -// Templatised data accessor. -template< typename T > -T Variant::Get() const -{ - T value; - GetInto(value); - return value; -} diff --git a/libs/libRocket/Include/Rocket/Core/Vector2.h b/libs/libRocket/Include/Rocket/Core/Vector2.h deleted file mode 100644 index 7a790c011c6..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Vector2.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREVECTOR2_H -#define ROCKETCOREVECTOR2_H - -#include "Debug.h" -#include "Math.h" - -namespace Rocket { -namespace Core { - -/** - Templated class for a generic two-component vector. - @author Peter Curry - */ - -template < typename Type > -class Vector2 -{ - public: - /// Lightweight, non-initialising constructor. - inline Vector2(); - /// Initialising constructor. - /// @param[in] x Initial x-value of the vector. - /// @param[in] y Initial y-value of the vector. - inline Vector2(Type x, Type y); - - /// Returns the magnitude of the vector. - /// @return The computed magnitude. - inline float Magnitude() const; - /// Returns the squared magnitude of the vector. - /// @return The computed squared magnitude. - inline Type SquaredMagnitude() const; - /// Generates a normalised vector from this vector. - /// @return The normalised vector. - inline Vector2 Normalise() const; - - /// Computes the dot-product between this vector and another. - /// @param[in] rhs The other vector to use in the dot-product. - /// @return The computed dot-product between the two vectors. - inline Type DotProduct(const Vector2& rhs) const; - - /// Returns this vector rotated around the origin. - /// @param[in] theta The angle to rotate by, in radians. - /// @return The rotated vector. - inline Vector2 Rotate(float theta) const; - - /// Returns the negation of this vector. - /// @return The negation of this vector. - inline Vector2 operator-() const; - - /// Returns the sum of this vector and another. - /// @param[in] rhs The vector to add this to. - /// @return The sum of the two vectors. - inline Vector2 operator+(const Vector2& rhs) const; - /// Returns the result of subtracting another vector from this vector. - /// @param[in] rhs The vector to subtract from this vector. - /// @return The result of the subtraction. - inline Vector2 operator-(const Vector2& rhs) const; - /// Returns the result of multiplying this vector by a scalar. - /// @param[in] rhs The scalar value to multiply by. - /// @return The result of the scale. - inline Vector2 operator*(Type rhs) const; - /// Returns the result of dividing this vector by a scalar. - /// @param[in] rhs The scalar value to divide by. - /// @return The result of the scale. - inline Vector2 operator/(Type rhs) const; - - /// Adds another vector to this in-place. - /// @param[in] rhs The vector to add. - /// @return This vector, post-operation. - inline Vector2& operator+=(const Vector2& rhs); - /// Subtracts another vector from this in-place. - /// @param[in] rhs The vector to subtract. - /// @return This vector, post-operation. - inline Vector2& operator-=(const Vector2& rhs); - /// Scales this vector in-place. - /// @param[in] rhs The value to scale this vector's components by. - /// @return This vector, post-operation. - inline Vector2& operator*=(const Type& rhs); - /// Scales this vector in-place by the inverse of a value. - /// @param[in] rhs The value to divide this vector's components by. - /// @return This vector, post-operation. - inline Vector2& operator/=(const Type& rhs); - - /// Equality operator. - /// @param[in] rhs The vector to compare this against. - /// @return True if the two vectors are equal, false otherwise. - inline bool operator==(const Vector2& rhs) const; - /// Inequality operator. - /// @param[in] rhs The vector to compare this against. - /// @return True if the two vectors are not equal, false otherwise. - inline bool operator!=(const Vector2& rhs) const; - - /// Auto-cast operator. - /// @return A pointer to the first value. - inline operator const Type*() const; - /// Constant auto-cast operator. - /// @return A constant pointer to the first value. - inline operator Type*(); - - // The components of the vector. - Type x; - Type y; -}; - -#include "Vector2.inl" - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/Vector2.inl b/libs/libRocket/Include/Rocket/Core/Vector2.inl deleted file mode 100644 index dbdc964a428..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Vector2.inl +++ /dev/null @@ -1,192 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -// Default constructor. -template < typename Type > -Vector2< Type >::Vector2() -{ -} - -// Initialising constructor. -template < typename Type > -Vector2< Type >::Vector2(Type _x, Type _y) -{ - x = _x; - y = _y; -} - -// Returns the magnitude of the vector. -template < typename Type > -float Vector2< Type >::Magnitude() const -{ - float squared_magnitude = (float) SquaredMagnitude(); - if (Math::IsZero(squared_magnitude)) - return 0; - - return Math::SquareRoot(squared_magnitude); -} - -// Returns the squared magnitude of the vector. -template < typename Type > -Type Vector2< Type >::SquaredMagnitude() const -{ - return x * x + - y * y; -} - -// Generates a normalised vector from this vector. -template < typename Type > -Vector2< Type > Vector2< Type >::Normalise() const -{ - float magnitude = Magnitude(); - if (Math::IsZero(magnitude)) - return *this; - - return *this / magnitude; -} - -// Computes the dot-product between this vector and another. -template < typename Type > -Type Vector2< Type >::DotProduct(const Vector2< Type >& rhs) const -{ - return x * rhs.x + - y * rhs.y; -} - -// Returns this vector rotated around the origin. -template < typename Type > -Vector2< Type > Vector2< Type >::Rotate(float theta) const -{ - float cos_theta = Math::Cos(theta); - float sin_theta = Math::Sin(theta); - - return Vector2< Type >(((Type)(cos_theta * x - sin_theta * y)), - ((Type)(sin_theta * x + cos_theta * y))); -} - -// Returns the negation of this vector. -template < typename Type > -Vector2< Type > Vector2< Type >::operator-() const -{ - return Vector2(-x, -y); -} - -// Returns the sum of this vector and another. -template < typename Type > -Vector2< Type > Vector2< Type >::operator+(const Vector2< Type >& rhs) const -{ - return Vector2< Type >(x + rhs.x, y + rhs.y); -} - -// Returns the result of subtracting another vector from this vector. -template < typename Type > -Vector2< Type > Vector2< Type >::operator-(const Vector2< Type >& rhs) const -{ - return Vector2(x - rhs.x, y - rhs.y); -} - -// Returns the result of multiplying this vector by a scalar. -template < typename Type > -Vector2< Type > Vector2< Type >::operator*(Type rhs) const -{ - return Vector2(x * rhs, y * rhs); -} - -// Returns the result of dividing this vector by a scalar. -template < typename Type > -Vector2< Type > Vector2< Type >::operator/(Type rhs) const -{ - return Vector2(x / rhs, y / rhs); -} - -// Adds another vector to this in-place. -template < typename Type > -Vector2< Type >& Vector2< Type >::operator+=(const Vector2& rhs) -{ - x += rhs.x; - y += rhs.y; - - return *this; -} - -// Subtracts another vector from this in-place. -template < typename Type > -Vector2< Type >& Vector2< Type >::operator-=(const Vector2& rhs) -{ - x -= rhs.x; - y -= rhs.y; - - return *this; -} - -// Scales this vector in-place. -template < typename Type > -Vector2< Type >& Vector2< Type >::operator*=(const Type& rhs) -{ - x *= rhs; - y *= rhs; - - return *this; -} - -// Scales this vector in-place by the inverse of a value. -template < typename Type > -Vector2< Type >& Vector2< Type >::operator/=(const Type& rhs) -{ - x /= rhs; - y /= rhs; - - return *this; -} - -// Equality operator. -template < typename Type > -bool Vector2< Type >::operator==(const Vector2& rhs) const -{ - return (x == rhs.x && y == rhs.y); -} - -// Inequality operator. -template < typename Type > -bool Vector2< Type >::operator!=(const Vector2& rhs) const -{ - return (x != rhs.x || y != rhs.y); -} - -// Auto-cast operator. -template < typename Type > -Vector2< Type >::operator const Type*() const -{ - return &x; -} - -// Constant auto-cast operator. -template < typename Type > -Vector2< Type >::operator Type*() -{ - return &x; -} diff --git a/libs/libRocket/Include/Rocket/Core/Vertex.h b/libs/libRocket/Include/Rocket/Core/Vertex.h deleted file mode 100644 index 626f7f681bc..00000000000 --- a/libs/libRocket/Include/Rocket/Core/Vertex.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREVERTEX_H -#define ROCKETCOREVERTEX_H - -#include "Header.h" -#include "Types.h" - -namespace Rocket { -namespace Core { - -/** - The element that makes up all geometry sent to the renderer. - - @author Peter Curry - */ - -struct ROCKETCORE_API Vertex -{ - /// Two-dimensional position of the vertex (usually in pixels). - Vector2f position; - /// RGBA-ordered 8-bit / channel colour. - Colourb colour; - /// Texture coordinate for any associated texture. - Vector2f tex_coord; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/WString.h b/libs/libRocket/Include/Rocket/Core/WString.h deleted file mode 100644 index 106ff4e9c73..00000000000 --- a/libs/libRocket/Include/Rocket/Core/WString.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREWSTRING_H -#define ROCKETCOREWSTRING_H - -#include "Types.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -typedef StringBase< word > WStringBase; - -/** - Stores a string of characters encoded in UCS-2 format (UTF-16 without support for supplementary characters). - - @author Peter Curry - */ - -class ROCKETCORE_API WString : public WStringBase -{ -public: - /// Constructs an empty string. - WString(); - - /// Constructs a string as a copy of another UCS-2 string. - WString(const WStringBase& ucs2_string); - /// Constructs a string from a sequence of UCS-2 encoded characters. - WString(const word* ucs2_string_begin, const word* ucs2_string_end); - /// Constructs a string from multiples of a UCS-2 encoded character. - WString(WStringBase::size_type count, word ucs2_char); - - /// Constructs a string from a null-terminated sequence of UTF-8 encoded characters. - WString(const char* utf8_string); - /// Constructs a string from a sequence of UTF-8 encoded characters. - WString(const char* utf8_string_begin, const char* utf8_string_end); - /// Constructs a string from a sequence of UTF-8 encoded characters. - WString(const String& utf8_string); - - /// Destroys the string. - ~WString(); - - /// Converts the string to UTF-8 encoding. - String& ToUTF8(String& utf8_string, bool append = false) const; - - /// Assigns a UCS-2 string to this string. - WString& operator=(const WStringBase& string); - /// Assigns a UCS-2 string to this string. - WString& operator=(const WString& string); - /// Assigns a null-terminated UCS-2 string to this string. - WString& operator=(const word* string); - /// Converts a UTF-8 encoded string into UCS-2 and assigns it to this string. - WString& operator=(const char* string); - - /// Checks equality between two UCS-2 encoded strings. - bool operator==(const WString& string) const; - /// Checks equality between this string and another string in UTF-8 encoding. - bool operator==(const char* string) const; - - WStringBase::size_type Find(const WString& s, WStringBase::size_type pos = WStringBase::npos) const; - WStringBase::size_type Find(const word* s, WStringBase::size_type pos = WStringBase::npos) const; - WStringBase::size_type Find(const word& s, WStringBase::size_type pos = WStringBase::npos) const; - - word& operator[](WStringBase::size_type offset); - word operator[](WStringBase::size_type offset) const; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/XMLNodeHandler.h b/libs/libRocket/Include/Rocket/Core/XMLNodeHandler.h deleted file mode 100644 index 4919730cbf4..00000000000 --- a/libs/libRocket/Include/Rocket/Core/XMLNodeHandler.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREXMLNODEHANDLER_H -#define ROCKETCOREXMLNODEHANDLER_H - -#include "ReferenceCountable.h" -#include "XMLParser.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Element; -class XMLParser; - -/** - A handler gets ElementStart, ElementEnd and ElementData called by the XMLParser. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API XMLNodeHandler : public ReferenceCountable -{ -public: - virtual ~XMLNodeHandler(); - - /// Called when a new element tag is opened. - /// @param parser The parser executing the parse. - /// @param name The XML tag name. - /// @param attributes The tag attributes. - /// @return The new element, may be NULL if no element was created. - virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) = 0; - - /// Called when an element is closed. - /// @param parser The parser executing the parse. - /// @param name The XML tag name. - virtual bool ElementEnd(XMLParser* parser, const String& name) = 0; - - /// Called for element data. - /// @param parser The parser executing the parse. - /// @param data The element data. - virtual bool ElementData(XMLParser* parser, const String& data) = 0; - - /// Called to release the node handler. - virtual void Release() = 0; - -protected: - virtual void OnReferenceDeactivate(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Core/XMLParser.h b/libs/libRocket/Include/Rocket/Core/XMLParser.h deleted file mode 100644 index c64aa2c3d5d..00000000000 --- a/libs/libRocket/Include/Rocket/Core/XMLParser.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREXMLPARSER_H -#define ROCKETCOREXMLPARSER_H - -#include -#include "Header.h" -#include "BaseXMLParser.h" - -namespace Rocket { -namespace Core { - -class DocumentHeader; -class Element; -class XMLNodeHandler; - -/** - Rocket's XML parsing engine. The factory creates an instance of this class for each RML parse. - - @author Lloyd Weehuizen - */ - -class ROCKETCORE_API XMLParser : public BaseXMLParser -{ -public: - XMLParser(Element* root); - ~XMLParser(); - - /// Registers a custom node handler to be used to a given tag. - /// @param[in] tag The tag the custom parser will handle. - /// @param[in] handler The custom handler. - /// @return The registered XML node handler. - static XMLNodeHandler* RegisterNodeHandler(const String& tag, XMLNodeHandler* handler); - /// Releases all registered node handlers. This is called internally. - static void ReleaseHandlers(); - - /// Returns the XML document's header. - /// @return The document header. - DocumentHeader* GetDocumentHeader(); - /// Returns the source URL of this parse. - /// @return The URL of the parsing stream. - const URL& GetSourceURL() const; - - // The parse stack. - struct ParseFrame - { - // Tag being parsed. - String tag; - - // Element representing this frame. - Element* element; - - // Handler used for this frame. - XMLNodeHandler* node_handler; - - // The default handler used for this frame's children. - XMLNodeHandler* child_handler; - }; - - /// Pushes an element handler onto the parse stack for parsing child elements. - /// @param[in] tag The tag the handler was registered with. - /// @return True if an appropriate handler was found and pushed onto the stack, false if not. - bool PushHandler(const String& tag); - /// Pushes the default element handler onto the parse stack. - void PushDefaultHandler(); - - /// Access the current parse frame. - /// @return The parser's current parse frame. - const ParseFrame* GetParseFrame() const; - -protected: - /// Called when the parser finds the beginning of an element tag. - virtual void HandleElementStart(const String& name, const XMLAttributes& attributes); - /// Called when the parser finds the end of an element tag. - virtual void HandleElementEnd(const String& name); - /// Called when the parser encounters data. - virtual void HandleData(const String& data); - -private: - // The header of the document being parsed. - DocumentHeader* header; - - // The active node handler. - XMLNodeHandler* active_handler; - - // The parser stack. - typedef std::stack< ParseFrame > ParserStack; - ParserStack stack; -}; - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Debugger.h b/libs/libRocket/Include/Rocket/Debugger.h deleted file mode 100644 index 056395baccd..00000000000 --- a/libs/libRocket/Include/Rocket/Debugger.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGER_H -#define ROCKETDEBUGGER_H - -#include "Debugger/Debugger.h" - -#endif diff --git a/libs/libRocket/Include/Rocket/Debugger/Debugger.h b/libs/libRocket/Include/Rocket/Debugger/Debugger.h deleted file mode 100644 index 628f4aed6fd..00000000000 --- a/libs/libRocket/Include/Rocket/Debugger/Debugger.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERDEBUGGER_H -#define ROCKETDEBUGGERDEBUGGER_H - -#include "../Core/Types.h" -#include "Header.h" - -namespace Rocket { -namespace Core { - -class Context; - -} - -namespace Debugger { - -/// Initialises the debug plugin. The debugger will be loaded into the given context. -/// @param[in] context The Rocket context to load the debugger into. The debugging tools will be displayed on this context. If this context is destroyed, the debugger will be released. -/// @return True if the debugger was successfully initialised -ROCKETDEBUGGER_API bool Initialise(Core::Context* context); - -/// Sets the context to be debugged. -/// @param[in] context The context to be debugged. -/// @return True if the debugger is initialised and the context was switched, false otherwise. -ROCKETDEBUGGER_API bool SetContext(Core::Context* context); - -/// Sets the visibility of the debugger. -/// @param[in] visibility True to show the debugger, false to hide it. -ROCKETDEBUGGER_API void SetVisible(bool visibility); -/// Returns the visibility of the debugger. -/// @return True if the debugger is visible, false if not. -ROCKETDEBUGGER_API bool IsVisible(); - -} -} - -#endif diff --git a/libs/libRocket/Include/Rocket/Debugger/Header.h b/libs/libRocket/Include/Rocket/Debugger/Header.h deleted file mode 100644 index 05c8bf70e46..00000000000 --- a/libs/libRocket/Include/Rocket/Debugger/Header.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERHEADER_H -#define ROCKETDEBUGGERHEADER_H - -#include "../Core/Platform.h" - -#ifdef STATIC_LIB - #define ROCKET_STATIC_LIB - #pragma message("DEPRECATED: STATIC_LIB macro has been deprecated in favor of ROCKET_STATIC_LIB and support will be removed in a future release") -#endif - -#if !defined ROCKET_STATIC_LIB - #ifdef ROCKET_PLATFORM_WIN32 - #ifdef RocketDebugger_EXPORTS - #define ROCKETDEBUGGER_API __declspec(dllexport) - #else - #define ROCKETDEBUGGER_API __declspec(dllimport) - #endif - #else - #define ROCKETDEBUGGER_API __attribute__((visibility("default"))) - #endif -#else - #define ROCKETDEBUGGER_API -#endif - -#endif diff --git a/libs/libRocket/Source/Controls/Clipboard.cpp b/libs/libRocket/Source/Controls/Clipboard.cpp deleted file mode 100644 index 345b251359c..00000000000 --- a/libs/libRocket/Source/Controls/Clipboard.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/Clipboard.h" -#include "../../Include/Rocket/Core/Types.h" -#include "../../Include/Rocket/Core/WString.h" -#if defined ROCKET_PLATFORM_WIN32 -#include -#endif - -namespace Rocket { -namespace Controls { - -#if defined ROCKET_PLATFORM_WIN32 -static HWND application_hwnd = NULL; - -static BOOL CALLBACK FindApplicationWindow(HWND hwnd, LPARAM process_id) -{ - DWORD hwnd_pid; - GetWindowThreadProcessId(hwnd, &hwnd_pid); - if (hwnd_pid == (DWORD) process_id) - { - application_hwnd = hwnd; - return FALSE; - } - - return TRUE; -} - -static HWND GetHWND() -{ - if (application_hwnd != NULL) - return application_hwnd; - - EnumWindows(FindApplicationWindow, GetCurrentProcessId()); - return application_hwnd; -} -#endif - -static Core::WString content; - -// Get the current contents of the clipboard. -Core::WString Clipboard::Get() -{ - #if defined ROCKET_PLATFORM_WIN32 - if (GetHWND()) - { - Core::WString clipboard_content; - - if (!OpenClipboard(GetHWND())) - return clipboard_content; - - HANDLE clipboard_data = GetClipboardData(CF_UNICODETEXT); - if (clipboard_data == NULL) - { - CloseClipboard(); - return clipboard_content; - } - - const Rocket::Core::word* clipboard_text = (const Rocket::Core::word*) GlobalLock(clipboard_data); - if (clipboard_text) - clipboard_content.Assign(clipboard_text); - GlobalUnlock(clipboard_data); - - CloseClipboard(); - return clipboard_content; - } - else - return content; - #else - return content; - #endif -} - -// Set the contents of the clipboard. -void Clipboard::Set(const Core::WString& _content) -{ - #if defined ROCKET_PLATFORM_WIN32 - if (GetHWND()) - { - if (!OpenClipboard(GetHWND())) - return; - - EmptyClipboard(); - - Rocket::Core::String win32_content; - _content.ToUTF8(win32_content); - - HGLOBAL clipboard_data = GlobalAlloc(GMEM_FIXED, win32_content.Length() + 1); - // Replaced strcpy_s with a simple strcpy, because we know for sure it's big enough. - strcpy((char*) clipboard_data, win32_content.CString()); - - if (SetClipboardData(CF_TEXT, clipboard_data) == NULL) - { - CloseClipboard(); - GlobalFree(clipboard_data); - } - else - CloseClipboard(); - } - else - content = _content; - #else - content = _content; - #endif -} - -#if defined ROCKET_PLATFORM_WIN32 -// Set the window handle of the application. -void Clipboard::SetHWND(void* hwnd) -{ - application_hwnd = (HWND) hwnd; -} -#endif - -} -} diff --git a/libs/libRocket/Source/Controls/Controls.cpp b/libs/libRocket/Source/Controls/Controls.cpp deleted file mode 100644 index 9cbf155f733..00000000000 --- a/libs/libRocket/Source/Controls/Controls.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/Controls.h" -#include "../../Include/Rocket/Core/ElementInstancerGeneric.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/StyleSheetSpecification.h" -#include "../../Include/Rocket/Core/XMLParser.h" -#include "../../Include/Rocket/Core/Plugin.h" -#include "../../Include/Rocket/Core/Core.h" -#include "ElementTextSelection.h" -#include "XMLNodeHandlerDataGrid.h" -#include "XMLNodeHandlerTabSet.h" -#include "XMLNodeHandlerTextArea.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" - -namespace Rocket { -namespace Controls { - -// Registers the custom element instancers. -void RegisterElementInstancers() -{ - Core::ElementInstancer* instancer = new Core::ElementInstancerGeneric< ElementForm >(); - Core::Factory::RegisterElementInstancer("form", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementFormControlInput >(); - Core::Factory::RegisterElementInstancer("input", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementFormControlDataSelect >(); - instancer = Core::Factory::RegisterElementInstancer("dataselect", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementFormControlSelect >(); - Core::Factory::RegisterElementInstancer("select", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementFormControlTextArea >(); - Core::Factory::RegisterElementInstancer("textarea", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementTextSelection >(); - Core::Factory::RegisterElementInstancer("#selection", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementTabSet >(); - Core::Factory::RegisterElementInstancer("tabset", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementDataGrid >(); - Core::Factory::RegisterElementInstancer("datagrid", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementDataGridExpandButton >(); - Core::Factory::RegisterElementInstancer("datagridexpand", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementDataGridCell >(); - Core::Factory::RegisterElementInstancer("#rktctl_datagridcell", instancer); - instancer->RemoveReference(); - - instancer = new Core::ElementInstancerGeneric< ElementDataGridRow >(); - Core::Factory::RegisterElementInstancer("#rktctl_datagridrow", instancer); - instancer->RemoveReference(); -} - -void RegisterXMLNodeHandlers() -{ - Core::XMLNodeHandler* node_handler = new XMLNodeHandlerDataGrid(); - Core::XMLParser::RegisterNodeHandler("datagrid", node_handler); - node_handler->RemoveReference(); - - node_handler = new XMLNodeHandlerTabSet(); - Core::XMLParser::RegisterNodeHandler("tabset", node_handler); - node_handler->RemoveReference(); - - node_handler = new XMLNodeHandlerTextArea(); - Core::XMLParser::RegisterNodeHandler("textarea", node_handler); - node_handler->RemoveReference(); -} - -static bool initialised = false; - -class ControlsPlugin : public Rocket::Core::Plugin -{ -public: - void OnShutdown() - { - initialised = false; - delete this; - } - - int GetEventClasses() - { - return Rocket::Core::Plugin::EVT_BASIC; - } -}; - -void Initialise() -{ - // Prevent double initialisation - if (!initialised) - { - Core::StyleSheetSpecification::RegisterProperty("min-rows", "0", false, false).AddParser("number"); - - // Register the element instancers for our custom elements. - RegisterElementInstancers(); - - // Register the XML node handlers for our elements that require special parsing. - RegisterXMLNodeHandlers(); - - // Register the controls plugin, so we'll be notified on Shutdown - Rocket::Core::RegisterPlugin(new ControlsPlugin()); - - initialised = true; - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/DataFormatter.cpp b/libs/libRocket/Source/Controls/DataFormatter.cpp deleted file mode 100644 index 0ced5fe0b82..00000000000 --- a/libs/libRocket/Source/Controls/DataFormatter.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/DataFormatter.h" - -namespace Rocket { -namespace Controls { - -typedef std::map< Rocket::Core::String, DataFormatter* > DataFormatterMap; -static DataFormatterMap data_formatters; - -DataFormatter::DataFormatter(const Rocket::Core::String& _name) -{ - if (!_name.Empty()) - { - name = _name; - } - else - { - name.FormatString(64, "%x", this); - } - data_formatters[name] = this; -} - -DataFormatter::~DataFormatter() -{ -} - -const Rocket::Core::String& DataFormatter::GetDataFormatterName() -{ - return name; -} - -DataFormatter* DataFormatter::GetDataFormatter(const Rocket::Core::String& data_formatter_name) -{ - DataFormatterMap::iterator i = data_formatters.find(data_formatter_name); - if (i == data_formatters.end()) - { - return NULL; - } - - return (*i).second; -} - -void* DataFormatter::GetScriptObject() const -{ - return NULL; -} - -} -} diff --git a/libs/libRocket/Source/Controls/DataQuery.cpp b/libs/libRocket/Source/Controls/DataQuery.cpp deleted file mode 100644 index ca4694ba578..00000000000 --- a/libs/libRocket/Source/Controls/DataQuery.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/DataQuery.h" -#include "../../Include/Rocket/Controls/DataSource.h" -#include - -namespace Rocket { -namespace Controls { - -class DataQuerySort -{ - public: - DataQuerySort(const Rocket::Core::StringList& _order_parameters) - { - order_parameters = _order_parameters; - } - - bool operator()(const Rocket::Core::StringList& ROCKET_UNUSED_PARAMETER(left), const Rocket::Core::StringList& ROCKET_UNUSED_PARAMETER(right)) - { - ROCKET_UNUSED(left); - ROCKET_UNUSED(right); - - return false; - } - - private: - Rocket::Core::StringList order_parameters; -}; - - - -DataQuery::DataQuery(DataSource* data_source, const Rocket::Core::String& table, const Rocket::Core::String& _fields, int offset, int limit, const Rocket::Core::String& order) -{ - ExecuteQuery(data_source, table, _fields, offset, limit, order); -} - - - -DataQuery::DataQuery() -{ - data_source = NULL; - table = ""; - offset = -1; - limit = -1; -} - - - -DataQuery::~DataQuery() -{ -} - - - -void DataQuery::ExecuteQuery(DataSource* _data_source, const Rocket::Core::String& _table, const Rocket::Core::String& _fields, int _offset, int _limit, const Rocket::Core::String& order) -{ - data_source = _data_source; - table = _table; - offset = _offset; - limit = _limit; - - // Set up the field list and field index cache. - Rocket::Core::StringUtilities::ExpandString(fields, _fields); - for (size_t i = 0; i < fields.size(); i++) - { - field_indices[fields[i]] = i; - } - - // Initialise the row pointer. - current_row = -1; - - // If limit is -1, then we fetch to the end of the data source. - if (limit == -1) - { - limit = data_source->GetNumRows(table) - offset; - } - - if (!order.Empty()) - { - // Fetch the rows from offset to limit. - rows.resize(limit); - for (int i = 0; i < limit; i++) - { - data_source->GetRow(rows[i], table, offset + i, fields); - } - - // Now sort the rows, based on the ordering requirements. - Rocket::Core::StringList order_parameters; - Rocket::Core::StringUtilities::ExpandString(order_parameters, order); - sort(rows.begin(), rows.end(), DataQuerySort(order_parameters)); - } -} - - - -bool DataQuery::NextRow() -{ - current_row++; - - if (current_row >= limit) - { - return false; - } - - LoadRow(); - return true; -} - - - -bool DataQuery::IsFieldSet(const Rocket::Core::String& field) const -{ - FieldIndices::const_iterator itr = field_indices.find(field); - if (itr == field_indices.end() || (*itr).second >= (int)rows[current_row].size()) - { - return false; - } - - return true; -} - - - -void DataQuery::LoadRow() -{ - ROCKET_ASSERT(current_row <= (int)rows.size()); - if (current_row >= (int)rows.size()) - { - rows.push_back(Rocket::Core::StringList()); - data_source->GetRow(rows[current_row], table, offset + current_row, fields); - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/DataSource.cpp b/libs/libRocket/Source/Controls/DataSource.cpp deleted file mode 100644 index e1054217dee..00000000000 --- a/libs/libRocket/Source/Controls/DataSource.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/DataSource.h" -#include "../../Include/Rocket/Controls/DataSourceListener.h" -#include "../../Include/Rocket/Core/StringUtilities.h" -#include "../../Include/Rocket/Core/Log.h" -#include - -namespace Rocket { -namespace Controls { - -const Rocket::Core::String DataSource::CHILD_SOURCE("#child_data_source"); -const Rocket::Core::String DataSource::DEPTH("#depth"); -const Rocket::Core::String DataSource::NUM_CHILDREN("#num_children"); - -typedef std::map< Rocket::Core::String, DataSource* > DataSourceMap; -static DataSourceMap data_sources; - -DataSource::DataSource(const Rocket::Core::String& _name) -{ - if (!_name.Empty()) - { - name = _name; - } - else - { - name.FormatString(64, "%x", this); - } - data_sources[name] = this; -} - -DataSource::~DataSource() -{ - ListenerList listeners_copy = listeners; - for (ListenerList::iterator i = listeners_copy.begin(); i != listeners_copy.end(); ++i) - { - (*i)->OnDataSourceDestroy(this); - } - - DataSourceMap::iterator iterator = data_sources.find(name); - if (iterator != data_sources.end() && - iterator->second == this) - { - data_sources.erase(name); - } -} - -const Rocket::Core::String& DataSource::GetDataSourceName() -{ - return name; -} - -DataSource* DataSource::GetDataSource(const Rocket::Core::String& data_source_name) -{ - DataSourceMap::iterator i = data_sources.find(data_source_name); - if (i == data_sources.end()) - { - return NULL; - } - - return (*i).second; -} - -void DataSource::AttachListener(DataSourceListener* listener) -{ - if (find(listeners.begin(), listeners.end(), listener) != listeners.end()) - { - ROCKET_ERROR; - return; - } - listeners.push_back(listener); -} - -void DataSource::DetachListener(DataSourceListener* listener) -{ - ListenerList::iterator i = find(listeners.begin(), listeners.end(), listener); - ROCKET_ASSERT(i != listeners.end()); - if (i != listeners.end()) - { - listeners.erase(i); - } -} - -void* DataSource::GetScriptObject() const -{ - return NULL; -} - -void DataSource::NotifyRowAdd(const Rocket::Core::String& table, int first_row_added, int num_rows_added) -{ - ListenerList listeners_copy = listeners; - for (ListenerList::iterator i = listeners_copy.begin(); i != listeners_copy.end(); ++i) - { - (*i)->OnRowAdd(this, table, first_row_added, num_rows_added); - } -} - -void DataSource::NotifyRowRemove(const Rocket::Core::String& table, int first_row_removed, int num_rows_removed) -{ - ListenerList listeners_copy = listeners; - for (ListenerList::iterator i = listeners_copy.begin(); i != listeners_copy.end(); ++i) - { - (*i)->OnRowRemove(this, table, first_row_removed, num_rows_removed); - } -} - -void DataSource::NotifyRowChange(const Rocket::Core::String& table, int first_row_changed, int num_rows_changed) -{ - ListenerList listeners_copy = listeners; - for (ListenerList::iterator i = listeners_copy.begin(); i != listeners_copy.end(); ++i) - { - (*i)->OnRowChange(this, table, first_row_changed, num_rows_changed); - } -} - -void DataSource::NotifyRowChange(const Rocket::Core::String& table) -{ - ListenerList listeners_copy = listeners; - for (ListenerList::iterator i = listeners_copy.begin(); i != listeners_copy.end(); ++i) - { - (*i)->OnRowChange(this, table); - } -} - -void DataSource::BuildRowEntries(Rocket::Core::StringList& row, const RowMap& row_map, const Rocket::Core::StringList& columns) -{ - // Reserve the number of entries. - row.resize(columns.size()); - for (size_t i = 0; i < columns.size(); i++) - { - // Look through our row_map for each entry and add it to the result set - RowMap::const_iterator itr = row_map.find(columns[i]); - if (itr != row_map.end()) - { - row[i] = (*itr).second; - } - else - { - row[i] = ""; - Rocket::Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Failed to find required data source column %s", columns[i].CString()); - } - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/DataSourceListener.cpp b/libs/libRocket/Source/Controls/DataSourceListener.cpp deleted file mode 100644 index 705e0ca88bd..00000000000 --- a/libs/libRocket/Source/Controls/DataSourceListener.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/DataSourceListener.h" -#include "../../Include/Rocket/Controls/DataSource.h" -#include "../../Include/Rocket/Core/StringUtilities.h" -#include "../../Include/Rocket/Core/Log.h" - -namespace Rocket { -namespace Controls { - -DataSourceListener::DataSourceListener() -{ -} - -DataSourceListener::~DataSourceListener() -{ -} - -// Notification of the destruction of an observed data source. -void DataSourceListener::OnDataSourceDestroy(DataSource* ROCKET_UNUSED_PARAMETER(data_source)) -{ - ROCKET_UNUSED(data_source); -} - -// Notification of the addition of one or more rows to an observed data source's table. -void DataSourceListener::OnRowAdd(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& ROCKET_UNUSED_PARAMETER(table), int ROCKET_UNUSED_PARAMETER(first_row_added), int ROCKET_UNUSED_PARAMETER(num_rows_added)) -{ - ROCKET_UNUSED(data_source); - ROCKET_UNUSED(table); - ROCKET_UNUSED(first_row_added); - ROCKET_UNUSED(num_rows_added); -} - -// Notification of the removal of one or more rows from an observed data source's table. -void DataSourceListener::OnRowRemove(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& ROCKET_UNUSED_PARAMETER(table), int ROCKET_UNUSED_PARAMETER(first_row_removed), int ROCKET_UNUSED_PARAMETER(num_rows_removed)) -{ - ROCKET_UNUSED(data_source); - ROCKET_UNUSED(table); - ROCKET_UNUSED(first_row_removed); - ROCKET_UNUSED(num_rows_removed); -} - -// Notification of the changing of one or more rows from an observed data source's table. -void DataSourceListener::OnRowChange(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& ROCKET_UNUSED_PARAMETER(table), int ROCKET_UNUSED_PARAMETER(first_row_changed), int ROCKET_UNUSED_PARAMETER(num_rows_changed)) -{ - ROCKET_UNUSED(data_source); - ROCKET_UNUSED(table); - ROCKET_UNUSED(first_row_changed); - ROCKET_UNUSED(num_rows_changed); -} - -// Notification of the change of all of the data of an observed data source's table. -void DataSourceListener::OnRowChange(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& ROCKET_UNUSED_PARAMETER(table)) -{ - ROCKET_UNUSED(data_source); - ROCKET_UNUSED(table); -} - -// Sets up data source and table from a given string. -bool DataSourceListener::ParseDataSource(DataSource*& data_source, Rocket::Core::String& table_name, const Rocket::Core::String& data_source_name) -{ - if (data_source_name.Length() == 0) - { - data_source = NULL; - table_name = ""; - return false; - } - - Rocket::Core::StringList data_source_parts; - Rocket::Core::StringUtilities::ExpandString(data_source_parts, data_source_name, '.'); - - DataSource* new_data_source = DataSource::GetDataSource(data_source_parts[0].CString()); - - if (data_source_parts.size() != 2 || !new_data_source) - { - Rocket::Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Bad data source name %s", data_source_name.CString()); - data_source = NULL; - table_name = ""; - return false; - } - - data_source = new_data_source; - table_name = data_source_parts[1]; - return true; -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementDataGrid.cpp b/libs/libRocket/Source/Controls/ElementDataGrid.cpp deleted file mode 100644 index 9b38cd0aa4d..00000000000 --- a/libs/libRocket/Source/Controls/ElementDataGrid.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementDataGrid.h" -#include "../../Include/Rocket/Controls/DataSource.h" -#include "../../Include/Rocket/Core/Math.h" -#include "../../Include/Rocket/Core/XMLParser.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/ElementDocument.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Controls/DataFormatter.h" -#include "../../Include/Rocket/Controls/ElementDataGridRow.h" - -namespace Rocket { -namespace Controls { - -ElementDataGrid::ElementDataGrid(const Rocket::Core::String& tag) : Core::Element(tag) -{ - Rocket::Core::XMLAttributes attributes; - - // Create the row for the column headers: - header = dynamic_cast< ElementDataGridRow* >(Core::Factory::InstanceElement(this, "#rktctl_datagridrow", "datagridheader", attributes)); - header->SetProperty("display", "block"); - header->Initialise(this); - AppendChild(header); - header->RemoveReference(); - - body = Core::Factory::InstanceElement(this, "*", "datagridbody", attributes); - body->SetProperty("display", "none"); - body->SetProperty("width", "auto"); - AppendChild(body); - body->RemoveReference(); - - body_visible = false; - - root = dynamic_cast< ElementDataGridRow* >(Core::Factory::InstanceElement(this, "#rktctl_datagridrow", "datagridroot", attributes)); - root->SetProperty("display", "none"); - root->Initialise(this); - - SetProperty("overflow", "auto"); - - new_data_source = ""; -} - -ElementDataGrid::~ElementDataGrid() -{ - root->RemoveReference(); -} - -void ElementDataGrid::SetDataSource(const Rocket::Core::String& data_source_name) -{ - new_data_source = data_source_name; -} - -// Adds a column to the table. -bool ElementDataGrid::AddColumn(const Rocket::Core::String& fields, const Rocket::Core::String& formatter, float initial_width, const Rocket::Core::String& header_rml) -{ - Core::Element* header_element = Core::Factory::InstanceElement(this, "datagridcolumn", "datagridcolumn", Rocket::Core::XMLAttributes()); - if (header_element == NULL) - return false; - - if (!Core::Factory::InstanceElementText(header_element, header_rml)) - { - header_element->RemoveReference(); - return false; - } - - AddColumn(fields, formatter, initial_width, header_element); - header_element->RemoveReference(); - return true; -} - -// Adds a column to the table. -void ElementDataGrid::AddColumn(const Rocket::Core::String& fields, const Rocket::Core::String& formatter, float initial_width, Core::Element* header_element) -{ - Column column; - Rocket::Core::StringUtilities::ExpandString(column.fields, fields); - column.formatter = DataFormatter::GetDataFormatter(formatter); - column.header = header; - column.current_width = initial_width; - column.refresh_on_child_change = false; - - // The header elements are added to the header row at the top of the table. - if (header_element) - { - header_element->SetProperty("display", "inline-block"); - - // Push all the width properties from the column onto the header element. - Rocket::Core::String width = header_element->GetAttribute("width", "100%"); - header_element->SetProperty("width", width); - - header->AppendChild(header_element); - } - - // Add the fields that this column requires to the concatenated string of all column fields. - for (size_t i = 0; i < column.fields.size(); i++) - { - // Don't append the depth or num_children fields, as they're handled by the row. - if (column.fields[i] == Rocket::Controls::DataSource::NUM_CHILDREN) - { - column.refresh_on_child_change = true; - } - else if (column.fields[i] != Rocket::Controls::DataSource::DEPTH) - { - if (!column_fields.Empty()) - { - column_fields.Append(","); - } - column_fields.Append(column.fields[i]); - } - } - - columns.push_back(column); - - Rocket::Core::Dictionary parameters; - parameters.Set("index", (int)(columns.size() - 1)); - DispatchEvent("columnadd", parameters); -} - -// Returns the number of columns in this table -int ElementDataGrid::GetNumColumns() -{ - return (int)columns.size(); -} - -// Returns the column at the specified index. -const ElementDataGrid::Column* ElementDataGrid::GetColumn(int column_index) -{ - if (column_index < 0 || column_index >= (int)columns.size()) - { - ROCKET_ERROR; - return NULL; - } - - return &columns[column_index]; -} - -/// Returns a CSV string containing all the fields that each column requires, in order. -const Rocket::Core::String& ElementDataGrid::GetAllColumnFields() -{ - return column_fields; -} - -// Adds a new row to the table - usually only called by child rows. -ElementDataGridRow* ElementDataGrid::AddRow(ElementDataGridRow* parent, int index) -{ - // Now we make a new row at the right place then return it. - Rocket::Core::XMLAttributes attributes; - ElementDataGridRow* new_row = dynamic_cast< ElementDataGridRow* >(Core::Factory::InstanceElement(this, "#rktctl_datagridrow", "datagridrow", attributes)); - - new_row->Initialise(this, parent, index, header, parent->GetDepth() + 1); - - // We need to work out the table-specific row. - int table_relative_index = parent->GetChildTableRelativeIndex(index); - - Core::Element* child_to_insert_before = NULL; - if (table_relative_index < body->GetNumChildren()) - { - child_to_insert_before = body->GetChild(table_relative_index); - } - body->InsertBefore(new_row, child_to_insert_before); - new_row->RemoveReference(); - - // As the rows have changed, we need to lay out the document again. - DirtyLayout(); - - return new_row; -} - -// Removes a row from the table. -void ElementDataGrid::RemoveRows(int index, int num_rows) -{ - for (int i = 0; i < num_rows; i++) - { - ElementDataGridRow* row = GetRow(index); - row->SetDataSource(""); - body->RemoveChild(row); - } - - // As the rows have changed, we need to lay out the document again. - DirtyLayout(); -} - -// Returns the number of rows in the table -int ElementDataGrid::GetNumRows() const -{ - return body->GetNumChildren(); -} - -// Returns the row at the given index in the table. -ElementDataGridRow* ElementDataGrid::GetRow(int index) const -{ - // We need to add two to the index, to skip the header row. - ElementDataGridRow* row = dynamic_cast< ElementDataGridRow* >(body->GetChild(index)); - return row; -} - -void ElementDataGrid::OnUpdate() -{ - Core::ElementDocument* document = GetOwnerDocument(); - document->LockLayout(true); - - if (!new_data_source.Empty()) - { - root->SetDataSource(new_data_source); - new_data_source = ""; - } - - bool any_new_children = root->UpdateChildren(); - if (any_new_children) - { - DispatchEvent("rowupdate", Rocket::Core::Dictionary()); - } - - if (!body_visible && (!any_new_children || root->GetNumLoadedChildren() >= Rocket::Core::Math::RealToInteger(ResolveProperty("min-rows", 0)))) - { - body->SetProperty("display", "block"); - body_visible = true; - } - - document->LockLayout(false); -} - -void ElementDataGrid::ProcessEvent(Core::Event& event) -{ - Core::Element::ProcessEvent(event); - - if (event == "columnadd") - { - if (event.GetTargetElement() == this) - { - root->RefreshRows(); - DirtyLayout(); - } - } - else if (event == "resize") - { - if (event.GetTargetElement() == this) - { - // commented this out because this bugs selection on overflowed - // datagrids contained within another overflowed element - //SetScrollTop(GetScrollHeight() - GetClientHeight()); - - for (int i = 0; i < header->GetNumChildren(); i++) - { - Core::Element* child = header->GetChild(i); - columns[i].current_width = child->GetBox().GetSize(Core::Box::MARGIN).x; - } - } - } -} - -// Gets the markup and content of the element. -void ElementDataGrid::GetInnerRML(Rocket::Core::String& content) const -{ - // The only content we have is the columns, and inside them the header elements. - for (size_t i = 0; i < columns.size(); i++) - { - Core::Element* header_element = header->GetChild((int)i); - - Rocket::Core::String column_fields; - for (size_t j = 0; j < columns[i].fields.size(); j++) - { - if (j != columns[i].fields.size() - 1) - { - column_fields.Append(","); - } - column_fields.Append(columns[i].fields[j]); - } - Rocket::Core::String width_attribute = header_element->GetAttribute("width", ""); - - content.Append(Rocket::Core::String(column_fields.Length() + 32, ""); - header_element->GetInnerRML(content); - content.Append(""); - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementDataGridCell.cpp b/libs/libRocket/Source/Controls/ElementDataGridCell.cpp deleted file mode 100644 index d7eaca4b7fe..00000000000 --- a/libs/libRocket/Source/Controls/ElementDataGridCell.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementDataGridCell.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Controls/ElementDataGrid.h" - -namespace Rocket { -namespace Controls { - -ElementDataGridCell::ElementDataGridCell(const Rocket::Core::String& tag) : Core::Element(tag) -{ -} - -ElementDataGridCell::~ElementDataGridCell() -{ - if (header) { - header->RemoveEventListener("resize", this); - header->RemoveReference(); - } -} - -void ElementDataGridCell::Initialise(int _column, Core::Element* _header) -{ - column = _column; - header = _header; - if (header) - { - header->AddReference(); - header->AddEventListener("resize", this); - SetProperty("width", Core::Property(header->GetBox().GetSize(Core::Box::MARGIN).x, Core::Property::PX)); - } -} - -int ElementDataGridCell::GetColumn() -{ - return column; -} - -void ElementDataGridCell::ProcessEvent(Core::Event& event) -{ - Core::Element::ProcessEvent(event); - - if (event == "resize") - { - if (event.GetTargetElement() == header) - { - SetProperty("width", Core::Property(header->GetBox().GetSize(Core::Box::MARGIN).x, Core::Property::PX)); - } - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementDataGridExpandButton.cpp b/libs/libRocket/Source/Controls/ElementDataGridExpandButton.cpp deleted file mode 100644 index fb0f1deeea4..00000000000 --- a/libs/libRocket/Source/Controls/ElementDataGridExpandButton.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementDataGridExpandButton.h" -#include "../../Include/Rocket/Controls/ElementDataGridRow.h" - -namespace Rocket { -namespace Controls { - -ElementDataGridExpandButton::ElementDataGridExpandButton(const Rocket::Core::String& tag) : Core::Element(tag) -{ - SetClass("collapsed", true); -} - -ElementDataGridExpandButton::~ElementDataGridExpandButton() -{ -} - -void ElementDataGridExpandButton::ProcessEvent(Core::Event& event) -{ - Core::Element::ProcessEvent(event); - - if (event == "click" && event.GetCurrentElement() == this) - { - // Look for the first data grid row above us, and toggle their on/off - // state. - Core::Element* parent = GetParentNode(); - ElementDataGridRow* parent_row; - do - { - parent_row = dynamic_cast< ElementDataGridRow* >(parent); - parent = parent->GetParentNode(); - } - while (parent && !parent_row); - - if (parent_row) - { - parent_row->ToggleRow(); - - if (parent_row->IsRowExpanded()) - { - SetClass("collapsed", false); - SetClass("expanded", true); - } - else - { - SetClass("collapsed", true); - SetClass("expanded", false); - } - } - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementDataGridRow.cpp b/libs/libRocket/Source/Controls/ElementDataGridRow.cpp deleted file mode 100644 index 70f5d3b0357..00000000000 --- a/libs/libRocket/Source/Controls/ElementDataGridRow.cpp +++ /dev/null @@ -1,701 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementDataGridRow.h" -#include "../../Include/Rocket/Core.h" -#include "../../Include/Rocket/Controls/DataSource.h" -#include "../../Include/Rocket/Controls/DataFormatter.h" -#include "../../Include/Rocket/Controls/ElementDataGrid.h" -#include "../../Include/Rocket/Controls/ElementDataGridCell.h" - -namespace Rocket { -namespace Controls { - -const float MAX_UPDATE_TIME = 0.01f; - -ElementDataGridRow::ElementDataGridRow(const Rocket::Core::String& tag) : Core::Element(tag) -{ - parent_grid = NULL; - parent_row = NULL; - child_index = -1; - depth = -1; - - data_source = NULL; - - table_relative_index = -1; - table_relative_index_dirty = true; - dirty_cells = true; - dirty_children = false; - row_expanded = true; - - SetProperty("white-space", "nowrap"); - SetProperty("display", Rocket::Core::Property(Rocket::Core::DISPLAY_INLINE_BLOCK, Rocket::Core::Property::KEYWORD)); -} - -ElementDataGridRow::~ElementDataGridRow() -{ - if (data_source) - { - data_source->DetachListener(this); - data_source = NULL; - } -} - -void ElementDataGridRow::Initialise(ElementDataGrid* _parent_grid, ElementDataGridRow* _parent_row, int _child_index, ElementDataGridRow* header_row, int _depth) -{ - parent_grid = _parent_grid; - parent_row = _parent_row; - child_index = _child_index; - depth = _depth; - - // We start all the rows collapsed, except for the root row. - if (child_index != -1) - { - row_expanded = false; - } - - int num_columns = parent_grid->GetNumColumns(); - Rocket::Core::XMLAttributes cell_attributes; - for (int i = 0; i < num_columns; i++) - { - ElementDataGridCell* cell = dynamic_cast< ElementDataGridCell* >(Core::Factory::InstanceElement(this, "#rktctl_datagridcell", "datagridcell", cell_attributes)); - cell->Initialise(i, header_row->GetChild(i)); - cell->SetProperty("display", Rocket::Core::Property(Rocket::Core::DISPLAY_INLINE_BLOCK, Rocket::Core::Property::KEYWORD)); - AppendChild(cell); - cell->RemoveReference(); - } -} - -void ElementDataGridRow::SetChildIndex(int _child_index) -{ - if (child_index != _child_index) - { - child_index = _child_index; - - if (parent_row) - { - parent_row->ChildChanged(child_index); - } - } -} - -int ElementDataGridRow::GetDepth() -{ - return depth; -} - -void ElementDataGridRow::SetDataSource(const Rocket::Core::String& data_source_name) -{ - if (data_source != NULL) - { - data_source->DetachListener(this); - data_source = NULL; - } - - if (ParseDataSource(data_source, data_table, data_source_name)) - { - data_source->AttachListener(this); - RefreshRows(); - } -} - -bool ElementDataGridRow::UpdateChildren() -{ - if (dirty_children) - { - float start_time = Core::GetSystemInterface()->GetElapsedTime(); - - RowQueue dirty_rows; - dirty_rows.push(this); - - while (!dirty_rows.empty()) - { - ElementDataGridRow* dirty_row = dirty_rows.front(); - dirty_rows.pop(); - - float time_slice = MAX_UPDATE_TIME - (Core::GetSystemInterface()->GetElapsedTime() - start_time); - if (time_slice <= 0.0f) - break; - - dirty_row->LoadChildren(time_slice); - for (size_t i = 0; i < dirty_row->children.size(); i++) - { - if (dirty_row->children[i]->dirty_cells || dirty_row->children[i]->dirty_children) - { - dirty_rows.push(dirty_row->children[i]); - } - } - } - - return true; - } - - return false; -} - -// Returns the number of children that aren't dirty (have been loaded) -int ElementDataGridRow::GetNumLoadedChildren() -{ - int num_loaded_children = 0; - for (size_t i = 0; i < children.size(); i++) - { - if (!children[i]->dirty_cells) - { - num_loaded_children++; - } - num_loaded_children += children[i]->GetNumLoadedChildren(); - } - - return num_loaded_children; -} - -bool ElementDataGridRow::IsRowExpanded() -{ - return row_expanded; -} - -void ElementDataGridRow::ExpandRow() -{ - row_expanded = true; - - for (size_t i = 0; i < children.size(); i++) - { - children[i]->Show(); - } - - DirtyLayout(); -} - -void ElementDataGridRow::CollapseRow() -{ - row_expanded = false; - - for (size_t i = 0; i < children.size(); i++) - { - children[i]->Hide(); - } - - DirtyLayout(); -} - -void ElementDataGridRow::ToggleRow() -{ - if (row_expanded) - { - CollapseRow(); - } - else - { - ExpandRow(); - } -} - -// Returns the index of this row, relative to its parent. -int ElementDataGridRow::GetParentRelativeIndex() -{ - return child_index; -} - -// Returns the index of this row, relative to the table rather than its parent. -int ElementDataGridRow::GetTableRelativeIndex() -{ - if (!parent_row) - { - return -1; - } - - if (table_relative_index_dirty) - { - table_relative_index = parent_row->GetChildTableRelativeIndex(child_index); - table_relative_index_dirty = false; - } - - return table_relative_index; -} - -// Returns the parent row of this row. -ElementDataGridRow* ElementDataGridRow::GetParentRow() -{ - return parent_row; -} - -// Returns the grid that this row belongs to. -ElementDataGrid* ElementDataGridRow::GetParentGrid() -{ - return parent_grid; -} - -void ElementDataGridRow::OnDataSourceDestroy(DataSource* ROCKET_UNUSED_PARAMETER(_data_source)) -{ - if(data_source != NULL) - { - data_source->DetachListener(this); - data_source = NULL; - } - RemoveChildren(); -} - -void ElementDataGridRow::OnRowAdd(DataSource* _data_source, const Rocket::Core::String& _data_table, int first_row_added, int num_rows_added) -{ - if (_data_source == data_source && _data_table == data_table) - AddChildren(first_row_added, num_rows_added); -} - -void ElementDataGridRow::OnRowRemove(DataSource* _data_source, const Rocket::Core::String& _data_table, int first_row_removed, int num_rows_removed) -{ - if (_data_source == data_source && _data_table == data_table) - RemoveChildren(first_row_removed, num_rows_removed); -} - -void ElementDataGridRow::OnRowChange(DataSource* _data_source, const Rocket::Core::String& _data_table, int first_row_changed, int num_rows_changed) -{ - if (_data_source == data_source && _data_table == data_table) - ChangeChildren(first_row_changed, num_rows_changed); -} - -void ElementDataGridRow::OnRowChange(DataSource* _data_source, const Rocket::Core::String& _data_table) -{ - if (_data_source == data_source && _data_table == data_table) - RefreshRows(); -} - -// Removes all the child cells and fetches them again from the data source. -void ElementDataGridRow::RefreshRows() -{ - // Remove all our child rows from the table. - RemoveChildren(); - - // Load the children from the data source. - if (data_source != NULL) - { - int num_rows = data_source->GetNumRows(data_table); - if (num_rows > 0) - { - AddChildren(0, num_rows); - } - } -} - -// Called when a row change (addition or removal) occurs in one of our -// children. -void ElementDataGridRow::ChildChanged(int child_row_index) -{ - for (int i = child_row_index + 1; i < (int)children.size(); i++) - { - children[i]->DirtyTableRelativeIndex(); - } - - if (parent_row) - { - parent_row->ChildChanged(child_index); - } -} - -// Checks if any columns are dependent on the number of children present, and -// refreshes them from the data source if they are. -void ElementDataGridRow::RefreshChildDependentCells() -{ - if (child_index != -1) - { - for (int i = 0; i < parent_grid->GetNumColumns(); i++) - { - const ElementDataGrid::Column* column = parent_grid->GetColumn(i); - if (column->refresh_on_child_change) - { - DirtyCells(); - } - } - } -} - -// Called whenever a row is added or removed above ours. -void ElementDataGridRow::DirtyTableRelativeIndex() -{ - for (size_t i = 0; i < children.size(); i++) - { - children[i]->DirtyTableRelativeIndex(); - } - - table_relative_index_dirty = true; -} - -int ElementDataGridRow::GetChildTableRelativeIndex(int child_index) -{ - // We start with our index, then count down each of the children until we - // reach child_index. For each child we skip by add one (for the child - // itself) and all of its descendants. - int child_table_index = GetTableRelativeIndex() + 1; - - for (int i = 0; i < child_index; i++) - { - child_table_index++; - child_table_index += children[i]->GetNumDescendants(); - } - - return child_table_index; -} - -// Adds children underneath this row, and fetches their contents (and possible -// children) from the row's data source. -void ElementDataGridRow::AddChildren(int first_row_added, int num_rows_added) -{ - if (first_row_added == -1) - { - first_row_added = (int)children.size(); - } - - // prevent relayout of the document while adding rows - Core::ElementDocument* document = parent_grid->GetOwnerDocument(); - document->LockLayout(true); - - // We need to make a row for each new child, then pass through the cell - // information and the child's data source (if one exists.) - if (data_source != NULL) - { - for (int i = 0; i < num_rows_added; i++) - { - int row_index = first_row_added + i; - - // Make a new row: - ElementDataGridRow* new_row = parent_grid->AddRow(this, row_index); - children.insert(children.begin() + row_index, new_row); - - if (!row_expanded) - { - new_row->SetProperty("display", "none"); - } - } - - for (int i = first_row_added + num_rows_added; i < (int)children.size(); i++) - { - children[i]->SetChildIndex(i); - children[i]->DirtyTableRelativeIndex(); - } - - if (parent_row) - { - parent_row->ChildChanged(child_index); - } - } - - document->LockLayout(false); - - RefreshChildDependentCells(); - DirtyRow(); - - Rocket::Core::Dictionary parameters; - parameters.Set("first_row_added", GetChildTableRelativeIndex(first_row_added)); - parameters.Set("num_rows_added", num_rows_added); - parent_grid->DispatchEvent("rowadd", parameters); -} - -void ElementDataGridRow::RemoveChildren(int first_row_removed, int num_rows_removed) -{ - if (num_rows_removed == -1) - { - num_rows_removed = (int)children.size() - first_row_removed; - } - - // prevent relayout of the document while removing rows - Core::ElementDocument* document = parent_grid->GetOwnerDocument(); - document->LockLayout(true); - - for (int i = num_rows_removed - 1; i >= 0; i--) - { - children[first_row_removed + i]->RemoveChildren(); - parent_grid->RemoveRows(children[first_row_removed + i]->GetTableRelativeIndex()); - } - - children.erase(children.begin() + first_row_removed, children.begin() + (first_row_removed + num_rows_removed)); - for (int i = first_row_removed; i < (int) children.size(); i++) - { - children[i]->SetChildIndex(i); - children[i]->DirtyTableRelativeIndex(); - } - - document->LockLayout(false); - - Rocket::Core::Dictionary parameters; - parameters.Set("first_row_removed", GetChildTableRelativeIndex(first_row_removed)); - parameters.Set("num_rows_removed", num_rows_removed); - parent_grid->DispatchEvent("rowremove", parameters); -} - -void ElementDataGridRow::ChangeChildren(int first_row_changed, int num_rows_changed) -{ - for (int i = first_row_changed; i < first_row_changed + num_rows_changed; i++) - children[i]->DirtyCells(); - - Rocket::Core::Dictionary parameters; - parameters.Set("first_row_changed", GetChildTableRelativeIndex(first_row_changed)); - parameters.Set("num_rows_changed", num_rows_changed); - parent_grid->DispatchEvent("rowchange", parameters); -} - -// Returns the number of rows under this row (children, grandchildren, etc) -int ElementDataGridRow::GetNumDescendants() -{ - int num_descendants = (int)children.size(); - - for (size_t i = 0; i < children.size(); i++) - num_descendants += children[i]->GetNumDescendants(); - - return num_descendants; -} - -// Adds the cell contents, and marks the row as loaded. -void ElementDataGridRow::Load(const DataQuery& row_information) -{ - // Check for a data source. If they're both set then we set - // ourselves up with it. - if (row_information.IsFieldSet(DataSource::CHILD_SOURCE)) - { - Rocket::Core::String data_source = row_information.Get< Rocket::Core::String >(DataSource::CHILD_SOURCE, ""); - if (!data_source.Empty()) - { - SetDataSource(data_source); - } - else - { - // If we've no data source, then we should remove any children. - RemoveChildren(); - } - } - - // Now load our cells. - for (int i = 0; i < parent_grid->GetNumColumns(); i++) - { - Core::Element* cell = GetChild(i); - - if (cell) - { - // Fetch the column: - const ElementDataGrid::Column* column = parent_grid->GetColumn(i); - - // Now we use the column's formatter to process the raw data into the - // XML string, and parse that into the actual Core::Elements. If there is - // no formatter, then we just send through the raw text, in CVS form. - Rocket::Core::StringList raw_data; - for (size_t i = 0; i < column->fields.size(); i++) - { - if (column->fields[i] == DataSource::DEPTH) - { - raw_data.push_back(Rocket::Core::String(8, "%d", depth)); - } - else if (column->fields[i] == DataSource::NUM_CHILDREN) - { - raw_data.push_back(Rocket::Core::String(8, "%d", children.size())); - } - else - { - raw_data.push_back(row_information.Get< Rocket::Core::String >(column->fields[i], "")); - } - } - - Rocket::Core::String cell_string; - if (column->formatter) - { - column->formatter->FormatData(cell_string, raw_data); - } - else - { - for (size_t i = 0; i < raw_data.size(); i++) - { - if (i > 0) - { - cell_string.Append(","); - } - cell_string.Append(raw_data[i]); - } - } - - // Remove all the cell's current contents. - while (cell->GetNumChildren(true) > 0) - { - cell->RemoveChild(cell->GetChild(0)); - } - - // Add the new contents to the cell. - Core::Factory::InstanceElementText(cell, cell_string); - - for (size_t i = 0; i < column->fields.size(); ++i) - { - cell->SetClass(column->fields[i], true); - } - } - else - { - ROCKET_ERROR; - } - } - - dirty_cells = false; -} - -// Instantiates the children that haven't been fully loaded yet. -void ElementDataGridRow::LoadChildren(float time_slice) -{ - float start_time = Core::GetSystemInterface()->GetElapsedTime(); - - int data_query_offset = -1; - int data_query_limit = -1; - - // Iterate through the list of children and find the holes of unloaded - // rows. - // - If we find an unloaded element, and we haven't set the offset - // (beginning of the hole), then we've hit a new hole. We set the offset - // to the current index and the limit (size of the hole) to 1. If we've - // found a hole already and we find an unloaded element, then we - // increase the size of the hole. - // - The end of a hole is either a loaded element or the end of the list. - // In either case, we check if we have a hole that's unfilled, and if - // so, we fill it. - bool any_dirty_children = false; - for (size_t i = 0; i < children.size() && (Core::GetSystemInterface()->GetElapsedTime() - start_time) < time_slice; i++) - { - if (children[i]->dirty_cells) - { - any_dirty_children = true; - if (data_query_offset == -1) - { - data_query_offset = (int)i; - data_query_limit = 1; - } - else - { - data_query_limit++; - } - } - else if (children[i]->dirty_children) - { - any_dirty_children = true; - } - - bool end_of_list = i == children.size() - 1; - bool unfilled_hole = data_query_offset != -1; - bool end_of_hole_found = !children[i]->dirty_cells; - - // If this is the last element and we've found no holes (or filled them - // all in) then all our children are loaded. - if (end_of_list && !unfilled_hole) - { - if (!any_dirty_children) - { - dirty_children = false; - } - } - // Otherwise, if we have a hole outstanding and we've either hit the - // end of the list or the end of the hole, fill the hole. - else if (unfilled_hole && (end_of_list || end_of_hole_found)) - { - float load_time_slice = time_slice - (Core::GetSystemInterface()->GetElapsedTime() - start_time); - LoadChildren(data_query_offset, data_query_limit, load_time_slice); - data_query_offset = -1; - data_query_limit = -1; - } - } - - if (children.empty()) - { - dirty_children = false; - } -} - -void ElementDataGridRow::LoadChildren(int first_row_to_load, int num_rows_to_load, Rocket::Core::Time time_slice) -{ - float start_time = Core::GetSystemInterface()->GetElapsedTime(); - - // Now fetch these new children from the data source, pass them - // through each column's data formatter, and add them as our new - // child rows. - Rocket::Core::String column_query = parent_grid->GetAllColumnFields() + "," + DataSource::CHILD_SOURCE; - DataQuery query(data_source, data_table, column_query, first_row_to_load, num_rows_to_load); - - for (int i = 0; i < num_rows_to_load; i++) - { - int index = first_row_to_load + i; - - if (!query.NextRow()) - { - Core::Log::Message(Rocket::Core::Log::LT_WARNING, "Failed to load row %d from data source %s", i, data_table.CString()); - } - - // Now load the child with the row in the query. - children[index]->Load(query); - - if (Core::GetSystemInterface()->GetElapsedTime() - start_time > time_slice) - { - break; - } - } -} - -void ElementDataGridRow::DirtyCells() -{ - dirty_cells = true; - if (parent_row) - { - parent_row->DirtyRow(); - } -} - -void ElementDataGridRow::DirtyRow() -{ - dirty_children = true; - if (parent_row) - { - parent_row->DirtyRow(); - } -} - -// Sets this row's child rows to be visible. -void ElementDataGridRow::Show() -{ - SetProperty("display", "inline-block"); - - if (row_expanded) - { - for (size_t i = 0; i < children.size(); i++) - { - children[i]->Show(); - } - } -} - -// Sets this row's children to be invisible. -void ElementDataGridRow::Hide() -{ - SetProperty("display", "none"); - - for (size_t i = 0; i < children.size(); i++) - { - children[i]->Hide(); - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementForm.cpp b/libs/libRocket/Source/Controls/ElementForm.cpp deleted file mode 100644 index 8203c0db8e1..00000000000 --- a/libs/libRocket/Source/Controls/ElementForm.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementForm.h" -#include "../../Include/Rocket/Core/Dictionary.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Controls/ElementFormControl.h" - -namespace Rocket { -namespace Controls { - -// Constructs a new ElementForm. This should not be called directly; use the Factory instead. -ElementForm::ElementForm(const Rocket::Core::String& tag) : Core::Element(tag) -{ -} - -ElementForm::~ElementForm() -{ -} - -// Submits the form. -void ElementForm::Submit(const Rocket::Core::String& name, const Rocket::Core::String& submit_value) -{ - Rocket::Core::Dictionary values; - if (name.Empty()) - values.Set("submit", submit_value); - else - values.Set(name, submit_value); - - Core::ElementList form_controls; - Core::ElementUtilities::GetElementsByTagName(form_controls, this, "input"); - Core::ElementUtilities::GetElementsByTagName(form_controls, this, "textarea"); - Core::ElementUtilities::GetElementsByTagName(form_controls, this, "select"); - Core::ElementUtilities::GetElementsByTagName(form_controls, this, "dataselect"); - - for (size_t i = 0; i < form_controls.size(); i++) - { - ElementFormControl* control = dynamic_cast< ElementFormControl* >(form_controls[i]); - if (!control) - continue; - - // Skip disabled controls. - if (control->IsDisabled()) - continue; - - // Only process controls that should be submitted. - if (!control->IsSubmitted()) - continue; - - Rocket::Core::String control_name = control->GetName(); - Rocket::Core::String control_value = control->GetValue(); - - // Skip over unnamed form controls. - if (control_name.Empty()) - continue; - - // If the item already exists, append to it. - Rocket::Core::Variant* value = values.Get(control_name); - if (value != NULL) - value->Set(value->Get< Rocket::Core::String >() + ", " + control_value); - else - values.Set< Rocket::Core::String >(control_name, control_value); - } - - DispatchEvent("submit", values); -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementFormControl.cpp b/libs/libRocket/Source/Controls/ElementFormControl.cpp deleted file mode 100644 index 6e9ddee6da5..00000000000 --- a/libs/libRocket/Source/Controls/ElementFormControl.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementFormControl.h" - -namespace Rocket { -namespace Controls { - -ElementFormControl::ElementFormControl(const Rocket::Core::String& tag) : Core::Element(tag) -{ - SetProperty("tab-index", "auto"); -} - -ElementFormControl::~ElementFormControl() -{ -} - -// Returns the name of the form control. -Rocket::Core::String ElementFormControl::GetName() const -{ - return GetAttribute("name", ""); -} - -// Sets the name of the form control. -void ElementFormControl::SetName(const Rocket::Core::String& name) -{ - SetAttribute("name", name); -} - -// Returns if this value should be submitted with the form -bool ElementFormControl::IsSubmitted() -{ - return true; -} - -// Returns the disabled status of the form control. -bool ElementFormControl::IsDisabled() const -{ - return GetAttribute("disabled") != NULL; -} - -// Sets the disabled status of the form control. -void ElementFormControl::SetDisabled(bool disable) -{ - if (disable) - { - SetAttribute("disabled", ""); - Blur(); - } - else - RemoveAttribute("disabled"); -} - -// Checks for changes to the 'disabled' attribute. -void ElementFormControl::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - Core::Element::OnAttributeChange(changed_attributes); - - if (changed_attributes.find("disabled") != changed_attributes.end()) - SetPseudoClass("disabled", IsDisabled()); -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementFormControlDataSelect.cpp b/libs/libRocket/Source/Controls/ElementFormControlDataSelect.cpp deleted file mode 100644 index 3b4ebd6254e..00000000000 --- a/libs/libRocket/Source/Controls/ElementFormControlDataSelect.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementFormControlDataSelect.h" -#include "../../Include/Rocket/Controls/DataQuery.h" -#include "../../Include/Rocket/Controls/DataSource.h" -#include "../../Include/Rocket/Controls/DataFormatter.h" -#include "WidgetDropDown.h" - -namespace Rocket { -namespace Controls { - -// Constructs a new ElementFormControlDataSelect. -ElementFormControlDataSelect::ElementFormControlDataSelect(const Rocket::Core::String& tag) : ElementFormControlSelect(tag) -{ - data_source = NULL; - initialised = false; -} - -ElementFormControlDataSelect::~ElementFormControlDataSelect() -{ - if (data_source != NULL) { - data_source->DetachListener(this); - data_source = NULL; - } -} - -// Sets the data source the control's options are driven from. -void ElementFormControlDataSelect::SetDataSource(const Rocket::Core::String& _data_source) -{ - SetAttribute("source", _data_source); -} - -// If a new data source has been set on the control, this will attach to it and build the initial -// options. -void ElementFormControlDataSelect::OnUpdate() -{ - if (!initialised) - { - initialised = true; - - if (ParseDataSource(data_source, data_table, GetAttribute< Rocket::Core::String >("source", ""))) - { - data_source->AttachListener(this); - BuildOptions(); - } - } -} - -// Checks for changes to the data source or formatting attributes. -void ElementFormControlDataSelect::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - ElementFormControlSelect::OnAttributeChange(changed_attributes); - - if (changed_attributes.find("source") != changed_attributes.end()) - { - if (data_source != NULL) { - data_source->DetachListener(this); - data_source = NULL; - } - - initialised = false; - } - else if (changed_attributes.find("fields") != changed_attributes.end() || - changed_attributes.find("valuefield") != changed_attributes.end() || - changed_attributes.find("formatter") != changed_attributes.end()) - { - BuildOptions(); - } -} - -// Detaches from the data source and rebuilds the options. -void ElementFormControlDataSelect::OnDataSourceDestroy(DataSource* _data_source) -{ - if (data_source == _data_source) - { - data_source->DetachListener(this); - data_source = NULL; - data_table = ""; - - BuildOptions(); - } -} - -// Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowAdd(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& table, int ROCKET_UNUSED_PARAMETER(first_row_added), int ROCKET_UNUSED_PARAMETER(num_rows_added)) -{ - ROCKET_UNUSED(data_source); - ROCKET_UNUSED(first_row_added); - ROCKET_UNUSED(num_rows_added); - - if (table == data_table) - BuildOptions(); -} - -// Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowRemove(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& table, int ROCKET_UNUSED_PARAMETER(first_row_removed), int ROCKET_UNUSED_PARAMETER(num_rows_removed)) -{ - ROCKET_UNUSED(data_source); - ROCKET_UNUSED(first_row_removed); - ROCKET_UNUSED(num_rows_removed); - - if (table == data_table) - BuildOptions(); -} - -// Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowChange(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& table, int ROCKET_UNUSED_PARAMETER(first_row_changed), int ROCKET_UNUSED_PARAMETER(num_rows_changed)) -{ - ROCKET_UNUSED(data_source); - ROCKET_UNUSED(first_row_changed); - ROCKET_UNUSED(num_rows_changed); - - if (table == data_table) - BuildOptions(); -} - -// Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowChange(DataSource* ROCKET_UNUSED_PARAMETER(data_source), const Rocket::Core::String& table) -{ - ROCKET_UNUSED(data_source); - - if (table == data_table) - BuildOptions(); -} - -// Builds the option list from the data source. -void ElementFormControlDataSelect::BuildOptions() -{ - widget->ClearOptions(); - - if (data_source == NULL) - return; - - // Store the old selection value and index. These will be used to restore the selection to the - // most appropriate option after the options have been rebuilt. - Rocket::Core::String old_value = GetValue(); - int old_selection = GetSelection(); - - Rocket::Core::String fields_attribute = GetAttribute("fields", ""); - Rocket::Core::String valuefield_attribute = GetAttribute("valuefield", ""); - Rocket::Core::String data_formatter_attribute = GetAttribute("formatter", ""); - DataFormatter* data_formatter = NULL; - - // Process the attributes. - if (fields_attribute.Empty()) - { - Core::Log::Message(Rocket::Core::Log::LT_ERROR, "DataQuery failed, no fields specified for %s.", GetTagName().CString()); - return; - } - - if (valuefield_attribute.Empty()) - { - valuefield_attribute = fields_attribute.Substring(0, fields_attribute.Find(",")); - } - - if (!data_formatter_attribute.Empty()) - { - data_formatter = DataFormatter::GetDataFormatter(data_formatter_attribute); - if (!data_formatter) - Core::Log::Message(Rocket::Core::Log::LT_WARNING, "Unable to find data formatter named '%s', formatting skipped.", data_formatter_attribute.CString()); - } - - // Build a list of attributes - Rocket::Core::String fields(valuefield_attribute); - fields += ","; - fields += fields_attribute; - - DataQuery query(data_source, data_table, fields); - while (query.NextRow()) - { - Rocket::Core::StringList fields; - Rocket::Core::String value = query.Get(0, ""); - - for (size_t i = 1; i < query.GetNumFields(); ++i) - fields.push_back(query.Get< Rocket::Core::String>(i, "")); - - Rocket::Core::String formatted(""); - if (fields.size() > 0) - formatted = fields[0]; - - if (data_formatter) - data_formatter->FormatData(formatted, fields); - - // Add the data as an option. - widget->AddOption(formatted, value, -1, false); - } - - // If an option was selected before, attempt to restore the selection to it. - if (old_selection > -1) - { - // Try to find a selection with the same value as the previous one. - for (int i = 0; i < GetNumOptions(); ++i) - { - SelectOption* option = GetOption(i); - if (option->GetValue() == old_value) - { - widget->SetSelection(i, true); - return; - } - } - - // Failed to find an option with the same value. Attempt to at least set the same index. - int new_selection = Rocket::Core::Math::Clamp(old_selection, 0, GetNumOptions() - 1); - if (GetNumOptions() == 0) - new_selection = -1; - - widget->SetSelection(new_selection, true); - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementFormControlInput.cpp b/libs/libRocket/Source/Controls/ElementFormControlInput.cpp deleted file mode 100644 index 178532b97f1..00000000000 --- a/libs/libRocket/Source/Controls/ElementFormControlInput.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" -#include "../../Include/Rocket/Core/Event.h" -#include "InputTypeButton.h" -#include "InputTypeCheckbox.h" -#include "InputTypeRadio.h" -#include "InputTypeRange.h" -#include "InputTypeSubmit.h" -#include "InputTypeText.h" - -namespace Rocket { -namespace Controls { - -// Constructs a new ElementFormControlInput. -ElementFormControlInput::ElementFormControlInput(const Rocket::Core::String& tag) : ElementFormControl(tag) -{ - type = NULL; - type = new InputTypeText(this); - type_name = "text"; - SetClass(type_name, true); -} - -ElementFormControlInput::~ElementFormControlInput() -{ - delete type; -} - -// Returns a string representation of the current value of the form control. -Rocket::Core::String ElementFormControlInput::GetValue() const -{ - return type->GetValue(); -} - -// Sets the current value of the form control. -void ElementFormControlInput::SetValue(const Rocket::Core::String& value) -{ - SetAttribute("value", value); -} - -// Returns if this value should be submitted with the form. -bool ElementFormControlInput::IsSubmitted() -{ - return type->IsSubmitted(); -} - -// Updates the element's underlying type. -void ElementFormControlInput::OnUpdate() -{ - type->OnUpdate(); -} - -// Renders the element's underlying type. -void ElementFormControlInput::OnRender() -{ - type->OnRender(); -} - -// Checks for necessary functional changes in the control as a result of changed attributes. -void ElementFormControlInput::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - ElementFormControl::OnAttributeChange(changed_attributes); - - if (changed_attributes.find("type") != changed_attributes.end()) - { - Rocket::Core::String new_type_name = GetAttribute< Rocket::Core::String >("type", "text"); - if (new_type_name != type_name) - { - InputType* new_type = NULL; - - if (new_type_name == "password") - new_type = new InputTypeText(this, Rocket::Controls::InputTypeText::OBSCURED); - else if (new_type_name == "radio") - new_type = new InputTypeRadio(this); - else if (new_type_name == "checkbox") - new_type = new InputTypeCheckbox(this); - else if (new_type_name == "range") - new_type = new InputTypeRange(this); - else if (new_type_name == "submit") - new_type = new InputTypeSubmit(this); - else if (new_type_name == "button") - new_type = new InputTypeButton(this); - else if (type_name == "text") - new_type = new InputTypeText(this); - - if (new_type != NULL) - { - delete type; - type = new_type; - - SetClass(type_name, false); - SetClass(new_type_name, true); - type_name = new_type_name; - - DirtyLayout(); - } - } - } - - if (!type->OnAttributeChange(changed_attributes)) - DirtyLayout(); -} - -// Called when properties on the element are changed. -void ElementFormControlInput::OnPropertyChange(const Core::PropertyNameList& changed_properties) -{ - ElementFormControl::OnPropertyChange(changed_properties); - - if (type != NULL) - type->OnPropertyChange(changed_properties); -} - -// If we are the added element, this will pass the call onto our type handler. -void ElementFormControlInput::OnChildAdd(Rocket::Core::Element* child) -{ - if (child == this) - type->OnChildAdd(); -} - -// If we are the removed element, this will pass the call onto our type handler. -void ElementFormControlInput::OnChildRemove(Rocket::Core::Element* child) -{ - if (child == this) - type->OnChildRemove(); -} - -// Handles the "click" event to toggle the control's checked status. -void ElementFormControlInput::ProcessEvent(Core::Event& event) -{ - ElementFormControl::ProcessEvent(event); - type->ProcessEvent(event); -} - -bool ElementFormControlInput::GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions) -{ - return type->GetIntrinsicDimensions(dimensions); -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementFormControlSelect.cpp b/libs/libRocket/Source/Controls/ElementFormControlSelect.cpp deleted file mode 100644 index 35bef009057..00000000000 --- a/libs/libRocket/Source/Controls/ElementFormControlSelect.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementFormControlSelect.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "WidgetDropDown.h" - -namespace Rocket { -namespace Controls { - -// Constructs a new ElementFormControlSelect. -ElementFormControlSelect::ElementFormControlSelect(const Rocket::Core::String& tag) : ElementFormControl(tag) -{ - widget = new WidgetDropDown(this); -} - -ElementFormControlSelect::~ElementFormControlSelect() -{ - delete widget; -} - -// Returns a string representation of the current value of the form control. -Rocket::Core::String ElementFormControlSelect::GetValue() const -{ - ROCKET_ASSERT(widget != NULL); - return widget->GetValue(); -} - -// Sets the current value of the form control. -void ElementFormControlSelect::SetValue(const Rocket::Core::String& value) -{ - OnUpdate(); - - ROCKET_ASSERT(widget != NULL); - widget->SetValue(value); -} - -// Sets the index of the selection. If the new index lies outside of the bounds, it will be clamped. -void ElementFormControlSelect::SetSelection(int selection) -{ - OnUpdate(); - - ROCKET_ASSERT(widget != NULL); - widget->SetSelection(selection); -} - -// Returns the index of the currently selected item. -int ElementFormControlSelect::GetSelection() const -{ - ROCKET_ASSERT(widget != NULL); - return widget->GetSelection(); -} - -// Returns one of the select control's option elements. -SelectOption* ElementFormControlSelect::GetOption(int index) -{ - OnUpdate(); - - ROCKET_ASSERT(widget != NULL); - return widget->GetOption(index); -} - -// Returns the number of options in the select control. -int ElementFormControlSelect::GetNumOptions() -{ - OnUpdate(); - - ROCKET_ASSERT(widget != NULL); - return widget->GetNumOptions(); -} - -// Adds a new option to the select control. -int ElementFormControlSelect::Add(const Rocket::Core::String& rml, const Rocket::Core::String& value, int before, bool selectable) -{ - OnUpdate(); - - ROCKET_ASSERT(widget != NULL); - return widget->AddOption(rml, value, before, false, selectable); -} - -// Removes an option from the select control. -void ElementFormControlSelect::Remove(int index) -{ - OnUpdate(); - - ROCKET_ASSERT(widget != NULL); - widget->RemoveOption(index); -} - -// Removes all options from the select control. -void ElementFormControlSelect::RemoveAll() -{ - OnUpdate(); - - ROCKET_ASSERT(widget != NULL); - widget->ClearOptions(); -} - -// Moves all children to be under control of the widget. -void ElementFormControlSelect::OnUpdate() -{ - ElementFormControl::OnUpdate(); - - // Move any child elements into the widget (except for the three functional elements). - while (HasChildNodes()) - { - Core::Element* child = GetFirstChild(); - - // Check for a value attribute. - Rocket::Core::String attribute_value = child->GetAttribute("value", ""); - - // Pull the inner RML and add the option. - Rocket::Core::String rml; - child->GetInnerRML(rml); - widget->AddOption(rml, attribute_value, -1, child->GetAttribute("selected") != NULL, child->GetAttribute("unselectable") == NULL); - - RemoveChild(child); - } -} - -// Updates the layout of the widget's elements. -void ElementFormControlSelect::OnRender() -{ - ElementFormControl::OnRender(); - - widget->OnRender(); -} - -// Forces an internal layout. -void ElementFormControlSelect::OnLayout() -{ - widget->OnLayout(); -} - -// Returns true to mark this element as replaced. -bool ElementFormControlSelect::GetIntrinsicDimensions(Rocket::Core::Vector2f& intrinsic_dimensions) -{ - intrinsic_dimensions.x = 128; - intrinsic_dimensions.y = 16; - return true; -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementFormControlTextArea.cpp b/libs/libRocket/Source/Controls/ElementFormControlTextArea.cpp deleted file mode 100644 index 7bee811c7de..00000000000 --- a/libs/libRocket/Source/Controls/ElementFormControlTextArea.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementFormControlTextArea.h" -#include "../../Include/Rocket/Core/Math.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "WidgetTextInputMultiLine.h" - -namespace Rocket { -namespace Controls { - -// Constructs a new ElementFormControlTextArea. -ElementFormControlTextArea::ElementFormControlTextArea(const Rocket::Core::String& tag) : ElementFormControl(tag) -{ - widget = new WidgetTextInputMultiLine(this); - - SetProperty("overflow", "auto"); - SetProperty("white-space", "pre-wrap"); -} - -ElementFormControlTextArea::~ElementFormControlTextArea() -{ - delete widget; -} - -// Returns a string representation of the current value of the form control. -Rocket::Core::String ElementFormControlTextArea::GetValue() const -{ - return GetAttribute< Rocket::Core::String >("value", ""); -} - -// Sets the current value of the form control. -void ElementFormControlTextArea::SetValue(const Rocket::Core::String& value) -{ - SetAttribute("value", value); -} - -// Sets the number of characters visible across the text area. Note that this will only be precise when using a -// fixed-width font. -void ElementFormControlTextArea::SetNumColumns(int num_columns) -{ - SetAttribute< int >("cols", Rocket::Core::Math::Max(1, num_columns)); -} - -// Returns the approximate number of characters visible at once. -int ElementFormControlTextArea::GetNumColumns() const -{ - return GetAttribute< int >("cols", 20); -} - -// Sets the number of visible lines of text in the text area. -void ElementFormControlTextArea::SetNumRows(int num_rows) -{ - SetAttribute< int >("rows", Rocket::Core::Math::Max(1, num_rows)); -} - -// Returns the number of visible lines of text in the text area. -int ElementFormControlTextArea::GetNumRows() const -{ - return GetAttribute< int >("rows", 2); -} - -// Sets the maximum length (in characters) of this text field. -void ElementFormControlTextArea::SetMaxLength(int max_length) -{ - SetAttribute< int >("maxlength", max_length); -} - -// Returns the maximum length (in characters) of this text field. -int ElementFormControlTextArea::GetMaxLength() const -{ - return GetAttribute< int >("maxlength", -1); -} - -// Enables or disables word-wrapping in the text area. -void ElementFormControlTextArea::SetWordWrap(bool word_wrap) -{ - if (word_wrap != GetWordWrap()) - { - if (word_wrap) - RemoveAttribute("wrap"); - else - SetAttribute("wrap", "nowrap"); - } -} - -// Returns the state of word-wrapping in the text area. -bool ElementFormControlTextArea::GetWordWrap() -{ - Rocket::Core::String attribute = GetAttribute< Rocket::Core::String >("wrap", ""); - return attribute != "nowrap"; -} - -// Returns the control's inherent size, based on the length of the input field and the current font size. -bool ElementFormControlTextArea::GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions) -{ - dimensions.x = (float) (GetNumColumns() * Core::ElementUtilities::GetStringWidth(this, "m")); - dimensions.y = (float) (GetNumRows() * Core::ElementUtilities::GetLineHeight(this)); - - return true; -} - -// Updates the control's widget. -void ElementFormControlTextArea::OnUpdate() -{ - widget->OnUpdate(); -} - -// Renders the control's widget. -void ElementFormControlTextArea::OnRender() -{ - widget->OnRender(); -} - -// Formats the element. -void ElementFormControlTextArea::OnLayout() -{ - widget->OnLayout(); -} - -// Called when attributes on the element are changed. -void ElementFormControlTextArea::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - ElementFormControl::OnAttributeChange(changed_attributes); - - if (changed_attributes.find("wrap") != changed_attributes.end()) - { - if (GetWordWrap()) - SetProperty("white-space", "pre-wrap"); - else - SetProperty("white-space", "pre"); - } - - if (changed_attributes.find("rows") != changed_attributes.end() || - changed_attributes.find("cols") != changed_attributes.end()) - DirtyLayout(); - - if (changed_attributes.find("maxlength") != changed_attributes.end()) - widget->SetMaxLength(GetMaxLength()); - - if (changed_attributes.find("value") != changed_attributes.end()) - widget->SetValue(GetValue()); -} - -// Called when properties on the control are changed. -void ElementFormControlTextArea::OnPropertyChange(const Core::PropertyNameList& changed_properties) -{ - ElementFormControl::OnPropertyChange(changed_properties); - - if (changed_properties.find("color") != changed_properties.end() || - changed_properties.find("background-color") != changed_properties.end()) - widget->UpdateSelectionColours(); -} - -// Returns the text content of the element. -void ElementFormControlTextArea::GetInnerRML(Rocket::Core::String& content) const -{ - content = GetValue(); -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementTabSet.cpp b/libs/libRocket/Source/Controls/ElementTabSet.cpp deleted file mode 100644 index 18e3ccf04f6..00000000000 --- a/libs/libRocket/Source/Controls/ElementTabSet.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/ElementTabSet.h" -#include "../../Include/Rocket/Core/Math.h" -#include "../../Include/Rocket/Core/Factory.h" - -namespace Rocket { -namespace Controls { - -ElementTabSet::ElementTabSet(const Rocket::Core::String& tag) : Core::Element(tag) -{ - active_tab = 0; -} - -ElementTabSet::~ElementTabSet() -{ -} - -// Sets the specifed tab index's tab title RML. -void ElementTabSet::SetTab(int tab_index, const Rocket::Core::String& rml) -{ - Core::Element* element = Core::Factory::InstanceElement(NULL, "*", "tab", Rocket::Core::XMLAttributes()); - Core::Factory::InstanceElementText(element, rml); - SetTab(tab_index, element); - element->RemoveReference(); -} - -// Sets the specifed tab index's tab panel RML. -void ElementTabSet::SetPanel(int tab_index, const Rocket::Core::String& rml) -{ - Core::Element* element = Core::Factory::InstanceElement(NULL, "*", "panel", Rocket::Core::XMLAttributes()); - Core::Factory::InstanceElementText(element, rml); - SetPanel(tab_index, element); - element->RemoveReference(); -} - -// Set the specifed tab index's title element. -void ElementTabSet::SetTab(int tab_index, Core::Element* element) -{ - Core::Element* tabs = GetChildByTag("tabs"); - if (tab_index >= 0 && - tab_index < tabs->GetNumChildren()) - tabs->ReplaceChild(GetChild(tab_index), element); - else - tabs->AppendChild(element); -} - -// Set the specified tab index's body element. -void ElementTabSet::SetPanel(int tab_index, Core::Element* element) -{ - // Append the window - Core::Element* windows = GetChildByTag("panels"); - if (tab_index >= 0 && - tab_index < windows->GetNumChildren()) - windows->ReplaceChild(GetChild(tab_index), element); - else - windows->AppendChild(element); -} - -// Remove one of the tab set's panels and its corresponding tab. -void ElementTabSet::RemoveTab(int tab_index) -{ - if (tab_index < 0) - return; - - Core::Element* panels = GetChildByTag("panels"); - Core::Element* tabs = GetChildByTag("tabs"); - - if (panels->GetNumChildren() > tab_index && - tabs->GetNumChildren() > tab_index) - { - panels->RemoveChild(panels->GetChild(tab_index)); - tabs->RemoveChild(tabs->GetChild(tab_index)); - } -} - -// Retrieve the number of tabs in the tabset. -int ElementTabSet::GetNumTabs() -{ - return GetChildByTag("tabs")->GetNumChildren(); -} - -void ElementTabSet::SetActiveTab(int tab_index) -{ - // Update display if the tab has changed - if (tab_index != active_tab) - { - Core::Element* tabs = GetChildByTag("tabs"); - Core::Element* old_tab = tabs->GetChild(active_tab); - Core::Element* new_tab = tabs->GetChild(tab_index); - - if (old_tab) - old_tab->SetPseudoClass("selected", false); - if (new_tab) - new_tab->SetPseudoClass("selected", true); - - Core::Element* windows = GetChildByTag("panels"); - Core::Element* old_window = windows->GetChild(active_tab); - Core::Element* new_window = windows->GetChild(tab_index); - - if (old_window) - old_window->SetProperty("display", "none"); - if (new_window) - new_window->SetProperty("display", "inline-block"); - - active_tab = tab_index; - - Rocket::Core::Dictionary parameters; - parameters.Set("tab_index", active_tab); - DispatchEvent("tabchange", parameters); - } -} - -int ElementTabSet::GetActiveTab() const -{ - return active_tab; -} - -// Process the incoming event. -void ElementTabSet::ProcessEvent(Core::Event& event) -{ - Core::Element::ProcessEvent(event); - - if (event.GetCurrentElement() == this && event == "click") - { - // Find the tab that this click occured on - Core::Element* tabs = GetChildByTag("tabs"); - Core::Element* tab = event.GetTargetElement(); - while (tab && tab != this && tab->GetParentNode() != tabs) - tab = tab->GetParentNode(); - - // Abort if we couldn't find the tab the click occured on - if (!tab || tab == this) - return; - - // Determine the new active tab index - int new_active_tab = active_tab; - for (int i = 0; i < tabs->GetNumChildren(); i++) - { - if (tabs->GetChild(i) == tab) - { - new_active_tab = i; - break; - } - } - - SetActiveTab(new_active_tab); - } -} - -void ElementTabSet::OnChildAdd(Core::Element* child) -{ - Core::Element::OnChildAdd(child); - - if (child->GetParentNode() == GetChildByTag("tabs")) - { - // Set up the new button and append it - child->SetProperty("display", "inline-block"); - child->AddEventListener("click", this); - - if (child->GetParentNode()->GetChild(active_tab) == child) - child->SetPseudoClass("selected", true); - } - - if (child->GetParentNode() == GetChildByTag("panels")) - { - // Hide the new tab window - child->SetProperty("display", "none"); - - // Make the new element visible if its the active tab - if (child->GetParentNode()->GetChild(active_tab) == child) - child->SetProperty("display", "inline-block"); - } -} - -void ElementTabSet::OnChildRemove(Core::Element* child) -{ - Core::Element::OnChildRemove(child); - - // If its a tab, remove its event listener - if (child->GetParentNode() == GetChildByTag("tabs")) - { - child->RemoveEventListener("click", this); - } -} - -Core::Element* ElementTabSet::GetChildByTag(const Rocket::Core::String& tag) -{ - // Look for the existing child - for (int i = 0; i < GetNumChildren(); i++) - { - if (GetChild(i)->GetTagName() == tag) - return GetChild(i); - } - - // If it doesn't exist, create it - Core::Element* element = Core::Factory::InstanceElement(this, "*", tag, Rocket::Core::XMLAttributes()); - AppendChild(element); - element->RemoveReference(); - return element; -} - -void ElementTabSet::OnAttach(Core::Element * ROCKET_UNUSED_PARAMETER(element)) -{ - ROCKET_UNUSED(element); - - AddReference(); -} - -void ElementTabSet::OnDetach(Core::Element * ROCKET_UNUSED_PARAMETER(element)) -{ - ROCKET_UNUSED(element); - - RemoveReference(); -} - - -} -} diff --git a/libs/libRocket/Source/Controls/ElementTextSelection.cpp b/libs/libRocket/Source/Controls/ElementTextSelection.cpp deleted file mode 100644 index e8f6d121b31..00000000000 --- a/libs/libRocket/Source/Controls/ElementTextSelection.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "ElementTextSelection.h" -#include "WidgetTextInput.h" - -namespace Rocket { -namespace Controls { - -ElementTextSelection::ElementTextSelection(const Rocket::Core::String& tag) : Rocket::Core::Element(tag) -{ - widget = NULL; -} - -ElementTextSelection::~ElementTextSelection() -{ -} - -// Set the widget that this selection element was created for. -void ElementTextSelection::SetWidget(WidgetTextInput* _widget) -{ - widget = _widget; -} - -// Processes 'color' and 'background-color' property changes. -void ElementTextSelection::OnPropertyChange(const Rocket::Core::PropertyNameList& changed_properties) -{ - Element::OnPropertyChange(changed_properties); - - if (widget == NULL) - return; - - // Check for a colour change. - if (changed_properties.find("color") != changed_properties.end() || - changed_properties.find("background-color") != changed_properties.end()) - { - widget->UpdateSelectionColours(); - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/ElementTextSelection.h b/libs/libRocket/Source/Controls/ElementTextSelection.h deleted file mode 100644 index a55aa0c4282..00000000000 --- a/libs/libRocket/Source/Controls/ElementTextSelection.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSELEMENTTEXTSELECTION_H -#define ROCKETCONTROLSELEMENTTEXTSELECTION_H - -#include "../../Include/Rocket/Core/Element.h" - -namespace Rocket { -namespace Controls { - -class WidgetTextInput; - -/** - A stub element used by the WidgetTextInput to query the RCSS-specified text colour and - background colour for selected text. - - @author Peter Curry - */ - -class ElementTextSelection : public Core::Element -{ -public: - ElementTextSelection(const Rocket::Core::String& tag); - virtual ~ElementTextSelection(); - - /// Set the widget that this selection element was created for. This is the widget that will be - /// notified when this element's properties are altered. - void SetWidget(WidgetTextInput* widget); - -protected: - /// Processes 'color' and 'background-color' property changes. - virtual void OnPropertyChange(const Rocket::Core::PropertyNameList& changed_properties); - -private: - WidgetTextInput* widget; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/InputType.cpp b/libs/libRocket/Source/Controls/InputType.cpp deleted file mode 100644 index a765f7fb368..00000000000 --- a/libs/libRocket/Source/Controls/InputType.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "InputType.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" - -namespace Rocket { -namespace Controls { - -InputType::InputType(ElementFormControlInput* element) : element(element) -{ -} - -InputType::~InputType() -{ -} - -// Returns a string representation of the current value of the form control. -Rocket::Core::String InputType::GetValue() const -{ - return element->GetAttribute< Rocket::Core::String >("value", ""); -} - -// Returns if this value should be submitted with the form. -bool InputType::IsSubmitted() -{ - return true; -} - -// Called every update from the host element. -void InputType::OnUpdate() -{ -} - -// Called every render from the host element. -void InputType::OnRender() -{ -} - -// Checks for necessary functional changes in the control as a result of changed attributes. -bool InputType::OnAttributeChange(const Core::AttributeNameList& ROCKET_UNUSED_PARAMETER(changed_attributes)) -{ - ROCKET_UNUSED(changed_attributes); - - return true; -} - -// Called when properties on the control are changed. -void InputType::OnPropertyChange(const Core::PropertyNameList& ROCKET_UNUSED_PARAMETER(changed_properties)) -{ - ROCKET_UNUSED(changed_properties); -} - -// Called when the element is added into a hierarchy. -void InputType::OnChildAdd() -{ -} - -// Called when the element is removed from a hierarchy. -void InputType::OnChildRemove() -{ -} - -} -} diff --git a/libs/libRocket/Source/Controls/InputType.h b/libs/libRocket/Source/Controls/InputType.h deleted file mode 100644 index 3ade33a2fba..00000000000 --- a/libs/libRocket/Source/Controls/InputType.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSINPUTTYPE_H -#define ROCKETCONTROLSINPUTTYPE_H - -#include "../../Include/Rocket/Core/String.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Controls { - -class ElementFormControlInput; - -/** - An interface for a input type handler used by ElementFormControlInput. A concrete InputType object handles the - functionality of an input element. - - @author Peter Curry - */ - -class InputType -{ -public: - InputType(ElementFormControlInput* element); - virtual ~InputType(); - - /// Returns a string representation of the current value of the form control. - /// @return The value of the form control. - virtual Rocket::Core::String GetValue() const; - /// Returns if this value should be submitted with the form. - /// @return True if the form control is to be submitted, false otherwise. - virtual bool IsSubmitted(); - - /// Called every update from the host element. - virtual void OnUpdate(); - - /// Called every render from the host element. - virtual void OnRender(); - - /// Checks for necessary functional changes in the control as a result of changed attributes. - /// @param[in] changed_attributes The list of changed attributes. - /// @return True if no layout is required, false if the layout needs to be dirtied. - virtual bool OnAttributeChange(const Core::AttributeNameList& changed_attributes); - /// Called when properties on the control are changed. - /// @param[in] changed_properties The properties changed on the element. - virtual void OnPropertyChange(const Core::PropertyNameList& changed_properties); - - /// Called when the element is added into a hierarchy. - virtual void OnChildAdd(); - /// Called when the element is removed from a hierarchy. - virtual void OnChildRemove(); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event) = 0; - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions) = 0; - -protected: - ElementFormControlInput* element; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/InputTypeButton.cpp b/libs/libRocket/Source/Controls/InputTypeButton.cpp deleted file mode 100644 index cd098458e41..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeButton.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "InputTypeButton.h" -#include "../../Include/Rocket/Controls/ElementForm.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" - -namespace Rocket { -namespace Controls { - -InputTypeButton::InputTypeButton(ElementFormControlInput* element) : InputType(element) -{ - document = NULL; - - // Call OnChildAdd() immediately; if the input element is already part of a document, this will - // attach our listeners to the document so the events can be intercepted. - OnChildAdd(); -} - -InputTypeButton::~InputTypeButton() -{ - // Call OnChildRemove(); in case our element is still attached to a document, this will detach - // our listeners. - OnChildRemove(); -} - -// Buttons are never submitted. -bool InputTypeButton::IsSubmitted() -{ - return false; -} - -// Checks for necessary functional changes in the control as a result of the event. -void InputTypeButton::ProcessEvent(Core::Event& event) -{ - // Stop a click event from proceeding any further if this button is disabled. - if (event.GetTargetElement() == element && - element->IsDisabled() && - (event == "click" || event == "dblclick")) - { - event.StopPropagation(); - } -} - -// Sizes the dimensions to the element's inherent size. -bool InputTypeButton::GetIntrinsicDimensions(Rocket::Core::Vector2f& ROCKET_UNUSED_PARAMETER(dimensions)) -{ - ROCKET_UNUSED(dimensions); - - return false; -} - -// Called when the element is added into a hierarchy. -void InputTypeButton::OnChildAdd() -{ - document = element->GetOwnerDocument(); - if (document == NULL) - return; - - document->AddEventListener("click", this, true); - document->AddEventListener("dblclick", this, true); -} - -// Called when the element is removed from a hierarchy. -void InputTypeButton::OnChildRemove() -{ - if (document != NULL) - { - document->RemoveEventListener("click", this, true); - document->RemoveEventListener("dblclick", this, true); - document = NULL; - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/InputTypeButton.h b/libs/libRocket/Source/Controls/InputTypeButton.h deleted file mode 100644 index a462296164a..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeButton.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSINPUTTYPEBUTTON_H -#define ROCKETCONTROLSINPUTTYPEBUTTON_H - -#include "../../Include/Rocket/Core/EventListener.h" -#include "../../Include/Rocket/Core/ElementDocument.h" -#include "InputType.h" - -namespace Rocket { -namespace Controls { - -/** - A button input type handler. The only functionality a button provides over a normal element is - the ability to be disabled to prevent 'click' events from being propagated any further than the - element's document. - - @author Peter Curry - */ - -class InputTypeButton : public InputType, public Core::EventListener -{ -public: - InputTypeButton(ElementFormControlInput* element); - virtual ~InputTypeButton(); - - /// Returns if this value should be submitted with the form. - /// @return True if the form control is to be submitted, false otherwise. - virtual bool IsSubmitted(); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); - - // Called when the element is added into a hierarchy. - virtual void OnChildAdd(); - /// Called when the element is removed from a hierarchy. - virtual void OnChildRemove(); - -private: - Core::ElementDocument* document; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/InputTypeCheckbox.cpp b/libs/libRocket/Source/Controls/InputTypeCheckbox.cpp deleted file mode 100644 index 664547a7f6d..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeCheckbox.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "InputTypeCheckbox.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" - -namespace Rocket { -namespace Controls { - -InputTypeCheckbox::InputTypeCheckbox(ElementFormControlInput* element) : InputType(element) -{ -} - -InputTypeCheckbox::~InputTypeCheckbox() -{ -} - -// Returns if this value should be submitted with the form. -bool InputTypeCheckbox::IsSubmitted() -{ - return element->HasAttribute("checked"); -} - -// Checks for necessary functional changes in the control as a result of changed attributes. -bool InputTypeCheckbox::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - // Check if maxlength has been defined. - if (changed_attributes.find("checked") != changed_attributes.end()) - { - bool checked = element->HasAttribute("checked"); - element->SetPseudoClass("checked", checked); - - Rocket::Core::Dictionary parameters; - parameters.Set("value", Rocket::Core::String(checked ? GetValue() : "")); - element->DispatchEvent("change", parameters); - } - - return true; -} - -// Checks for necessary functional changes in the control as a result of the event. -void InputTypeCheckbox::ProcessEvent(Core::Event& event) -{ - if (event == "click" && - !element->IsDisabled()) - { - if (element->HasAttribute("checked")) - element->RemoveAttribute("checked"); - else - element->SetAttribute("checked", ""); - } -} - -// Sizes the dimensions to the element's inherent size. -bool InputTypeCheckbox::GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions) -{ - dimensions.x = 16; - dimensions.y = 16; - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Controls/InputTypeCheckbox.h b/libs/libRocket/Source/Controls/InputTypeCheckbox.h deleted file mode 100644 index 9b9bcee11b4..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeCheckbox.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSINPUTTYPECHECKBOX_H -#define ROCKETCONTROLSINPUTTYPECHECKBOX_H - -#include "InputType.h" - -namespace Rocket { -namespace Controls { - -/** - A checkbox input type handler. - - @author Peter Curry - */ - -class InputTypeCheckbox : public InputType -{ -public: - InputTypeCheckbox(ElementFormControlInput* element); - virtual ~InputTypeCheckbox(); - - /// Returns if this value should be submitted with the form. - /// @return True if the form control is to be submitted, false otherwise. - virtual bool IsSubmitted(); - - /// Checks for necessary functional changes in the control as a result of changed attributes. - /// @param[in] changed_attributes The list of changed attributes. - /// @return True if no layout is required, false if the layout needs to be dirtied. - virtual bool OnAttributeChange(const Core::AttributeNameList& changed_attributes); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/InputTypeRadio.cpp b/libs/libRocket/Source/Controls/InputTypeRadio.cpp deleted file mode 100644 index fc39352c33c..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeRadio.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "InputTypeRadio.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Controls/ElementForm.h" - -namespace Rocket { -namespace Controls { - -InputTypeRadio::InputTypeRadio(ElementFormControlInput* element) : InputType(element) -{ - if (element->HasAttribute("checked")) - PopRadioSet(); -} - -InputTypeRadio::~InputTypeRadio() -{ -} - -// Returns if this value should be submitted with the form. -bool InputTypeRadio::IsSubmitted() -{ - return element->HasAttribute("checked"); -} - -// Checks for necessary functional changes in the control as a result of changed attributes. -bool InputTypeRadio::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - // Check if maxlength has been defined. - if (changed_attributes.find("checked") != changed_attributes.end()) - { - bool checked = element->HasAttribute("checked"); - element->SetPseudoClass("checked", checked); - - if (checked) - PopRadioSet(); - - Rocket::Core::Dictionary parameters; - parameters.Set("value", Rocket::Core::String(checked ? GetValue() : "")); - element->DispatchEvent("change", parameters); - } - - return true; -} - -// Pops the element's radio set if we are checked. -void InputTypeRadio::OnChildAdd() -{ - if (element->HasAttribute("checked")) - PopRadioSet(); -} - -// Checks for necessary functional changes in the control as a result of the event. -void InputTypeRadio::ProcessEvent(Core::Event& event) -{ - if (event == "click" && - !element->IsDisabled()) - element->SetAttribute("checked", ""); -} - -// Sizes the dimensions to the element's inherent size. -bool InputTypeRadio::GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions) -{ - dimensions.x = 16; - dimensions.y = 16; - - return true; -} - -// Pops all other radio buttons in our form that share our name. -void InputTypeRadio::PopRadioSet() -{ - // Uncheck all other radio buttons with our name in the form. - ElementForm* form = NULL; - Core::Element* parent = element->GetParentNode(); - while (parent != NULL && - (form = dynamic_cast< ElementForm* >(parent)) == NULL) - parent = parent->GetParentNode(); - - if (form != NULL) - { - Core::ElementList form_controls; - Core::ElementUtilities::GetElementsByTagName(form_controls, form, "input"); - - for (size_t i = 0; i < form_controls.size(); ++i) - { - ElementFormControlInput* radio_control = dynamic_cast< ElementFormControlInput* >(form_controls[i]); - if (radio_control != NULL && - element != radio_control && - radio_control->GetAttribute< Rocket::Core::String >("type", "text") == "radio" && - radio_control->GetName() == element->GetName()) - { - radio_control->RemoveAttribute("checked"); - } - } - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/InputTypeRadio.h b/libs/libRocket/Source/Controls/InputTypeRadio.h deleted file mode 100644 index d7ee124a3a0..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeRadio.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSINPUTTYPERADIO_H -#define ROCKETCONTROLSINPUTTYPERADIO_H - -#include "InputType.h" - -namespace Rocket { -namespace Controls { - -/** - A radio button input type handler. - - @author Peter Curry - */ - -class InputTypeRadio : public InputType -{ -public: - InputTypeRadio(ElementFormControlInput* element); - virtual ~InputTypeRadio(); - - /// Returns if this value should be submitted with the form. - /// @return True if the form control is to be submitted, false otherwise. - virtual bool IsSubmitted(); - - /// Checks for necessary functional changes in the control as a result of changed attributes. - /// @param[in] changed_attributes The list of changed attributes. - /// @return True if no layout is required, false if the layout needs to be dirtied. - virtual bool OnAttributeChange(const Core::AttributeNameList& changed_attributes); - - /// Pops the element's radio set if we are checked. - virtual void OnChildAdd(); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); - -private: - /// Pops all other radio buttons in our form that share our name. - void PopRadioSet(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/InputTypeRange.cpp b/libs/libRocket/Source/Controls/InputTypeRange.cpp deleted file mode 100644 index e8f638a3a6c..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeRange.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "InputTypeRange.h" -#include "WidgetSliderInput.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" - -namespace Rocket { -namespace Controls { - -InputTypeRange::InputTypeRange(ElementFormControlInput* element) : InputType(element) -{ - widget = new WidgetSliderInput(element); - widget->Initialise(); -} - -InputTypeRange::~InputTypeRange() -{ - delete widget; -} - -// Returns a string representation of the current value of the form control. -Rocket::Core::String InputTypeRange::GetValue() const -{ - return Rocket::Core::String(32, "%f", widget->GetValue()); -} - -// Called every update from the host element. -void InputTypeRange::OnUpdate() -{ - widget->Update(); -} - -// Checks for necessary functional changes in the control as a result of changed attributes. -bool InputTypeRange::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - bool dirty_layout = false; - - // Check if maxlength has been defined. - if (changed_attributes.find("orientation") != changed_attributes.end()) - { - widget->SetOrientation(element->GetAttribute< Rocket::Core::String >("orientation", "horizontal") == "horizontal" ? WidgetSliderInput::HORIZONTAL : WidgetSliderInput::VERTICAL); - dirty_layout = true; - } - - // Check if size has been defined. - if (changed_attributes.find("step") != changed_attributes.end()) - widget->SetStep(element->GetAttribute< float >("step", 1.0f)); - - // Check if min has been defined. - if (changed_attributes.find("min") != changed_attributes.end()) - widget->SetMinValue(element->GetAttribute< float >("min", 0.0f)); - - // Check if max has been defined. - if (changed_attributes.find("max") != changed_attributes.end()) - widget->SetMaxValue(element->GetAttribute< float >("max", 100.0f)); - - // Check if the value has been changed. - if (changed_attributes.find("value") != changed_attributes.end()) - widget->SetValue(element->GetAttribute< float >("value", 0.0f)); - - return !dirty_layout; -} - -// Checks for necessary functional changes in the control as a result of the event. -void InputTypeRange::ProcessEvent(Core::Event& event) -{ - if (event == "resize" && - event.GetTargetElement() == element) - { - widget->FormatElements(); - } -} - -// Sizes the dimensions to the element's inherent size. -bool InputTypeRange::GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions) -{ - widget->GetDimensions(dimensions); - return true; -} - -} -} diff --git a/libs/libRocket/Source/Controls/InputTypeRange.h b/libs/libRocket/Source/Controls/InputTypeRange.h deleted file mode 100644 index 5514e77cee6..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeRange.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSINPUTTYPERANGE_H -#define ROCKETCONTROLSINPUTTYPERANGE_H - -#include "InputType.h" - -namespace Rocket { -namespace Controls { - -class WidgetSliderInput; - -/** - A range input type handler. - - @author Peter Curry - */ - -class InputTypeRange : public InputType -{ -public: - InputTypeRange(ElementFormControlInput* element); - virtual ~InputTypeRange(); - - /// Returns a string representation of the current value of the form control. - /// @return The value of the form control. - virtual Rocket::Core::String GetValue() const; - - /// Called every update from the host element. - virtual void OnUpdate(); - - /// Checks for necessary functional changes in the control as a result of changed attributes. - /// @param[in] changed_attributes The list of changed attributes. - /// @return True if no layout is required, false if the layout needs to be dirtied. - virtual bool OnAttributeChange(const Core::AttributeNameList& changed_attributes); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); - -private: - WidgetSliderInput* widget; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/InputTypeSubmit.cpp b/libs/libRocket/Source/Controls/InputTypeSubmit.cpp deleted file mode 100644 index 6a1fb81c4eb..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeSubmit.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "InputTypeSubmit.h" -#include "../../Include/Rocket/Controls/ElementForm.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" - -namespace Rocket { -namespace Controls { - -InputTypeSubmit::InputTypeSubmit(ElementFormControlInput* element) : InputType(element) -{ -} - -InputTypeSubmit::~InputTypeSubmit() -{ -} - -// Submit buttons are never submitted; they submit themselves if appropriate. -bool InputTypeSubmit::IsSubmitted() -{ - return false; -} - -// Checks for necessary functional changes in the control as a result of the event. -void InputTypeSubmit::ProcessEvent(Core::Event& event) -{ - if (event == "click" && - !element->IsDisabled()) - { - Core::Element* parent = element->GetParentNode(); - while (parent) - { - ElementForm* form = dynamic_cast< ElementForm* >(parent); - if (form != NULL) - { - form->Submit(element->GetAttribute< Rocket::Core::String >("name", ""), element->GetAttribute< Rocket::Core::String >("value", "")); - return; - } - else - { - parent = parent->GetParentNode(); - } - } - } -} - -// Sizes the dimensions to the element's inherent size. -bool InputTypeSubmit::GetIntrinsicDimensions(Rocket::Core::Vector2f& ROCKET_UNUSED_PARAMETER(dimensions)) -{ - ROCKET_UNUSED(dimensions); - - return false; -} - -} -} diff --git a/libs/libRocket/Source/Controls/InputTypeSubmit.h b/libs/libRocket/Source/Controls/InputTypeSubmit.h deleted file mode 100644 index e395aa47f9a..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeSubmit.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSINPUTTYPESUBMIT_H -#define ROCKETCONTROLSINPUTTYPESUBMIT_H - -#include "InputType.h" - -namespace Rocket { -namespace Controls { - -/** - A submit input type handler. - - @author Peter Curry - */ - -class InputTypeSubmit : public InputType -{ -public: - InputTypeSubmit(ElementFormControlInput* element); - virtual ~InputTypeSubmit(); - - /// Returns if this value should be submitted with the form. - /// @return True if the form control is to be submitted, false otherwise. - virtual bool IsSubmitted(); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/InputTypeText.cpp b/libs/libRocket/Source/Controls/InputTypeText.cpp deleted file mode 100644 index dc11878740b..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeText.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "InputTypeText.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "WidgetTextInputSingleLine.h" -#include "WidgetTextInputSingleLinePassword.h" -#include "../../Include/Rocket/Controls/ElementFormControlInput.h" - -namespace Rocket { -namespace Controls { - -InputTypeText::InputTypeText(ElementFormControlInput* element, Visibility visibility) : InputType(element) -{ - if (visibility == VISIBLE) - widget = new WidgetTextInputSingleLine(element); - else - widget = new WidgetTextInputSingleLinePassword(element); - - widget->SetMaxLength(element->GetAttribute< int >("maxlength", -1)); - widget->SetValue(element->GetAttribute< Rocket::Core::String >("value", "")); - - size = element->GetAttribute< int >("size", 20); -} - -InputTypeText::~InputTypeText() -{ - delete widget; -} - -// Called every update from the host element. -void InputTypeText::OnUpdate() -{ - widget->OnUpdate(); -} - -// Called every render from the host element. -void InputTypeText::OnRender() -{ - widget->OnRender(); -} - -// Checks for necessary functional changes in the control as a result of changed attributes. -bool InputTypeText::OnAttributeChange(const Core::AttributeNameList& changed_attributes) -{ - bool dirty_layout = false; - - // Check if maxlength has been defined. - if (changed_attributes.find("maxlength") != changed_attributes.end()) - widget->SetMaxLength(element->GetAttribute< int >("maxlength", -1)); - - // Check if size has been defined. - if (changed_attributes.find("size") != changed_attributes.end()) - { - size = element->GetAttribute< int >("size", 20); - dirty_layout = true; - } - - // Check if the value has been changed. - if (changed_attributes.find("value") != changed_attributes.end()) - widget->SetValue(element->GetAttribute< Rocket::Core::String >("value", "")); - - return !dirty_layout; -} - -// Called when properties on the control are changed. -void InputTypeText::OnPropertyChange(const Core::PropertyNameList& changed_properties) -{ - if (changed_properties.find("color") != changed_properties.end() || - changed_properties.find("background-color") != changed_properties.end()) - widget->UpdateSelectionColours(); -} - -// Checks for necessary functional changes in the control as a result of the event. -void InputTypeText::ProcessEvent(Core::Event& ROCKET_UNUSED_PARAMETER(event)) -{ - ROCKET_UNUSED(event); -} - -// Sizes the dimensions to the element's inherent size. -bool InputTypeText::GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions) -{ - dimensions.x = (float) (size * Core::ElementUtilities::GetStringWidth(element, "m")); - dimensions.y = (float) Core::ElementUtilities::GetLineHeight(element) + 2; - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Controls/InputTypeText.h b/libs/libRocket/Source/Controls/InputTypeText.h deleted file mode 100644 index 96b61fcc848..00000000000 --- a/libs/libRocket/Source/Controls/InputTypeText.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSINPUTTYPETEXT_H -#define ROCKETCONTROLSINPUTTYPETEXT_H - -#include "InputType.h" - -namespace Rocket { -namespace Controls { - -class WidgetTextInput; - -/** - A single-line input type handler. - - @author Peter Curry - */ - -class InputTypeText : public InputType -{ -public: - enum Visibility - { - VISIBLE, - OBSCURED - }; - - InputTypeText(ElementFormControlInput* element, Visibility visibility = VISIBLE); - virtual ~InputTypeText(); - - /// Called every update from the host element. - virtual void OnUpdate(); - - /// Called every render from the host element. - virtual void OnRender(); - - /// Checks for necessary functional changes in the control as a result of changed attributes. - /// @param[in] changed_attributes The list of changed attributes. - /// @return True if no layout is required, false if the layout needs to be dirtied. - virtual bool OnAttributeChange(const Core::AttributeNameList& changed_attributes); - /// Called when properties on the control are changed. - /// @param[in] changed_properties The properties changed on the element. - virtual void OnPropertyChange(const Core::PropertyNameList& changed_properties); - - /// Checks for necessary functional changes in the control as a result of the event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Sizes the dimensions to the element's inherent size. - /// @return True. - virtual bool GetIntrinsicDimensions(Rocket::Core::Vector2f& dimensions); - -private: - int size; - - WidgetTextInput* widget; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/Lua/As.h b/libs/libRocket/Source/Controls/Lua/As.h deleted file mode 100644 index a523307c6dd..00000000000 --- a/libs/libRocket/Source/Controls/Lua/As.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAAS_H -#define ROCKETCONTROLSLUAAS_H -/* - These are helper functions to fill up the Element.As table with types that are able to be casted -*/ - -#include -#include -#include - -namespace Rocket { -namespace Controls { -namespace Lua { - -//Helper function for the controls, so that the types don't have to define individual functions themselves -// to fill the Elements.As table -template -int CastFromElementTo(lua_State* L) -{ - Rocket::Core::Element* ele = Rocket::Core::Lua::LuaType::check(L,1); - LUACHECKOBJ(ele); - Rocket::Core::Lua::LuaType::push(L,(ToType*)ele,false); - return 1; -} - -//Adds to the Element.As table the name of the type, and the function to use to cast -template -void AddCastFunctionToElementAsTable(lua_State* L) -{ - int top = lua_gettop(L); - lua_getglobal(L,"Element"); - lua_getfield(L,-1,"As"); - if(!lua_isnoneornil(L,-1)) - { - lua_pushcfunction(L,Rocket::Controls::Lua::CastFromElementTo); - lua_setfield(L,-2,Rocket::Core::Lua::GetTClassName()); - } - lua_settop(L,top); //pop "As" and "Element" -} - -} -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/Lua/Controls.cpp b/libs/libRocket/Source/Controls/Lua/Controls.cpp deleted file mode 100644 index 02da56ff0ab..00000000000 --- a/libs/libRocket/Source/Controls/Lua/Controls.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include -#include -#include -#include -#include -#include "SelectOptionsProxy.h" -#include "DataFormatter.h" -#include "DataSource.h" -#include "ElementForm.h" -#include "ElementFormControl.h" -#include "ElementFormControlSelect.h" -#include "ElementFormControlDataSelect.h" -#include "ElementFormControlInput.h" -#include "ElementFormControlTextArea.h" -#include "ElementDataGrid.h" -#include "ElementDataGridRow.h" -#include "ElementTabSet.h" - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//This will define all of the types from RocketControls for Lua. There is not a -//corresponding function for types of RocketCore, because they are defined automatically -//when the Interpreter starts. -void RegisterTypes(lua_State* L) -{ - if(Rocket::Core::Lua::Interpreter::GetLuaState() == NULL) - { - Rocket::Core::Log::Message(Rocket::Core::Log::LT_ERROR, - "In Rocket::Controls::Lua::RegisterTypes: Tried to register the \'Controls\' types for Lua without first initializing the Interpreter."); - return; - } - LuaType::Register(L); - LuaType::Register(L); - //Inherits from ElementFormControl - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - //proxy tables - LuaType::Register(L); -} - -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/DataFormatter.cpp b/libs/libRocket/Source/Controls/Lua/DataFormatter.cpp deleted file mode 100644 index 4580b9c4422..00000000000 --- a/libs/libRocket/Source/Controls/Lua/DataFormatter.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DataFormatter.h" - - -using Rocket::Core::Log; -namespace Rocket { -namespace Controls { -namespace Lua { -//method -int DataFormatternew(lua_State* L) -{ - DataFormatter* df; - int ref = LUA_NOREF; - int top = lua_gettop(L); - if(top == 0) - df = new DataFormatter(); - else if (top > 0) //at least one element means at least a name - { - if(top > 1) //if a function as well - { - if(lua_type(L,2) != LUA_TFUNCTION) - { - Log::Message(Log::LT_ERROR, "Lua: In DataFormatter.new, the second argument MUST be a function (or not exist). You passed in a %s.", lua_typename(L,lua_type(L,2))); - } - else //if it is a function - { - LuaDataFormatter::PushDataFormatterFunctionTable(L); - lua_pushvalue(L,2); //re-push the function so it is on the top of the stack - ref = luaL_ref(L,-2); - lua_pop(L,1); //pop the function table - } - } - df = new DataFormatter(luaL_checkstring(L,1)); - df->ref_FormatData = ref; //will either be valid or LUA_NOREF - } - LuaType::push(L,df,true); - return 1; -} - -//setter -int DataFormatterSetAttrFormatData(lua_State* L) -{ - DataFormatter* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int ref = LUA_NOREF; - if(lua_type(L,2) != LUA_TFUNCTION) - { - Log::Message(Log::LT_ERROR, "Lua: Setting DataFormatter.FormatData, the value must be a function. You passed in a %s.", lua_typename(L,lua_type(L,2))); - } - else //if it is a function - { - LuaDataFormatter::PushDataFormatterFunctionTable(L); - lua_pushvalue(L,2); //re-push the function so it is on the top of the stack - ref = luaL_ref(L,-2); - lua_pop(L,1); //pop the function table - } - obj->ref_FormatData = ref; - return 0; -} - -Rocket::Core::Lua::RegType DataFormatterMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg DataFormatterGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg DataFormatterSetters[] = -{ - LUASETTER(DataFormatter,FormatData) - { NULL, NULL }, -}; - -} -} -} - -namespace Rocket { -namespace Core { -namespace Lua { -using Rocket::Controls::Lua::DataFormatter; -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,Rocket::Controls::Lua::DataFormatternew); - lua_setfield(L,metatable_index-1,"new"); - return; -} -LUACONTROLSTYPEDEFINE(DataFormatter,false) -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/DataFormatter.h b/libs/libRocket/Source/Controls/Lua/DataFormatter.h deleted file mode 100644 index e7854313c7b..00000000000 --- a/libs/libRocket/Source/Controls/Lua/DataFormatter.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUADATAFORMATTER_H -#define ROCKETCONTROLSLUADATAFORMATTER_H - - -#include -#include -#include "LuaDataFormatter.h" - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { -typedef LuaDataFormatter DataFormatter; -//method -int DataFormatternew(lua_State* L); - -//setter -int DataFormatterSetAttrFormatData(lua_State* L); - -extern Rocket::Core::Lua::RegType DataFormatterMethods[]; -extern luaL_Reg DataFormatterGetters[]; -extern luaL_Reg DataFormatterSetters[]; -} -} -} -//for DataFormatter.new -namespace Rocket { namespace Core { namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::Lua::DataFormatter) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/DataSource.cpp b/libs/libRocket/Source/Controls/Lua/DataSource.cpp deleted file mode 100644 index a226520161c..00000000000 --- a/libs/libRocket/Source/Controls/Lua/DataSource.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DataSource.h" -#include - -using Rocket::Core::Log; - -namespace Rocket { -namespace Controls { -namespace Lua { -typedef LuaDataSource DataSource; - -int DataSourcenew(lua_State* L) -{ - const char* name = luaL_checkstring(L,1); - LuaDataSource* ds = new LuaDataSource(name); - LuaType::push(L,ds,true); - return 1; -} - -int DataSourceNotifyRowAdd(lua_State* L, DataSource* obj) -{ - LUACHECKOBJ(obj); - const char* table_name = luaL_checkstring(L,1); - int first_row_added = luaL_checkinteger(L,2); - int num_rows_added = luaL_checkinteger(L,3); - obj->NotifyRowAdd(table_name,first_row_added,num_rows_added); - return 0; -} - -int DataSourceNotifyRowRemove(lua_State* L, DataSource* obj) -{ - LUACHECKOBJ(obj); - const char* table_name = luaL_checkstring(L,1); - int first_row_removed = luaL_checkinteger(L,2); - int num_rows_removed = luaL_checkinteger(L,3); - obj->NotifyRowRemove(table_name,first_row_removed,num_rows_removed); - return 0; -} - -int DataSourceNotifyRowChange(lua_State* L, DataSource* obj) -{ - LUACHECKOBJ(obj); - const char* table_name = luaL_checkstring(L,1); - if(lua_gettop(L) < 2) - { - obj->NotifyRowChange(table_name); - } - else - { - int first_row_changed = luaL_checkinteger(L,2); - int num_rows_changed = luaL_checkinteger(L,3); - obj->NotifyRowChange(table_name,first_row_changed,num_rows_changed); - } - return 0; -} - -int DataSourceSetAttrGetNumRows(lua_State* L) -{ - DataSource* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - if(lua_type(L,2) == LUA_TFUNCTION) - { - lua_pushvalue(L,2); //copy of the function, so it is for sure at the top of the stack - obj->getNumRowsRef = luaL_ref(L, LUA_REGISTRYINDEX); - } - else - Log::Message(Log::LT_WARNING, "Lua: Must assign DataSource.GetNumRows as a function, value received was of %s type", lua_typename(L,2)); - return 0; -} - -int DataSourceSetAttrGetRow(lua_State* L) -{ - DataSource* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - if(lua_type(L,2) == LUA_TFUNCTION) - { - lua_pushvalue(L,2); //copy of the functions, so it is for sure at the top of the stack - obj->getRowRef = luaL_ref(L, LUA_REGISTRYINDEX); - } - else - Log::Message(Log::LT_WARNING, "Lua: Must assign DataSource.GetRow as a function, value received was of %s type", lua_typename(L,2)); - return 0; -} - - -Rocket::Core::Lua::RegType DataSourceMethods[] = -{ - LUAMETHOD(DataSource,NotifyRowAdd) - LUAMETHOD(DataSource,NotifyRowRemove) - LUAMETHOD(DataSource,NotifyRowChange) - { NULL, NULL }, -}; - -luaL_Reg DataSourceGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg DataSourceSetters[] = -{ - LUASETTER(DataSource,GetNumRows) - LUASETTER(DataSource,GetRow) - { NULL, NULL }, -}; - - - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,Rocket::Controls::Lua::DataSourcenew); - lua_setfield(L,metatable_index-1,"new"); - return; -} -using Rocket::Controls::Lua::DataSource; -LUACONTROLSTYPEDEFINE(DataSource,false) -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/DataSource.h b/libs/libRocket/Source/Controls/Lua/DataSource.h deleted file mode 100644 index 97744fe1aeb..00000000000 --- a/libs/libRocket/Source/Controls/Lua/DataSource.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUADATASOURCE_H -#define ROCKETCONTROLSLUADATASOURCE_H - -#include -#include -#include "LuaDataSource.h" - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { -typedef LuaDataSource DataSource; - -int DataSourcenew(lua_State* L); - -int DataSourceNotifyRowAdd(lua_State* L, DataSource* obj); -int DataSourceNotifyRowRemove(lua_State* L, DataSource* obj); -int DataSourceNotifyRowChange(lua_State* L, DataSource* obj); - -int DataSourceSetAttrGetNumRows(lua_State* L); -int DataSourceSetAttrGetRow(lua_State* L); - -extern Rocket::Core::Lua::RegType DataSourceMethods[]; -extern luaL_Reg DataSourceGetters[]; -extern luaL_Reg DataSourceSetters[]; - - - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::Lua::DataSource) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementDataGrid.cpp b/libs/libRocket/Source/Controls/Lua/ElementDataGrid.cpp deleted file mode 100644 index 11a8dc6369b..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementDataGrid.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementDataGrid.h" -#include -#include -#include - - -namespace Rocket { -namespace Controls { -namespace Lua { - - -//methods -int ElementDataGridAddColumn(lua_State* L, ElementDataGrid* obj) -{ - LUACHECKOBJ(obj); - const char* fields = luaL_checkstring(L,1); - const char* formatter = luaL_checkstring(L,2); - float width = (float)luaL_checknumber(L,3); - const char* rml = luaL_checkstring(L,4); - - obj->AddColumn(fields,formatter,width,rml); - return 0; -} - -int ElementDataGridSetDataSource(lua_State* L, ElementDataGrid* obj) -{ - LUACHECKOBJ(obj); - const char* source = luaL_checkstring(L,1); - - obj->SetDataSource(source); - return 0; -} - - -//getter -int ElementDataGridGetAttrrows(lua_State* L) -{ - ElementDataGrid* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - - lua_newtable(L); - int tbl = lua_gettop(L); - int numrows = obj->GetNumRows(); - ElementDataGridRow* row; - for(int i = 0; i < numrows; i++) - { - row = obj->GetRow(i); - LuaType::push(L,row,false); - lua_rawseti(L,tbl,i); - } - return 1; -} - - - -Rocket::Core::Lua::RegType ElementDataGridMethods[] = -{ - LUAMETHOD(ElementDataGrid,AddColumn) - LUAMETHOD(ElementDataGrid,SetDataSource) - { NULL, NULL }, -}; - -luaL_Reg ElementDataGridGetters[] = -{ - LUAGETTER(ElementDataGrid,rows) - { NULL, NULL }, -}; - -luaL_Reg ElementDataGridSetters[] = -{ - { NULL, NULL }, -}; - - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} -using Rocket::Controls::ElementDataGrid; -LUACONTROLSTYPEDEFINE(ElementDataGrid,true) -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/ElementDataGrid.h b/libs/libRocket/Source/Controls/Lua/ElementDataGrid.h deleted file mode 100644 index 072c356c06b..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementDataGrid.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTDATAGRID_H -#define ROCKETCONTROLSLUAELEMENTDATAGRID_H - - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//methods -int ElementDataGridAddColumn(lua_State* L, ElementDataGrid* obj); -int ElementDataGridSetDataSource(lua_State* L, ElementDataGrid* obj); - -//getter -int ElementDataGridGetAttrrows(lua_State* L); - - -extern Rocket::Core::Lua::RegType ElementDataGridMethods[]; -extern luaL_Reg ElementDataGridGetters[]; -extern luaL_Reg ElementDataGridSetters[]; - - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//this will be used to "inherit" from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementDataGrid) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementDataGridRow.cpp b/libs/libRocket/Source/Controls/Lua/ElementDataGridRow.cpp deleted file mode 100644 index bc56e9d8dd3..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementDataGridRow.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementDataGridRow.h" -#include -#include - - -namespace Rocket { -namespace Controls { -namespace Lua { - - -//getters -int ElementDataGridRowGetAttrrow_expanded(lua_State* L) -{ - ElementDataGridRow* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushboolean(L,obj->IsRowExpanded()); - return 1; -} - -int ElementDataGridRowGetAttrparent_relative_index(lua_State* L) -{ - ElementDataGridRow* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetParentRelativeIndex()); - return 1; -} - -int ElementDataGridRowGetAttrtable_relative_index(lua_State* L) -{ - ElementDataGridRow* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetTableRelativeIndex()); - return 1; -} - -int ElementDataGridRowGetAttrparent_row(lua_State* L) -{ - ElementDataGridRow* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - LuaType::push(L,obj->GetParentRow(),false); - return 1; -} - -int ElementDataGridRowGetAttrparent_grid(lua_State* L) -{ - ElementDataGridRow* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - LuaType::push(L,obj->GetParentGrid(),false); - return 1; -} - - -//setter -int ElementDataGridRowSetAttrrow_expanded(lua_State* L) -{ - ElementDataGridRow* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - bool expanded = CHECK_BOOL(L,2); - if(expanded) - obj->ExpandRow(); - else - obj->CollapseRow(); - return 0; -} - - - -Rocket::Core::Lua::RegType ElementDataGridRowMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementDataGridRowGetters[] = -{ - LUAGETTER(ElementDataGridRow,row_expanded) - LUAGETTER(ElementDataGridRow,parent_relative_index) - LUAGETTER(ElementDataGridRow,table_relative_index) - LUAGETTER(ElementDataGridRow,parent_row) - LUAGETTER(ElementDataGridRow,parent_grid) - { NULL, NULL }, -}; - -luaL_Reg ElementDataGridRowSetters[] = -{ - LUASETTER(ElementDataGridRow,row_expanded) - { NULL, NULL }, -}; - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} -using Rocket::Controls::ElementDataGridRow; -LUACONTROLSTYPEDEFINE(ElementDataGridRow,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Controls/Lua/ElementDataGridRow.h b/libs/libRocket/Source/Controls/Lua/ElementDataGridRow.h deleted file mode 100644 index 43fe64c1986..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementDataGridRow.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTDATAGRIDROW_H -#define ROCKETCONTROLSLUAELEMENTDATAGRIDROW_H - - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//getters -int ElementDataGridRowGetAttrrow_expanded(lua_State* L); -int ElementDataGridRowGetAttrparent_relative_index(lua_State* L); -int ElementDataGridRowGetAttrtable_relative_index(lua_State* L); -int ElementDataGridRowGetAttrparent_row(lua_State* L); -int ElementDataGridRowGetAttrparent_grid(lua_State* L); - -//setter -int ElementDataGridRowSetAttrrow_expanded(lua_State* L); - - -extern Rocket::Core::Lua::RegType ElementDataGridRowMethods[]; -extern luaL_Reg ElementDataGridRowGetters[]; -extern luaL_Reg ElementDataGridRowSetters[]; - - - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//this will be used to "inherit" from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementDataGridRow) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementForm.cpp b/libs/libRocket/Source/Controls/Lua/ElementForm.cpp deleted file mode 100644 index 9566ccf0f75..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementForm.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementForm.h" -#include -#include -#include - -namespace Rocket { -namespace Controls { -namespace Lua { - -//method -int ElementFormSubmit(lua_State* L, ElementForm* obj) -{ - int top = lua_gettop(L); - const char* name = ""; - const char* value = ""; - if(top > 0) - { - name = luaL_checkstring(L,1); - if(top > 1) - value = luaL_checkstring(L,2); - } - obj->Submit(name,value); - return 0; -} - -Rocket::Core::Lua::RegType ElementFormMethods[] = -{ - LUAMETHOD(ElementForm,Submit) - { NULL, NULL }, -}; - -luaL_Reg ElementFormGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementFormSetters[] = -{ - { NULL, NULL }, -}; - - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - //inherit from Element - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} -using Rocket::Controls::ElementForm; -LUACONTROLSTYPEDEFINE(ElementForm,true) -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/ElementForm.h b/libs/libRocket/Source/Controls/Lua/ElementForm.h deleted file mode 100644 index a3ce19e6021..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementForm.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTFORM_H -#define ROCKETCONTROLSLUAELEMENTFORM_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; - - -namespace Rocket { -namespace Controls { -namespace Lua { - -//method -int ElementFormSubmit(lua_State* L, ElementForm* obj); - -extern Rocket::Core::Lua::RegType ElementFormMethods[]; -extern luaL_Reg ElementFormGetters[]; -extern luaL_Reg ElementFormSetters[]; -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//this will be used to "inherit" from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementForm) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControl.cpp b/libs/libRocket/Source/Controls/Lua/ElementFormControl.cpp deleted file mode 100644 index 07b2aa07358..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControl.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementFormControl.h" -#include -#include -#include -#include - - -namespace Rocket { -namespace Controls { -namespace Lua { - -//getters -int ElementFormControlGetAttrdisabled(lua_State* L) -{ - ElementFormControl* efc = LuaType::check(L,1); - LUACHECKOBJ(efc); - lua_pushboolean(L,efc->IsDisabled()); - return 1; -} - -int ElementFormControlGetAttrname(lua_State* L) -{ - ElementFormControl* efc = LuaType::check(L,1); - LUACHECKOBJ(efc); - lua_pushstring(L,efc->GetName().CString()); - return 1; -} - -int ElementFormControlGetAttrvalue(lua_State* L) -{ - ElementFormControl* efc = LuaType::check(L,1); - LUACHECKOBJ(efc); - lua_pushstring(L,efc->GetValue().CString()); - return 1; -} - - -//setters -int ElementFormControlSetAttrdisabled(lua_State* L) -{ - ElementFormControl* efc = LuaType::check(L,1); - LUACHECKOBJ(efc); - efc->SetDisabled(CHECK_BOOL(L,2)); - return 0; -} - -int ElementFormControlSetAttrname(lua_State* L) -{ - ElementFormControl* efc = LuaType::check(L,1); - LUACHECKOBJ(efc); - const char* name = luaL_checkstring(L,2); - efc->SetName(name); - return 0; -} - -int ElementFormControlSetAttrvalue(lua_State* L) -{ - ElementFormControl* efc = LuaType::check(L,1); - LUACHECKOBJ(efc); - const char* value = luaL_checkstring(L,2); - efc->SetValue(value); - return 0; -} - - -Rocket::Core::Lua::RegType ElementFormControlMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlGetters[] = -{ - LUAGETTER(ElementFormControl,disabled) - LUAGETTER(ElementFormControl,name) - LUAGETTER(ElementFormControl,value) - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlSetters[] = -{ - LUASETTER(ElementFormControl,disabled) - LUASETTER(ElementFormControl,name) - LUASETTER(ElementFormControl,value) - { NULL, NULL }, -}; - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} -using Rocket::Controls::ElementFormControl; -LUACONTROLSTYPEDEFINE(ElementFormControl,true) -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControl.h b/libs/libRocket/Source/Controls/Lua/ElementFormControl.h deleted file mode 100644 index 6fc63c976fe..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControl.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTFORMCONTROL_H -#define ROCKETCONTROLSLUAELEMENTFORMCONTROL_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//getters -int ElementFormControlGetAttrdisabled(lua_State* L); -int ElementFormControlGetAttrname(lua_State* L); -int ElementFormControlGetAttrvalue(lua_State* L); - -//setters -int ElementFormControlSetAttrdisabled(lua_State* L); -int ElementFormControlSetAttrname(lua_State* L); -int ElementFormControlSetAttrvalue(lua_State* L); - -extern Rocket::Core::Lua::RegType ElementFormControlMethods[]; -extern luaL_Reg ElementFormControlGetters[]; -extern luaL_Reg ElementFormControlSetters[]; - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementFormControl) -}}} -#endif - diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlDataSelect.cpp b/libs/libRocket/Source/Controls/Lua/ElementFormControlDataSelect.cpp deleted file mode 100644 index cbf1f26277d..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlDataSelect.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementFormControlDataSelect.h" -#include -#include "ElementFormControlSelect.h" -#include - -namespace Rocket { -namespace Controls { -namespace Lua { - -//method -int ElementFormControlDataSelectSetDataSource(lua_State* L, ElementFormControlDataSelect* obj) -{ - const char* source = luaL_checkstring(L,1); - obj->SetDataSource(source); - return 0; -} - -Rocket::Core::Lua::RegType ElementFormControlDataSelectMethods[] = -{ - LUAMETHOD(ElementFormControlDataSelect,SetDataSource) - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlDataSelectGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlDataSelectSetters[] = -{ - { NULL, NULL }, -}; - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -//inherits from ElementFormControl which inherits from Element -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - //do whatever ElementFormControlSelect did as far as inheritance - ExtraInit(L,metatable_index); - //then inherit from ElementFromControlSelect - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} - -using Rocket::Controls::ElementFormControlDataSelect; -LUACONTROLSTYPEDEFINE(ElementFormControlDataSelect,true) -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlDataSelect.h b/libs/libRocket/Source/Controls/Lua/ElementFormControlDataSelect.h deleted file mode 100644 index 460263cd4b4..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlDataSelect.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTFORMCONTROLDATASELECT_H -#define ROCKETCONTROLSLUAELEMENTFORMCONTROLDATASELECT_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//method -int ElementFormControlDataSelectSetDataSource(lua_State* L, ElementFormControlDataSelect* obj); - -extern Rocket::Core::Lua::RegType ElementFormControlDataSelectMethods[]; -extern luaL_Reg ElementFormControlDataSelectGetters[]; -extern luaL_Reg ElementFormControlDataSelectSetters[]; - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//inherits from ElementFormControl which inherits from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementFormControlDataSelect) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlInput.cpp b/libs/libRocket/Source/Controls/Lua/ElementFormControlInput.cpp deleted file mode 100644 index e99d78f5ffa..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlInput.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementFormControlInput.h" -#include -#include "ElementFormControl.h" -#include - -namespace Rocket { -namespace Controls { -namespace Lua { - - -//getters -int ElementFormControlInputGetAttrchecked(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushboolean(L,obj->HasAttribute("checked")); - return 1; -} - -int ElementFormControlInputGetAttrmaxlength(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetAttribute("maxlength",-1)); - return 1; -} - -int ElementFormControlInputGetAttrsize(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetAttribute("size",20)); - return 1; -} - -int ElementFormControlInputGetAttrmax(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetAttribute("max",100)); - return 1; -} - -int ElementFormControlInputGetAttrmin(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetAttribute("min",0)); - return 1; -} - -int ElementFormControlInputGetAttrstep(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetAttribute("step",1)); - return 1; -} - - -//setters -int ElementFormControlInputSetAttrchecked(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - bool checked = CHECK_BOOL(L,2); - if(checked) - obj->SetAttribute("checked",true); - else - obj->RemoveAttribute("checked"); - return 0; -} - -int ElementFormControlInputSetAttrmaxlength(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int maxlength = luaL_checkinteger(L,2); - obj->SetAttribute("maxlength",maxlength); - return 0; -} - -int ElementFormControlInputSetAttrsize(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int size = luaL_checkinteger(L,2); - obj->SetAttribute("size",size); - return 0; -} - -int ElementFormControlInputSetAttrmax(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int max = luaL_checkinteger(L,2); - obj->SetAttribute("max",max); - return 0; -} - -int ElementFormControlInputSetAttrmin(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int min = luaL_checkinteger(L,2); - obj->SetAttribute("min",min); - return 0; -} - -int ElementFormControlInputSetAttrstep(lua_State* L) -{ - ElementFormControlInput* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int step = luaL_checkinteger(L,2); - obj->SetAttribute("step",step); - return 0; -} - - -Rocket::Core::Lua::RegType ElementFormControlInputMethods[] = -{ - {NULL,NULL}, -}; - -luaL_Reg ElementFormControlInputGetters[] = -{ - LUAGETTER(ElementFormControlInput,checked) - LUAGETTER(ElementFormControlInput,maxlength) - LUAGETTER(ElementFormControlInput,size) - LUAGETTER(ElementFormControlInput,max) - LUAGETTER(ElementFormControlInput,min) - LUAGETTER(ElementFormControlInput,step) - {NULL,NULL}, -}; - -luaL_Reg ElementFormControlInputSetters[] = -{ - LUASETTER(ElementFormControlInput,checked) - LUASETTER(ElementFormControlInput,maxlength) - LUASETTER(ElementFormControlInput,size) - LUASETTER(ElementFormControlInput,max) - LUASETTER(ElementFormControlInput,min) - LUASETTER(ElementFormControlInput,step) - {NULL,NULL}, -}; - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} -using Rocket::Controls::ElementFormControlInput; -LUACONTROLSTYPEDEFINE(ElementFormControlInput,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlInput.h b/libs/libRocket/Source/Controls/Lua/ElementFormControlInput.h deleted file mode 100644 index 55e8c176764..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlInput.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTFORMCONTROLINPUT_H -#define ROCKETCONTROLSLUAELEMENTFORMCONTROLINPUT_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//getters -int ElementFormControlInputGetAttrchecked(lua_State* L); -int ElementFormControlInputGetAttrmaxlength(lua_State* L); -int ElementFormControlInputGetAttrsize(lua_State* L); -int ElementFormControlInputGetAttrmax(lua_State* L); -int ElementFormControlInputGetAttrmin(lua_State* L); -int ElementFormControlInputGetAttrstep(lua_State* L); - -//setters -int ElementFormControlInputSetAttrchecked(lua_State* L); -int ElementFormControlInputSetAttrmaxlength(lua_State* L); -int ElementFormControlInputSetAttrsize(lua_State* L); -int ElementFormControlInputSetAttrmax(lua_State* L); -int ElementFormControlInputSetAttrmin(lua_State* L); -int ElementFormControlInputSetAttrstep(lua_State* L); - -extern Rocket::Core::Lua::RegType ElementFormControlInputMethods[]; -extern luaL_Reg ElementFormControlInputGetters[]; -extern luaL_Reg ElementFormControlInputSetters[]; - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//inherits from ElementFormControl which inherits from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementFormControlInput) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlSelect.cpp b/libs/libRocket/Source/Controls/Lua/ElementFormControlSelect.cpp deleted file mode 100644 index 43255ceca4b..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlSelect.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementFormControlSelect.h" -#include "SelectOptionsProxy.h" -#include -#include -#include -#include "ElementFormControl.h" -#include - - -namespace Rocket { -namespace Controls { -namespace Lua { - -//methods -int ElementFormControlSelectAdd(lua_State* L, ElementFormControlSelect* obj) -{ - const char* rml = luaL_checkstring(L,1); - const char* value = luaL_checkstring(L,2); - int before = -1; //default - if(lua_gettop(L) >= 3) - before = luaL_checkinteger(L,3); - - int index = obj->Add(rml,value,before); - lua_pushinteger(L,index); - return 1; -} - -int ElementFormControlSelectRemove(lua_State* L, ElementFormControlSelect* obj) -{ - int index = luaL_checkinteger(L,1); - obj->Remove(index); - return 0; -} - -//getters -int ElementFormControlSelectGetAttroptions(lua_State* L) -{ - ElementFormControlSelect* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - SelectOptionsProxy* proxy = new SelectOptionsProxy(); - proxy->owner = obj; - LuaType::push(L,proxy,true); - return 1; -} - -int ElementFormControlSelectGetAttrselection(lua_State* L) -{ - ElementFormControlSelect* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int selection = obj->GetSelection(); - lua_pushinteger(L,selection); - return 1; -} - - -//setter -int ElementFormControlSelectSetAttrselection(lua_State* L) -{ - ElementFormControlSelect* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int selection = luaL_checkinteger(L,2); - obj->SetSelection(selection); - return 0; -} - - -Rocket::Core::Lua::RegType ElementFormControlSelectMethods[] = -{ - LUAMETHOD(ElementFormControlSelect,Add) - LUAMETHOD(ElementFormControlSelect,Remove) - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlSelectGetters[] = -{ - LUAGETTER(ElementFormControlSelect,options) - LUAGETTER(ElementFormControlSelect,selection) - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlSelectSetters[] = -{ - LUASETTER(ElementFormControlSelect,selection) - { NULL, NULL }, -}; - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -//inherits from ElementFormControl which inherits from Element -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - //init whatever elementformcontrol did extra, like inheritance - ExtraInit(L,metatable_index); - //then inherit from elementformcontrol - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} -using Rocket::Controls::ElementFormControlSelect; -LUACONTROLSTYPEDEFINE(ElementFormControlSelect,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlSelect.h b/libs/libRocket/Source/Controls/Lua/ElementFormControlSelect.h deleted file mode 100644 index 5ac6e930c46..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlSelect.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTFORMCONTROLSELECT_H -#define ROCKETCONTROLSLUAELEMENTFORMCONTROLSELECT_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//methods -int ElementFormControlSelectAdd(lua_State* L, ElementFormControlSelect* obj); -int ElementFormControlSelectRemove(lua_State* L, ElementFormControlSelect* obj); - -//getters -int ElementFormControlSelectGetAttroptions(lua_State* L); -int ElementFormControlSelectGetAttrselection(lua_State* L); - -//setter -int ElementFormControlSelectSetAttrselection(lua_State* L); - -extern Rocket::Core::Lua::RegType ElementFormControlSelectMethods[]; -extern luaL_Reg ElementFormControlSelectGetters[]; -extern luaL_Reg ElementFormControlSelectSetters[]; - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//inherits from ElementFormControl which inherits from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementFormControlSelect) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlTextArea.cpp b/libs/libRocket/Source/Controls/Lua/ElementFormControlTextArea.cpp deleted file mode 100644 index 41a79ce1da8..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlTextArea.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementFormControlTextArea.h" -#include -#include "ElementFormControl.h" -#include - -namespace Rocket { -namespace Controls { -namespace Lua { - -//getters -int ElementFormControlTextAreaGetAttrcols(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetNumColumns()); - return 1; -} - -int ElementFormControlTextAreaGetAttrmaxlength(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetMaxLength()); - return 1; -} - -int ElementFormControlTextAreaGetAttrrows(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->GetNumRows()); - return 1; -} - -int ElementFormControlTextAreaGetAttrwordwrap(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushboolean(L,obj->GetWordWrap()); - return 1; -} - - -//setters -int ElementFormControlTextAreaSetAttrcols(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int cols = luaL_checkinteger(L,2); - obj->SetNumColumns(cols); - return 0; -} - -int ElementFormControlTextAreaSetAttrmaxlength(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int ml = luaL_checkinteger(L,2); - obj->SetMaxLength(ml); - return 0; -} - -int ElementFormControlTextAreaSetAttrrows(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int rows = luaL_checkinteger(L,2); - obj->SetNumRows(rows); - return 0; -} - -int ElementFormControlTextAreaSetAttrwordwrap(lua_State* L) -{ - ElementFormControlTextArea* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - bool ww = CHECK_BOOL(L,2); - obj->SetWordWrap(ww); - return 0; -} - - -Rocket::Core::Lua::RegType ElementFormControlTextAreaMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlTextAreaGetters[] = -{ - LUAGETTER(ElementFormControlTextArea,cols) - LUAGETTER(ElementFormControlTextArea,maxlength) - LUAGETTER(ElementFormControlTextArea,rows) - LUAGETTER(ElementFormControlTextArea,wordwrap) - { NULL, NULL }, -}; - -luaL_Reg ElementFormControlTextAreaSetters[] = -{ - LUASETTER(ElementFormControlTextArea,cols) - LUASETTER(ElementFormControlTextArea,maxlength) - LUASETTER(ElementFormControlTextArea,rows) - LUASETTER(ElementFormControlTextArea,wordwrap) - { NULL, NULL }, -}; - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} - -using Rocket::Controls::ElementFormControlTextArea; -LUACONTROLSTYPEDEFINE(ElementFormControlTextArea,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Controls/Lua/ElementFormControlTextArea.h b/libs/libRocket/Source/Controls/Lua/ElementFormControlTextArea.h deleted file mode 100644 index f77afb9efe3..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementFormControlTextArea.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTFORMCONTROLTEXTAREA_H -#define ROCKETCONTROLSLUAELEMENTFORMCONTROLTEXTAREA_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//getters -int ElementFormControlTextAreaGetAttrcols(lua_State* L); -int ElementFormControlTextAreaGetAttrmaxlength(lua_State* L); -int ElementFormControlTextAreaGetAttrrows(lua_State* L); -int ElementFormControlTextAreaGetAttrwordwrap(lua_State* L); - -//setters -int ElementFormControlTextAreaSetAttrcols(lua_State* L); -int ElementFormControlTextAreaSetAttrmaxlength(lua_State* L); -int ElementFormControlTextAreaSetAttrrows(lua_State* L); -int ElementFormControlTextAreaSetAttrwordwrap(lua_State* L); - -extern Rocket::Core::Lua::RegType ElementFormControlTextAreaMethods[]; -extern luaL_Reg ElementFormControlTextAreaGetters[]; -extern luaL_Reg ElementFormControlTextAreaSetters[]; - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//inherits from ElementFormControl which inherits from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementFormControlTextArea) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/ElementTabSet.cpp b/libs/libRocket/Source/Controls/Lua/ElementTabSet.cpp deleted file mode 100644 index c31dda2f7e1..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementTabSet.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementTabSet.h" -#include -#include - - -namespace Rocket { -namespace Controls { -namespace Lua { - -//methods -int ElementTabSetSetPanel(lua_State* L, ElementTabSet* obj) -{ - LUACHECKOBJ(obj); - int index = luaL_checkinteger(L,1); - const char* rml = luaL_checkstring(L,2); - - obj->SetPanel(index,rml); - return 0; -} - -int ElementTabSetSetTab(lua_State* L, ElementTabSet* obj) -{ - LUACHECKOBJ(obj); - int index = luaL_checkinteger(L,1); - const char* rml = luaL_checkstring(L,2); - - obj->SetTab(index,rml); - return 0; -} - - -//getters -int ElementTabSetGetAttractive_tab(lua_State* L) -{ - ElementTabSet* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int tab = obj->GetActiveTab(); - lua_pushinteger(L,tab); - return 1; -} - -int ElementTabSetGetAttrnum_tabs(lua_State* L) -{ - ElementTabSet* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int num = obj->GetNumTabs(); - lua_pushinteger(L,num); - return 1; -} - - -//setter -int ElementTabSetSetAttractive_tab(lua_State* L) -{ - ElementTabSet* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int tab = luaL_checkinteger(L,2); - obj->SetActiveTab(tab); - return 0; -} - - -Rocket::Core::Lua::RegType ElementTabSetMethods[] = -{ - LUAMETHOD(ElementTabSet,SetPanel) - LUAMETHOD(ElementTabSet,SetTab) - { NULL, NULL }, -}; - -luaL_Reg ElementTabSetGetters[] = -{ - LUAGETTER(ElementTabSet,active_tab) - LUAGETTER(ElementTabSet,num_tabs) - { NULL, NULL }, -}; - -luaL_Reg ElementTabSetSetters[] = -{ - LUASETTER(ElementTabSet,active_tab) - { NULL, NULL }, -}; - - - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -//this will be used to "inherit" from Element -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} - -using Rocket::Controls::ElementTabSet; -LUACONTROLSTYPEDEFINE(ElementTabSet,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Controls/Lua/ElementTabSet.h b/libs/libRocket/Source/Controls/Lua/ElementTabSet.h deleted file mode 100644 index da53b789b41..00000000000 --- a/libs/libRocket/Source/Controls/Lua/ElementTabSet.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUAELEMENTTABSET_H -#define ROCKETCONTROLSLUAELEMENTTABSET_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -//methods -int ElementTabSetSetPanel(lua_State* L, ElementTabSet* obj); -int ElementTabSetSetTab(lua_State* L, ElementTabSet* obj); - -//getters -int ElementTabSetGetAttractive_tab(lua_State* L); -int ElementTabSetGetAttrnum_tabs(lua_State* L); - -//setter -int ElementTabSetSetAttractive_tab(lua_State* L); - -extern Rocket::Core::Lua::RegType ElementTabSetMethods[]; -extern luaL_Reg ElementTabSetGetters[]; -extern luaL_Reg ElementTabSetSetters[]; - - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -//this will be used to "inherit" from Element -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::ElementTabSet) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/LuaDataFormatter.cpp b/libs/libRocket/Source/Controls/Lua/LuaDataFormatter.cpp deleted file mode 100644 index c2d479c04b7..00000000000 --- a/libs/libRocket/Source/Controls/Lua/LuaDataFormatter.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LuaDataFormatter.h" -#include -#include - -using Rocket::Core::Lua::Interpreter; -using Rocket::Core::Log; -namespace Rocket { -namespace Controls { -namespace Lua { - -LuaDataFormatter::LuaDataFormatter(const Rocket::Core::String& name) : Rocket::Controls::DataFormatter(name), ref_FormatData(LUA_NOREF) -{ - -} - -LuaDataFormatter::~LuaDataFormatter() -{ - //empty -} - -void LuaDataFormatter::FormatData(Rocket::Core::String& formatted_data, const Rocket::Core::StringList& raw_data) -{ - if(ref_FormatData == LUA_NOREF || ref_FormatData == LUA_REFNIL) - { - Log::Message(Log::LT_ERROR, "In LuaDataFormatter: There is no value assigned to the \"FormatData\" variable."); - return; - } - lua_State* L = Interpreter::GetLuaState(); - int top = lua_gettop(L); - PushDataFormatterFunctionTable(L); // push the table where the function resides - lua_rawgeti(L,-1,ref_FormatData); //push the function - if(lua_type(L,-1) != LUA_TFUNCTION) - { - Log::Message(Log::LT_ERROR, "In LuaDataFormatter: The value for the FormatData variable must be a function. You passed in a %s.", lua_typename(L,lua_type(L,-1))); - lua_settop(L,top); - return; - } - lua_newtable(L); //to hold raw_data - int tbl = lua_gettop(L); - for(unsigned int i = 0; i < raw_data.size(); i++) - { - lua_pushstring(L,raw_data[i].CString()); - lua_rawseti(L,tbl,i); - } - Interpreter::ExecuteCall(1,1); //1 parameter (the table), 1 result (a string) - - //top of the stack should be the return value - if(lua_type(L,-1) != LUA_TSTRING) - { - Log::Message(Log::LT_ERROR, "In LuaDataFormatter: the return value of FormatData must be a string. You returned a %s.", lua_typename(L,lua_type(L,-1))); - lua_settop(L,top); - return; - } - formatted_data = Rocket::Core::String(lua_tostring(L,-1)); - lua_settop(L,top); -} - -void LuaDataFormatter::PushDataFormatterFunctionTable(lua_State* L) -{ - lua_getglobal(L,"LUADATAFORMATTERFUNCTIONS"); - if(lua_isnoneornil(L,-1)) - { - lua_newtable(L); - lua_setglobal(L,"LUADATAFORMATTERFUNCTIONS"); - lua_pop(L,1); //pop the unsucessful getglobal - lua_getglobal(L,"LUADATAFORMATTERFUNCTIONS"); - } -} - -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/LuaDataFormatter.h b/libs/libRocket/Source/Controls/Lua/LuaDataFormatter.h deleted file mode 100644 index 51c794f5dc4..00000000000 --- a/libs/libRocket/Source/Controls/Lua/LuaDataFormatter.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUALUADATAFORMATTER_H -#define ROCKETCONTROLSLUALUADATAFORMATTER_H - -#include -#include - -namespace Rocket { -namespace Controls { -namespace Lua { - -class LuaDataFormatter : public Rocket::Controls::DataFormatter -{ -public: - LuaDataFormatter(const Rocket::Core::String& name = ""); - ~LuaDataFormatter(); - - virtual void FormatData(Rocket::Core::String& formatted_data, const Rocket::Core::StringList& raw_data); - - //Helper function used to push on to the stack the table where the function ref should be stored - static void PushDataFormatterFunctionTable(lua_State* L); - - int ref_FormatData; //the lua reference to the FormatData function -}; - -} -} -} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/LuaDataSource.cpp b/libs/libRocket/Source/Controls/Lua/LuaDataSource.cpp deleted file mode 100644 index 51069d4eaab..00000000000 --- a/libs/libRocket/Source/Controls/Lua/LuaDataSource.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LuaDataSource.h" -#include -#include -#include - -using Rocket::Core::Lua::Interpreter; -using Rocket::Core::Log; -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { - -LuaDataSource::LuaDataSource(const Rocket::Core::String& name) : DataSource(name), getRowRef(LUA_NOREF), getNumRowsRef(LUA_NOREF) -{ -} - -/// Fetches the contents of one row of a table within the data source. -/// @param[out] row The list of values in the table. -/// @param[in] table The name of the table to query. -/// @param[in] row_index The index of the desired row. -/// @param[in] columns The list of desired columns within the row. -void LuaDataSource::GetRow(Rocket::Core::StringList& row, const Rocket::Core::String& table, int row_index, const Rocket::Core::StringList& columns) -{ - if(getRowRef == LUA_NOREF || getRowRef == LUA_REFNIL) return; - - //setup the call - Interpreter::BeginCall(getRowRef); - lua_State* L = Interpreter::GetLuaState(); - lua_pushstring(L,table.CString()); - lua_pushinteger(L,row_index); - lua_newtable(L); - int index = 0; - for(Rocket::Core::StringList::const_iterator itr = columns.begin(); itr != columns.end(); ++itr) - { - lua_pushstring(L,itr->CString()); - lua_rawseti(L,-2,index++); - } - Interpreter::ExecuteCall(3,1); //3 parameters, 1 return. After here, the top of the stack contains the return value - - int res = lua_gettop(L); - if(lua_type(L,res) == LUA_TTABLE) - { - lua_pushnil(L); - while(lua_next(L,res) != 0) - { - //key at -2, value at -1 - row.push_back(luaL_checkstring(L,-1)); - lua_pop(L,1); //pops value, leaves key for next iteration - } - lua_pop(L,1); //pop key - } - else - Log::Message(Log::LT_WARNING, "Lua: DataSource.GetRow must return a table, the function it called returned a %s", lua_typename(L,res)); - - Interpreter::EndCall(1); -} - -/// Fetches the number of rows within one of this data source's tables. -/// @param[in] table The name of the table to query. -/// @return The number of rows within the specified table. Returns -1 in case of an incorrect Lua function. -int LuaDataSource::GetNumRows(const Rocket::Core::String& table) -{ - if(getNumRowsRef == LUA_NOREF || getNumRowsRef == LUA_REFNIL) return -1; - - lua_State* L = Interpreter::GetLuaState(); - Interpreter::BeginCall(getNumRowsRef); - lua_pushstring(L,table.CString()); - Interpreter::ExecuteCall(1,1); //1 parameter, 1 return. After this, the top of the stack contains the return value - - int res = lua_gettop(L); - if(lua_type(L,res) == LUA_TNUMBER) - { - return luaL_checkinteger(L,res); - } - else - { - Log::Message(Log::LT_WARNING, "Lua: DataSource.GetNumRows must return an integer, the function it called returned a %s", lua_typename(L,res)); - return -1; - } - -} - -} -} -} diff --git a/libs/libRocket/Source/Controls/Lua/LuaDataSource.h b/libs/libRocket/Source/Controls/Lua/LuaDataSource.h deleted file mode 100644 index 497cea99167..00000000000 --- a/libs/libRocket/Source/Controls/Lua/LuaDataSource.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUALUADATASOURCE_H -#define ROCKETCONTROLSLUALUADATASOURCE_H - -#include -#include -#include -#include - -namespace Rocket { -namespace Controls { -namespace Lua { - -class LuaDataSource : public Rocket::Controls::DataSource -{ -public: - //default initilialize the lua func references to -1 - LuaDataSource(const Rocket::Core::String& name = ""); - - /// Fetches the contents of one row of a table within the data source. - /// @param[out] row The list of values in the table. - /// @param[in] table The name of the table to query. - /// @param[in] row_index The index of the desired row. - /// @param[in] columns The list of desired columns within the row. - virtual void GetRow(Rocket::Core::StringList& row, const Rocket::Core::String& table, int row_index, const Rocket::Core::StringList& columns); - /// Fetches the number of rows within one of this data source's tables. - /// @param[in] table The name of the table to query. - /// @return The number of rows within the specified table. Returns -1 in case of an incorrect Lua function. - virtual int GetNumRows(const Rocket::Core::String& table); - - //make the protected members of DataSource public - using DataSource::NotifyRowAdd; - using DataSource::NotifyRowRemove; - using DataSource::NotifyRowChange; - - //lua reference to DataSource.GetRow - int getRowRef; - //lua reference to DataSource.GetNumRows - int getNumRowsRef; -}; - -} -} -} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/SelectOptionsProxy.cpp b/libs/libRocket/Source/Controls/Lua/SelectOptionsProxy.cpp deleted file mode 100644 index 550e76ffcbf..00000000000 --- a/libs/libRocket/Source/Controls/Lua/SelectOptionsProxy.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "SelectOptionsProxy.h" -#include - - -namespace Rocket { -namespace Controls { -namespace Lua { - - -int SelectOptionsProxy__index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - int keytype = lua_type(L,2); - if(keytype == LUA_TNUMBER) //only valid key types - { - SelectOptionsProxy* proxy = LuaType::check(L,1); - LUACHECKOBJ(proxy); - int index = luaL_checkinteger(L,2); - Rocket::Controls::SelectOption* opt = proxy->owner->GetOption(index); - LUACHECKOBJ(opt); - lua_newtable(L); - LuaType::push(L,opt->GetElement(),false); - lua_setfield(L,-2,"element"); - lua_pushstring(L,opt->GetValue().CString()); - lua_setfield(L,-2,"value"); - return 1; - } - else - return LuaType::index(L); -} - -//since there are no string keys, just use __ipairs -int SelectOptionsProxy__pairs(lua_State* L) -{ - return SelectOptionsProxy__ipairs(L); -} - -//[1] is the object, [2] is the previous key, [3] is the userdata -int SelectOptionsProxy__ipairs(lua_State* L) -{ - SelectOptionsProxy* proxy = LuaType::check(L,1); - LUACHECKOBJ(proxy); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - SelectOption* opt = NULL; - while((*pindex) < proxy->owner->GetNumOptions()) - { - opt = proxy->owner->GetOption((*pindex)++); - if(opt != NULL) - break; - } - //we got to the end without finding an option - if(opt == NULL) - { - lua_pushnil(L); - lua_pushnil(L); - } - else //we found an option - { - lua_pushinteger(L,(*pindex)-1); //key - lua_newtable(L); //value - //fill the value - LuaType::push(L,opt->GetElement()); - lua_setfield(L,-2,"element"); - lua_pushstring(L,opt->GetValue().CString()); - lua_setfield(L,-2,"value"); - } - return 2; -} - -Rocket::Core::Lua::RegType SelectOptionsProxyMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg SelectOptionsProxyGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg SelectOptionsProxySetters[] = -{ - { NULL, NULL }, -}; - - -} -} -} -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,Rocket::Controls::Lua::SelectOptionsProxy__index); - lua_setfield(L,metatable_index,"__index"); - lua_pushcfunction(L,Rocket::Controls::Lua::SelectOptionsProxy__pairs); - lua_setfield(L,metatable_index,"__pairs"); - lua_pushcfunction(L,Rocket::Controls::Lua::SelectOptionsProxy__ipairs); - lua_setfield(L,metatable_index,"__ipairs"); -} - -using Rocket::Controls::Lua::SelectOptionsProxy; -LUACONTROLSTYPEDEFINE(SelectOptionsProxy,false); -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Controls/Lua/SelectOptionsProxy.h b/libs/libRocket/Source/Controls/Lua/SelectOptionsProxy.h deleted file mode 100644 index 186ff0e3b09..00000000000 --- a/libs/libRocket/Source/Controls/Lua/SelectOptionsProxy.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSLUASELECTOPTIONSPROXY_H -#define ROCKETCONTROLSLUASELECTOPTIONSPROXY_H - -#include -#include -#include - -using Rocket::Core::Lua::LuaType; -namespace Rocket { -namespace Controls { -namespace Lua { -//where owner is the ElementFormControlSelect that we should look up information from -struct SelectOptionsProxy { Rocket::Controls::ElementFormControlSelect* owner; }; - -int SelectOptionsProxy__index(lua_State* L); -int SelectOptionsProxy__pairs(lua_State* L); -int SelectOptionsProxy__ipairs(lua_State* L); - -extern Rocket::Core::Lua::RegType SelectOptionsProxyMethods[]; -extern luaL_Reg SelectOptionsProxyGetters[]; -extern luaL_Reg SelectOptionsProxySetters[]; - -} -} -} -namespace Rocket { namespace Core { namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -LUACONTROLSTYPEDECLARE(Rocket::Controls::Lua::SelectOptionsProxy) -}}} -#endif diff --git a/libs/libRocket/Source/Controls/Lua/precompiled.h b/libs/libRocket/Source/Controls/Lua/precompiled.h deleted file mode 100644 index 65ce20e16ab..00000000000 --- a/libs/libRocket/Source/Controls/Lua/precompiled.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAPRECOMPILED_H -#define ROCKETCORELUAPRECOMPILED_H - -#include -#include -#include -#include -#endif diff --git a/libs/libRocket/Source/Controls/SelectOption.cpp b/libs/libRocket/Source/Controls/SelectOption.cpp deleted file mode 100644 index b6c5a27b694..00000000000 --- a/libs/libRocket/Source/Controls/SelectOption.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Controls/SelectOption.h" - -namespace Rocket { -namespace Controls { - -SelectOption::SelectOption(Core::Element* _element, const Rocket::Core::String& value, bool selectable) : value(value) , selectable(selectable) -{ - element = _element; -} - -SelectOption::~SelectOption() -{ -} - -// Returns the element that represents the option visually. -Core::Element* SelectOption::GetElement() -{ - return element; -} - -// Returns the value of the option. -const Rocket::Core::String& SelectOption::GetValue() const -{ - return value; -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetDropDown.cpp b/libs/libRocket/Source/Controls/WidgetDropDown.cpp deleted file mode 100644 index 18debb28a6d..00000000000 --- a/libs/libRocket/Source/Controls/WidgetDropDown.cpp +++ /dev/null @@ -1,380 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "WidgetDropDown.h" -#include "../../Include/Rocket/Core/Math.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/Input.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" -#include "../../Include/Rocket/Controls/ElementFormControl.h" - -namespace Rocket { -namespace Controls { - -WidgetDropDown::WidgetDropDown(ElementFormControl* element) -{ - parent_element = element; - - box_layout_dirty = false; - value_layout_dirty = false; - - selected_option = -1; - - // Create the button and selection elements. - button_element = Core::Factory::InstanceElement(parent_element, "*", "selectarrow", Rocket::Core::XMLAttributes()); - value_element = Core::Factory::InstanceElement(element, "*", "selectvalue", Rocket::Core::XMLAttributes()); - selection_element = Core::Factory::InstanceElement(parent_element, "*", "selectbox", Rocket::Core::XMLAttributes()); - - value_element->SetProperty("overflow", "hidden"); - - selection_element->SetProperty("visibility", "hidden"); - selection_element->SetProperty("z-index", Core::Property(1.0f, Core::Property::NUMBER)); - selection_element->SetProperty("clip", "none"); - - parent_element->AddEventListener("click", this, true); - parent_element->AddEventListener("blur", this); - parent_element->AddEventListener("focus", this); - parent_element->AddEventListener("keydown", this, true); - - // Add the elements to our parent element. - parent_element->AppendChild(button_element, false); - parent_element->AppendChild(selection_element, false); - parent_element->AppendChild(value_element, false); -} - -WidgetDropDown::~WidgetDropDown() -{ - ClearOptions(); - - parent_element->RemoveEventListener("click", this, true); - parent_element->RemoveEventListener("blur", this); - parent_element->RemoveEventListener("focus", this); - parent_element->RemoveEventListener("keydown", this, true); - - button_element->RemoveReference(); - selection_element->RemoveReference(); - value_element->RemoveReference(); -} - -// Updates the selection box layout if necessary. -void WidgetDropDown::OnRender() -{ - if (box_layout_dirty) - { - Core::Box box; - Core::ElementUtilities::BuildBox(box, parent_element->GetBox().GetSize(), selection_element); - - // Layout the selection box. - Core::ElementUtilities::FormatElement(selection_element, parent_element->GetBox().GetSize(Core::Box::BORDER)); - selection_element->SetOffset(Rocket::Core::Vector2f(box.GetEdge(Core::Box::MARGIN, Core::Box::LEFT), parent_element->GetBox().GetSize(Core::Box::BORDER).y + box.GetEdge(Core::Box::MARGIN, Core::Box::TOP)), parent_element); - - box_layout_dirty = false; - } - - if (value_layout_dirty) - { - Core::ElementUtilities::FormatElement(value_element, parent_element->GetBox().GetSize(Core::Box::BORDER)); - value_element->SetOffset(parent_element->GetBox().GetPosition(Core::Box::CONTENT), parent_element); - - value_layout_dirty = false; - } -} - -void WidgetDropDown::OnLayout() -{ - if(parent_element->IsDisabled()) - { - // Propagate disabled state to selectvalue and selectarrow - value_element->SetPseudoClass("disabled", true); - button_element->SetPseudoClass("disabled", true); - } - - // Layout the button and selection boxes. - Core::Box parent_box = parent_element->GetBox(); - - Core::ElementUtilities::PositionElement(button_element, Rocket::Core::Vector2f(0, 0), Core::ElementUtilities::TOP_RIGHT); - Core::ElementUtilities::PositionElement(selection_element, Rocket::Core::Vector2f(0, 0), Core::ElementUtilities::TOP_LEFT); - - // Calculate the value element position and size. - Rocket::Core::Vector2f size; - size.x = parent_element->GetBox().GetSize(Core::Box::CONTENT).x - button_element->GetBox().GetSize(Core::Box::MARGIN).x; - size.y = parent_element->GetBox().GetSize(Core::Box::CONTENT).y; - - value_element->SetOffset(parent_element->GetBox().GetPosition(Core::Box::CONTENT), parent_element); - value_element->SetBox(Core::Box(size)); - - box_layout_dirty = true; - value_layout_dirty = true; -} - -// Sets the value of the widget. -void WidgetDropDown::SetValue(const Rocket::Core::String& _value) -{ - for (size_t i = 0; i < options.size(); ++i) - { - if (options[i].GetValue() == _value) - { - SetSelection((int) i); - return; - } - } - - value = _value; - value_element->SetInnerRML(value); - value_layout_dirty = true; - - selected_option = -1; -} - -// Returns the current value of the widget. -const Rocket::Core::String& WidgetDropDown::GetValue() const -{ - return value; -} - -// Sets the index of the selection. If the new index lies outside of the bounds, it will be clamped. -void WidgetDropDown::SetSelection(int selection, bool force) -{ - Rocket::Core::String new_value; - - if (selection < 0 || - selection >= (int) options.size()) - { - selection = -1; - } - else - { - new_value = options[selection].GetValue(); - } - - if (force || - selection != selected_option || - value != new_value) - { - selected_option = selection; - value = new_value; - - Rocket::Core::String value_rml; - if (selected_option >= 0) - options[selected_option].GetElement()->GetInnerRML(value_rml); - - value_element->SetInnerRML(value_rml); - value_layout_dirty = true; - - Rocket::Core::Dictionary parameters; - parameters.Set("value", value); - parent_element->DispatchEvent("change", parameters); - } -} - -// Returns the index of the currently selected item. -int WidgetDropDown::GetSelection() const -{ - return selected_option; -} - -// Adds a new option to the select control. -int WidgetDropDown::AddOption(const Rocket::Core::String& rml, const Rocket::Core::String& value, int before, bool select, bool selectable) -{ - // Instance a new element for the option. - Core::Element* element = Core::Factory::InstanceElement(selection_element, "*", "option", Rocket::Core::XMLAttributes()); - - // Force to block display and inject the RML. Register a click handler so we can be notified of selection. - element->SetProperty("display", "block"); - element->SetProperty("clip", "auto"); - element->SetInnerRML(rml); - element->AddEventListener("click", this); - - int option_index; - if (before < 0 || - before >= (int) options.size()) - { - selection_element->AppendChild(element); - options.push_back(SelectOption(element, value, selectable)); - option_index = (int) options.size() - 1; - } - else - { - selection_element->InsertBefore(element, selection_element->GetChild(before)); - options.insert(options.begin() + before, SelectOption(element, value, selectable)); - option_index = before; - } - - element->RemoveReference(); - - // Select the option if appropriate. - if (select) - SetSelection(option_index); - - box_layout_dirty = true; - return option_index; -} - -// Removes an option from the select control. -void WidgetDropDown::RemoveOption(int index) -{ - if (index < 0 || - index >= (int) options.size()) - return; - - // Remove the listener and delete the option element. - options[index].GetElement()->RemoveEventListener("click", this); - selection_element->RemoveChild(options[index].GetElement()); - options.erase(options.begin() + index); - - box_layout_dirty = true; -} - -// Removes all options from the list. -void WidgetDropDown::ClearOptions() -{ - while (!options.empty()) - RemoveOption((int) options.size() - 1); -} - -// Returns on of the widget's options. -SelectOption* WidgetDropDown::GetOption(int index) -{ - if (index < 0 || - index >= GetNumOptions()) - return NULL; - - return &options[index]; -} - -// Returns the number of options in the widget. -int WidgetDropDown::GetNumOptions() const -{ - return (int) options.size(); -} - -void WidgetDropDown::ProcessEvent(Core::Event& event) -{ - if (parent_element->IsDisabled()) - return; - - // Process the button onclick - if (event == "click") - { - - if (event.GetCurrentElement()->GetParentNode() == selection_element) - { - // Find the element in the options and fire the selection event - for (size_t i = 0; i < options.size(); i++) - { - if (options[i].GetElement() == event.GetCurrentElement()) - { - if (options[i].IsSelectable()) - { - SetSelection((int)i); - event.StopPropagation(); - - ShowSelectBox(false); - parent_element->Focus(); - } - } - } - } - else - { - // We have to check that this event isn't targeted to an element - // inside the selection box as we'll get all events coming from our - // root level select element as well as the ones coming from options (which - // get caught in the above if) - Core::Element* element = event.GetTargetElement(); - while (element && element != parent_element) - { - if (element == selection_element) - return; - element = element->GetParentNode(); - } - - if (selection_element->GetProperty< int >("visibility") == Core::VISIBILITY_HIDDEN) - ShowSelectBox(true); - else - ShowSelectBox(false); - } - } - else if (event == "blur" && event.GetTargetElement() == parent_element) - { - ShowSelectBox(false); - } - else if (event == "keydown") - { - Core::Input::KeyIdentifier key_identifier = (Core::Input::KeyIdentifier) event.GetParameter< int >("key_identifier", 0); - - switch (key_identifier) - { - case Core::Input::KI_UP: - SetSelection((selected_option - 1 + (int)options.size()) % (int)options.size()); - break; - case Core::Input::KI_DOWN: - SetSelection((selected_option + 1) % (int)options.size()); - break; - default: - break; - } - } - - if (event.GetTargetElement() == parent_element) - { - if (event == "focus") - { - value_element->SetPseudoClass("focus", true); - button_element->SetPseudoClass("focus", true); - } - else if (event == "blur") - { - value_element->SetPseudoClass("focus", false); - button_element->SetPseudoClass("focus", false); - } - } - -} - -// Shows or hides the selection box. -void WidgetDropDown::ShowSelectBox(bool show) -{ - if (show) - { - selection_element->SetProperty("visibility", "visible"); - value_element->SetPseudoClass("checked", true); - button_element->SetPseudoClass("checked", true); - } - else - { - selection_element->SetProperty("visibility", "hidden"); - value_element->SetPseudoClass("checked", false); - button_element->SetPseudoClass("checked", false); - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetDropDown.h b/libs/libRocket/Source/Controls/WidgetDropDown.h deleted file mode 100644 index c36181cf260..00000000000 --- a/libs/libRocket/Source/Controls/WidgetDropDown.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSWIDGETDROPDOWN_H -#define ROCKETCONTROLSWIDGETDROPDOWN_H - -#include "../../Include/Rocket/Core/String.h" -#include "../../Include/Rocket/Core/EventListener.h" -#include "../../Include/Rocket/Controls/SelectOption.h" -#include - -namespace Rocket { -namespace Controls { - -class ElementFormControl; - -/** - Widget for drop-down functionality. - @author Lloyd Weehuizen - */ - -class WidgetDropDown : public Core::EventListener -{ -public: - WidgetDropDown(ElementFormControl* element); - virtual ~WidgetDropDown(); - - /// Updates the selection box layout if necessary. - void OnRender(); - /// Positions the drop-down's internal elements. - void OnLayout(); - - /// Sets the value of the widget. - /// @param[in] value The new value to set. - void SetValue(const Rocket::Core::String& value); - /// Returns the current value of the widget. - /// @return The current value of the widget. - const Rocket::Core::String& GetValue() const; - - /// Sets the index of the selection. If the new index lies outside of the bounds, the selection index will be set to -1. - /// @param[in] selection The new selection index. - /// @param[in] force Forces the new selection, even if the widget believes the selection to not have changed. - void SetSelection(int selection, bool force = false); - /// Returns the index of the currently selected item. - /// @return The index of the currently selected item. - int GetSelection() const; - - /// Adds a new option to the select control. - /// @param[in] rml The RML content used to represent the option. - /// @param[in] value The value of the option. - /// @param[in] before The index of the element to insert the new option before. - /// @param[in] select True to select the new option. - /// @param[in] selectable If true this option can be selected. If false, this option is not selectable. - /// @return The index of the new option. - int AddOption(const Rocket::Core::String& rml, const Rocket::Core::String& value, int before, bool select, bool selectable = true); - /// Removes an option from the select control. - /// @param[in] index The index of the option to remove. - void RemoveOption(int index); - /// Removes all options from the list. - void ClearOptions(); - - /// Returns on of the widget's options. - /// @param[in] The index of the desired option. - /// @return The option. This may be NULL if the index was out of bounds. - SelectOption* GetOption(int index); - /// Returns the number of options in the widget. - /// @return The number of options. - int GetNumOptions() const; - - /// Processes the incoming event. - virtual void ProcessEvent(Core::Event& event); - -private: - typedef std::vector< SelectOption > OptionList; - - // Shows or hides the selection box. - void ShowSelectBox(bool show); - - // Parent element that holds this widget - ElementFormControl* parent_element; - - // The elements making up the drop-down process. - Core::Element* button_element; - Core::Element* selection_element; - Core::Element* value_element; - - // The options in the drop down. - OptionList options; - int selected_option; - - // The current value of the widget. - Rocket::Core::String value; - - bool box_layout_dirty; - bool value_layout_dirty; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/WidgetSlider.cpp b/libs/libRocket/Source/Controls/WidgetSlider.cpp deleted file mode 100644 index 6a204fa6156..00000000000 --- a/libs/libRocket/Source/Controls/WidgetSlider.cpp +++ /dev/null @@ -1,522 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "WidgetSlider.h" -#include "../../Include/Rocket/Core.h" -#include "../../Include/Rocket/Controls/ElementFormControl.h" - -namespace Rocket { -namespace Controls { - -const float DEFAULT_REPEAT_DELAY = 0.5f; -const float DEFAULT_REPEAT_PERIOD = 0.1f; - -WidgetSlider::WidgetSlider(ElementFormControl* _parent) -{ - parent = _parent; - - orientation = HORIZONTAL; - - track = NULL; - bar = NULL; - arrows[0] = NULL; - arrows[1] = NULL; - - bar_position = 0; - bar_drag_anchor = 0; - - arrow_timers[0] = -1; - arrow_timers[1] = -1; - last_update_time = 0; -} - -WidgetSlider::~WidgetSlider() -{ - if (bar != NULL) - { - bar->RemoveEventListener("drag", this); - bar->RemoveEventListener("dragstart", this); - parent->RemoveChild(bar); - } - - parent->RemoveEventListener("blur", this); - parent->RemoveEventListener("focus", this); - parent->RemoveEventListener("keydown", this, true); - - if (track != NULL) - { - track->RemoveEventListener("click", this); - parent->RemoveChild(track); - } - - for (int i = 0; i < 2; i++) - { - if (arrows[i] != NULL) - { - arrows[i]->RemoveEventListener("mousedown", this); - arrows[i]->RemoveEventListener("mouseup", this); - arrows[i]->RemoveEventListener("mouseout", this); - parent->RemoveChild(arrows[i]); - } - } -} - -// Initialises the slider to a given orientation. -bool WidgetSlider::Initialise() -{ - // Create all of our child elements as standard elements, and abort if we can't create them. - track = Core::Factory::InstanceElement(parent, "*", "slidertrack", Rocket::Core::XMLAttributes()); - - bar = Core::Factory::InstanceElement(parent, "*", "sliderbar", Rocket::Core::XMLAttributes()); - bar->SetProperty("drag", "drag"); - - arrows[0] = Core::Factory::InstanceElement(parent, "*", "sliderarrowdec", Rocket::Core::XMLAttributes()); - arrows[1] = Core::Factory::InstanceElement(parent, "*", "sliderarrowinc", Rocket::Core::XMLAttributes()); - - if (track == NULL || - bar == NULL || - arrows[0] == NULL || - arrows[1] == NULL) - { - if (track != NULL) - track->RemoveReference(); - - if (bar != NULL) - bar->RemoveReference(); - - if (arrows[0] != NULL) - arrows[0]->RemoveReference(); - - if (arrows[1] != NULL) - arrows[1]->RemoveReference(); - - return false; - } - - // Add them as non-DOM elements. - parent->AppendChild(track, false); - parent->AppendChild(bar, false); - parent->AppendChild(arrows[0], false); - parent->AppendChild(arrows[1], false); - - // Remove the initial references on the elements. - track->RemoveReference(); - bar->RemoveReference(); - arrows[0]->RemoveReference(); - arrows[1]->RemoveReference(); - - // Attach the listeners as appropriate. - bar->AddEventListener("drag", this); - bar->AddEventListener("dragstart", this); - - parent->AddEventListener("blur", this); - parent->AddEventListener("focus", this); - parent->AddEventListener("keydown", this, true); - track->AddEventListener("click", this); - - for (int i = 0; i < 2; i++) - { - arrows[i]->AddEventListener("mousedown", this); - arrows[i]->AddEventListener("mouseup", this); - arrows[i]->AddEventListener("mouseout", this); - } - - return true; -} - -// Updates the key repeats for the increment / decrement arrows. -void WidgetSlider::Update() -{ - for (int i = 0; i < 2; i++) - { - bool updated_time = false; - float delta_time = 0; - - if (arrow_timers[i] > 0) - { - if (!updated_time) - { - float current_time = Core::GetSystemInterface()->GetElapsedTime(); - delta_time = current_time - last_update_time; - last_update_time = current_time; - } - - arrow_timers[i] -= delta_time; - while (arrow_timers[i] <= 0) - { - arrow_timers[i] += DEFAULT_REPEAT_PERIOD; - SetBarPosition(i == 0 ? OnLineDecrement() : OnLineIncrement()); - } - } - } -} - -// Sets the position of the bar. -void WidgetSlider::SetBarPosition(float _bar_position) -{ - bar_position = Rocket::Core::Math::Clamp(_bar_position, 0.0f, 1.0f); - PositionBar(); - - Rocket::Core::Dictionary parameters; - parameters.Set("value", bar_position); - parent->DispatchEvent("change", parameters); -} - -// Returns the current position of the bar. -float WidgetSlider::GetBarPosition() -{ - return bar_position; -} - -// Sets the orientation of the slider. -void WidgetSlider::SetOrientation(Orientation _orientation) -{ - orientation = _orientation; -} - -// Returns the slider's orientation. -WidgetSlider::Orientation WidgetSlider::GetOrientation() const -{ - return orientation; -} - -// Sets the dimensions to the size of the slider. -void WidgetSlider::GetDimensions(Rocket::Core::Vector2f& dimensions) const -{ - switch (orientation) - { - case VERTICAL: dimensions.x = 16; dimensions.y = 256; break; - case HORIZONTAL: dimensions.x = 256; dimensions.y = 16; break; - } -} - -// Lays out and resizes the internal elements. -void WidgetSlider::FormatElements(const Rocket::Core::Vector2f& containing_block, float slider_length, float bar_length) -{ - int length_axis = orientation == VERTICAL ? 1 : 0; - - // Build the box for the containing slider element. As the containing block is not guaranteed to have a defined - // height, we must use the width for both axes. - Core::Box parent_box; - Core::ElementUtilities::BuildBox(parent_box, Rocket::Core::Vector2f(containing_block.x, containing_block.x), parent); - - // Set the length of the slider. - Rocket::Core::Vector2f content = parent_box.GetSize(); - content[length_axis] = slider_length; - parent_box.SetContent(content); - - // Generate the initial dimensions for the track. It'll need to be cut down to fit the arrows. - Core::Box track_box; - Core::ElementUtilities::BuildBox(track_box, parent_box.GetSize(), track); - content = track_box.GetSize(); - content[length_axis] = slider_length -= orientation == VERTICAL ? (track_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::TOP) + track_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::BOTTOM)) : - (track_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::LEFT) + track_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::RIGHT)); - // If no height has been explicitly specified for the track, it'll be initialised to -1 as per normal block - // elements. We'll fix that up here. - if (orientation == HORIZONTAL && - content.y < 0) - content.y = parent_box.GetSize().y; - - // Now we size the arrows. - for (int i = 0; i < 2; i++) - { - Core::Box arrow_box; - Core::ElementUtilities::BuildBox(arrow_box, parent_box.GetSize(), arrows[i]); - - // Clamp the size to (0, 0). - Rocket::Core::Vector2f arrow_size = arrow_box.GetSize(); - if (arrow_size.x < 0 || - arrow_size.y < 0) - arrow_box.SetContent(Rocket::Core::Vector2f(0, 0)); - - arrows[i]->SetBox(arrow_box); - - // Shrink the track length by the arrow size. - content[length_axis] -= arrow_box.GetSize(Core::Box::MARGIN)[length_axis]; - } - - // Now the track has been sized, we can fix everything into position. - track_box.SetContent(content); - track->SetBox(track_box); - - if (orientation == VERTICAL) - { - Rocket::Core::Vector2f offset(arrows[0]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::LEFT), arrows[0]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::TOP)); - arrows[0]->SetOffset(offset, parent); - - offset.x = track->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::LEFT); - offset.y += arrows[0]->GetBox().GetSize(Core::Box::BORDER).y + arrows[0]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::BOTTOM) + track->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::TOP); - track->SetOffset(offset, parent); - - offset.x = arrows[1]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::LEFT); - offset.y += track->GetBox().GetSize(Core::Box::BORDER).y + track->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::BOTTOM) + arrows[1]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::TOP); - arrows[1]->SetOffset(offset, parent); - } - else - { - Rocket::Core::Vector2f offset(arrows[0]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::LEFT), arrows[0]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::TOP)); - arrows[0]->SetOffset(offset, parent); - - offset.x += arrows[0]->GetBox().GetSize(Core::Box::BORDER).x + arrows[0]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::RIGHT) + track->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::LEFT); - offset.y = track->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::TOP); - track->SetOffset(offset, parent); - - offset.x += track->GetBox().GetSize(Core::Box::BORDER).x + track->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::RIGHT) + arrows[1]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::LEFT); - offset.y = arrows[1]->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::TOP); - arrows[1]->SetOffset(offset, parent); - } - - FormatBar(bar_length); - - if (parent->IsDisabled()) - { - // Propagate disabled state to child elements - bar->SetPseudoClass("disabled", true); - track->SetPseudoClass("disabled", true); - arrows[0]->SetPseudoClass("disabled", true); - arrows[1]->SetPseudoClass("disabled", true); - } -} - -// Lays out and positions the bar element. -void WidgetSlider::FormatBar(float bar_length) -{ - Core::Box bar_box; - Core::ElementUtilities::BuildBox(bar_box, parent->GetBox().GetSize(), bar); - - Rocket::Core::Vector2f bar_box_content = bar_box.GetSize(); - if (orientation == HORIZONTAL) - { - if (bar->GetLocalProperty("height") == NULL) - bar_box_content.y = parent->GetBox().GetSize().y; - } - - if (bar_length >= 0) - { - Rocket::Core::Vector2f track_size = track->GetBox().GetSize(); - - if (orientation == VERTICAL) - { - float track_length = track_size.y - (bar_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::TOP) + bar_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::BOTTOM)); - - if (bar->GetLocalProperty("height") == NULL) - { - bar_box_content.y = track_length * bar_length; - - // Check for 'min-height' restrictions. - float min_track_length = bar->ResolveProperty("min-height", track_length); - bar_box_content.y = Rocket::Core::Math::Max(min_track_length, bar_box_content.y); - - // Check for 'max-height' restrictions. - float max_track_length = bar->ResolveProperty("max-height", track_length); - if (max_track_length > 0) - bar_box_content.y = Rocket::Core::Math::Min(max_track_length, bar_box_content.y); - } - - // Make sure we haven't gone further than we're allowed to (min-height may have made us too big). - bar_box_content.y = Rocket::Core::Math::Min(bar_box_content.y, track_length); - } - else - { - float track_length = track_size.x - (bar_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::LEFT) + bar_box.GetCumulativeEdge(Core::Box::CONTENT, Core::Box::RIGHT)); - - if (bar->GetLocalProperty("width") == NULL) - { - bar_box_content.x = track_length * bar_length; - - // Check for 'min-width' restrictions. - float min_track_length = bar->ResolveProperty("min-width", track_length); - bar_box_content.x = Rocket::Core::Math::Max(min_track_length, bar_box_content.x); - - // Check for 'max-width' restrictions. - float max_track_length = bar->ResolveProperty("max-width", track_length); - if (max_track_length > 0) - bar_box_content.x = Rocket::Core::Math::Min(max_track_length, bar_box_content.x); - } - - // Make sure we haven't gone further than we're allowed to (min-width may have made us too big). - bar_box_content.x = Rocket::Core::Math::Min(bar_box_content.x, track_length); - } - } - - // Set the new dimensions on the bar to re-decorate it. - bar_box.SetContent(bar_box_content); - bar->SetBox(bar_box); - - // Now that it's been resized, re-position it. - PositionBar(); -} - -// Returns the widget's parent element. -Core::Element* WidgetSlider::GetParent() const -{ - return parent; -} - -// Handles events coming through from the slider's components. -void WidgetSlider::ProcessEvent(Core::Event& event) -{ - if (parent->IsDisabled()) - return; - - if (event.GetTargetElement() == bar) - { - if (event == "drag") - { - if (orientation == HORIZONTAL) - { - float traversable_track_length = track->GetBox().GetSize(Core::Box::CONTENT).x - bar->GetBox().GetSize(Core::Box::CONTENT).x; - if (traversable_track_length > 0) - { - float traversable_track_origin = track->GetAbsoluteOffset().x + bar_drag_anchor; - float new_bar_position = (event.GetParameter< float >("mouse_x", 0) - traversable_track_origin) / traversable_track_length; - new_bar_position = Rocket::Core::Math::Clamp(new_bar_position, 0.0f, 1.0f); - - SetBarPosition(OnBarChange(new_bar_position)); - } - } - else - { - float traversable_track_length = track->GetBox().GetSize(Core::Box::CONTENT).y - bar->GetBox().GetSize(Core::Box::CONTENT).y; - if (traversable_track_length > 0) - { - float traversable_track_origin = track->GetAbsoluteOffset().y + bar_drag_anchor; - float new_bar_position = (event.GetParameter< float >("mouse_y", 0) - traversable_track_origin) / traversable_track_length; - new_bar_position = Rocket::Core::Math::Clamp(new_bar_position, 0.0f, 1.0f); - - SetBarPosition(OnBarChange(new_bar_position)); - } - } - } - else if (event == "dragstart") - { - if (orientation == HORIZONTAL) - bar_drag_anchor = event.GetParameter< int >("mouse_x", 0) - Rocket::Core::Math::RealToInteger(bar->GetAbsoluteOffset().x); - else - bar_drag_anchor = event.GetParameter< int >("mouse_y", 0) - Rocket::Core::Math::RealToInteger(bar->GetAbsoluteOffset().y); - } - } - else if (event.GetTargetElement() == track) - { - if (event == "click") - { - if (orientation == HORIZONTAL) - { - float mouse_position = event.GetParameter< float >("mouse_x", 0); - float click_position = (mouse_position - track->GetAbsoluteOffset().x) / track->GetBox().GetSize().x; - - SetBarPosition(click_position <= bar_position ? OnPageDecrement(click_position) : OnPageIncrement(click_position)); - } - else - { - float mouse_position = event.GetParameter< float >("mouse_y", 0); - float click_position = (mouse_position - track->GetAbsoluteOffset().y) / track->GetBox().GetSize().y; - - SetBarPosition(click_position <= bar_position ? OnPageDecrement(click_position) : OnPageIncrement(click_position)); - } - } - } - - if (event == "mousedown") - { - if (event.GetTargetElement() == arrows[0]) - { - arrow_timers[0] = DEFAULT_REPEAT_DELAY; - last_update_time = Core::GetSystemInterface()->GetElapsedTime(); - SetBarPosition(OnLineDecrement()); - } - else if (event.GetTargetElement() == arrows[1]) - { - arrow_timers[1] = DEFAULT_REPEAT_DELAY; - last_update_time = Core::GetSystemInterface()->GetElapsedTime(); - SetBarPosition(OnLineIncrement()); - } - } - else if (event == "mouseup" || - event == "mouseout") - { - if (event.GetTargetElement() == arrows[0]) - arrow_timers[0] = -1; - else if (event.GetTargetElement() == arrows[1]) - arrow_timers[1] = -1; - } - else if (event == "keydown") - { - Core::Input::KeyIdentifier key_identifier = (Core::Input::KeyIdentifier) event.GetParameter< int >("key_identifier", 0); - - switch (key_identifier) - { - case Core::Input::KI_LEFT: - if (orientation == HORIZONTAL) SetBarPosition(OnLineDecrement()); - break; - case Core::Input::KI_UP: - if (orientation == VERTICAL) SetBarPosition(OnLineDecrement()); - break; - case Core::Input::KI_RIGHT: - if (orientation == HORIZONTAL) SetBarPosition(OnLineIncrement()); - break; - case Core::Input::KI_DOWN: - if (orientation == VERTICAL) SetBarPosition(OnLineIncrement()); - break; - default: - break; - } - } - - - if (event.GetTargetElement() == parent) - { - if (event == "focus") - { - bar->SetPseudoClass("focus", true); - } - else if (event == "blur") - { - bar->SetPseudoClass("focus", false); - } - } -} - -void WidgetSlider::PositionBar() -{ - const Rocket::Core::Vector2f& track_dimensions = track->GetBox().GetSize(); - const Rocket::Core::Vector2f& bar_dimensions = bar->GetBox().GetSize(Core::Box::BORDER); - - if (orientation == VERTICAL) - { - float traversable_track_length = track_dimensions.y - bar_dimensions.y; - bar->SetOffset(Rocket::Core::Vector2f(bar->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::LEFT), track->GetRelativeOffset().y + traversable_track_length * bar_position), parent); - } - else - { - float traversable_track_length = track_dimensions.x - bar_dimensions.x; - bar->SetOffset(Rocket::Core::Vector2f(track->GetRelativeOffset().x + traversable_track_length * bar_position, bar->GetBox().GetEdge(Core::Box::MARGIN, Core::Box::TOP)), parent); - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetSlider.h b/libs/libRocket/Source/Controls/WidgetSlider.h deleted file mode 100644 index 5a15c0b57a7..00000000000 --- a/libs/libRocket/Source/Controls/WidgetSlider.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSWIDGETSLIDER_H -#define ROCKETCONTROLSWIDGETSLIDER_H - -#include "../../Include/Rocket/Core/EventListener.h" - -namespace Rocket { -namespace Controls { - -class ElementFormControl; - -/** - A generic widget for incorporating sliding functionality into an element. - - @author Peter Curry - */ - -class WidgetSlider : public Core::EventListener -{ -public: - enum Orientation - { - VERTICAL, - HORIZONTAL - }; - - WidgetSlider(ElementFormControl* parent); - virtual ~WidgetSlider(); - - /// Initialises the slider's hidden elements. - bool Initialise(); - - /// Updates the key repeats for the increment / decrement arrows. - void Update(); - - /// Sets the position of the bar. - /// @param[in] bar_position The new position of the bar (0 representing the start of the track, 1 representing the end). - void SetBarPosition(float bar_position); - /// Returns the current position of the bar. - /// @return The current position of the bar (0 representing the start of the track, 1 representing the end). - float GetBarPosition(); - - /// Sets the orientation of the slider. - /// @param[in] orientation The slider's new orientation. - void SetOrientation(Orientation orientation); - /// Returns the slider's orientation. - /// @return The orientation of the slider. - Orientation GetOrientation() const; - - /// Sets the dimensions to the size of the slider. - /// @param[in] dimensions The dimensions to size. - void GetDimensions(Rocket::Core::Vector2f& dimensions) const; - -protected: - /// Lays out and resizes the slider's internal elements. - /// @param[in] containing_block The padded box containing the slider. This is used to resolve relative properties. - /// @param[in] slider_length The total length, in pixels, of the slider widget. - /// @param[in] bar_length The total length of the bar, as a proportion of the track length. If this is -1, the intrinsic length will be used. - void FormatElements(const Rocket::Core::Vector2f& containing_block, float slider_length, float bar_length = -1); - /// Lays out and positions the bar element. - /// @param[in] bar_length The total length of the bar, as a proportion of the track length. If this is -1, the intrinsic length will be used. - void FormatBar(float bar_length = -1); - - /// Returns the widget's parent element. - Core::Element* GetParent() const; - - /// Handles events coming through from the slider's components. - virtual void ProcessEvent(Core::Event& event); - - /// Called when the slider's bar position is set or dragged. - /// @param[in] bar_position The new position of the bar (0 representing the start of the track, 1 representing the end). - /// @return The new position of the bar. - virtual float OnBarChange(float bar_position) = 0; - /// Called when the slider is incremented by one 'line', either by the down / right key or a mouse-click on the - /// increment arrow. - /// @return The new position of the bar. - virtual float OnLineIncrement() = 0; - /// Called when the slider is decremented by one 'line', either by the up / left key or a mouse-click on the - /// decrement arrow. - /// @return The new position of the bar. - virtual float OnLineDecrement() = 0; - /// Called when the slider is incremented by one 'page', either by the page-up key or a mouse-click on the - /// track below / right of the bar. - /// @param[in] click_position The parametric position of the click along the track, or -1 if this was not generated by a mouse click. - /// @return The new position of the bar. - virtual float OnPageIncrement(float click_position) = 0; - /// Called when the slider is incremented by one 'page', either by the page-down key or a mouse-click on the - /// track above / left of the bar. - /// @param[in] click_position The parametric position of the click along the track, or -1 if this was not generated by a mouse click. - /// @return The new position of the bar. - virtual float OnPageDecrement(float click_position) = 0; - -private: - void PositionBar(); - - ElementFormControl* parent; - - Orientation orientation; - - // The background track element, across which the bar slides. - Core::Element* track; - // The bar element. This is the element that is dragged across the trough. - Core::Element* bar; - // The two (optional) buttons for incrementing and decrementing the slider. - Core::Element* arrows[2]; - - // A number from 0 to 1, indicating how far along the track the bar is. - float bar_position; - // If the bar is being dragged, this is the pixel offset from the start of the bar to where it was picked up. - int bar_drag_anchor; - - // Set to the auto-repeat timer if either of the arrow buttons have been pressed, -1 if they haven't. - float arrow_timers[2]; - float last_update_time; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/WidgetSliderInput.cpp b/libs/libRocket/Source/Controls/WidgetSliderInput.cpp deleted file mode 100644 index 01307d64764..00000000000 --- a/libs/libRocket/Source/Controls/WidgetSliderInput.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "WidgetSliderInput.h" -#include "../../Include/Rocket/Core/Math.h" -#include "../../Include/Rocket/Core/Element.h" - -namespace Rocket { -namespace Controls { - -WidgetSliderInput::WidgetSliderInput(ElementFormControl* parent) : WidgetSlider(parent) -{ - value = 0; - min_value = 0; - max_value = 100; - step = 1; -} - -WidgetSliderInput::~WidgetSliderInput() -{ -} - -void WidgetSliderInput::SetValue(float value) -{ - float num_steps = (value - min_value) / step; - float new_value = min_value + Rocket::Core::Math::Round(num_steps) * step; - - SetBarPosition(SetValueInternal(new_value)); -} - -float WidgetSliderInput::GetValue() -{ - return value; -} - -// Sets the minimum value of the slider. -void WidgetSliderInput::SetMinValue(float _min_value) -{ - min_value = _min_value; -} - -// Sets the maximum value of the slider. -void WidgetSliderInput::SetMaxValue(float _max_value) -{ - max_value = _max_value; -} - -// Sets the slider's value increment. -void WidgetSliderInput::SetStep(float _step) -{ - // Can't have a zero step! - if (_step == 0) - return; - - step = _step; -} - -// Formats the slider's elements. -void WidgetSliderInput::FormatElements() -{ - Rocket::Core::Vector2f box = GetParent()->GetBox().GetSize(); - WidgetSlider::FormatElements(box, GetOrientation() == VERTICAL ? box.y : box.x); -} - -// Called when the slider's bar position is set or dragged. -float WidgetSliderInput::OnBarChange(float bar_position) -{ - float new_value = min_value + bar_position * (max_value - min_value); - int num_steps = Rocket::Core::Math::Round((new_value - value) / step); - - return SetValueInternal(value + num_steps * step); -} - -// Called when the slider is incremented by one 'line'. -float WidgetSliderInput::OnLineIncrement() -{ - return SetValueInternal(value + step); -} - -// Called when the slider is decremented by one 'line'. -float WidgetSliderInput::OnLineDecrement() -{ - return SetValueInternal(value - step); -} - -// Called when the slider is incremented by one 'page'. -float WidgetSliderInput::OnPageIncrement(float click_position) -{ - return OnBarChange(click_position); -} - -// Called when the slider is incremented by one 'page'. -float WidgetSliderInput::OnPageDecrement(float click_position) -{ - return OnBarChange(click_position); -} - -// Clamps the new value, sets it on the slider. -float WidgetSliderInput::SetValueInternal(float new_value) -{ - if (min_value < max_value) - { - value = Rocket::Core::Math::Clamp(new_value, min_value, max_value); - } - else if (min_value > max_value) - { - value = Rocket::Core::Math::Clamp(new_value, max_value, min_value); - } - else - { - value = min_value; - return 0; - } - - return (value - min_value) / (max_value - min_value); -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetSliderInput.h b/libs/libRocket/Source/Controls/WidgetSliderInput.h deleted file mode 100644 index d5b7e5df2d8..00000000000 --- a/libs/libRocket/Source/Controls/WidgetSliderInput.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSWIDGETSLIDERINPUT_H -#define ROCKETCONTROLSWIDGETSLIDERINPUT_H - -#include "WidgetSlider.h" - -namespace Rocket { -namespace Controls { - -/** - A specialisation of the slider widget for input sliders. - - @author Peter Curry - */ - -class WidgetSliderInput : public WidgetSlider -{ -public: - WidgetSliderInput(ElementFormControl* parent); - virtual ~WidgetSliderInput(); - - /// Sets a new value on the slider. - /// @param[in] value The new value for the slider. This will be clamped between the min and max values, and set to the nearest increment. - void SetValue(float value); - /// Returns the current value of the slider. - /// @return The current value of the slider. - float GetValue(); - - /// Sets the minimum value of the slider. - /// @param[in] min_value The new minimum value of the slider. - void SetMinValue(float min_value); - /// Sets the maximum value of the slider. - /// @param[in] max_value The new minimum value of the slider. - void SetMaxValue(float max_value); - /// Sets the slider's value increment. - /// @param[in] step The new increment for the slider's value. - void SetStep(float step); - - /// Formats the slider's elements. - void FormatElements(); - -protected: - /// Called when the slider's bar position is set or dragged. - /// @param bar_position[in] The new position of the bar (0 representing the start of the track, 1 representing the end). - /// @return The new position of the bar. - virtual float OnBarChange(float bar_position); - /// Called when the slider is incremented by one 'line', either by the down / right key or a mouse-click on the - /// increment arrow. - /// @return The new position of the bar. - virtual float OnLineIncrement(); - /// Called when the slider is decremented by one 'line', either by the up / left key or a mouse-click on the - /// decrement arrow. - /// @return The new position of the bar. - virtual float OnLineDecrement(); - /// Called when the slider is incremented by one 'page', either by the page-up key or a mouse-click on the - /// track below / right of the bar. - /// @return The new position of the bar. - virtual float OnPageIncrement(float click_position); - /// Called when the slider is incremented by one 'page', either by the page-down key or a mouse-click on the - /// track above / left of the bar. - /// @return The new position of the bar. - virtual float OnPageDecrement(float click_position); - -private: - /// Clamps the new value, sets it on the slider and returns it as a number from 0 to 1, 0 being the minimum - /// value and 1 the maximum. - /// @param[in] new_value The new value to set on the slider. - /// @return The new parametric value of the slider. - float SetValueInternal(float new_value); - - float value; - float min_value; - float max_value; - - float step; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/WidgetTextInput.cpp b/libs/libRocket/Source/Controls/WidgetTextInput.cpp deleted file mode 100644 index 4fb72191e62..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInput.cpp +++ /dev/null @@ -1,988 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "WidgetTextInput.h" -#include "ElementTextSelection.h" -#include "../../Include/Rocket/Core.h" -#include "../../Include/Rocket/Controls/ElementFormControl.h" -#include "../../Include/Rocket/Controls/Clipboard.h" -#include "../../Include/Rocket/Core/SystemInterface.h" - -namespace Rocket { -namespace Controls { - -const float CURSOR_BLINK_TIME = 0.7f; - -WidgetTextInput::WidgetTextInput(ElementFormControl* _parent) : internal_dimensions(0, 0), scroll_offset(0, 0), selection_geometry(_parent), cursor_position(0, 0), cursor_size(0, 0), cursor_geometry(_parent) -{ - keyboard_showed = false; - - parent = _parent; - parent->SetProperty("white-space", "pre"); - parent->SetProperty("overflow", "hidden"); - parent->SetProperty("drag", "drag"); - parent->SetClientArea(Rocket::Core::Box::CONTENT); - - parent->AddEventListener("resize", this, true); - parent->AddEventListener("keydown", this, true); - parent->AddEventListener("textinput", this, true); - parent->AddEventListener("focus", this, true); - parent->AddEventListener("blur", this, true); - parent->AddEventListener("mousedown", this, true); - parent->AddEventListener("drag", this, true); - - text_element = dynamic_cast< Core::ElementText* >(Core::Factory::InstanceElement(parent, "#text", "#text", Rocket::Core::XMLAttributes())); - selected_text_element = dynamic_cast< Core::ElementText* >(Core::Factory::InstanceElement(parent, "#text", "#text", Rocket::Core::XMLAttributes())); - if (text_element != NULL) - { - text_element->SuppressAutoLayout(); - parent->AppendChild(text_element, false); - text_element->RemoveReference(); - - selected_text_element->SuppressAutoLayout(); - parent->AppendChild(selected_text_element, false); - selected_text_element->RemoveReference(); - } - - // Create the dummy selection element. - selection_element = Core::Factory::InstanceElement(parent, "#selection", "selection", Rocket::Core::XMLAttributes()); - ElementTextSelection* text_selection_element = dynamic_cast< ElementTextSelection* >(selection_element); - if (text_selection_element != NULL) - { - text_selection_element->SetWidget(this); - parent->AppendChild(text_selection_element, false); - text_selection_element->RemoveReference(); - } - - edit_index = 0; - absolute_cursor_index = 0; - cursor_line_index = 0; - cursor_character_index = 0; - - ideal_cursor_position = 0; - - max_length = -1; - - selection_anchor_index = 0; - selection_begin_index = 0; - selection_length = 0; - - ShowCursor(false); -} - -WidgetTextInput::~WidgetTextInput() -{ - parent->RemoveEventListener("resize", this, true); - parent->RemoveEventListener("keydown", this, true); - parent->RemoveEventListener("textinput", this, true); - parent->RemoveEventListener("focus", this, true); - parent->RemoveEventListener("blur", this, true); - parent->RemoveEventListener("mousedown", this, true); - parent->RemoveEventListener("drag", this, true); - - // Remove all the children added by the text widget. - parent->RemoveChild(text_element); - parent->RemoveChild(selected_text_element); - parent->RemoveChild(selection_element); -} - -// Sets the value of the text field. -void WidgetTextInput::SetValue(const Core::String& value) -{ - text_element->SetText(value); - FormatElement(); - - UpdateRelativeCursor(); -} - -// Sets the maximum length (in characters) of this text field. -void WidgetTextInput::SetMaxLength(int _max_length) -{ - if (max_length != _max_length) - { - max_length = _max_length; - if (max_length >= 0) - { - const Core::WString& value = GetElement()->GetAttribute< Rocket::Core::String >("value", ""); - if ((int) value.Length() > max_length) - { - Rocket::Core::String new_value; - Core::WString(value.CString(), value.CString() + max_length).ToUTF8(new_value); - - GetElement()->SetAttribute("value", new_value); - } - } - } -} - -// Returns the maximum length (in characters) of this text field. -int WidgetTextInput::GetMaxLength() const -{ - return max_length; -} - -// Update the colours of the selected text. -void WidgetTextInput::UpdateSelectionColours() -{ - // Determine what the colour of the selected text is. If our 'selection' element has the 'color' - // attribute set, then use that. Otherwise, use the inverse of our own text colour. - Rocket::Core::Colourb colour; - const Rocket::Core::Property* colour_property = selection_element->GetLocalProperty("color"); - if (colour_property != NULL) - colour = colour_property->Get< Rocket::Core::Colourb >(); - else - { - colour = parent->GetProperty< Rocket::Core::Colourb >("color"); - colour.red = 255 - colour.red; - colour.green = 255 - colour.green; - colour.blue = 255 - colour.blue; - } - - // Set the computed text colour on the element holding the selected text. - selected_text_element->SetProperty("color", Rocket::Core::Property(colour, Rocket::Core::Property::COLOUR)); - - // If the 'background-color' property has been set on the 'selection' element, use that as the - // background colour for the selected text. Otherwise, use the inverse of the selected text - // colour. - colour_property = selection_element->GetLocalProperty("background-color"); - if (colour_property != NULL) - selection_colour = colour_property->Get< Rocket::Core::Colourb >(); - else - selection_colour = Rocket::Core::Colourb(255 - colour.red, 255 - colour.green, 255 - colour.blue, colour.alpha); -} - -// Updates the cursor, if necessary. -void WidgetTextInput::OnUpdate() -{ - if (cursor_timer > 0) - { - float current_time = Core::GetSystemInterface()->GetElapsedTime(); - cursor_timer -= (current_time - last_update_time); - last_update_time = current_time; - - while (cursor_timer <= 0) - { - cursor_timer += CURSOR_BLINK_TIME; - cursor_visible = !cursor_visible; - } - } -} - -// Renders the cursor, if it is visible. -void WidgetTextInput::OnRender() -{ - Core::ElementUtilities::SetClippingRegion(text_element); - - Rocket::Core::Vector2f text_translation = parent->GetAbsoluteOffset() - Rocket::Core::Vector2f(parent->GetScrollLeft(), parent->GetScrollTop()); - selection_geometry.Render(text_translation); - - if (cursor_visible && - !parent->IsDisabled()) - { - cursor_geometry.Render(text_translation + cursor_position); - } -} - -// Formats the widget's internal content. -void WidgetTextInput::OnLayout() -{ - FormatElement(); - parent->SetScrollLeft(scroll_offset.x); - parent->SetScrollTop(scroll_offset.y); -} - -// Returns the input element's underlying text element. -Core::ElementText* WidgetTextInput::GetTextElement() -{ - return text_element; -} - -// Returns the input element's maximum allowed text dimensions. -const Rocket::Core::Vector2f& WidgetTextInput::GetTextDimensions() const -{ - return internal_dimensions; -} - -// Gets the parent element containing the widget. -Core::Element* WidgetTextInput::GetElement() -{ - return parent; -} - -// Dispatches a change event to the widget's element. -void WidgetTextInput::DispatchChangeEvent(bool linebreak) -{ - Rocket::Core::Dictionary parameters; - parameters.Set("value", GetElement()->GetAttribute< Rocket::Core::String >("value", "")); - parameters.Set("linebreak", linebreak); - GetElement()->DispatchEvent("change", parameters); -} - -// Processes the "keydown" and "textinput" event to write to the input field, and the "focus" and "blur" to set -// the state of the cursor. -void WidgetTextInput::ProcessEvent(Core::Event& event) -{ - if (event == "resize") - { - GenerateCursor(); - - Rocket::Core::Vector2f text_position = parent->GetBox().GetPosition(Core::Box::CONTENT); - text_element->SetOffset(text_position, parent); - selected_text_element->SetOffset(text_position, parent); - - Rocket::Core::Vector2f new_internal_dimensions = parent->GetBox().GetSize(Core::Box::CONTENT); - if (new_internal_dimensions != internal_dimensions) - { - internal_dimensions = new_internal_dimensions; - - FormatElement(); - UpdateCursorPosition(); - } - } - else if (parent->IsDisabled()) - { - return; - } - else if (event == "keydown") - { - Core::Input::KeyIdentifier key_identifier = (Core::Input::KeyIdentifier) event.GetParameter< int >("key_identifier", 0); - bool numlock = event.GetParameter< int >("num_lock_key", 0) > 0; - bool shift = event.GetParameter< int >("shift_key", 0) > 0; - bool ctrl = event.GetParameter< int >("ctrl_key", 0) > 0; - - switch (key_identifier) - { - case Core::Input::KI_NUMPAD4: if (numlock) break; - case Core::Input::KI_LEFT: MoveCursorHorizontal(-1, shift); break; - - case Core::Input::KI_NUMPAD6: if (numlock) break; - case Core::Input::KI_RIGHT: MoveCursorHorizontal(1, shift); break; - - case Core::Input::KI_NUMPAD8: if (numlock) break; - case Core::Input::KI_UP: MoveCursorVertical(-1, shift); break; - - case Core::Input::KI_NUMPAD2: if (numlock) break; - case Core::Input::KI_DOWN: MoveCursorVertical(1, shift); break; - - case Core::Input::KI_NUMPAD7: if (numlock) break; - case Core::Input::KI_HOME: MoveCursorHorizontal(-cursor_character_index, shift); break; - - case Core::Input::KI_NUMPAD1: if (numlock) break; - case Core::Input::KI_END: MoveCursorHorizontal(lines[cursor_line_index].content_length - cursor_character_index, shift); break; - - case Core::Input::KI_BACK: - { - if (DeleteCharacter(true)) - { - FormatElement(); - UpdateRelativeCursor(); - } - - ShowCursor(true); - } - break; - - case Core::Input::KI_DECIMAL: if (numlock) break; - case Core::Input::KI_DELETE: - { - if (DeleteCharacter(false)) - { - FormatElement(); - UpdateRelativeCursor(); - } - - ShowCursor(true); - } - break; - - case Core::Input::KI_NUMPADENTER: - case Core::Input::KI_RETURN: - { - LineBreak(); - } - break; - - case Core::Input::KI_C: - { - if (ctrl) - CopySelection(); - } - break; - - case Core::Input::KI_X: - { - if (ctrl) - { - CopySelection(); - DeleteSelection(); - } - } - break; - - case Core::Input::KI_V: - { - if (ctrl) - { - const Core::WString clipboard_content = Clipboard::Get(); - for (size_t i = 0; i < clipboard_content.Length(); ++i) - { - if (max_length > 0 && - (int) Core::WString(GetElement()->GetAttribute< Rocket::Core::String >("value", "")).Length() > max_length) - break; - - AddCharacter(clipboard_content[i]); - } - } - } - break; - - // Ignore tabs so input fields can be navigated through with keys. - case Core::Input::KI_TAB: - return; - - default: - { - } - break; - } - - event.StopPropagation(); - } - else if (event == "textinput") - { - // Only process the text if no modifier keys are pressed. - if (event.GetParameter< int >("ctrl_key", 0) == 0 && - event.GetParameter< int >("alt_key", 0) == 0 && - event.GetParameter< int >("meta_key", 0) == 0) - { - Rocket::Core::word character = event.GetParameter< Rocket::Core::word >("data", 0); - if (max_length < 0 || (int) Core::String(GetElement()->GetAttribute< Rocket::Core::String >("value", "")).Length() < max_length) - AddCharacter(character); - } - - ShowCursor(true); - event.StopPropagation(); - } - else if (event == "focus" && - event.GetTargetElement() == parent) - { - UpdateSelection(false); - ShowCursor(true, false); - } - else if (event == "blur" && - event.GetTargetElement() == parent) - { - ClearSelection(); - ShowCursor(false, false); - } - else if ((event == "mousedown" || - event == "drag") && - event.GetTargetElement() == parent) - { - Rocket::Core::Vector2f mouse_position = Rocket::Core::Vector2f((float) event.GetParameter< int >("mouse_x", 0), - (float) event.GetParameter< int >("mouse_y", 0)); - mouse_position -= text_element->GetAbsoluteOffset(); - - cursor_line_index = CalculateLineIndex(mouse_position.y); - cursor_character_index = CalculateCharacterIndex(cursor_line_index, mouse_position.x); - - UpdateAbsoluteCursor(); - UpdateCursorPosition(); - ideal_cursor_position = cursor_position.x; - - UpdateSelection(event == "drag" || event.GetParameter< int >("shift_key", 0) > 0); - - ShowCursor(true); - } -} - -// Adds a new character to the string at the cursor position. -bool WidgetTextInput::AddCharacter(Rocket::Core::word character) -{ - if (!IsCharacterValid(character)) - return false; - - if (selection_length > 0) - DeleteSelection(); - - Core::WString value = GetElement()->GetAttribute< Rocket::Core::String >("value", ""); - value.Insert(GetCursorIndex(), Core::WString(1, character), 1); - - edit_index += 1; - - Rocket::Core::String utf8_value; - value.ToUTF8(utf8_value); - GetElement()->SetAttribute("value", utf8_value); - DispatchChangeEvent(); - - UpdateSelection(false); - - return true; -} - -// Deletes a character from the string. -bool WidgetTextInput::DeleteCharacter(bool back) -{ - // First, check if we have anything selected; if so, delete that first before we start delete - // individual characters. - if (selection_length > 0) - { - DeleteSelection(); - DispatchChangeEvent(); - - UpdateSelection(false); - - return true; - } - - Core::WString value = GetElement()->GetAttribute< Rocket::Core::String >("value", ""); - - if (back) - { - if (GetCursorIndex() == 0) - return false; - - value.Erase(GetCursorIndex() - 1, 1); - edit_index -= 1; - } - else - { - if (GetCursorIndex() == (int) value.Length()) - return false; - - value.Erase(GetCursorIndex(), 1); - } - - Rocket::Core::String utf8_value; - value.ToUTF8(utf8_value); - GetElement()->SetAttribute("value", utf8_value); - DispatchChangeEvent(); - - UpdateSelection(false); - - return true; -} - -// Copies the selection (if any) to the clipboard. -void WidgetTextInput::CopySelection() -{ - const Core::String& value = GetElement()->GetAttribute< Rocket::Core::String >("value", ""); - Clipboard::Set(Core::String(value.Substring(selection_begin_index, selection_length))); -} - -// Returns the absolute index of the cursor. -int WidgetTextInput::GetCursorIndex() const -{ - return edit_index; -} - -// Moves the cursor along the current line. -void WidgetTextInput::MoveCursorHorizontal(int distance, bool select) -{ - absolute_cursor_index += distance; - absolute_cursor_index = Rocket::Core::Math::Max(0, absolute_cursor_index); - - UpdateRelativeCursor(); - ideal_cursor_position = cursor_position.x; - - UpdateSelection(select); - - ShowCursor(true); -} - -// Moves the cursor up and down the text field. -void WidgetTextInput::MoveCursorVertical(int distance, bool select) -{ - bool update_ideal_cursor_position = false; - cursor_line_index += distance; - - if (cursor_line_index < 0) - { - cursor_line_index = 0; - cursor_character_index = 0; - - update_ideal_cursor_position = true; - } - else if (cursor_line_index >= (int) lines.size()) - { - cursor_line_index = (int) lines.size() - 1; - cursor_character_index = (int) lines[cursor_line_index].content_length; - - update_ideal_cursor_position = true; - } - else - cursor_character_index = CalculateCharacterIndex(cursor_line_index, ideal_cursor_position); - - UpdateAbsoluteCursor(); - UpdateCursorPosition(); - - if (update_ideal_cursor_position) - ideal_cursor_position = cursor_position.x; - - UpdateSelection(select); - - ShowCursor(true); -} - -// Updates the absolute cursor index from the relative cursor indices. -void WidgetTextInput::UpdateAbsoluteCursor() -{ - ROCKET_ASSERT(cursor_line_index < (int) lines.size()) - - absolute_cursor_index = cursor_character_index; - edit_index = cursor_character_index; - - for (int i = 0; i < cursor_line_index; i++) - { - absolute_cursor_index += (int)lines[i].content.Length(); - edit_index += (int)lines[i].content.Length() + lines[i].extra_characters; - } -} - -// Updates the relative cursor indices from the absolute cursor index. -void WidgetTextInput::UpdateRelativeCursor() -{ - int num_characters = 0; - edit_index = absolute_cursor_index; - - for (size_t i = 0; i < lines.size(); i++) - { - if (num_characters + lines[i].content_length >= absolute_cursor_index) - { - cursor_line_index = (int) i; - cursor_character_index = absolute_cursor_index - num_characters; - - UpdateCursorPosition(); - - return; - } - - num_characters += (int) lines[i].content.Length(); - edit_index += lines[i].extra_characters; - } - - // We shouldn't ever get here; this means we actually couldn't find where the absolute cursor said it was. So we'll - // just set the relative cursors to the very end of the text field, and update the absolute cursor to point here. - cursor_line_index = (int) lines.size() - 1; - cursor_character_index = lines[cursor_line_index].content_length; - absolute_cursor_index = num_characters; - edit_index = num_characters; - - UpdateCursorPosition(); -} - -// Calculates the line index under a specific vertical position. -int WidgetTextInput::CalculateLineIndex(float position) -{ - float line_height = (float) Core::ElementUtilities::GetLineHeight(parent); - int line_index = Rocket::Core::Math::RealToInteger(position / line_height); - return Rocket::Core::Math::Clamp(line_index, 0, (int) (lines.size() - 1)); -} - -// Calculates the character index along a line under a specific horizontal position. -int WidgetTextInput::CalculateCharacterIndex(int line_index, float position) -{ - int character_index = 0; - float line_width = 0; - - while (character_index < lines[line_index].content_length) - { - float next_line_width = (float) Core::ElementUtilities::GetStringWidth(text_element, lines[line_index].content.Substring(0, character_index)); - if (next_line_width > position) - { - if (position - line_width < next_line_width - position) - return Rocket::Core::Math::Max(0, character_index - 1); - else - return character_index; - } - - line_width = next_line_width; - character_index++; - } - - return character_index; -} - -// Shows or hides the cursor. -void WidgetTextInput::ShowCursor(bool show, bool move_to_cursor) -{ - if (show) - { - cursor_visible = true; - SetKeyboardActive(true); - keyboard_showed = true; - - cursor_timer = CURSOR_BLINK_TIME; - last_update_time = Core::GetSystemInterface()->GetElapsedTime(); - - // Shift the cursor into view. - if (move_to_cursor) - { - float minimum_scroll_top = (cursor_position.y + cursor_size.y) - parent->GetClientHeight(); - if (parent->GetScrollTop() < minimum_scroll_top) - parent->SetScrollTop(minimum_scroll_top); - else if (parent->GetScrollTop() > cursor_position.y) - parent->SetScrollTop(cursor_position.y); - - float minimum_scroll_left = (cursor_position.x + cursor_size.x) - parent->GetClientWidth(); - if (parent->GetScrollLeft() < minimum_scroll_left) - parent->SetScrollLeft(minimum_scroll_left); - else if (parent->GetScrollLeft() > cursor_position.x) - parent->SetScrollLeft(cursor_position.x); - - scroll_offset.x = parent->GetScrollLeft(); - scroll_offset.y = parent->GetScrollTop(); - } - } - else - { - cursor_visible = false; - cursor_timer = -1; - last_update_time = 0; - if (keyboard_showed) - { - SetKeyboardActive(false); - keyboard_showed = false; - } - } -} - -// Formats the element, laying out the text and inserting scrollbars as appropriate. -void WidgetTextInput::FormatElement() -{ - Core::ElementScroll* scroll = parent->GetElementScroll(); - float width = parent->GetBox().GetSize(Core::Box::PADDING).x; - - int x_overflow_property = parent->GetProperty< int >("overflow-x"); - int y_overflow_property = parent->GetProperty< int >("overflow-y"); - - if (x_overflow_property == Core::OVERFLOW_SCROLL) - scroll->EnableScrollbar(Core::ElementScroll::HORIZONTAL, width); - else - scroll->DisableScrollbar(Core::ElementScroll::HORIZONTAL); - - if (y_overflow_property == Core::OVERFLOW_SCROLL) - scroll->EnableScrollbar(Core::ElementScroll::VERTICAL, width); - else - scroll->DisableScrollbar(Core::ElementScroll::VERTICAL); - - // Format the text and determine its total area. - Rocket::Core::Vector2f content_area = FormatText(); - - // If we're set to automatically generate horizontal scrollbars, check for that now. - if (x_overflow_property == Core::OVERFLOW_AUTO) - { - if (parent->GetClientWidth() < content_area.x) - scroll->EnableScrollbar(Core::ElementScroll::HORIZONTAL, width); - } - - // Now check for vertical overflow. If we do turn on the scrollbar, this will cause a reflow. - if (y_overflow_property == Core::OVERFLOW_AUTO) - { - if (parent->GetClientHeight() < content_area.y) - { - scroll->EnableScrollbar(Core::ElementScroll::VERTICAL, width); - content_area = FormatText(); - - if (x_overflow_property == Core::OVERFLOW_AUTO && - parent->GetClientWidth() < content_area.y) - { - scroll->EnableScrollbar(Core::ElementScroll::HORIZONTAL, width); - } - } - } - - parent->SetContentBox(Rocket::Core::Vector2f(0, 0), content_area); - scroll->FormatScrollbars(); -} - -// Formats the input element's text field. -Rocket::Core::Vector2f WidgetTextInput::FormatText() -{ - absolute_cursor_index = edit_index; - - Rocket::Core::Vector2f content_area(0, 0); - - // Clear the old lines, and all the lines in the text elements. - lines.clear(); - text_element->ClearLines(); - selected_text_element->ClearLines(); - - // Clear the selection background geometry, and get the vertices and indices so the new geo can - // be generated. - selection_geometry.Release(true); - std::vector< Core::Vertex >& selection_vertices = selection_geometry.GetVertices(); - std::vector< int >& selection_indices = selection_geometry.GetIndices(); - - // Determine the line-height of the text element. - int line_height = Rocket::Core::ElementUtilities::GetLineHeight(parent); - - int line_begin = 0; - Rocket::Core::Vector2f line_position(0, 0); - bool last_line = false; - - // Keep generating lines until all the text content is placed. - do - { - Line line; - line.extra_characters = 0; - float line_width; - - // Generate the next line. - last_line = text_element->GenerateLine(line.content, line.content_length, line_width, line_begin, parent->GetClientWidth() - cursor_size.x, 0, false); - - // If this line terminates in a soft-return, then the line may be leaving a space or two behind as an orphan. - // If so, we must append the orphan onto the line even though it will push the line outside of the input - // field's bounds. - bool soft_return = false; - if (!last_line && - (line.content.Empty() || - line.content[line.content.Length() - 1] != '\n')) - { - soft_return = true; - - const Core::WString& text = text_element->GetText(); - Core::WString orphan; - for (int i = 1; i >= 0; --i) - { - int index = line_begin + line.content_length + i; - if (index >= (int) text.Length()) - continue; - - if (text[index] != ' ') - { - orphan = ""; - continue; - } - - int next_index = index + 1; - if (!orphan.Empty() || - next_index >= (int) text.Length() || - text[next_index] != ' ') - orphan += ' '; - } - - if (!orphan.Empty()) - { - line.content += orphan; - line.content_length += (int) orphan.Length(); - line_width += Core::ElementUtilities::GetStringWidth(text_element, orphan); - } - } - - - // Now that we have the string of characters appearing on the new line, we split it into - // three parts; the unselected text appearing before any selected text on the line, the - // selected text on the line, and any unselected text after the selection. - Core::WString pre_selection, selection, post_selection; - GetLineSelection(pre_selection, selection, post_selection, line.content, line_begin); - - // The pre-selected text is placed, if there is any (if the selection starts on or before - // the beginning of this line, then this will be empty). - if (!pre_selection.Empty()) - { - text_element->AddLine(line_position, pre_selection); - line_position.x += Core::ElementUtilities::GetStringWidth(text_element, pre_selection); - } - - // If there is any selected text on this line, place it in the selected text element and - // generate the geometry for its background. - if (!selection.Empty()) - { - selected_text_element->AddLine(line_position, selection); - int selection_width = Core::ElementUtilities::GetStringWidth(selected_text_element, selection); - - selection_vertices.resize(selection_vertices.size() + 4); - selection_indices.resize(selection_indices.size() + 6); - Core::GeometryUtilities::GenerateQuad(&selection_vertices[selection_vertices.size() - 4], &selection_indices[selection_indices.size() - 6], line_position, Rocket::Core::Vector2f((float)selection_width, (float)line_height), selection_colour, (int)selection_vertices.size() - 4); - - line_position.x += selection_width; - } - - // If there is any unselected text after the selection on this line, place it in the - // standard text element after the selected text. - if (!post_selection.Empty()) - text_element->AddLine(line_position, post_selection); - - - // Update variables for the next line. - line_begin += line.content_length; - line_position.x = 0; - line_position.y += line_height; - - // Grow the content area width-wise if this line is the longest so far, and push the - // height out. - content_area.x = Rocket::Core::Math::Max(content_area.x, line_width + cursor_size.x); - content_area.y = line_position.y; - - // Push a trailing '\r' token onto the back to indicate a soft return if necessary. - if (soft_return) - { - line.content += '\r'; - line.extra_characters -= 1; - - if (edit_index >= line_begin) - absolute_cursor_index += 1; - } - - // Push the new line into our array of lines, but first check if its content length needs to be truncated to - // dodge a trailing endline. - if (!line.content.Empty() && - line.content[line.content.Length() - 1] == '\n') - line.content_length -= 1; - lines.push_back(line); - } - while (!last_line); - - return content_area; -} - -// Generates the text cursor. -void WidgetTextInput::GenerateCursor() -{ - // Generates the cursor. - cursor_geometry.Release(); - - std::vector< Core::Vertex >& vertices = cursor_geometry.GetVertices(); - vertices.resize(4); - - std::vector< int >& indices = cursor_geometry.GetIndices(); - indices.resize(6); - - cursor_size.x = 1; - cursor_size.y = (float) Core::ElementUtilities::GetLineHeight(text_element) + 2; - Core::GeometryUtilities::GenerateQuad(&vertices[0], &indices[0], Rocket::Core::Vector2f(0, 0), cursor_size, parent->GetProperty< Rocket::Core::Colourb >("color")); -} - -void WidgetTextInput::UpdateCursorPosition() -{ - if (text_element->GetFontFaceHandle() == NULL) - return; - - cursor_position.x = (float) Core::ElementUtilities::GetStringWidth(text_element, lines[cursor_line_index].content.Substring(0, cursor_character_index)); - cursor_position.y = -1 + cursor_line_index * (float) Core::ElementUtilities::GetLineHeight(text_element); -} - -// Expand the text selection to the position of the cursor. -void WidgetTextInput::UpdateSelection(bool selecting) -{ - if (!selecting) - { - selection_anchor_index = edit_index; - ClearSelection(); - } - else - { - int new_begin_index; - int new_end_index; - - if (edit_index > selection_anchor_index) - { - new_begin_index = selection_anchor_index; - new_end_index = edit_index; - } - else - { - new_begin_index = edit_index; - new_end_index = selection_anchor_index; - } - - if (new_begin_index != selection_begin_index || - new_end_index - new_begin_index != selection_length) - { - selection_begin_index = new_begin_index; - selection_length = new_end_index - new_begin_index; - - FormatText(); - } - } -} - -// Removes the selection of text. -void WidgetTextInput::ClearSelection() -{ - if (selection_length > 0) - { - selection_length = 0; - FormatElement(); - } -} - -// Deletes all selected text and removes the selection. -void WidgetTextInput::DeleteSelection() -{ - if (selection_length > 0) - { - const Core::WString& value = GetElement()->GetAttribute< Rocket::Core::String >("value", ""); - - Rocket::Core::String new_value; - Core::WString(value.Substring(0, selection_begin_index) + value.Substring(selection_begin_index + selection_length)).ToUTF8(new_value); - GetElement()->SetAttribute("value", new_value); - - // Move the cursor to the beginning of the old selection. - absolute_cursor_index = selection_begin_index; - UpdateRelativeCursor(); - - // Erase our record of the selection. - ClearSelection(); - } -} - -// Split one line of text into three parts, based on the current selection. -void WidgetTextInput::GetLineSelection(Core::WString& pre_selection, Core::WString& selection, Core::WString& post_selection, const Core::WString& line, int line_begin) -{ - // Check if we have any selection at all, and if so if the selection is on this line. - if (selection_length <= 0 || - selection_begin_index + selection_length < line_begin || - selection_begin_index > line_begin + (int) line.Length()) - { - pre_selection = line; - return; - } - - // Split the line up into its three parts, depending on the size and placement of the selection. - pre_selection = line.Substring(0, Rocket::Core::Math::Max(0, selection_begin_index - line_begin)); - selection = line.Substring(Rocket::Core::Math::Max(0, selection_begin_index - line_begin), Rocket::Core::Math::Max(0, selection_length + Rocket::Core::Math::Min(0, selection_begin_index - line_begin))); - post_selection = line.Substring(selection_begin_index + selection_length - line_begin); -} - -void WidgetTextInput::SetKeyboardActive(bool active) -{ - Core::SystemInterface* system = Core::GetSystemInterface(); - if (system) { - if (active) - { - system->ActivateKeyboard(); - } else - { - system->DeactivateKeyboard(); - } - } -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetTextInput.h b/libs/libRocket/Source/Controls/WidgetTextInput.h deleted file mode 100644 index 9f2e01d8d02..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInput.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSWIDGETTEXTINPUT_H -#define ROCKETCONTROLSWIDGETTEXTINPUT_H - -#include "../../Include/Rocket/Core/EventListener.h" -#include "../../Include/Rocket/Core/Geometry.h" -#include "../../Include/Rocket/Core/WString.h" -#include "../../Include/Rocket/Core/Vertex.h" - -namespace Rocket { -namespace Core { - -class ElementText; - -} - -namespace Controls { - -class ElementFormControl; - -/** - An abstract widget for editing and navigating around a text field. - - @author Peter Curry - */ - -class WidgetTextInput : public Core::EventListener -{ -public: - WidgetTextInput(ElementFormControl* parent); - virtual ~WidgetTextInput(); - - /// Sets the value of the text field. - /// @param[in] value The new value to set on the text field. - virtual void SetValue(const Core::String& value); - - /// Sets the maximum length (in characters) of this text field. - /// @param[in] max_length The new maximum length of the text field. A number lower than zero will mean infinite characters. - void SetMaxLength(int max_length); - /// Returns the maximum length (in characters) of this text field. - /// @return The maximum number of characters allowed in this text field. - int GetMaxLength() const; - - /// Update the colours of the selected text. - void UpdateSelectionColours(); - - /// Updates the cursor, if necessary. - void OnUpdate(); - /// Renders the cursor, if it is visible. - void OnRender(); - /// Formats the widget's internal content. - void OnLayout(); - - /// Returns the input element's underlying text element. - Core::ElementText* GetTextElement(); - /// Returns the input element's maximum allowed text dimensions. - const Rocket::Core::Vector2f& GetTextDimensions() const; - -protected: - /// Processes the "keydown" and "textinput" event to write to the input field, and the "focus" and - /// "blur" to set the state of the cursor. - virtual void ProcessEvent(Core::Event& event); - - /// Adds a new character to the string at the cursor position. - /// @param[in] character The character to add to the string. - /// @return True if the character was successfully added, false otherwise. - bool AddCharacter(Rocket::Core::word character); - /// Deletes a character from the string. - /// @param[in] backward True to delete a character behind the cursor, false for in front of the cursor. - /// @return True if a character was deleted, false otherwise. - bool DeleteCharacter(bool back); - /// Returns true if the given character is permitted in the input field, false if not. - /// @param[in] character The character to validate. - /// @return True if the character is allowed, false if not. - virtual bool IsCharacterValid(Rocket::Core::word character) = 0; - /// Called when the user pressed enter. - virtual void LineBreak() = 0; - - /// Returns the absolute index of the cursor. - int GetCursorIndex() const; - - /// Gets the parent element containing the widget. - Core::Element* GetElement(); - - /// Dispatches a change event to the widget's element. - void DispatchChangeEvent(bool linebreak = false); - -private: - /// Moves the cursor along the current line. - /// @param[in] x How far to move the cursor. - /// @param[in] select True if the movement will also move the selection cursor, false if not. - void MoveCursorHorizontal(int distance, bool select); - /// Moves the cursor up and down the text field. - /// @param[in] x How far to move the cursor. - /// @param[in] select True if the movement will also move the selection cursor, false if not. - void MoveCursorVertical(int distance, bool select); - - /// Updates the absolute cursor index from the relative cursor indices. - void UpdateAbsoluteCursor(); - /// Updates the relative cursor indices from the absolute cursor index. - void UpdateRelativeCursor(); - - /// Calculates the line index under a specific vertical position. - /// @param[in] position The position to query. - /// @return The index of the line under the mouse cursor. - int CalculateLineIndex(float position); - /// Calculates the character index along a line under a specific horizontal position. - /// @param[in] line_index The line to query. - /// @param[in] position The position to query. - /// @return The index of the character under the mouse cursor. - int CalculateCharacterIndex(int line_index, float position); - - /// Shows or hides the cursor. - /// @param[in] show True to show the cursor, false to hide it. - /// @param[in] move_to_cursor True to force the cursor to be visible, false to not scroll the widget. - void ShowCursor(bool show, bool move_to_cursor = true); - - /// Formats the element, laying out the text and inserting scrollbars as appropriate. - void FormatElement(); - /// Formats the input element's text field. - /// @return The content area of the element. - Rocket::Core::Vector2f FormatText(); - - /// Generates the text cursor. - void GenerateCursor(); - /// Updates the position to render the cursor. - void UpdateCursorPosition(); - - /// Expand or shrink the text selection to the position of the cursor. - /// @param[in] selecting True if the new position of the cursor should expand / contract the selection area, false if it should only set the anchor for future selections. - void UpdateSelection(bool selecting); - /// Removes the selection of text. - void ClearSelection(); - /// Deletes all selected text and removes the selection. - void DeleteSelection(); - /// Copies the selection (if any) to the clipboard. - void CopySelection(); - - /// Split one line of text into three parts, based on the current selection. - /// @param[out] pre_selection The section of unselected text before any selected text on the line. - /// @param[out] selection The section of selected text on the line. - /// @param[out] post_selection The section of unselected text after any selected text on the line. If there is no selection on the line, then this will be empty. - /// @param[in] line The text making up the line. - /// @param[in] line_begin The absolute index at the beginning of the line. - void GetLineSelection(Core::WString& pre_selection, Core::WString& selection, Core::WString& post_selection, const Core::WString& line, int line_begin); - - struct Line - { - // The contents of the line (including the trailing endline, if that terminated the line). - Core::WString content; - // The length of the editable characters on the line (excluding any trailing endline). - int content_length; - - // The number of extra characters at the end of the content that are not present in the actual value; in the - // case of a soft return, this may be negative. - int extra_characters; - }; - - ElementFormControl* parent; - - Core::ElementText* text_element; - Core::ElementText* selected_text_element; - Rocket::Core::Vector2f internal_dimensions; - Rocket::Core::Vector2f scroll_offset; - - typedef std::vector< Line > LineList; - LineList lines; - - int max_length; - - int edit_index; - - int absolute_cursor_index; - int cursor_line_index; - int cursor_character_index; - - // Selection. The start and end indices of the selection are in absolute coordinates. - Core::Element* selection_element; - int selection_anchor_index; - int selection_begin_index; - int selection_length; - - // The colour of the background of selected text. - Rocket::Core::Colourb selection_colour; - // The selection background. - Core::Geometry selection_geometry; - - // Cursor visibility and timings. - float cursor_timer; - bool cursor_visible; - bool keyboard_showed; - /// Activate or deactivate keyboard (for touchscreen devices) - /// @param[in] active True if need activate keyboard, false if need deactivate. - void SetKeyboardActive(bool active); - - float last_update_time; - - // The cursor geometry. - float ideal_cursor_position; - Rocket::Core::Vector2f cursor_position; - Rocket::Core::Vector2f cursor_size; - Core::Geometry cursor_geometry; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/WidgetTextInputMultiLine.cpp b/libs/libRocket/Source/Controls/WidgetTextInputMultiLine.cpp deleted file mode 100644 index 5cb1734f824..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInputMultiLine.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "WidgetTextInputMultiLine.h" -#include "../../Include/Rocket/Core/Dictionary.h" -#include "../../Include/Rocket/Core/ElementText.h" - -namespace Rocket { -namespace Controls { - -WidgetTextInputMultiLine::WidgetTextInputMultiLine(ElementFormControl* parent) : WidgetTextInput(parent) -{ -} - -WidgetTextInputMultiLine::~WidgetTextInputMultiLine() -{ -} - -// Returns true if the given character is permitted in the input field, false if not. -bool WidgetTextInputMultiLine::IsCharacterValid(Rocket::Core::word character) -{ - return character != '\t'; -} - -// Called when the user pressed enter. -void WidgetTextInputMultiLine::LineBreak() -{ -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetTextInputMultiLine.h b/libs/libRocket/Source/Controls/WidgetTextInputMultiLine.h deleted file mode 100644 index 93674380670..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInputMultiLine.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSWIDGETTEXTINPUTMULTILINE_H -#define ROCKETCONTROLSWIDGETTEXTINPUTMULTILINE_H - -#include "WidgetTextInput.h" - -namespace Rocket { -namespace Controls { - -/** - A specialisation of the text input widget for multi-line text fields. - - @author Peter Curry - */ - -class WidgetTextInputMultiLine : public WidgetTextInput -{ -public: - WidgetTextInputMultiLine(ElementFormControl* parent); - virtual ~WidgetTextInputMultiLine(); - -protected: - /// Returns true if the given character is permitted in the input field, false if not. - /// @param[in] character The character to validate. - /// @return True if the character is allowed, false if not. - virtual bool IsCharacterValid(Rocket::Core::word character); - /// Called when the user pressed enter. - virtual void LineBreak(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/WidgetTextInputSingleLine.cpp b/libs/libRocket/Source/Controls/WidgetTextInputSingleLine.cpp deleted file mode 100644 index bf5c1bbcdee..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInputSingleLine.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Core/Dictionary.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "WidgetTextInputSingleLine.h" - -namespace Rocket { -namespace Controls { - -WidgetTextInputSingleLine::WidgetTextInputSingleLine(ElementFormControl* parent) : WidgetTextInput(parent) -{ -} - -WidgetTextInputSingleLine::~WidgetTextInputSingleLine() -{ -} - -// Sets the value of the text field. The value will be stripped of end-lines. -void WidgetTextInputSingleLine::SetValue(const Core::String& value) -{ - Core::String new_value = value; - SanitiseValue(new_value); - - WidgetTextInput::SetValue(new_value); -} - -// Returns true if the given character is permitted in the input field, false if not. -bool WidgetTextInputSingleLine::IsCharacterValid(Rocket::Core::word character) -{ - return character != '\t' && character != '\n' && character != '\r'; -} - -// Called when the user pressed enter. -void WidgetTextInputSingleLine::LineBreak() -{ - DispatchChangeEvent(true); -} - -// Strips all \n and \r characters from the string. -void WidgetTextInputSingleLine::SanitiseValue(Core::String& value) -{ - Core::String new_value; - for (Core::String::size_type i = 0; i < value.Length(); ++i) - { - switch (value[i]) - { - case '\n': - case '\r': - case '\t': - break; - - default: - new_value += value[i]; - } - } - - value = new_value; -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetTextInputSingleLine.h b/libs/libRocket/Source/Controls/WidgetTextInputSingleLine.h deleted file mode 100644 index a96e8d0d026..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInputSingleLine.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSWIDGETTEXTINPUTSINGLELINE_H -#define ROCKETCONTROLSWIDGETTEXTINPUTSINGLELINE_H - -#include "WidgetTextInput.h" - -namespace Rocket { -namespace Controls { - -/** - A specialisation of the text input widget for single-line input fields. - - @author Peter Curry - */ - -class WidgetTextInputSingleLine : public WidgetTextInput -{ -public: - WidgetTextInputSingleLine(ElementFormControl* parent); - virtual ~WidgetTextInputSingleLine(); - - /// Sets the value of the text field. The value will be stripped of end-lines. - /// @param value[in] The new value to set on the text field. - virtual void SetValue(const Core::String& value); - -protected: - /// Returns true if the given character is permitted in the input field, false if not. - /// @param[in] character The character to validate. - /// @return True if the character is allowed, false if not. - virtual bool IsCharacterValid(Rocket::Core::word character); - /// Called when the user pressed enter. - virtual void LineBreak(); - - /// Strips all \n and \r characters from the string. - void SanitiseValue(Core::String& value); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/WidgetTextInputSingleLinePassword.cpp b/libs/libRocket/Source/Controls/WidgetTextInputSingleLinePassword.cpp deleted file mode 100644 index 2130a2143e8..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInputSingleLinePassword.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Core/ElementText.h" -#include "WidgetTextInputSingleLinePassword.h" - -namespace Rocket { -namespace Controls { - -WidgetTextInputSingleLinePassword::WidgetTextInputSingleLinePassword(ElementFormControl* parent) : WidgetTextInputSingleLine(parent) -{ -} - -WidgetTextInputSingleLinePassword::~WidgetTextInputSingleLinePassword() -{ -} - -// Sets the value of the password field. -void WidgetTextInputSingleLinePassword::SetValue(const Core::String& value) -{ - Core::String sanitised_value(value); - SanitiseValue(sanitised_value); - WidgetTextInput::SetValue(Core::String(sanitised_value.Length(), (Rocket::Core::word) '*')); -} - -} -} diff --git a/libs/libRocket/Source/Controls/WidgetTextInputSingleLinePassword.h b/libs/libRocket/Source/Controls/WidgetTextInputSingleLinePassword.h deleted file mode 100644 index ddc3b8a26d5..00000000000 --- a/libs/libRocket/Source/Controls/WidgetTextInputSingleLinePassword.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSWIDGETTEXTINPUTSINGLELINEPASSWORD_H -#define ROCKETCONTROLSWIDGETTEXTINPUTSINGLELINEPASSWORD_H - -#include "WidgetTextInputSingleLine.h" - -namespace Rocket { -namespace Controls { - -/** - @author Peter Curry - */ - -class WidgetTextInputSingleLinePassword : public WidgetTextInputSingleLine -{ -public: - WidgetTextInputSingleLinePassword(ElementFormControl* parent); - virtual ~WidgetTextInputSingleLinePassword(); - - /// Sets the value of the password field. - /// @param value[in] The new password to set on the field. - virtual void SetValue(const Core::String& value); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/XMLNodeHandlerDataGrid.cpp b/libs/libRocket/Source/Controls/XMLNodeHandlerDataGrid.cpp deleted file mode 100644 index 87068449c8a..00000000000 --- a/libs/libRocket/Source/Controls/XMLNodeHandlerDataGrid.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "XMLNodeHandlerDataGrid.h" -#include "../../Include/Rocket/Core/StreamMemory.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/XMLParser.h" -#include "../../Include/Rocket/Controls/ElementDataGrid.h" - -namespace Rocket { -namespace Controls { - -XMLNodeHandlerDataGrid::XMLNodeHandlerDataGrid() -{ -} - -XMLNodeHandlerDataGrid::~XMLNodeHandlerDataGrid() -{ -} - -Core::Element* XMLNodeHandlerDataGrid::ElementStart(Core::XMLParser* parser, const Rocket::Core::String& name, const Rocket::Core::XMLAttributes& attributes) -{ - Core::Element* element = NULL; - Core::Element* parent = parser->GetParseFrame()->element; - - ROCKET_ASSERT(name == "datagrid" || - name == "col"); - - if (name == "datagrid") - { - // Attempt to instance the grid. - element = Core::Factory::InstanceElement(parent, name, name, attributes); - ElementDataGrid* grid = dynamic_cast< ElementDataGrid* >(element); - if (grid == NULL) - { - if (element != NULL) - element->RemoveReference(); - - Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Instancer failed to create data grid for tag %s.", name.CString()); - return NULL; - } - - // Set the data source and table on the data grid. - Rocket::Core::String data_source = attributes.Get< Rocket::Core::String >("source", ""); - grid->SetDataSource(data_source); - - parent->AppendChild(grid); - grid->RemoveReference(); - - // Switch to this handler for all columns. - parser->PushHandler("datagrid"); - } - else if (name == "col") - { - // Make a new node handler to handle the header elements. - element = Core::Factory::InstanceElement(parent, "datagridcolumn", "datagridcolumn", attributes); - if (element == NULL) - return NULL; - - ElementDataGrid* grid = dynamic_cast< ElementDataGrid* >(parent); - if (grid != NULL) - { - grid->AddColumn(attributes.Get< Rocket::Core::String >("fields", ""), attributes.Get< Rocket::Core::String >("formatter", ""), attributes.Get< float >("width", 0), element); - element->RemoveReference(); - } - - // Switch to element handler for all children. - parser->PushDefaultHandler(); - } - else - { - ROCKET_ERROR; - } - - return element; -} - -bool XMLNodeHandlerDataGrid::ElementEnd(Core::XMLParser* ROCKET_UNUSED_PARAMETER(parser), const Rocket::Core::String& ROCKET_UNUSED_PARAMETER(name)) -{ - ROCKET_UNUSED(parser); - ROCKET_UNUSED(name); - - return true; -} - -bool XMLNodeHandlerDataGrid::ElementData(Core::XMLParser* parser, const Rocket::Core::String& data) -{ - Core::Element* parent = parser->GetParseFrame()->element; - - // Parse the text into the parent element. - return Core::Factory::InstanceElementText(parent, data); -} - -void XMLNodeHandlerDataGrid::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Controls/XMLNodeHandlerDataGrid.h b/libs/libRocket/Source/Controls/XMLNodeHandlerDataGrid.h deleted file mode 100644 index 26d9bf22a1e..00000000000 --- a/libs/libRocket/Source/Controls/XMLNodeHandlerDataGrid.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSXMLNODEHANDLERDATAGRID_H -#define ROCKETCONTROLSXMLNODEHANDLERDATAGRID_H - -#include "../../Include/Rocket/Core/Types.h" -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Controls { - -/** - Node handler for the construction of a data grid. - - @author Robert Curry - */ - -class XMLNodeHandlerDataGrid : public Core::XMLNodeHandler -{ -public: - XMLNodeHandlerDataGrid(); - virtual ~XMLNodeHandlerDataGrid(); - - /// Called when a new element is opened. - virtual Core::Element* ElementStart(Core::XMLParser* parser, const Rocket::Core::String& name, const Rocket::Core::XMLAttributes& attributes); - /// Called when an element is closed. - virtual bool ElementEnd(Core::XMLParser* parser, const Rocket::Core::String& name); - /// Called for element data. - virtual bool ElementData(Core::XMLParser* parser, const Rocket::Core::String& data); - - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/XMLNodeHandlerTabSet.cpp b/libs/libRocket/Source/Controls/XMLNodeHandlerTabSet.cpp deleted file mode 100644 index ba32a29c02b..00000000000 --- a/libs/libRocket/Source/Controls/XMLNodeHandlerTabSet.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "XMLNodeHandlerTabSet.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/XMLParser.h" -#include "../../Include/Rocket/Controls/ElementTabSet.h" - -namespace Rocket { -namespace Controls { - -XMLNodeHandlerTabSet::XMLNodeHandlerTabSet() -{ -} - -XMLNodeHandlerTabSet::~XMLNodeHandlerTabSet() -{ -} - -Core::Element* XMLNodeHandlerTabSet::ElementStart(Core::XMLParser* parser, const Rocket::Core::String& name, const Rocket::Core::XMLAttributes& attributes) -{ - ROCKET_ASSERT(name == "tabset" || - name == "tabs" || - name == "tab" || - name == "panels" || - name == "panel"); - - if (name == "tabset") - { - // Call this node handler for all children - parser->PushHandler("tabset"); - - // Attempt to instance the tabset - Core::Element* element = Core::Factory::InstanceElement(parser->GetParseFrame()->element, name, name, attributes); - ElementTabSet* tabset = dynamic_cast< ElementTabSet* >(element); - if (!tabset) - { - if (element) - element->RemoveReference(); - Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Instancer failed to create element for tag %s.", name.CString()); - return NULL; - } - - // Add the TabSet into the document - parser->GetParseFrame()->element->AppendChild(element); - element->RemoveReference(); - - return element; - } - else if (name == "tab") - { - // Call default element handler for all children. - parser->PushDefaultHandler(); - - Core::Element* tab_element = Core::Factory::InstanceElement(parser->GetParseFrame()->element, "*", "tab", attributes); - - ElementTabSet* tabset = dynamic_cast< ElementTabSet* >(parser->GetParseFrame()->element); - if (tabset) - { - tabset->SetTab(-1, tab_element); - tab_element->RemoveReference(); - } - - return tab_element; - - } - else if (name == "panel") - { - // Call default element handler for all children. - parser->PushDefaultHandler(); - - Core::Element* panel_element = Core::Factory::InstanceElement(parser->GetParseFrame()->element, "*", "panel", attributes); - - ElementTabSet* tabset = dynamic_cast< ElementTabSet* >(parser->GetParseFrame()->element); - if (tabset) - { - tabset->SetPanel(-1, panel_element); - panel_element->RemoveReference(); - } - - return panel_element; - } - else if (name == "tabs" || name == "panels") - { - // Use the element handler to add the tabs and panels elements to the the tabset (this allows users to - // style them nicely), but don't return the new element, as we still want the tabset to be the top of the - // parser's node stack. - - Core::Element* parent = parser->GetParseFrame()->element; - - // Attempt to instance the element with the instancer. - Core::Element* element = Core::Factory::InstanceElement(parent, name, name, attributes); - if (!element) - { - Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Instancer failed to create element for tag %s.", name.CString()); - return NULL; - } - - // Add the element to its parent and remove the initial reference. - parent->AppendChild(element); - element->RemoveReference(); - } - - return NULL; -} - -bool XMLNodeHandlerTabSet::ElementEnd(Core::XMLParser* ROCKET_UNUSED_PARAMETER(parser), const Rocket::Core::String& ROCKET_UNUSED_PARAMETER(name)) -{ - ROCKET_UNUSED(parser); - ROCKET_UNUSED(name); - - return true; -} - -bool XMLNodeHandlerTabSet::ElementData(Core::XMLParser* parser, const Rocket::Core::String& data) -{ - return Core::Factory::InstanceElementText(parser->GetParseFrame()->element, data); -} - -void XMLNodeHandlerTabSet::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Controls/XMLNodeHandlerTabSet.h b/libs/libRocket/Source/Controls/XMLNodeHandlerTabSet.h deleted file mode 100644 index 6b4b3e62559..00000000000 --- a/libs/libRocket/Source/Controls/XMLNodeHandlerTabSet.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSXMLNODEHANDLERTABSET_H -#define ROCKETCONTROLSXMLNODEHANDLERTABSET_H - -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Controls { - -/** - XML node handler for processing the tabset tags. - - @author Lloyd Weehuizen - */ - -class XMLNodeHandlerTabSet : public Core::XMLNodeHandler -{ -public: - XMLNodeHandlerTabSet(); - virtual ~XMLNodeHandlerTabSet(); - - /// Called when a new element start is opened - virtual Core::Element* ElementStart(Core::XMLParser* parser, const Rocket::Core::String& name, const Rocket::Core::XMLAttributes& attributes); - /// Called when an element is closed - virtual bool ElementEnd(Core::XMLParser* parser, const Rocket::Core::String& name); - /// Called for element data - virtual bool ElementData(Core::XMLParser* parser, const Rocket::Core::String& data); - - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Controls/XMLNodeHandlerTextArea.cpp b/libs/libRocket/Source/Controls/XMLNodeHandlerTextArea.cpp deleted file mode 100644 index 930f3dd4697..00000000000 --- a/libs/libRocket/Source/Controls/XMLNodeHandlerTextArea.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "XMLNodeHandlerTextArea.h" -#include "../../Include/Rocket/Core.h" -#include "../../Include/Rocket/Controls/ElementFormControlTextArea.h" - -namespace Rocket { -namespace Controls { - -XMLNodeHandlerTextArea::XMLNodeHandlerTextArea() -{ -} - -XMLNodeHandlerTextArea::~XMLNodeHandlerTextArea() -{ -} - -Core::Element* XMLNodeHandlerTextArea::ElementStart(Core::XMLParser* parser, const Rocket::Core::String& name, const Rocket::Core::XMLAttributes& attributes) -{ - ElementFormControlTextArea* text_area = dynamic_cast< ElementFormControlTextArea* >(parser->GetParseFrame()->element); - if (text_area == NULL) - { - Core::Element* new_element = Core::Factory::InstanceElement(parser->GetParseFrame()->element, name, name, attributes); - if (new_element == NULL) - return NULL; - - parser->GetParseFrame()->element->AppendChild(new_element); - new_element->RemoveReference(); - - return new_element; - } - - return NULL; -} - -bool XMLNodeHandlerTextArea::ElementEnd(Core::XMLParser* ROCKET_UNUSED_PARAMETER(parser), const Rocket::Core::String& ROCKET_UNUSED_PARAMETER(name)) -{ - ROCKET_UNUSED(parser); - ROCKET_UNUSED(name); - - return true; -} - -bool XMLNodeHandlerTextArea::ElementData(Core::XMLParser* parser, const Rocket::Core::String& data) -{ - ElementFormControlTextArea* text_area = dynamic_cast< ElementFormControlTextArea* >(parser->GetParseFrame()->element); - if (text_area != NULL) - { - // Do any necessary translation. - Rocket::Core::String translated_data; - Core::GetSystemInterface()->TranslateString(translated_data, data); - - text_area->SetValue(translated_data); - } - - return true; -} - -void XMLNodeHandlerTextArea::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Controls/XMLNodeHandlerTextArea.h b/libs/libRocket/Source/Controls/XMLNodeHandlerTextArea.h deleted file mode 100644 index ef6e21e061d..00000000000 --- a/libs/libRocket/Source/Controls/XMLNodeHandlerTextArea.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCONTROLSXMLNODEHANDLERTEXTAREA_H -#define ROCKETCONTROLSXMLNODEHANDLERTEXTAREA_H - -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Controls { - -/** - Node handler that processes the contents of the textarea tag. - - @author Peter Curry - */ - -class XMLNodeHandlerTextArea : public Core::XMLNodeHandler -{ -public: - XMLNodeHandlerTextArea(); - virtual ~XMLNodeHandlerTextArea(); - - /// Called when a new element is opened. - virtual Core::Element* ElementStart(Core::XMLParser* parser, const Rocket::Core::String& name, const Rocket::Core::XMLAttributes& attributes); - /// Called when an element is closed. - virtual bool ElementEnd(Core::XMLParser* parser, const Rocket::Core::String& name); - /// Called for element data. - virtual bool ElementData(Core::XMLParser* parser, const Rocket::Core::String& data); - - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/BaseXMLParser.cpp b/libs/libRocket/Source/Core/BaseXMLParser.cpp deleted file mode 100644 index 5b2c28e27e6..00000000000 --- a/libs/libRocket/Source/Core/BaseXMLParser.cpp +++ /dev/null @@ -1,512 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/BaseXMLParser.h" - -namespace Rocket { -namespace Core { - -// Most file layers cache 4k. -const int DEFAULT_BUFFER_SIZE = 4096; - -BaseXMLParser::BaseXMLParser() -{ - read = NULL; - buffer = NULL; - buffer_used = 0; - buffer_size = 0; - open_tag_depth = 0; -} - -BaseXMLParser::~BaseXMLParser() -{ -} - -// Registers a tag as containing general character data. -void BaseXMLParser::RegisterCDATATag(const String& tag) -{ - if (!tag.Empty()) - cdata_tags.insert(tag.ToLower()); -} - -// Parses the given stream as an XML file, and calls the handlers when -// interesting phenomenon are encountered. -void BaseXMLParser::Parse(Stream* stream) -{ - xml_source = stream; - buffer_size = DEFAULT_BUFFER_SIZE; - - buffer = (unsigned char*) malloc(buffer_size); - read = buffer; - line_number = 1; - FillBuffer(); - - // Read (er ... skip) the header, if one exists. - ReadHeader(); - // Read the XML body. - ReadBody(); - - free(buffer); -} - -// Get the current file line number -int BaseXMLParser::GetLineNumber() -{ - return line_number; -} - -// Called when the parser finds the beginning of an element tag. -void BaseXMLParser::HandleElementStart(const String& ROCKET_UNUSED_PARAMETER(name), const XMLAttributes& ROCKET_UNUSED_PARAMETER(attributes)) -{ - ROCKET_UNUSED(name); - ROCKET_UNUSED(attributes); -} - -// Called when the parser finds the end of an element tag. -void BaseXMLParser::HandleElementEnd(const String& ROCKET_UNUSED_PARAMETER(name)) -{ - ROCKET_UNUSED(name); -} - -// Called when the parser encounters data. -void BaseXMLParser::HandleData(const String& ROCKET_UNUSED_PARAMETER(data)) -{ - ROCKET_UNUSED(data); -} - -void BaseXMLParser::ReadHeader() -{ - if (PeekString((unsigned char*) "", temp); - } -} - -void BaseXMLParser::ReadBody() -{ - open_tag_depth = 0; - - for(;;) - { - // Find the next open tag. - if (!FindString((unsigned char*) "<", data)) - break; - - // Check what kind of tag this is. - if (PeekString((const unsigned char*) "!--")) - { - // Comment. - String temp; - if (!FindString((const unsigned char*) "-->", temp)) - break; - } - else if (PeekString((const unsigned char*) "![CDATA[")) - { - // CDATA tag; read everything (including markup) until the ending - // CDATA tag. - if (!ReadCDATA()) - break; - } - else if (PeekString((const unsigned char*) "/")) - { - if (!ReadCloseTag()) - break; - - // Bail if we've hit the end of the XML data. - if (open_tag_depth == 0) - { - xml_source->Seek((long)((read - buffer) - buffer_used), SEEK_CUR); - break; - } - } - else - { - if (!ReadOpenTag()) - break; - } - } - - // Check for error conditions - if (open_tag_depth > 0) - { - Log::Message(Log::LT_WARNING, "XML parse error on line %d of %s.", GetLineNumber(), xml_source->GetSourceURL().GetURL().CString()); - } -} - -bool BaseXMLParser::ReadOpenTag() -{ - // Increase the open depth - open_tag_depth++; - - // Opening tag; send data immediately and open the tag. - if (!data.Empty()) - { - HandleData(data); - data.Clear(); - } - - String tag_name; - if (!FindWord(tag_name, "/>")) - return false; - - bool section_opened = false; - - if (PeekString((const unsigned char*) ">")) - { - // Simple open tag. - HandleElementStart(tag_name, XMLAttributes()); - section_opened = true; - } - else if (PeekString((const unsigned char*) "/") && - PeekString((const unsigned char*) ">")) - { - // Empty open tag. - HandleElementStart(tag_name, XMLAttributes()); - HandleElementEnd(tag_name); - - // Tag immediately closed, reduce count - open_tag_depth--; - } - else - { - // It appears we have some attributes. Let's parse them. - XMLAttributes attributes; - if (!ReadAttributes(attributes)) - return false; - - if (PeekString((const unsigned char*) ">")) - { - HandleElementStart(tag_name, attributes); - section_opened = true; - } - else if (PeekString((const unsigned char*) "/") && - PeekString((const unsigned char*) ">")) - { - HandleElementStart(tag_name, attributes); - HandleElementEnd(tag_name); - - // Tag immediately closed, reduce count - open_tag_depth--; - } - else - { - return false; - } - } - - // Check if this tag needs to processed as CDATA. - if (section_opened) - { - String lcase_tag_name = tag_name.ToLower(); - if (cdata_tags.find(lcase_tag_name) != cdata_tags.end()) - { - if (ReadCDATA(lcase_tag_name.CString())) - { - open_tag_depth--; - if (!data.Empty()) - { - HandleData(data); - data.Clear(); - } - HandleElementEnd(tag_name); - - return true; - } - - return false; - } - } - - return true; -} - -bool BaseXMLParser::ReadCloseTag() -{ - // Closing tag; send data immediately and close the tag. - if (!data.Empty()) - { - HandleData(data); - data.Clear(); - } - - String tag_name; - if (!FindString((const unsigned char*) ">", tag_name)) - return false; - - HandleElementEnd(StringUtilities::StripWhitespace(tag_name)); - - // Tag closed, reduce count - open_tag_depth--; - - return true; -} - -bool BaseXMLParser::ReadAttributes(XMLAttributes& attributes) -{ - for (;;) - { - String attribute; - String value; - - // Get the attribute name - if (!FindWord(attribute, "=/>")) - { - return false; - } - - // Check if theres an assigned value - if (PeekString((const unsigned char*)"=")) - { - if (PeekString((const unsigned char*) "\"")) - { - if (!FindString((const unsigned char*) "\"", value)) - return false; - } - else if (PeekString((const unsigned char*) "'")) - { - if (!FindString((const unsigned char*) "'", value)) - return false; - } - else if (!FindWord(value, "/>")) - { - return false; - } - } - - attributes.Set(attribute.CString(), value); - - // Check for the end of the tag. - if (PeekString((const unsigned char*) "/", false) || - PeekString((const unsigned char*) ">", false)) - return true; - } -} - -bool BaseXMLParser::ReadCDATA(const char* terminator) -{ - String cdata; - if (terminator == NULL) - { - FindString((const unsigned char*) "]]>", cdata); - data += cdata; - return true; - } - else - { - for (;;) - { - // Search for the next tag opening. - if (!FindString((const unsigned char*) "<", cdata)) - return false; - - if (PeekString((const unsigned char*) "/", false)) - { - String tag; - if (FindString((const unsigned char*) ">", tag)) - { - String tag_name = StringUtilities::StripWhitespace(tag.Substring(tag.Find("/") + 1)); - if (tag_name.ToLower() == terminator) - { - data += cdata; - return true; - } - else - { - cdata += "<"; - cdata += tag; - cdata += ">"; - } - } - else - cdata += "<"; - } - else - cdata += "<"; - } - } -} - -// Reads from the stream until a complete word is found. -bool BaseXMLParser::FindWord(String& word, const char* terminators) -{ - for (;;) - { - if (read >= buffer + buffer_used) - { - if (!FillBuffer()) - return false; - } - - // Ignore white space - if (StringUtilities::IsWhitespace(*read)) - { - if (word.Empty()) - { - read++; - continue; - } - else - return true; - } - - // Check for termination condition - if (terminators && strchr(terminators, *read)) - { - return !word.Empty(); - } - - word += *read; - read++; - } -} - -// Reads from the stream until the given character set is found. -bool BaseXMLParser::FindString(const unsigned char* string, String& data) -{ - int index = 0; - while (string[index]) - { - if (read >= buffer + buffer_used) - { - if (!FillBuffer()) - return false; - } - - // Count line numbers - if (*read == '\n') - { - line_number++; - } - - if (*read == string[index]) - { - index += 1; - } - else - { - if (index > 0) - { - data.Append((const char*) string, index); - index = 0; - } - - data += *read; - } - - read++; - } - - return true; -} - -// Returns true if the next sequence of characters in the stream matches the -// given string. -bool BaseXMLParser::PeekString(const unsigned char* string, bool consume) -{ - unsigned char* peek_read = read; - - int i = 0; - while (string[i]) - { - // If we're about to read past the end of the buffer, read into the - // overflow buffer. - if ((peek_read - buffer) + i >= buffer_used) - { - int peek_offset = (int)(peek_read - read); - FillBuffer(); - peek_read = read + peek_offset; - - if (peek_read - buffer + i >= buffer_used) - { - // Wierd, seems our buffer is too small, realloc it bigger. - buffer_size *= 2; - int read_offset = (int)(read - buffer); - unsigned char* new_buffer = (unsigned char*) realloc(buffer, buffer_size); - ROCKET_ASSERTMSG(new_buffer != NULL, "Unable to allocate larger buffer for Peek() call"); - if(new_buffer == NULL) - { - return false; - } - buffer = new_buffer; - // Restore the read pointers. - read = buffer + read_offset; - peek_read = read + peek_offset; - - // Attempt to fill our new buffer size. - if (!FillBuffer()) - return false; - } - } - - // Seek past all the whitespace if we haven't hit the initial character yet. - if (i == 0 && StringUtilities::IsWhitespace(*peek_read)) - { - peek_read++; - } - else - { - if (*peek_read != string[i]) - return false; - - i++; - peek_read++; - } - } - - // Set the read pointer to the end of the peek. - if (consume) - { - read = peek_read; - } - - return true; -} - -// Fill the buffer as much as possible, without removing any content that is still pending -bool BaseXMLParser::FillBuffer() -{ - int bytes_free = buffer_size; - int bytes_remaining = Math::Max((int)(buffer_used - (read - buffer)), 0); - - // If theres any data still in the buffer, shift it down, and fill it again - if (bytes_remaining > 0) - { - memmove(buffer, read, bytes_remaining); - bytes_free = buffer_size - bytes_remaining; - } - - read = buffer; - size_t bytes_read = xml_source->Read(&buffer[bytes_remaining], bytes_free); - buffer_used = (int)(bytes_read + bytes_remaining); - - return bytes_read > 0; -} - -} -} diff --git a/libs/libRocket/Source/Core/Box.cpp b/libs/libRocket/Source/Core/Box.cpp deleted file mode 100644 index 4ad0f936f48..00000000000 --- a/libs/libRocket/Source/Core/Box.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Box.h" - -namespace Rocket { -namespace Core { - -// Initialises a zero-sized box. -Box::Box() : content(0, 0), offset(0, 0) -{ - memset(area_edges, 0, sizeof(area_edges)); -} - -// Initialises a box with a default content area and no padding, borders and margins. -Box::Box(const Vector2f& content) : content(content), offset(0, 0) -{ - memset(area_edges, 0, sizeof(area_edges)); -} - -Box::~Box() -{ -} - -// Returns the offset of this box. This will usually be (0, 0). -const Vector2f& Box::GetOffset() const -{ - return offset; -} - -// Returns the top-left position of one of the areas. -Vector2f Box::GetPosition(Area area) const -{ - Vector2f area_position(offset.x - area_edges[MARGIN][LEFT], offset.y - area_edges[MARGIN][TOP]); - for (int i = 0; i < area; i++) - { - area_position.x += area_edges[i][LEFT]; - area_position.y += area_edges[i][TOP]; - } - - return area_position; -} - -// Returns the size of one of the box's areas. This will include all inner areas. -Vector2f Box::GetSize(Area area) const -{ - Vector2f area_size(content); - for (int i = PADDING; i >= area; i--) - { - area_size.x += (area_edges[i][LEFT] + area_edges[i][RIGHT]); - area_size.y += (area_edges[i][TOP] + area_edges[i][BOTTOM]); - } - - return area_size; -} - -// Sets the offset of the box, relative usually to the owning element. -void Box::SetOffset(const Vector2f& _offset) -{ - offset = _offset; -} - -// Sets the size of the content area. -void Box::SetContent(const Vector2f& _content) -{ - content = _content; -} - -// Sets the size of one of the segments of one of the box's outer areas. -void Box::SetEdge(Area area, Edge edge, float size) -{ - area_edges[area][edge] = size; -} - -// Returns the size of one of the area segments. -float Box::GetEdge(Area area, Edge edge) const -{ - return area_edges[area][edge]; -} - -// Returns the cumulative size of one edge up to one of the box's areas. -float Box::GetCumulativeEdge(Area area, Edge edge) const -{ - float size = 0; - int max_area = Math::Min((int) area, 2); - for (int i = 0; i <= max_area; i++) - size += area_edges[i][edge]; - - return size; -} - -// Compares the size of the content area and the other area edges. -bool Box::operator==(const Box& rhs) const -{ - return content == rhs.content && memcmp(area_edges, rhs.area_edges, sizeof(area_edges)) == 0; -} - -// Compares the size of the content area and the other area edges. -bool Box::operator!=(const Box& rhs) const -{ - return !(*this == rhs); -} - -} -} diff --git a/libs/libRocket/Source/Core/Clock.cpp b/libs/libRocket/Source/Core/Clock.cpp deleted file mode 100644 index 6cbb36c47d5..00000000000 --- a/libs/libRocket/Source/Core/Clock.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Clock.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -float Clock::GetElapsedTime() -{ - SystemInterface* system_interface = GetSystemInterface(); - if (system_interface != NULL) - return system_interface->GetElapsedTime(); - else - return 0; -} - -} -} diff --git a/libs/libRocket/Source/Core/Clock.h b/libs/libRocket/Source/Core/Clock.h deleted file mode 100644 index 4acd66ab2a8..00000000000 --- a/libs/libRocket/Source/Core/Clock.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORECLOCK_H -#define ROCKETCORECLOCK_H - -namespace Rocket { -namespace Core { - -/** - Rocket's Interface to Time. - - @author Lloyd Weehuizen - */ -class Clock -{ -public: - /// Get the elapsed time since application startup - /// @return Seconds elapsed since application startup. - static float GetElapsedTime(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Context.cpp b/libs/libRocket/Source/Core/Context.cpp deleted file mode 100644 index d7687e5737c..00000000000 --- a/libs/libRocket/Source/Core/Context.cpp +++ /dev/null @@ -1,1233 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core.h" -#include "EventDispatcher.h" -#include "EventIterators.h" -#include "PluginRegistry.h" -#include "StreamFile.h" -#include "../../Include/Rocket/Core/StreamMemory.h" -#include -#include - -namespace Rocket { -namespace Core { - -const float DOUBLE_CLICK_TIME = 0.5f; - -Context::Context(const String& name) : name(name), dimensions(0, 0), mouse_position(0, 0), clip_origin(-1, -1), clip_dimensions(-1, -1) -{ - instancer = NULL; - - // Initialise this to NULL; this will be set in Rocket::Core::CreateContext(). - render_interface = NULL; - - root = Factory::InstanceElement(NULL, "*", "#root", XMLAttributes()); - root->SetId(name); - root->SetOffset(Vector2f(0, 0), NULL); - root->SetProperty(Z_INDEX, "0"); - - Element* element = Factory::InstanceElement(NULL, "body", "body", XMLAttributes()); - cursor_proxy = dynamic_cast< ElementDocument* >(element); - if (cursor_proxy == NULL) - { - if (element != NULL) - element->RemoveReference(); - } - else - cursor_proxy->context = this; - - document_focus_history.push_back(root); - focus = root; - - show_cursor = true; - - drag_started = false; - drag_verbose = false; - drag_clone = NULL; - - last_click_element = NULL; - last_click_time = 0; -} - -Context::~Context() -{ - PluginRegistry::NotifyContextDestroy(this); - - UnloadAllDocuments(); - UnloadAllMouseCursors(); - - ReleaseUnloadedDocuments(); - - if (cursor_proxy != NULL) - cursor_proxy->RemoveReference(); - - if (root != NULL) - root->RemoveReference(); - - if (instancer) - instancer->RemoveReference(); - - if (render_interface) - render_interface->RemoveReference(); -} - -// Returns the name of the context. -const String& Context::GetName() const -{ - return name; -} - -// Changes the dimensions of the screen. -void Context::SetDimensions(const Vector2i& _dimensions) -{ - if (dimensions != _dimensions) - { - dimensions = _dimensions; - root->SetBox(Box(Vector2f((float) dimensions.x, (float) dimensions.y))); - root->DirtyLayout(); - - for (int i = 0; i < root->GetNumChildren(); ++i) - { - ElementDocument* document = root->GetChild(i)->GetOwnerDocument(); - if (document != NULL) - { - document->DirtyLayout(); - document->UpdatePosition(); - } - } - - clip_dimensions = dimensions; - } -} - -// Returns the dimensions of the screen. -const Vector2i& Context::GetDimensions() const -{ - return dimensions; -} - -// Updates all elements in the element tree. -bool Context::Update() -{ - root->Update(); - - // Release any documents that were unloaded during the update. - ReleaseUnloadedDocuments(); - - return true; -} - -// Renders all visible elements in the element tree. -bool Context::Render() -{ - RenderInterface* render_interface = GetRenderInterface(); - if (render_interface == NULL) - return false; - - // Update the layout for all documents in the root. This is done now as events during the - // update may have caused elements to require an update. - for (int i = 0; i < root->GetNumChildren(); ++i) - root->GetChild(i)->UpdateLayout(); - - render_interface->context = this; - ElementUtilities::ApplyActiveClipRegion(this, render_interface); - - root->Render(); - - ElementUtilities::SetClippingRegion(NULL, this); - - // Render the cursor proxy so any elements attached the cursor will be rendered below the cursor. - if (cursor_proxy != NULL) - { - cursor_proxy->Update(); - cursor_proxy->SetOffset(Vector2f((float) Math::Clamp(mouse_position.x, 0, dimensions.x), - (float) Math::Clamp(mouse_position.y, 0, dimensions.y)), - NULL); - cursor_proxy->Render(); - } - - // Render the cursor document if we have one and we're showing the cursor. - if (active_cursor && - show_cursor) - { - active_cursor->Update(); - active_cursor->SetOffset(Vector2f((float) Math::Clamp(mouse_position.x, 0, dimensions.x), - (float) Math::Clamp(mouse_position.y, 0, dimensions.y)), - NULL); - active_cursor->Render(); - } - - render_interface->context = NULL; - - return true; -} - -// Creates a new, empty document and places it into this context. -ElementDocument* Context::CreateDocument(const String& tag) -{ - Element* element = Factory::InstanceElement(NULL, tag, "body", XMLAttributes()); - if (element == NULL) - { - Log::Message(Log::LT_ERROR, "Failed to instance document on tag '%s', instancer returned NULL.", tag.CString()); - return NULL; - } - - ElementDocument* document = dynamic_cast< ElementDocument* >(element); - if (document == NULL) - { - Log::Message(Log::LT_ERROR, "Failed to instance document on tag '%s', Found type '%s', was expecting derivative of ElementDocument.", tag.CString(), typeid(element).name()); - - element->RemoveReference(); - return NULL; - } - - document->context = this; - root->AppendChild(document); - - PluginRegistry::NotifyDocumentLoad(document); - - return document; -} - -// Load a document into the context. -ElementDocument* Context::LoadDocument(const String& document_path) -{ - // Open the stream based on the file path - StreamFile* stream = new StreamFile(); - if (!stream->Open(document_path)) - { - stream->RemoveReference(); - return NULL; - } - - // Load the document from the stream - ElementDocument* document = LoadDocument(stream); - - stream->RemoveReference(); - - return document; -} - -// Load a document into the context. -ElementDocument* Context::LoadDocument(Stream* stream) -{ - PluginRegistry::NotifyDocumentOpen(this, stream->GetSourceURL().GetURL()); - - // Load the document from the stream. - ElementDocument* document = Factory::InstanceDocumentStream(this, stream); - if (!document) - return NULL; - - root->AppendChild(document); - - // Bind the events, run the layout and fire the 'onload' event. - ElementUtilities::BindEventAttributes(document); - document->UpdateLayout(); - - // Dispatch the load notifications. - PluginRegistry::NotifyDocumentLoad(document); - document->DispatchEvent(LOAD, Dictionary(), false); - - return document; -} - -// Load a document into the context. -ElementDocument* Context::LoadDocumentFromMemory(const String& string) -{ - // Open the stream based on the string contents. - StreamMemory* stream = new StreamMemory((byte*)string.CString(), string.Length()); - stream->SetSourceURL("[document from memory]"); - - // Load the document from the stream. - ElementDocument* document = LoadDocument(stream); - - stream->RemoveReference(); - - return document; -} - -// Unload the given document -void Context::UnloadDocument(ElementDocument* _document) -{ - // Has this document already been unloaded? - for (size_t i = 0; i < unloaded_documents.size(); ++i) - { - if (unloaded_documents[i] == _document) - return; - } - - // Add a reference, to ensure the document isn't released - // while we're closing it. - unloaded_documents.push_back(_document); - ElementDocument* document = _document; - - if (document->GetParentNode() == root) - { - // Dispatch the unload notifications. - document->DispatchEvent(UNLOAD, Dictionary(), false); - PluginRegistry::NotifyDocumentUnload(document); - - // Remove the document from the context. - root->RemoveChild(document); - } - - // Remove the item from the focus history. - ElementList::iterator itr = std::find(document_focus_history.begin(), document_focus_history.end(), document); - if (itr != document_focus_history.end()) - document_focus_history.erase(itr); - - // Focus to the previous document if the old document is the current focus. - if (focus && focus->GetOwnerDocument() == document) - { - focus = NULL; - document_focus_history.back()->GetFocusLeafNode()->Focus(); - } - - // Clear the active element if the old document is the active element. - if (active && active->GetOwnerDocument() == document) - { - active = NULL; - } - - // Rebuild the hover state. - UpdateHoverChain(Dictionary(), Dictionary(), mouse_position); -} - -// Unload all the currently loaded documents -void Context::UnloadAllDocuments() -{ - // Unload all children. - while (root->GetNumChildren(true) > 0) - UnloadDocument(root->GetChild(0)->GetOwnerDocument()); - - // Force cleanup of child elements now, reference counts must hit zero so that python (if it's in use) cleans up - // before we exit this method. - root->active_children.clear(); - root->ReleaseElements(root->deleted_children); -} - -// Adds a previously-loaded cursor document as a mouse cursor within this context. -void Context::AddMouseCursor(ElementDocument* cursor_document) -{ - cursor_document->AddReference(); - - CursorMap::iterator i = cursors.find(cursor_document->GetTitle()); - if (i != cursors.end()) - { - if (active_cursor == (*i).second) - active_cursor = cursor_document; - - if (default_cursor == (*i).second) - default_cursor = cursor_document; - - (*i).second->RemoveReference(); - } - cursors[cursor_document->GetTitle()] = cursor_document; - - if (!default_cursor) - { - default_cursor = cursor_document; - active_cursor = cursor_document; - } -} - -// Loads a document as a mouse cursor. -ElementDocument* Context::LoadMouseCursor(const String& document_path) -{ - StreamFile* stream = new StreamFile(); - if (!stream->Open(document_path)) - return NULL; - - // Load the document from the stream. - ElementDocument* document = Factory::InstanceDocumentStream(this, stream); - if (document == NULL) - { - stream->RemoveReference(); - return NULL; - } - - AddMouseCursor(document); - - // Bind the events, run the layout and fire the 'onload' event. - ElementUtilities::BindEventAttributes(document); - document->UpdateLayout(); - document->DispatchEvent(LOAD, Dictionary(), false); - - stream->RemoveReference(); - - return document; -} - -// Unload the given cursor. -void Context::UnloadMouseCursor(const String& cursor_name) -{ - CursorMap::iterator i = cursors.find(cursor_name); - if (i != cursors.end()) - { - if (default_cursor == (*i).second) - default_cursor = NULL; - - if (active_cursor == (*i).second) - active_cursor = default_cursor; - - (*i).second->RemoveReference(); - cursors.erase(i); - } -} - -// Unloads all currently loaded cursors. -void Context::UnloadAllMouseCursors() -{ - while (!cursors.empty()) - UnloadMouseCursor((*cursors.begin()).first.CString()); -} - -// Sets a cursor as the active cursor. -bool Context::SetMouseCursor(const String& cursor_name) -{ - CursorMap::iterator i = cursors.find(cursor_name); - if (i == cursors.end()) - { - active_cursor = default_cursor; - Log::Message(Log::LT_WARNING, "Failed to find cursor '%s' in context '%s', reverting to default cursor.", cursor_name.CString(), name.CString()); - return false; - } - - active_cursor = (*i).second; - return true; -} - -// Shows or hides the cursor. -void Context::ShowMouseCursor(bool show) -{ - show_cursor = show; -} - -// Returns the first document found in the root with the given id. -ElementDocument* Context::GetDocument(const String& id) -{ - for (int i = 0; i < root->GetNumChildren(); i++) - { - ElementDocument* document = root->GetChild(i)->GetOwnerDocument(); - if (document == NULL) - continue; - - if (document->GetId() == id) - return document; - } - - return NULL; -} - -// Returns a document in the context by index. -ElementDocument* Context::GetDocument(int index) -{ - Element* element = root->GetChild(index); - if (element == NULL) - return NULL; - - return element->GetOwnerDocument(); -} - -// Returns the number of documents in the context. -int Context::GetNumDocuments() const -{ - return root->GetNumChildren(); -} - -// Returns the hover element. -Element* Context::GetHoverElement() -{ - return *hover; -} - -// Returns the focus element. -Element* Context::GetFocusElement() -{ - return *focus; -} - -// Returns the root element. -Element* Context::GetRootElement() -{ - return root; -} - -// Brings the document to the front of the document stack. -void Context::PullDocumentToFront(ElementDocument* document) -{ - if (document != root->GetLastChild()) - { - // Calling RemoveChild() / AppendChild() would be cleaner, but that dirties the document's layout - // unnecessarily, so we'll go under the hood here. - for (int i = 0; i < root->GetNumChildren(); ++i) - { - if (root->GetChild(i) == document) - { - root->children.erase(root->children.begin() + i); - root->children.insert(root->children.begin() + root->GetNumChildren(), document); - - root->DirtyStackingContext(); - } - } - } -} - -// Sends the document to the back of the document stack. -void Context::PushDocumentToBack(ElementDocument* document) -{ - if (document != root->GetFirstChild()) - { - // See PullDocumentToFront(). - for (int i = 0; i < root->GetNumChildren(); ++i) - { - if (root->GetChild(i) == document) - { - root->children.erase(root->children.begin() + i); - root->children.insert(root->children.begin(), document); - - root->DirtyStackingContext(); - } - } - } -} - -// Adds an event listener to the root element. -void Context::AddEventListener(const String& event, EventListener* listener, bool in_capture_phase) -{ - root->AddEventListener(event, listener, in_capture_phase); -} - -// Removes an event listener from the root element. -void Context::RemoveEventListener(const String& event, EventListener* listener, bool in_capture_phase) -{ - root->RemoveEventListener(event, listener, in_capture_phase); -} - -// Sends a key down event into Rocket. -bool Context::ProcessKeyDown(Input::KeyIdentifier key_identifier, int key_modifier_state) -{ - // Generate the parameters for the key event. - Dictionary parameters; - GenerateKeyEventParameters(parameters, key_identifier); - GenerateKeyModifierEventParameters(parameters, key_modifier_state); - - if (focus) - return focus->DispatchEvent(KEYDOWN, parameters, true); - else - return root->DispatchEvent(KEYDOWN, parameters, true); -} - -// Sends a key up event into Rocket. -bool Context::ProcessKeyUp(Input::KeyIdentifier key_identifier, int key_modifier_state) -{ - // Generate the parameters for the key event. - Dictionary parameters; - GenerateKeyEventParameters(parameters, key_identifier); - GenerateKeyModifierEventParameters(parameters, key_modifier_state); - - if (focus) - return focus->DispatchEvent(KEYUP, parameters, true); - else - return root->DispatchEvent(KEYUP, parameters, true); -} - -// Sends a single character of text as text input into Rocket. -bool Context::ProcessTextInput(word character) -{ - // Generate the parameters for the key event. - Dictionary parameters; - parameters.Set("data", character); - - if (focus) - return focus->DispatchEvent(TEXTINPUT, parameters, true); - else - return root->DispatchEvent(TEXTINPUT, parameters, true); -} - -// Sends a string of text as text input into Rocket. -bool Context::ProcessTextInput(const String& string) -{ - bool consumed = true; - - for (size_t i = 0; i < string.Length(); ++i) - { - // Generate the parameters for the key event. - Dictionary parameters; - parameters.Set("data", string[i]); - - if (focus) - consumed = focus->DispatchEvent(TEXTINPUT, parameters, true) && consumed; - else - consumed = root->DispatchEvent(TEXTINPUT, parameters, true) && consumed; - } - - return consumed; -} - -// Sends a mouse movement event into Rocket. -void Context::ProcessMouseMove(int x, int y, int key_modifier_state) -{ - // Check whether the mouse moved since the last event came through. - Vector2i old_mouse_position = mouse_position; - bool mouse_moved = (x != mouse_position.x) || (y != mouse_position.y); - if (mouse_moved) - { - mouse_position.x = x; - mouse_position.y = y; - } - - // Generate the parameters for the mouse events (there could be a few!). - Dictionary parameters; - GenerateMouseEventParameters(parameters, -1); - GenerateKeyModifierEventParameters(parameters, key_modifier_state); - - Dictionary drag_parameters; - GenerateMouseEventParameters(drag_parameters); - GenerateDragEventParameters(drag_parameters); - GenerateKeyModifierEventParameters(drag_parameters, key_modifier_state); - - // Update the current hover chain. This will send all necessary 'onmouseout', 'onmouseover', 'ondragout' and - // 'ondragover' messages. - UpdateHoverChain(parameters, drag_parameters, old_mouse_position); - - // Dispatch any 'onmousemove' events. - if (mouse_moved) - { - if (hover) - { - hover->DispatchEvent(MOUSEMOVE, parameters, true); - - if (drag_hover && - drag_verbose) - drag_hover->DispatchEvent(DRAGMOVE, drag_parameters, true); - } - } -} - -static Element* FindFocusElement(Element* element) -{ - ElementDocument* owner_document = element->GetOwnerDocument(); - if (!owner_document || owner_document->GetProperty< int >(FOCUS) == FOCUS_NONE) - return NULL; - - while (element && element->GetProperty< int >(FOCUS) == FOCUS_NONE) - { - element = element->GetParentNode(); - } - - return element; -} - -// Sends a mouse-button down event into Rocket. -void Context::ProcessMouseButtonDown(int button_index, int key_modifier_state) -{ - Dictionary parameters; - GenerateMouseEventParameters(parameters, button_index); - GenerateKeyModifierEventParameters(parameters, key_modifier_state); - - if (button_index == 0) - { - Element* new_focus = *hover; - - // Set the currently hovered element to focus if it isn't already the focus. - if (hover) - { - new_focus = FindFocusElement(*hover); - if (new_focus && new_focus != *focus) - { - if (!new_focus->Focus()) - return; - } - } - - // Save the just-pressed-on element as the pressed element. - active = new_focus; - - bool propogate = true; - - // Call 'onmousedown' on every item in the hover chain, and copy the hover chain to the active chain. - if (hover) - propogate = hover->DispatchEvent(MOUSEDOWN, parameters, true); - - if (propogate) - { - // Check for a double-click on an element; if one has occured, we send the 'dblclick' event to the hover - // element. If not, we'll start a timer to catch the next one. - float click_time = GetSystemInterface()->GetElapsedTime(); - if (active == last_click_element && - click_time - last_click_time < DOUBLE_CLICK_TIME) - { - if (hover) - propogate = hover->DispatchEvent(DBLCLICK, parameters, true); - - last_click_element = NULL; - last_click_time = 0; - } - else - { - last_click_element = *active; - last_click_time = click_time; - - } - } - - for (ElementSet::iterator itr = hover_chain.begin(); itr != hover_chain.end(); ++itr) - active_chain.push_back((*itr)); - - if (propogate) - { - // Traverse down the hierarchy of the newly focussed element (if any), and see if we can begin dragging it. - drag_started = false; - drag = hover; - while (drag) - { - int drag_style = drag->GetProperty(DRAG)->value.Get< int >(); - switch (drag_style) - { - case DRAG_NONE: drag = drag->GetParentNode(); continue; - case DRAG_BLOCK: drag = NULL; continue; - default: drag_verbose = (drag_style == DRAG_DRAG_DROP || drag_style == DRAG_CLONE); - } - - break; - } - } - } - else - { - // Not the primary mouse button, so we're not doing any special processing. - if (hover) - hover->DispatchEvent(MOUSEDOWN, parameters, true); - } -} - -// Sends a mouse-button up event into Rocket. -void Context::ProcessMouseButtonUp(int button_index, int key_modifier_state) -{ - Dictionary parameters; - GenerateMouseEventParameters(parameters, button_index); - GenerateKeyModifierEventParameters(parameters, key_modifier_state); - - // Process primary click. - if (button_index == 0) - { - // The elements in the new hover chain have the 'onmouseup' event called on them. - if (hover) - hover->DispatchEvent(MOUSEUP, parameters, true); - - // If the active element (the one that was being hovered over when the mouse button was pressed) is still being - // hovered over, we click it. - if (hover && active && active == FindFocusElement(*hover)) - { - active->DispatchEvent(CLICK, parameters, true); - } - - // Unset the 'active' pseudo-class on all the elements in the active chain; because they may not necessarily - // have had 'onmouseup' called on them, we can't guarantee this has happened already. - std::for_each(active_chain.begin(), active_chain.end(), PseudoClassFunctor("active", false)); - active_chain.clear(); - - if (drag) - { - if (drag_started) - { - Dictionary drag_parameters; - GenerateMouseEventParameters(drag_parameters); - GenerateDragEventParameters(drag_parameters); - GenerateKeyModifierEventParameters(drag_parameters, key_modifier_state); - - if (drag_hover) - { - if (drag_verbose) - { - drag_hover->DispatchEvent(DRAGDROP, drag_parameters, true); - drag_hover->DispatchEvent(DRAGOUT, drag_parameters, true); - } - } - - drag->DispatchEvent(DRAGEND, drag_parameters, true); - - ReleaseDragClone(); - } - - drag = NULL; - drag_hover = NULL; - drag_hover_chain.clear(); - } - } - else - { - // Not the left mouse button, so we're not doing any special processing. - if (hover) - hover->DispatchEvent(MOUSEUP, parameters, true); - } -} - -// Sends a mouse-wheel movement event into Rocket. -bool Context::ProcessMouseWheel(int wheel_delta, int key_modifier_state) -{ - if (hover) - { - Dictionary scroll_parameters; - GenerateKeyModifierEventParameters(scroll_parameters, key_modifier_state); - scroll_parameters.Set("wheel_delta", wheel_delta); - - return hover->DispatchEvent(MOUSESCROLL, scroll_parameters, true); - } - - return true; -} - -// Gets the context's render interface. -RenderInterface* Context::GetRenderInterface() const -{ - return render_interface; -} - -// Gets the current clipping region for the render traversal -bool Context::GetActiveClipRegion(Vector2i& origin, Vector2i& dimensions) const -{ - if (clip_dimensions.x < 0 || clip_dimensions.y < 0) - return false; - - origin = clip_origin; - dimensions = clip_dimensions; - - return true; -} - -// Sets the current clipping region for the render traversal -void Context::SetActiveClipRegion(const Vector2i& origin, const Vector2i& dimensions) -{ - clip_origin = origin; - clip_dimensions = dimensions; -} - -// Sets the instancer to use for releasing this object. -void Context::SetInstancer(ContextInstancer* _instancer) -{ - ROCKET_ASSERT(instancer == NULL); - instancer = _instancer; - instancer->AddReference(); -} - -// Internal callback for when an element is removed from the hierarchy. -void Context::OnElementRemove(Element* element) -{ - ElementSet::iterator i = hover_chain.find(element); - if (i == hover_chain.end()) - return; - - ElementSet old_hover_chain = hover_chain; - hover_chain.erase(i); - - Element* hover_element = element; - while (hover_element != NULL) - { - Element* next_hover_element = NULL; - - // Look for a child on this element's children that is also hovered. - for (int j = 0; j < hover_element->GetNumChildren(true); ++j) - { - // Is this child also in the hover chain? - Element* hover_child_element = hover_element->GetChild(j); - ElementSet::iterator k = hover_chain.find(hover_child_element); - if (k != hover_chain.end()) - { - next_hover_element = hover_child_element; - hover_chain.erase(k); - - break; - } - } - - hover_element = next_hover_element; - } - - Dictionary parameters; - GenerateMouseEventParameters(parameters, -1); - SendEvents(old_hover_chain, hover_chain, MOUSEOUT, parameters, true); -} - -// Internal callback for when a new element gains focus -bool Context::OnFocusChange(Element* new_focus) -{ - ElementSet old_chain; - ElementSet new_chain; - - Element* old_focus = *(focus); - ElementDocument* old_document = old_focus ? old_focus->GetOwnerDocument() : NULL; - ElementDocument* new_document = new_focus->GetOwnerDocument(); - - // If the current focus is modal and the new focus is not modal, deny the request - if (old_document && old_document->IsModal() && (!new_document || !new_document->GetOwnerDocument()->IsModal())) - return false; - - // Build the old chains - Element* element = old_focus; - while (element) - { - old_chain.insert(element); - element = element->GetParentNode(); - } - - // Build the new chain - element = new_focus; - while (element) - { - new_chain.insert(element); - element = element->GetParentNode(); - } - - Dictionary parameters; - - // Send out blur/focus events. - SendEvents(old_chain, new_chain, BLUR, parameters, false); - SendEvents(new_chain, old_chain, FOCUS, parameters, false); - - focus = new_focus; - - // Raise the element's document to the front, if desired. - ElementDocument* document = focus->GetOwnerDocument(); - if (document != NULL) - { - const Property* z_index_property = document->GetProperty(Z_INDEX); - if (z_index_property->unit == Property::KEYWORD && - z_index_property->value.Get< int >() == Z_INDEX_AUTO) - document->PullToFront(); - } - - // Update the focus history - if (old_document != new_document) - { - // If documents have changed, add the new document to the end of the history - ElementList::iterator itr = std::find(document_focus_history.begin(), document_focus_history.end(), new_document); - if (itr != document_focus_history.end()) - document_focus_history.erase(itr); - - if (new_document != NULL) - document_focus_history.push_back(new_document); - } - - return true; -} - -// Generates an event for faking clicks on an element. -void Context::GenerateClickEvent(Element* element) -{ - Dictionary parameters; - GenerateMouseEventParameters(parameters, 0); - - element->DispatchEvent(CLICK, parameters, true); -} - -// Updates the current hover elements, sending required events. -void Context::UpdateHoverChain(const Dictionary& parameters, const Dictionary& drag_parameters, const Vector2i& old_mouse_position) -{ - Vector2f position((float) mouse_position.x, (float) mouse_position.y); - - // Send out drag events. - if (drag) - { - if (mouse_position != old_mouse_position) - { - if (!drag_started) - { - Dictionary drag_start_parameters = drag_parameters; - drag_start_parameters.Set("mouse_x", old_mouse_position.x); - drag_start_parameters.Set("mouse_y", old_mouse_position.y); - drag->DispatchEvent(DRAGSTART, drag_start_parameters); - drag_started = true; - - if (drag->GetProperty< int >(DRAG) == DRAG_CLONE) - { - // Clone the element and attach it to the mouse cursor. - CreateDragClone(*drag); - } - } - - drag->DispatchEvent(DRAG, drag_parameters); - } - } - - hover = GetElementAtPoint(position); - - if (!hover || - hover->GetProperty(CURSOR)->unit == Property::KEYWORD) - active_cursor = default_cursor; - else - SetMouseCursor(hover->GetProperty< String >(CURSOR)); - - // Build the new hover chain. - ElementSet new_hover_chain; - Element* element = *hover; - while (element != NULL) - { - new_hover_chain.insert(element); - element = element->GetParentNode(); - } - - // Send mouseout / mouseover events. - SendEvents(hover_chain, new_hover_chain, MOUSEOUT, parameters, true); - SendEvents(new_hover_chain, hover_chain, MOUSEOVER, parameters, true); - - // Send out drag events. - if (drag) - { - drag_hover = GetElementAtPoint(position, *drag); - - ElementSet new_drag_hover_chain; - element = *drag_hover; - while (element != NULL) - { - new_drag_hover_chain.insert(element); - element = element->GetParentNode(); - } - -/* if (mouse_moved && !drag_started) - { - drag->DispatchEvent(DRAGSTART, drag_parameters); - drag_started = true; - - if (drag->GetProperty< int >(DRAG) == DRAG_CLONE) - { - // Clone the element and attach it to the mouse cursor. - CreateDragClone(*drag); - } - }*/ - - if (drag_started && - drag_verbose) - { - // Send out ondragover and ondragout events as appropriate. - SendEvents(drag_hover_chain, new_drag_hover_chain, DRAGOUT, drag_parameters, true); - SendEvents(new_drag_hover_chain, drag_hover_chain, DRAGOVER, drag_parameters, true); - } - - drag_hover_chain.swap(new_drag_hover_chain); - } - - // Swap the new chain in. - hover_chain.swap(new_hover_chain); -} - -// Returns the youngest descendent of the given element which is under the given point in screen coodinates. -Element* Context::GetElementAtPoint(const Vector2f& point, const Element* ignore_element, Element* element) -{ - // Update the layout on all documents prior to this call. - for (int i = 0; i < GetNumDocuments(); ++i) - GetDocument(i)->UpdateLayout(); - - if (element == NULL) - { - if (ignore_element == root) - return NULL; - - element = root; - } - - // Check if any documents have modal focus; if so, only check down than document. - if (element == root) - { - if (focus) - { - ElementDocument* focus_document = focus->GetOwnerDocument(); - if (focus_document != NULL && - focus_document->IsModal()) - { - element = focus_document; - } - } - } - - // Check any elements within our stacking context. We want to return the lowest-down element - // that is under the cursor. - if (element->local_stacking_context) - { - if (element->stacking_context_dirty) - element->BuildLocalStackingContext(); - - for (int i = (int) element->stacking_context.size() - 1; i >= 0; --i) - { - if (ignore_element != NULL) - { - Element* element_hierarchy = element->stacking_context[i]; - while (element_hierarchy != NULL) - { - if (element_hierarchy == ignore_element) - break; - - element_hierarchy = element_hierarchy->GetParentNode(); - } - - if (element_hierarchy != NULL) - continue; - } - - Element* child_element = GetElementAtPoint(point, ignore_element, element->stacking_context[i]); - if (child_element != NULL) - return child_element; - } - } - - // Check if the point is actually within this element. - bool within_element = element->IsPointWithinElement(point); - if (within_element) - { - Vector2i clip_origin, clip_dimensions; - if (ElementUtilities::GetClippingRegion(clip_origin, clip_dimensions, element)) - { - within_element = point.x >= clip_origin.x && - point.y >= clip_origin.y && - point.x <= (clip_origin.x + clip_dimensions.x) && - point.y <= (clip_origin.y + clip_dimensions.y); - } - } - - if (within_element) - return element; - - return NULL; -} - -// Creates the drag clone from the given element. -void Context::CreateDragClone(Element* element) -{ - if (cursor_proxy == NULL) - { - Log::Message(Log::LT_ERROR, "Unable to create drag clone, no cursor proxy document."); - return; - } - - ReleaseDragClone(); - - // Instance the drag clone. - drag_clone = element->Clone(); - if (drag_clone == NULL) - { - Log::Message(Log::LT_ERROR, "Unable to duplicate drag clone."); - return; - } - - // Append the clone to the cursor proxy element. - cursor_proxy->AppendChild(drag_clone); - drag_clone->RemoveReference(); - - // Set the style sheet on the cursor proxy. - cursor_proxy->SetStyleSheet(element->GetStyleSheet()); - - // Set all the required properties and pseudo-classes on the clone. - drag_clone->SetPseudoClass("drag", true); - drag_clone->SetProperty("position", "absolute"); - drag_clone->SetProperty("left", Property(element->GetAbsoluteLeft() - element->GetBox().GetEdge(Box::MARGIN, Box::LEFT) - mouse_position.x, Property::PX)); - drag_clone->SetProperty("top", Property(element->GetAbsoluteTop() - element->GetBox().GetEdge(Box::MARGIN, Box::TOP) - mouse_position.y, Property::PX)); -} - -// Releases the drag clone, if one exists. -void Context::ReleaseDragClone() -{ - if (drag_clone != NULL) - { - cursor_proxy->RemoveChild(drag_clone); - drag_clone = NULL; - } -} - -// Builds the parameters for a generic key event. -void Context::GenerateKeyEventParameters(Dictionary& parameters, Input::KeyIdentifier key_identifier) -{ - parameters.Set("key_identifier", (int) key_identifier); -} - -// Builds the parameters for a generic mouse event. -void Context::GenerateMouseEventParameters(Dictionary& parameters, int button_index) -{ - parameters.Set("mouse_x", mouse_position.x); - parameters.Set("mouse_y", mouse_position.y); - if (button_index >= 0) - parameters.Set("button", button_index); -} - -// Builds the parameters for the key modifier state. -void Context::GenerateKeyModifierEventParameters(Dictionary& parameters, int key_modifier_state) -{ - static String property_names[] = { - "ctrl_key", - "shift_key", - "alt_key", - "meta_key", - "caps_lock_key", - "num_lock_key", - "scroll_lock_key" - }; - - for (int i = 0; i < 7; i++) - parameters.Set(property_names[i], (int) ((key_modifier_state & (1 << i)) > 0)); -} - -// Builds the parameters for a drag event. -void Context::GenerateDragEventParameters(Dictionary& parameters) -{ - parameters.Set("drag_element", (void*) *drag); -} - -// Releases all unloaded documents pending destruction. -void Context::ReleaseUnloadedDocuments() -{ - if (!unloaded_documents.empty()) - { - ElementList documents = unloaded_documents; - unloaded_documents.clear(); - - // Clear the deleted list. - for (size_t i = 0; i < documents.size(); ++i) - documents[i]->GetEventDispatcher()->DetachAllEvents(); - documents.clear(); - } -} - -// Sends the specified event to all elements in new_items that don't appear in old_items. -void Context::SendEvents(const ElementSet& old_items, const ElementSet& new_items, const String& event, const Dictionary& parameters, bool interruptible) -{ - ElementList elements; - std::set_difference(old_items.begin(), old_items.end(), new_items.begin(), new_items.end(), std::back_inserter(elements)); - std::for_each(elements.begin(), elements.end(), RKTEventFunctor(event, parameters, interruptible)); -} - -void Context::OnReferenceDeactivate() -{ - if (instancer != NULL) - { - instancer->ReleaseContext(this); - } -} - -} -} diff --git a/libs/libRocket/Source/Core/ContextInstancer.cpp b/libs/libRocket/Source/Core/ContextInstancer.cpp deleted file mode 100644 index a295848beec..00000000000 --- a/libs/libRocket/Source/Core/ContextInstancer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ContextInstancer.h" - -namespace Rocket { -namespace Core { - -ContextInstancer::~ContextInstancer() -{ -} - -void ContextInstancer::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/ContextInstancerDefault.cpp b/libs/libRocket/Source/Core/ContextInstancerDefault.cpp deleted file mode 100644 index 1b8fa0c4b15..00000000000 --- a/libs/libRocket/Source/Core/ContextInstancerDefault.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ContextInstancerDefault.h" -#include "../../Include/Rocket/Core/Context.h" - -namespace Rocket { -namespace Core { - -ContextInstancerDefault::ContextInstancerDefault() -{ -} - -ContextInstancerDefault::~ContextInstancerDefault() -{ -} - -Context* ContextInstancerDefault::InstanceContext(const String& name) -{ - Context* new_context = new Context(name); - return new_context; -} - -// Releases a context previously created by this context. -void ContextInstancerDefault::ReleaseContext(Context* context) -{ - delete context; -} - -void ContextInstancerDefault::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/ContextInstancerDefault.h b/libs/libRocket/Source/Core/ContextInstancerDefault.h deleted file mode 100644 index 0978bf43097..00000000000 --- a/libs/libRocket/Source/Core/ContextInstancerDefault.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORECONTEXTINSTANCERDEFAULT_H -#define ROCKETCORECONTEXTINSTANCERDEFAULT_H - -#include "../../Include/Rocket/Core/ContextInstancer.h" - -namespace Rocket { -namespace Core { - -/** - Default instancer for instancing contexts. - - @author Peter Curry - */ - -class ContextInstancerDefault : public ContextInstancer -{ -public: - ContextInstancerDefault(); - virtual ~ContextInstancerDefault(); - - /// Instances a context. - /// @param[in] name Name of this context. - /// @return The instanced context. - virtual Context* InstanceContext(const String& name); - - /// Releases a context previously created by this context. - /// @param[in] context The context to release. - virtual void ReleaseContext(Context* context); - - /// Releases this context instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ConvolutionFilter.cpp b/libs/libRocket/Source/Core/ConvolutionFilter.cpp deleted file mode 100644 index 8574754a6cc..00000000000 --- a/libs/libRocket/Source/Core/ConvolutionFilter.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ConvolutionFilter.h" - -namespace Rocket { -namespace Core { - -ConvolutionFilter::ConvolutionFilter() -{ - kernel_size = 0; - kernel = NULL; - - operation = MEDIAN; -} - -ConvolutionFilter::~ConvolutionFilter() -{ - delete[] kernel; -} - -// Initialises the filter. A filter must be initialised and populated with values before use. -bool ConvolutionFilter::Initialise(int _kernel_size, FilterOperation _operation) -{ - if (_kernel_size <= 0) - return false; - - kernel_size = Math::Max(_kernel_size, 1); - kernel_size = kernel_size * 2 + 1; - - kernel = new float[kernel_size * kernel_size]; - memset(kernel, 0, kernel_size * kernel_size * sizeof(float)); - - operation = _operation; - return true; -} - -// Returns a reference to one of the rows of the filter kernel. -float* ConvolutionFilter::operator[](int index) -{ - ROCKET_ASSERT(kernel != NULL); - - index = Math::Max(index, 0); - index = Math::Min(index, kernel_size - 1); - - return kernel + kernel_size * index; -} - -// Runs the convolution filter. -void ConvolutionFilter::Run(byte* destination, const Vector2i& destination_dimensions, int destination_stride, const byte* source, const Vector2i& source_dimensions, const Vector2i& source_offset) const -{ - for (int y = 0; y < destination_dimensions.y; ++y) - { - for (int x = 0; x < destination_dimensions.x; ++x) - { - int num_pixels = 0; - int opacity = 0; - - for (int kernel_y = 0; kernel_y < kernel_size; ++kernel_y) - { - int source_y = y - source_offset.y - ((kernel_size - 1) / 2) + kernel_y; - - for (int kernel_x = 0; kernel_x < kernel_size; ++kernel_x) - { - int pixel_opacity; - - int source_x = x - source_offset.x - ((kernel_size - 1) / 2) + kernel_x; - if (source_y >= 0 && - source_y < source_dimensions.y && - source_x >= 0 && - source_x < source_dimensions.x) - { - pixel_opacity = Math::RealToInteger(source[source_y * source_dimensions.x + source_x] * kernel[kernel_y * kernel_size + kernel_x]); - } - else - pixel_opacity = 0; - - switch (operation) - { - case MEDIAN: opacity += pixel_opacity; break; - case DILATION: opacity = Math::Max(opacity, pixel_opacity); break; - case EROSION: opacity = num_pixels == 0 ? pixel_opacity : Math::Min(opacity, pixel_opacity); break; - } - - ++num_pixels; - } - } - - if (operation == MEDIAN) - opacity /= num_pixels; - - opacity = Math::Min(255, opacity); -#ifdef ROCKET_8BPP_FONTS - destination[x] = (byte) opacity; -#else - destination[x * 4 + 3] = (byte) opacity; -#endif - } - - destination += destination_stride; - } -} - -} -} diff --git a/libs/libRocket/Source/Core/Core.cpp b/libs/libRocket/Source/Core/Core.cpp deleted file mode 100644 index 3695383979d..00000000000 --- a/libs/libRocket/Source/Core/Core.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core.h" -#include -#include "FileInterfaceDefault.h" -#include "GeometryDatabase.h" -#include "PluginRegistry.h" -#include "StyleSheetFactory.h" -#include "TemplateCache.h" -#include "TextureDatabase.h" - -namespace Rocket { -namespace Core { - -// Rocket's renderer interface. -static RenderInterface* render_interface = NULL; -/// Rocket's system interface. -static SystemInterface* system_interface = NULL; -// Rocket's file I/O interface. -FileInterface* file_interface = NULL; -#ifndef ROCKET_NO_FILE_INTERFACE_DEFAULT -static FileInterfaceDefault file_interface_default; -#endif -static bool initialised = false; - -typedef std::map< String, Context* > ContextMap; -static ContextMap contexts; - -#ifndef ROCKET_VERSION - #define ROCKET_VERSION "custom" -#endif - -/** - A 'plugin' for unobtrusively intercepting the destruction of contexts. - */ - -class PluginContextRelease : public Plugin -{ - public: - virtual void OnShutdown() - { - delete this; - } - - virtual void OnContextDestroy(Context* context) - { - contexts.erase(context->GetName()); - } -}; - -bool Initialise() -{ - // Check for valid interfaces, or install default interfaces as appropriate. - if (system_interface == NULL) - { - Log::Message(Log::LT_ERROR, "No system interface set!"); - return false; - } - - if (file_interface == NULL) - { -#ifndef ROCKET_NO_FILE_INTERFACE_DEFAULT - file_interface = &file_interface_default; - file_interface->AddReference(); -#else - Log::Message(Log::LT_ERROR, "No file interface set!"); - return false; -#endif - } - - Log::Initialise(); - - TextureDatabase::Initialise(); - - FontDatabase::Initialise(); - - StyleSheetSpecification::Initialise(); - StyleSheetFactory::Initialise(); - - TemplateCache::Initialise(); - - Factory::Initialise(); - - // Notify all plugins we're starting up. - PluginRegistry::RegisterPlugin(new PluginContextRelease()); - PluginRegistry::NotifyInitialise(); - - initialised = true; - - return true; -} - -void Shutdown() -{ - // Notify all plugins we're being shutdown. - PluginRegistry::NotifyShutdown(); - - // Release all remaining contexts. - for (ContextMap::iterator itr = contexts.begin(); itr != contexts.end(); ++itr) - Core::Log::Message(Log::LT_WARNING, "Context '%s' still active on shutdown.", (*itr).first.CString()); - contexts.clear(); - - TemplateCache::Shutdown(); - StyleSheetFactory::Shutdown(); - StyleSheetSpecification::Shutdown(); - FontDatabase::Shutdown(); - TextureDatabase::Shutdown(); - Factory::Shutdown(); - - Log::Shutdown(); - - initialised = false; - - if (render_interface != NULL) - render_interface->RemoveReference(); - - if (file_interface != NULL) - file_interface->RemoveReference(); - - if (system_interface != NULL) - system_interface->RemoveReference(); - - render_interface = NULL; - file_interface = NULL; - system_interface = NULL; -} - -// Returns the version of this Rocket library. -String GetVersion() -{ - return ROCKET_VERSION; -} - -// Sets the interface through which all Rocket messages will be routed. -void SetSystemInterface(SystemInterface* _system_interface) -{ - if (system_interface == _system_interface) - return; - - if (system_interface != NULL) - system_interface->RemoveReference(); - - system_interface = _system_interface; - if (system_interface != NULL) - system_interface->AddReference(); -} - -// Returns Rocket's system interface. -SystemInterface* GetSystemInterface() -{ - return system_interface; -} - -// Sets the interface through which all rendering requests are made. -void SetRenderInterface(RenderInterface* _render_interface) -{ - if (render_interface == _render_interface) - return; - - if (render_interface != NULL) - render_interface->RemoveReference(); - - render_interface = _render_interface; - if (render_interface != NULL) - render_interface->AddReference(); -} - -// Returns Rocket's render interface. -RenderInterface* GetRenderInterface() -{ - return render_interface; -} - -// Sets the interface through which all file I/O requests are made. -void SetFileInterface(FileInterface* _file_interface) -{ - if (file_interface == _file_interface) - return; - - if (file_interface != NULL) - file_interface->RemoveReference(); - - file_interface = _file_interface; - if (file_interface != NULL) - file_interface->AddReference(); -} - -// Returns Rocket's file interface. -FileInterface* GetFileInterface() -{ - return file_interface; -} - -// Creates a new element context. -Context* CreateContext(const String& name, const Vector2i& dimensions, RenderInterface* custom_render_interface) -{ - if (!initialised) - return NULL; - - if (custom_render_interface == NULL && - render_interface == NULL) - { - Log::Message(Log::LT_WARNING, "Failed to create context '%s', no render interface specified and no default render interface exists.", name.CString()); - return NULL; - } - - if (GetContext(name) != NULL) - { - Log::Message(Log::LT_WARNING, "Failed to create context '%s', context already exists.", name.CString()); - return NULL; - } - - Context* new_context = Factory::InstanceContext(name); - if (new_context == NULL) - { - Log::Message(Log::LT_WARNING, "Failed to instance context '%s', instancer returned NULL.", name.CString()); - return NULL; - } - - // Set the render interface on the context, and add a reference onto it. - if (custom_render_interface) - new_context->render_interface = custom_render_interface; - else - new_context->render_interface = render_interface; - new_context->render_interface->AddReference(); - - new_context->SetDimensions(dimensions); - contexts[name] = new_context; - - PluginRegistry::NotifyContextCreate(new_context); - - return new_context; -} - -// Fetches a previously constructed context by name. -Context* GetContext(const String& name) -{ - ContextMap::iterator i = contexts.find(name); - if (i == contexts.end()) - return NULL; - - return (*i).second; -} - -// Fetches a context by index. -Context* GetContext(int index) -{ - ContextMap::iterator i = contexts.begin(); - int count = 0; - - if (index >= GetNumContexts()) - index = GetNumContexts() - 1; - - while (count < index) - { - ++i; - ++count; - } - - if (i == contexts.end()) - return NULL; - - return (*i).second; -} - -// Returns the number of active contexts. -int GetNumContexts() -{ - return (int) contexts.size(); -} - -// Registers a generic rocket plugin -void RegisterPlugin(Plugin* plugin) -{ - if (initialised) - plugin->OnInitialise(); - - PluginRegistry::RegisterPlugin(plugin); -} - -// Forces all compiled geometry handles generated by libRocket to be released. -void ReleaseCompiledGeometries() -{ - GeometryDatabase::ReleaseGeometries(); -} - -// Forces all texture handles loaded and generated by libRocket to be released. -void ReleaseTextures() -{ - TextureDatabase::ReleaseTextures(); -} - -} -} diff --git a/libs/libRocket/Source/Core/DebugFont.h b/libs/libRocket/Source/Core/DebugFont.h deleted file mode 100644 index 8f70a47d3dc..00000000000 --- a/libs/libRocket/Source/Core/DebugFont.h +++ /dev/null @@ -1,3587 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDEBUGFONT_H -#define ROCKETCOREDEBUGFONT_H - -static unsigned char lacuna_regular[] = -{ - 0x0, 0x1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x30, 0x0, 0x3, 0x0, 0xc0, 0x4f, 0x53, 0x2f, 0x32, - 0x83, 0x9c, 0x3f, 0xd3, 0x0, 0x0, 0xdd, 0x4, 0x0, 0x0, 0x0, 0x4e, 0x63, 0x6d, 0x61, 0x70, - 0x9, 0x13, 0x6b, 0x2e, 0x0, 0x0, 0xa5, 0x50, 0x0, 0x0, 0x4, 0x82, 0x63, 0x76, 0x74, 0x20, - 0xea, 0xa, 0x94, 0x47, 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x5, 0x8e, 0x66, 0x70, 0x67, 0x6d, - 0x83, 0x33, 0xc2, 0x4f, 0x0, 0x0, 0x3, 0xe8, 0x0, 0x0, 0x0, 0x14, 0x67, 0x6c, 0x79, 0x66, - 0x9c, 0x3b, 0xbc, 0x67, 0x0, 0x0, 0x9, 0xc8, 0x0, 0x0, 0x92, 0x7e, 0x68, 0x64, 0x6d, 0x78, - 0x9d, 0x59, 0x94, 0xcb, 0x0, 0x0, 0xce, 0x7c, 0x0, 0x0, 0xe, 0x88, 0x68, 0x65, 0x61, 0x64, - 0xd9, 0x44, 0x80, 0x2e, 0x0, 0x0, 0xdd, 0x54, 0x0, 0x0, 0x0, 0x36, 0x68, 0x68, 0x65, 0x61, - 0x9, 0x29, 0x3, 0xd5, 0x0, 0x0, 0xdd, 0x8c, 0x0, 0x0, 0x0, 0x24, 0x68, 0x6d, 0x74, 0x78, - 0xe6, 0x99, 0x37, 0xef, 0x0, 0x0, 0x9f, 0xd8, 0x0, 0x0, 0x3, 0x8c, 0x6b, 0x65, 0x72, 0x6e, - 0x89, 0x37, 0x8e, 0x7c, 0x0, 0x0, 0xa9, 0xd4, 0x0, 0x0, 0x24, 0xa8, 0x6c, 0x6f, 0x63, 0x61, - 0x0, 0x3d, 0xab, 0xc, 0x0, 0x0, 0x9c, 0x48, 0x0, 0x0, 0x3, 0x90, 0x6d, 0x61, 0x78, 0x70, - 0x1, 0x98, 0x1, 0xe7, 0x0, 0x0, 0xdd, 0xb0, 0x0, 0x0, 0x0, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x66, 0x13, 0x7, 0x42, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x2, 0xeb, 0x70, 0x6f, 0x73, 0x74, - 0x35, 0x67, 0x77, 0xf0, 0x0, 0x0, 0xa3, 0x64, 0x0, 0x0, 0x1, 0xec, 0x70, 0x72, 0x65, 0x70, - 0x85, 0xee, 0xfc, 0x36, 0x0, 0x0, 0x9, 0x8c, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, 0x15, - 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x1f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0xe, 0x0, 0x8e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x58, - 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x1c, 0x0, 0xaa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x50, 0x1, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x0, 0x1a, 0x1, 0xcf, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xe, 0x0, 0x5d, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x7, 0x0, 0x87, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x2c, 0x0, 0xc6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xe, - 0x0, 0x9c, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x28, 0x1, 0x4a, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0xd, 0x1, 0xc2, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, - 0x0, 0x0, 0x0, 0x3e, 0x0, 0x1f, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x1, 0x0, 0x1c, - 0x0, 0x6b, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x2, 0x0, 0xe, 0x0, 0x8e, 0x0, 0x3, - 0x0, 0x1, 0x4, 0x9, 0x0, 0x3, 0x0, 0x58, 0x0, 0xf2, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, - 0x0, 0x4, 0x0, 0x1c, 0x0, 0xaa, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x5, 0x0, 0x50, - 0x1, 0x72, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x6, 0x0, 0x1a, 0x1, 0xcf, 0x4c, 0x61, - 0x63, 0x75, 0x6e, 0x61, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x62, 0x79, 0x20, 0x50, - 0x65, 0x74, 0x65, 0x72, 0x20, 0x48, 0x6f, 0x66, 0x66, 0x6d, 0x61, 0x6e, 0x6e, 0x0, 0x4c, 0x0, - 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x20, 0x10, 0x0, 0x20, 0x0, - 0x32, 0x0, 0x30, 0x0, 0x30, 0x0, 0x31, 0x0, 0x20, 0x0, 0x62, 0x0, 0x79, 0x0, 0x20, 0x0, - 0x50, 0x0, 0x65, 0x0, 0x74, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, 0x0, 0x48, 0x0, 0x6f, 0x0, - 0x66, 0x0, 0x66, 0x0, 0x6d, 0x0, 0x61, 0x0, 0x6e, 0x0, 0x6e, 0x4c, 0x61, 0x63, 0x75, 0x6e, - 0x61, 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, - 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, 0x75, 0x0, - 0x6c, 0x0, 0x61, 0x0, 0x72, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x52, 0x0, 0x65, - 0x0, 0x67, 0x0, 0x75, 0x0, 0x6c, 0x0, 0x61, 0x0, 0x72, 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, - 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, 0x75, - 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, 0x75, 0x0, 0x6c, - 0x0, 0x61, 0x0, 0x72, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x46, - 0x6f, 0x6e, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x65, 0x72, 0x20, 0x34, 0x2e, 0x31, 0x2e, - 0x32, 0x20, 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, - 0x0, 0x4d, 0x0, 0x61, 0x0, 0x63, 0x0, 0x72, 0x0, 0x6f, 0x0, 0x6d, 0x0, 0x65, 0x0, 0x64, - 0x0, 0x69, 0x0, 0x61, 0x0, 0x20, 0x0, 0x46, 0x0, 0x6f, 0x0, 0x6e, 0x0, 0x74, 0x0, 0x6f, - 0x0, 0x67, 0x0, 0x72, 0x0, 0x61, 0x0, 0x70, 0x0, 0x68, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, - 0x0, 0x34, 0x0, 0x2e, 0x0, 0x31, 0x0, 0x2e, 0x0, 0x32, 0x0, 0x20, 0x0, 0x4c, 0x0, 0x61, - 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, - 0x0, 0x75, 0x0, 0x6c, 0x0, 0x61, 0x0, 0x72, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x65, 0x72, 0x20, - 0x34, 0x2e, 0x31, 0x2e, 0x32, 0x20, 0x31, 0x37, 0x2e, 0x30, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x33, - 0x0, 0x4d, 0x0, 0x61, 0x0, 0x63, 0x0, 0x72, 0x0, 0x6f, 0x0, 0x6d, 0x0, 0x65, 0x0, 0x64, - 0x0, 0x69, 0x0, 0x61, 0x0, 0x20, 0x0, 0x46, 0x0, 0x6f, 0x0, 0x6e, 0x0, 0x74, 0x0, 0x6f, - 0x0, 0x67, 0x0, 0x72, 0x0, 0x61, 0x0, 0x70, 0x0, 0x68, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, - 0x0, 0x34, 0x0, 0x2e, 0x0, 0x31, 0x0, 0x2e, 0x0, 0x32, 0x0, 0x20, 0x0, 0x31, 0x0, 0x37, - 0x0, 0x2e, 0x0, 0x30, 0x0, 0x32, 0x0, 0x2e, 0x0, 0x32, 0x0, 0x30, 0x0, 0x30, 0x0, 0x33, - 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x4c, 0x0, - 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, - 0x75, 0x0, 0x6c, 0x0, 0x61, 0x0, 0x72, 0x0, 0x40, 0x1, 0x0, 0x2c, 0x76, 0x45, 0x20, 0xb0, - 0x3, 0x25, 0x45, 0x23, 0x61, 0x68, 0x18, 0x23, 0x68, 0x60, 0x44, 0x2d, 0xfe, 0xe8, 0xff, 0xfb, - 0x2, 0x16, 0x3, 0x10, 0x3, 0x32, 0x0, 0x56, 0x0, 0x6b, 0x0, 0x44, 0x0, 0x4b, 0x4a, 0x73, - 0x9c, 0x46, 0xec, 0x9a, 0x3a, 0xfa, 0x67, 0xb4, 0x9, 0x25, 0xac, 0x8f, 0xe, 0xbf, 0x2e, 0x4f, - 0xd1, 0x8f, 0x42, 0xac, 0xd, 0x5e, 0xb8, 0xf3, 0x33, 0x6d, 0x93, 0x54, 0x9c, 0xe4, 0x44, 0x32, - 0xaa, 0x12, 0xd8, 0xfb, 0x6a, 0x9a, 0xe7, 0x7c, 0x22, 0x3a, 0x43, 0xac, 0xe8, 0xa, 0x30, 0x26, - 0x51, 0xd5, 0xe7, 0x77, 0x27, 0xa2, 0x69, 0xc3, 0x2, 0x72, 0x89, 0xe1, 0x77, 0xc9, 0xc4, 0x68, - 0xb7, 0x1f, 0x59, 0xbe, 0x86, 0x90, 0xe7, 0x22, 0xd7, 0x72, 0x26, 0x52, 0x2a, 0xeb, 0x8b, 0x5b, - 0xae, 0x2f, 0x55, 0xbd, 0xb6, 0x9, 0xd9, 0xef, 0x43, 0x82, 0xed, 0x32, 0x83, 0xca, 0x5b, 0xca, - 0x6a, 0xfb, 0xb8, 0xc8, 0xf4, 0x1d, 0xc7, 0x41, 0x2, 0xcf, 0x2d, 0xa2, 0xcb, 0x6, 0x33, 0x26, - 0x52, 0xb6, 0xf4, 0x16, 0xa5, 0x35, 0x21, 0xd5, 0xc7, 0x48, 0x57, 0xf4, 0xb7, 0xdd, 0xf7, 0x6f, - 0x60, 0xb5, 0x4e, 0x99, 0xfd, 0x70, 0x77, 0xe3, 0x3, 0xc3, 0xc9, 0x45, 0x7e, 0x27, 0xf4, 0x8d, - 0xd4, 0xb0, 0x56, 0x53, 0x2b, 0xff, 0xa4, 0x91, 0x16, 0x2c, 0x4, 0xda, 0x87, 0x47, 0x40, 0xf2, - 0xe2, 0x9d, 0x89, 0x7d, 0x48, 0x33, 0xfd, 0xbf, 0x6b, 0x5c, 0xe, 0x98, 0xf0, 0x9f, 0x9e, 0x6f, - 0x19, 0xfd, 0xb3, 0x66, 0x2b, 0x1c, 0x8b, 0xf4, 0xaf, 0x2d, 0xf, 0x1c, 0x76, 0x67, 0xb8, 0xb7, - 0xf9, 0xd3, 0x95, 0x79, 0xc, 0x5d, 0x9d, 0xe4, 0x51, 0x62, 0xf0, 0xe7, 0x89, 0xd7, 0x27, 0x79, - 0xd4, 0xea, 0x68, 0x84, 0xe2, 0x16, 0x9d, 0xa2, 0x3b, 0x2e, 0xed, 0x8e, 0xd1, 0x8f, 0x7e, 0x63, - 0x5e, 0x29, 0xf7, 0xaa, 0x60, 0x40, 0x3, 0x88, 0xb1, 0xad, 0x45, 0x48, 0xdb, 0xe4, 0x79, 0x6c, - 0xaf, 0x2d, 0xcb, 0xc2, 0x76, 0x79, 0x56, 0xc2, 0xf7, 0xb7, 0x94, 0x58, 0xa, 0x86, 0xbb, 0xb5, - 0x1c, 0x58, 0x7c, 0xee, 0xf, 0x6f, 0x8b, 0xa, 0x3e, 0xb5, 0xb3, 0x5e, 0x13, 0xcf, 0x32, 0x2f, - 0xfb, 0x4b, 0x94, 0xf1, 0xf, 0xd5, 0x83, 0x6c, 0x50, 0xfa, 0xf2, 0x6f, 0x8f, 0x4f, 0x26, 0xe1, - 0xdb, 0x92, 0x6e, 0x1c, 0xe1, 0xae, 0x9f, 0x3a, 0x3a, 0xa6, 0xeb, 0x26, 0xf3, 0x26, 0xc2, 0x17, - 0x10, 0x64, 0x6d, 0xb9, 0xbc, 0x9d, 0x9b, 0x93, 0x85, 0x46, 0x20, 0xa2, 0x8a, 0x82, 0xaa, 0x52, - 0x4d, 0xb2, 0xde, 0xd1, 0x89, 0x79, 0x3c, 0xec, 0xce, 0x88, 0xf, 0x71, 0x0, 0xb, 0xf9, 0xd1, - 0x26, 0x75, 0x54, 0x1c, 0xee, 0xbf, 0x7b, 0x1f, 0xa6, 0x19, 0xc7, 0xcb, 0x6c, 0x29, 0xac, 0xc, - 0xc0, 0xe7, 0x6c, 0x96, 0xdf, 0x3d, 0xb8, 0xc8, 0x2b, 0x53, 0xc1, 0xb3, 0x0, 0xfd, 0x24, 0x75, - 0xd3, 0x16, 0x46, 0xe2, 0xa9, 0x53, 0xc5, 0x3a, 0x61, 0xdd, 0xaa, 0x2f, 0x9a, 0x7f, 0xea, 0x5f, - 0x68, 0xe6, 0x4d, 0x48, 0xe8, 0x1c, 0x97, 0xae, 0x78, 0x6, 0x17, 0xf0, 0x81, 0x91, 0x2f, 0x7, - 0xc1, 0xd7, 0x1d, 0xd7, 0x2c, 0xe6, 0x7b, 0x3b, 0xb6, 0x8, 0x89, 0x4e, 0xcc, 0xc0, 0x6f, 0xb1, - 0x15, 0x73, 0xf5, 0xd3, 0x94, 0xa3, 0x36, 0x63, 0xeb, 0x0, 0x63, 0xaa, 0x1, 0x5f, 0x99, 0xf9, - 0x7a, 0x20, 0x35, 0x58, 0xae, 0xa6, 0x10, 0x86, 0x23, 0x4f, 0xb5, 0xee, 0x4d, 0xd0, 0x8b, 0x56, - 0xbc, 0x38, 0x36, 0xfe, 0x96, 0xbf, 0xbb, 0x56, 0x37, 0xc9, 0xe8, 0x66, 0x7b, 0xc, 0x16, 0x83, - 0x8d, 0x3e, 0x3f, 0xae, 0xe0, 0xb, 0xae, 0x3c, 0x5a, 0xab, 0xc0, 0x4e, 0x3c, 0xb0, 0x1, 0xdc, - 0xeb, 0x68, 0x8a, 0xb0, 0x7e, 0x80, 0x4e, 0xd0, 0x8f, 0x72, 0xb6, 0x52, 0x18, 0xf7, 0xec, 0x92, - 0x7f, 0x7c, 0x37, 0x13, 0xa1, 0x8d, 0x43, 0x30, 0xf5, 0xdc, 0xa, 0x20, 0x3b, 0x11, 0xf, 0x62, - 0x5a, 0xb7, 0x95, 0x97, 0xf0, 0x99, 0x9a, 0x48, 0x39, 0xa8, 0xe1, 0x9c, 0x83, 0x6c, 0x22, 0xac, - 0xf7, 0xcf, 0x90, 0x63, 0x15, 0x16, 0xa5, 0x8e, 0x66, 0x6b, 0x29, 0x1, 0xd2, 0xdf, 0x3d, 0x4f, - 0x4f, 0x6, 0xd9, 0xb9, 0x52, 0x19, 0xbf, 0x1f, 0xd0, 0xf1, 0x5b, 0x37, 0x83, 0x6, 0xaf, 0xe1, - 0x5b, 0x90, 0xf7, 0x3f, 0x96, 0xd3, 0x35, 0x68, 0xa4, 0x1e, 0x55, 0xfe, 0xbc, 0xb0, 0xd0, 0x38, - 0x47, 0xa3, 0xfd, 0x19, 0xdd, 0x1c, 0x71, 0xf7, 0xfe, 0x66, 0xde, 0x5a, 0x2e, 0xaa, 0x7e, 0xea, - 0x1c, 0x93, 0xc1, 0x33, 0x64, 0xc7, 0x2, 0x55, 0xec, 0xd1, 0x83, 0x87, 0x3a, 0x2a, 0xa3, 0xda, - 0x4a, 0x22, 0x92, 0x22, 0xa3, 0x13, 0xf7, 0x60, 0xc2, 0xb5, 0x1d, 0x99, 0x78, 0x97, 0xe2, 0x4a, - 0x81, 0xae, 0x69, 0x9e, 0xb, 0x6e, 0xaa, 0xae, 0x7f, 0xcd, 0xe8, 0x7d, 0x9d, 0x10, 0x2d, 0x8c, - 0xee, 0x75, 0xa1, 0x7, 0x5a, 0xdd, 0x85, 0x71, 0xb7, 0x18, 0x41, 0xbb, 0xda, 0x1b, 0x7, 0x1d, - 0x28, 0xcf, 0xc3, 0x35, 0xb, 0x8, 0x27, 0xe3, 0xc3, 0x92, 0x7c, 0x3b, 0xf, 0xb7, 0x9d, 0x58, - 0x39, 0xc3, 0xb0, 0x65, 0x14, 0x5c, 0x1a, 0xf1, 0xd7, 0x64, 0x74, 0x13, 0x40, 0xfb, 0xf5, 0x97, - 0x9f, 0x13, 0x3e, 0xfb, 0x21, 0xdb, 0xe1, 0x74, 0x95, 0xf3, 0x24, 0x6a, 0xaf, 0x4, 0x5b, 0xf4, - 0x8b, 0xb7, 0xe5, 0x17, 0xc7, 0x67, 0x17, 0xb7, 0x6c, 0x97, 0xf6, 0xb2, 0x84, 0x55, 0xd, 0xcb, - 0xb7, 0x77, 0x17, 0x15, 0x2e, 0xf9, 0x80, 0x9c, 0x55, 0x3b, 0xe7, 0xe3, 0x4f, 0x8c, 0x36, 0x34, - 0xdb, 0xd9, 0x4a, 0x77, 0x92, 0x87, 0xa3, 0xb6, 0xf7, 0x8b, 0xc2, 0xd8, 0x1c, 0x3e, 0x7b, 0x70, - 0xe2, 0xe1, 0x81, 0xc3, 0x6a, 0x63, 0xb, 0xf3, 0xaa, 0xd3, 0x7e, 0x70, 0xe8, 0x1a, 0x9d, 0x8f, - 0x2e, 0x29, 0xee, 0x90, 0xa1, 0xa8, 0x59, 0x76, 0x85, 0xd6, 0xb7, 0xbf, 0x4e, 0x5e, 0xda, 0x80, - 0x7, 0x86, 0x27, 0x68, 0xc3, 0x4e, 0xb, 0xef, 0x27, 0x86, 0xcc, 0x39, 0x7f, 0xd4, 0xe1, 0x4a, - 0x8d, 0xd1, 0x2c, 0xa5, 0xdc, 0x65, 0x7, 0x2b, 0x28, 0xc7, 0xde, 0x44, 0x45, 0xb0, 0xa5, 0x85, - 0xca, 0x6c, 0x66, 0xf, 0xa6, 0x2e, 0x87, 0xf3, 0xa8, 0x83, 0x4e, 0x11, 0xd9, 0xb2, 0x72, 0x48, - 0xa2, 0x98, 0xe1, 0xf1, 0xc6, 0x33, 0x36, 0x3, 0x6, 0x58, 0x46, 0xfa, 0xe2, 0x71, 0x85, 0x12, - 0x3b, 0xb9, 0xa0, 0x61, 0x4a, 0x18, 0xaa, 0x8a, 0xce, 0x5e, 0x75, 0xec, 0x56, 0x58, 0xf9, 0x3e, - 0x63, 0xd3, 0xd, 0x45, 0xa3, 0x99, 0x3b, 0x99, 0xa, 0xa8, 0x58, 0xf9, 0x95, 0xce, 0xe7, 0x10, - 0x22, 0x1e, 0x4d, 0xf3, 0xeb, 0x31, 0xd3, 0x15, 0x72, 0xe5, 0x14, 0x25, 0x85, 0x46, 0x41, 0xe4, - 0xe4, 0x99, 0x77, 0x7, 0x57, 0xe2, 0xd8, 0x9e, 0x80, 0x64, 0x6e, 0xc8, 0x1c, 0x81, 0x97, 0x30, - 0x23, 0x92, 0xee, 0x94, 0x9e, 0x76, 0x14, 0xbc, 0xf4, 0x8d, 0x87, 0x7e, 0x22, 0xe1, 0xda, 0x84, - 0x50, 0x14, 0xf9, 0xf5, 0x67, 0x6b, 0x47, 0x56, 0xc9, 0xf7, 0xa2, 0x6e, 0x29, 0x15, 0x97, 0xf5, - 0xa4, 0x9a, 0x5b, 0x1d, 0xe9, 0xb4, 0x69, 0x2e, 0x1, 0x8e, 0xc1, 0x8d, 0x3b, 0x31, 0xa, 0x8, - 0x55, 0x5c, 0x85, 0xe5, 0xa8, 0x8c, 0x54, 0x3c, 0xff, 0xe0, 0xb8, 0x92, 0x26, 0x22, 0xc0, 0xab, - 0x72, 0x58, 0x58, 0xbe, 0xe4, 0xdb, 0x96, 0x4a, 0x3f, 0xe2, 0xda, 0x9e, 0x5, 0x3c, 0x3c, 0xe0, - 0xe4, 0x95, 0x63, 0x34, 0xfd, 0xd7, 0x22, 0x5b, 0x4b, 0x0, 0xe0, 0xa9, 0xf7, 0x35, 0xc6, 0x4, - 0x1c, 0x55, 0x69, 0xaa, 0xa0, 0xec, 0xe7, 0xa2, 0x89, 0x57, 0x2c, 0x9d, 0x8e, 0xb1, 0xae, 0x41, - 0x51, 0x81, 0xc2, 0xa2, 0x8d, 0x48, 0x38, 0xfd, 0xb2, 0x9b, 0x13, 0x46, 0x1c, 0xfa, 0xc5, 0xc0, - 0x2a, 0x64, 0x58, 0xed, 0xea, 0x8c, 0x67, 0x6e, 0xa2, 0x28, 0xc3, 0xda, 0x68, 0x18, 0xb0, 0x1d, - 0xdc, 0xf4, 0x69, 0x67, 0xc3, 0x2, 0x84, 0xb9, 0x27, 0x20, 0xc5, 0x82, 0xc, 0x8c, 0x20, 0x64, - 0xd7, 0xe7, 0x42, 0xdd, 0xad, 0x60, 0xc1, 0xb, 0x6d, 0xaa, 0xae, 0xcd, 0x8f, 0x4e, 0xa0, 0x20, - 0x47, 0xb2, 0xd1, 0x55, 0x49, 0xed, 0xaa, 0x25, 0xe9, 0x1c, 0xcd, 0x6c, 0x3d, 0xa0, 0xd, 0xfb, - 0x4d, 0x9f, 0xeb, 0x2c, 0x9a, 0xb5, 0x33, 0x5c, 0xaf, 0xbe, 0x4d, 0xc7, 0xb2, 0x67, 0xd7, 0xf3, - 0x72, 0x89, 0x5d, 0x25, 0xf2, 0xd3, 0x6b, 0x76, 0x12, 0xe6, 0xba, 0xf6, 0x42, 0xf6, 0x73, 0xc7, - 0x44, 0x12, 0x94, 0x6e, 0xe2, 0xae, 0x2f, 0xe0, 0x4e, 0x91, 0xf4, 0x53, 0xd6, 0xf3, 0x77, 0x83, - 0x19, 0x43, 0x8a, 0xe0, 0x44, 0x8a, 0xe0, 0x3f, 0x7a, 0xd9, 0x5b, 0x0, 0xd4, 0x38, 0x8d, 0x86, - 0x71, 0xa6, 0x0, 0x2f, 0x92, 0xce, 0x2f, 0x30, 0xea, 0x76, 0x9b, 0x18, 0x17, 0xde, 0xf8, 0x53, - 0x97, 0x9, 0x1e, 0xe0, 0xb2, 0x9f, 0x54, 0x2a, 0xf6, 0xb5, 0x75, 0x15, 0x5c, 0x1b, 0xf1, 0xd7, - 0x67, 0x74, 0x12, 0x40, 0xfc, 0x1d, 0xcf, 0x6d, 0x1f, 0xbf, 0x7f, 0x60, 0xef, 0xf1, 0x94, 0x6b, - 0x3b, 0x1d, 0xb7, 0x92, 0x18, 0x36, 0x21, 0x96, 0x97, 0xb3, 0x74, 0x52, 0xfc, 0x84, 0xbe, 0xb6, - 0x5e, 0x52, 0xc5, 0xf4, 0x6, 0x8, 0x37, 0x39, 0x7, 0xc, 0x57, 0x5c, 0xa1, 0x80, 0xe8, 0x8e, - 0x92, 0x63, 0x31, 0x41, 0x99, 0xe5, 0xbb, 0x75, 0x5a, 0x55, 0xcf, 0xf6, 0x87, 0x94, 0x2d, 0x9, - 0xbd, 0xb7, 0x1e, 0x12, 0x11, 0x2e, 0xca, 0xf4, 0x35, 0x58, 0x47, 0x31, 0xd1, 0xa0, 0x6a, 0x2, - 0xb7, 0x4, 0xd8, 0xe6, 0x52, 0xcc, 0xbb, 0x7c, 0xda, 0x1f, 0x69, 0xb1, 0xf3, 0x6d, 0xa1, 0x8, - 0x22, 0xa7, 0xc1, 0x26, 0x6b, 0x88, 0xae, 0x86, 0xde, 0x62, 0x49, 0xe9, 0xec, 0xd7, 0xcf, 0x6b, - 0x6e, 0x10, 0x5, 0xb8, 0x87, 0x64, 0x6a, 0x44, 0x46, 0xb4, 0x96, 0x85, 0xf6, 0x87, 0x8e, 0x67, - 0x20, 0x2, 0xb4, 0xa9, 0x47, 0x11, 0xef, 0x3e, 0x89, 0xa6, 0x3b, 0x47, 0xad, 0xe9, 0x31, 0xf5, - 0x7d, 0x94, 0x1d, 0x23, 0x8f, 0xaa, 0x70, 0x1, 0x50, 0x6b, 0xa0, 0xbb, 0xf1, 0x9b, 0x93, 0xa2, - 0x74, 0x4, 0x11, 0xd0, 0xbf, 0x6a, 0x1f, 0xc2, 0x30, 0xb4, 0xa9, 0x55, 0x54, 0xcb, 0xf9, 0x13, - 0x5, 0x13, 0x4d, 0x72, 0x3d, 0x4, 0xc4, 0xc4, 0x43, 0x76, 0xca, 0x1f, 0x60, 0xac, 0x59, 0x26, - 0xf6, 0xe6, 0x71, 0x89, 0xf7, 0x7b, 0x0, 0xc, 0x2, 0xbe, 0x0, 0x0, 0x40, 0xb, 0x4, 0x4, - 0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x0, 0x0, 0x1, 0x8d, 0xb8, 0x1, 0xff, 0x85, 0x45, 0x68, - 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0xb3, 0x6, 0x5, - 0x46, 0x0, 0x2b, 0xb3, 0x8, 0x7, 0x46, 0x0, 0x2b, 0xb1, 0x5, 0x5, 0x45, 0x68, 0x44, 0xb1, - 0x7, 0x7, 0x45, 0x68, 0x44, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x3f, 0x0, 0x0, 0x1, 0xb6, - 0x3, 0x20, 0x0, 0x3, 0x0, 0x7, 0x0, 0x56, 0x40, 0x20, 0x1, 0x8, 0x8, 0x40, 0x9, 0x2, - 0x7, 0x4, 0x5, 0x1, 0x0, 0x6, 0x5, 0x5, 0x3, 0x2, 0x5, 0x4, 0x7, 0x0, 0x7, 0x6, - 0x7, 0x1, 0x2, 0x1, 0x3, 0x0, 0x1, 0x1, 0x0, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x0, 0x0, 0x8, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x33, 0x11, - 0x21, 0x11, 0x25, 0x33, 0x11, 0x23, 0x3f, 0x1, 0x77, 0xfe, 0xc7, 0xfa, 0xfa, 0x3, 0x20, 0xfc, - 0xe0, 0x3f, 0x2, 0xa3, 0x0, 0x2, 0x0, 0x73, 0xff, 0xf2, 0x0, 0xf4, 0x3, 0xc, 0x0, 0x3, - 0x0, 0xf, 0x0, 0x45, 0x40, 0x16, 0x1, 0x10, 0x10, 0x40, 0x11, 0x4, 0x2, 0x1, 0xa, 0x4, - 0x3, 0x0, 0xd, 0x8, 0x7, 0x7, 0x3, 0x0, 0x3, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x3, 0x23, 0x3, 0x13, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xe2, 0xe, 0x44, 0xe, 0x72, 0x26, 0x1a, - 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x3, 0xc, 0xfd, 0xc8, 0x2, 0x38, 0xfd, 0x27, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, 0x0, 0x2, 0x0, 0x5, 0x2, 0x53, 0x1, 0x1f, 0x3, 0x32, - 0x0, 0x3, 0x0, 0x7, 0x0, 0x46, 0x40, 0x18, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x4, - 0x3, 0x0, 0x6, 0x5, 0x2, 0x3, 0x1, 0x7, 0x4, 0x3, 0x3, 0x0, 0x4, 0x1, 0x7, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x27, - 0x23, 0x7, 0x23, 0x27, 0x1, 0x1f, 0x16, 0x33, 0x13, 0x62, 0x16, 0x33, 0x13, 0x3, 0x32, 0xdf, - 0xdf, 0xdf, 0xdf, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x0, 0x0, 0x2, 0x83, 0x3, 0x56, 0x0, 0x1b, - 0x0, 0x1f, 0x0, 0x90, 0x40, 0x46, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1e, 0x1c, 0x1b, 0x1a, - 0x19, 0x16, 0x15, 0x12, 0x11, 0x10, 0xe, 0xd, 0xc, 0xb, 0x8, 0x7, 0x4, 0x3, 0x2, 0x0, - 0x1d, 0x1c, 0x11, 0x10, 0x1, 0x5, 0x0, 0x7, 0x1b, 0x1a, 0x17, 0x16, 0x13, 0x5, 0x12, 0x1f, - 0x1e, 0xf, 0xe, 0x3, 0x5, 0x2, 0x7, 0xd, 0xc, 0x9, 0x8, 0x5, 0x5, 0x4, 0x19, 0x18, - 0x15, 0x3, 0x14, 0xb, 0xa, 0x7, 0x3, 0x6, 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, 0x3c, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0xd, 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x7, 0x33, 0x15, 0x23, 0x3, 0x23, 0x13, 0x23, 0x3, 0x23, - 0x13, 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x33, 0x13, 0x33, 0x3, 0x33, 0x13, 0x33, 0x3, 0x33, - 0x7, 0x23, 0x7, 0x33, 0x2, 0x83, 0x6f, 0x14, 0x68, 0x71, 0x29, 0x45, 0x29, 0xcd, 0x29, 0x45, - 0x29, 0x65, 0x6e, 0x14, 0x68, 0x71, 0x29, 0x45, 0x29, 0xcd, 0x29, 0x45, 0x29, 0x66, 0xb4, 0xcd, - 0x14, 0xcd, 0x1, 0xf0, 0x8b, 0x40, 0xfe, 0xdb, 0x1, 0x25, 0xfe, 0xdb, 0x1, 0x25, 0x40, 0x8b, - 0x40, 0x1, 0x26, 0xfe, 0xda, 0x1, 0x26, 0xfe, 0xda, 0x40, 0x8b, 0x0, 0x0, 0x1, 0x0, 0x3c, - 0xff, 0x89, 0x2, 0x2b, 0x3, 0x8a, 0x0, 0x2e, 0x0, 0x59, 0x40, 0x1f, 0x1, 0x2f, 0x2f, 0x40, - 0x30, 0x0, 0x24, 0x22, 0xe, 0xa, 0x28, 0x21, 0x1f, 0x1e, 0x1d, 0x1c, 0x18, 0x12, 0x9, 0x7, - 0x6, 0x5, 0x4, 0x0, 0x1e, 0x1d, 0x6, 0x5, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, - 0x0, 0x2f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2f, 0xff, - 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, 0x27, 0x37, 0x16, 0x17, - 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, - 0x35, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x1e, 0x1, - 0x17, 0x16, 0x2, 0x2b, 0x41, 0x37, 0x56, 0x44, 0x77, 0x66, 0x2b, 0x25, 0x36, 0x3c, 0x36, 0x41, - 0x28, 0x34, 0x43, 0x1f, 0x5a, 0xcf, 0x3b, 0x37, 0x58, 0x43, 0x63, 0x61, 0x23, 0x5b, 0x55, 0x3e, - 0x2d, 0x38, 0x3e, 0x17, 0xc5, 0x2b, 0x45, 0xbc, 0x58, 0x34, 0x2b, 0xb, 0x71, 0x70, 0x7, 0x45, - 0x41, 0x1c, 0x13, 0x15, 0x18, 0x1f, 0x42, 0x3c, 0x35, 0x18, 0x30, 0x6e, 0x77, 0x4c, 0x32, 0x2f, - 0xb, 0x79, 0x77, 0x5, 0x3c, 0x44, 0x3a, 0x18, 0x1d, 0x38, 0x33, 0x2f, 0x11, 0x6d, 0x29, 0x43, - 0x0, 0x5, 0x0, 0x3b, 0xff, 0xec, 0x3, 0x59, 0x3, 0x4e, 0x0, 0xb, 0x0, 0xf, 0x0, 0x1b, - 0x0, 0x27, 0x0, 0x33, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x34, 0x34, 0x40, 0x35, 0x10, 0x2b, 0x19, - 0x2e, 0x28, 0x22, 0x1c, 0x16, 0x10, 0xe, 0xc, 0x6, 0x0, 0x3, 0x7, 0x25, 0x31, 0x7, 0x13, - 0x1f, 0x7, 0x9, 0xf, 0xc, 0xe, 0xd, 0x13, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x2f, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x6, 0x0, 0x34, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x34, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x25, 0x1, 0x23, 0x1, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x26, - 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0xa4, 0x69, 0x4c, 0x4b, 0x69, 0x69, - 0x4b, 0x4c, 0x69, 0x1, 0x4a, 0xfd, 0xfb, 0x4f, 0x2, 0x5, 0xba, 0x69, 0x4c, 0x4b, 0x69, 0x69, - 0x4b, 0x4c, 0x69, 0xfe, 0x8, 0x41, 0x31, 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0x1, 0xb5, 0x41, - 0x31, 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0x2, 0x98, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, - 0x6a, 0xfc, 0x9e, 0x3, 0x62, 0xfd, 0x63, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, 0x1, 0x9b, - 0x32, 0x3e, 0x3f, 0x31, 0x31, 0x3f, 0x3e, 0xfe, 0x4b, 0x32, 0x3f, 0x3f, 0x32, 0x31, 0x3f, 0x3e, - 0x0, 0x2, 0x0, 0x3b, 0xff, 0xf8, 0x2, 0x5d, 0x3, 0x12, 0x0, 0x22, 0x0, 0x2a, 0x0, 0x5a, - 0x40, 0x21, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x0, 0x29, 0x24, 0x20, 0x1f, 0x19, 0x17, 0x2, 0x26, - 0x23, 0x22, 0x21, 0x1c, 0x16, 0x11, 0xd, 0x9, 0x0, 0x14, 0x3, 0x6, 0x1, 0x1, 0x0, 0x1, - 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x6, 0x7, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x32, - 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x13, 0x37, 0x17, 0x7, 0x2f, 0x1, 0x6, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x2, 0x5d, 0x5c, 0x35, 0x32, 0x13, 0x36, 0x43, 0x5b, 0x78, 0x32, - 0x18, 0x4a, 0x34, 0xc, 0x1d, 0x6b, 0x4a, 0x59, 0x3d, 0x30, 0x2e, 0x39, 0x2b, 0x38, 0x54, 0xc6, - 0x41, 0x2b, 0x45, 0x60, 0xab, 0x6e, 0x4d, 0x36, 0x4b, 0x4d, 0x2b, 0xb, 0x1f, 0x71, 0x5f, 0x4b, - 0x40, 0x1e, 0x3e, 0x49, 0x15, 0x34, 0x30, 0x41, 0x5f, 0x1, 0x3f, 0x2e, 0x2e, 0x36, 0x29, 0x30, - 0x76, 0xfe, 0xe8, 0x40, 0x34, 0x43, 0x6, 0xef, 0x4e, 0x5e, 0x3f, 0x4e, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x53, 0x0, 0x97, 0x3, 0x32, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x3, 0x0, 0x2, 0x1, 0x3, 0x0, 0x4, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x3, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, - 0xff, 0xc0, 0x38, 0x59, 0x13, 0x7, 0x23, 0x27, 0x97, 0x16, 0x33, 0x13, 0x3, 0x32, 0xdf, 0xdf, - 0x0, 0x1, 0x0, 0x3b, 0xff, 0x23, 0x1, 0xb, 0x3, 0x47, 0x0, 0x9, 0x0, 0x39, 0x40, 0xf, - 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x8, 0x6, 0x3, 0x0, 0x5, 0x1, 0x1, 0x3, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x3, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x7, 0x26, 0x11, 0x10, 0x37, 0x17, 0x6, 0x15, - 0x14, 0x1, 0xb, 0x41, 0x8f, 0x8f, 0x3f, 0x7b, 0xba, 0x23, 0xfa, 0x1, 0x18, 0x1, 0x19, 0xf9, - 0x25, 0xf2, 0xfb, 0xfb, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x23, 0x1, 0xb, 0x3, 0x47, 0x0, 0x9, - 0x0, 0x39, 0x40, 0xf, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x7, 0x5, 0x3, 0x0, 0x8, 0x2, - 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x10, 0x7, 0x27, 0x36, - 0x35, 0x34, 0x27, 0x37, 0x16, 0x1, 0xb, 0x8f, 0x41, 0x7c, 0x7a, 0x3f, 0x8f, 0x1, 0x35, 0xfe, - 0xe8, 0xfa, 0x23, 0xf4, 0xfb, 0xfb, 0xf2, 0x25, 0xf9, 0x0, 0x0, 0x1, 0x0, 0x5f, 0x1, 0xc3, - 0x1, 0xb8, 0x3, 0x31, 0x0, 0x11, 0x0, 0x52, 0x40, 0x1c, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, - 0x11, 0x10, 0xd, 0xc, 0x8, 0x7, 0x4, 0x3, 0xb, 0xa, 0x9, 0x2, 0x1, 0x0, 0x6, 0x5, - 0xf, 0xe, 0x4, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x17, 0x7, 0x27, 0x7, - 0x23, 0x27, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x33, 0x17, 0x37, 0x1, 0xb8, 0x70, 0x6f, - 0x1b, 0x72, 0x3, 0x37, 0x3, 0x73, 0x1a, 0x6e, 0x6f, 0x1b, 0x73, 0x3, 0x37, 0x3, 0x73, 0x2, - 0xbe, 0x44, 0x44, 0x2f, 0x3e, 0x82, 0x82, 0x3d, 0x2d, 0x45, 0x44, 0x2f, 0x3e, 0x82, 0x82, 0x3e, - 0x0, 0x1, 0x0, 0x3b, 0x0, 0x5c, 0x1, 0xad, 0x1, 0xce, 0x0, 0xb, 0x0, 0x5e, 0x40, 0x24, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x1, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x5, 0x4, 0x1, 0x3, 0x0, 0x9, 0x8, 0x3, - 0x2, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x15, 0x23, - 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x1, 0xad, 0x99, 0x40, 0x99, 0x99, 0x40, 0x99, - 0xf5, 0x99, 0x99, 0x40, 0x99, 0x99, 0x0, 0x1, 0x0, 0x5f, 0xff, 0x8e, 0x0, 0xe0, 0x0, 0x76, - 0x0, 0xf, 0x0, 0x39, 0x40, 0xf, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xa, 0x6, 0x3, 0x0, - 0xd, 0x2, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x14, 0x7, - 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xe0, 0x4e, 0x18, - 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, 0x26, 0x31, 0x51, 0x52, 0x14, 0xa, 0x36, 0x10, 0xc, - 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x0, 0x1, 0x0, 0x3b, 0x0, 0xf5, 0x1, 0xb, 0x1, 0x35, - 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, - 0x59, 0x25, 0x23, 0x35, 0x33, 0x1, 0xb, 0xd0, 0xd0, 0xf5, 0x40, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0xff, 0xf2, 0x0, 0xbc, 0x0, 0x73, 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, - 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x37, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x33, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, 0x1, 0x0, 0x3b, - 0x0, 0x0, 0x1, 0x9d, 0x3, 0x56, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, - 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x23, 0x1, 0x1, 0x9d, 0xfe, 0xed, 0x4f, 0x1, 0x13, 0x3, - 0x56, 0xfc, 0xaa, 0x3, 0x56, 0x0, 0x0, 0x2, 0x0, 0x50, 0xff, 0xf2, 0x2, 0x4d, 0x2, 0x40, - 0x0, 0xf, 0x0, 0x1f, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1c, 0x14, - 0x18, 0x10, 0x8, 0x0, 0xc, 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, - 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x2, 0x4d, 0x54, 0x46, 0x65, 0x65, 0x45, 0x54, 0x54, 0x46, 0x64, 0x65, 0x46, - 0x54, 0x56, 0x1f, 0x2b, 0x5f, 0x5f, 0x2b, 0x1e, 0x1e, 0x2b, 0x5f, 0x5f, 0x2b, 0x1f, 0x1, 0x19, - 0x96, 0x50, 0x41, 0x41, 0x4f, 0x97, 0x96, 0x50, 0x41, 0x41, 0x4f, 0x97, 0x57, 0x39, 0x50, 0x50, - 0x39, 0x57, 0x57, 0x39, 0x50, 0x50, 0x39, 0x0, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x1, 0xb1, - 0x2, 0x3a, 0x0, 0xa, 0x0, 0x52, 0x40, 0x1c, 0x1, 0xb, 0xb, 0x40, 0xc, 0x0, 0xa, 0x9, - 0x5, 0x4, 0x3, 0x2, 0xa, 0x9, 0x8, 0x6, 0x3, 0x2, 0x1, 0x0, 0x8, 0x7, 0x1, 0x0, - 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xb, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0xb, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x35, 0x33, 0x3, 0x7, 0x27, 0x37, - 0x33, 0x11, 0x33, 0x1, 0xb1, 0xfe, 0xab, 0x88, 0x1, 0x7d, 0x16, 0x9b, 0x4d, 0x79, 0x48, 0x1, - 0x9b, 0x30, 0x3e, 0x49, 0xfe, 0xe, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x1, 0xf8, 0x2, 0x41, - 0x0, 0x18, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x19, 0x19, 0x40, 0x1a, 0x0, 0x18, 0x17, 0xb, 0x18, - 0x17, 0x14, 0xc, 0x7, 0x2, 0x1, 0x0, 0x9, 0x7, 0x10, 0x10, 0x1, 0x0, 0x1, 0x1, 0x1, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, - 0x0, 0x19, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x19, 0xff, - 0xc0, 0x38, 0x59, 0x29, 0x1, 0x35, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, - 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0xf, 0x1, 0x21, 0x1, 0xf8, 0xfe, 0x58, - 0xd2, 0x41, 0xc, 0x28, 0x7b, 0x54, 0x43, 0x32, 0x1e, 0x2f, 0x3d, 0x43, 0x63, 0x36, 0x33, 0x89, - 0xa2, 0x1, 0x37, 0x4e, 0xa1, 0x32, 0xc, 0x2b, 0x34, 0x6e, 0x4e, 0x31, 0x26, 0x1b, 0x23, 0x35, - 0x31, 0x51, 0x65, 0x65, 0x78, 0x0, 0x0, 0x1, 0x0, 0x50, 0xff, 0x1d, 0x2, 0x4, 0x2, 0x41, - 0x0, 0x2d, 0x0, 0x56, 0x40, 0x1e, 0x1, 0x2e, 0x2e, 0x40, 0x2f, 0x0, 0x1d, 0x12, 0x11, 0x10, - 0xf, 0x8, 0x6, 0x2a, 0x26, 0x1e, 0x16, 0x11, 0x10, 0xc, 0x5, 0x0, 0x19, 0x7, 0x22, 0x22, - 0x3, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x2e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2e, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x27, - 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x1, 0x35, 0x33, 0x32, 0x37, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x14, 0x7, 0x6, 0x7, 0x16, 0x17, 0x16, 0x2, 0x4, 0x7a, 0x63, 0x86, 0x51, 0x35, 0x45, - 0x56, 0x3a, 0x28, 0x2c, 0x52, 0x45, 0x33, 0x33, 0x49, 0x27, 0x22, 0x4a, 0x38, 0x2b, 0x2a, 0x25, - 0x13, 0x35, 0x1b, 0x2b, 0x3b, 0x40, 0x60, 0x3d, 0x3a, 0x22, 0x20, 0x2f, 0x2f, 0x22, 0x27, 0x3, - 0x64, 0x82, 0x67, 0x35, 0x55, 0x25, 0x29, 0x47, 0x4a, 0x5c, 0x4d, 0x2c, 0x27, 0x3e, 0x38, 0x45, - 0x17, 0x14, 0x1a, 0x2f, 0x21, 0x19, 0x23, 0x38, 0x36, 0x4f, 0x43, 0x37, 0x33, 0x12, 0xf, 0x32, - 0x38, 0x0, 0x0, 0x1, 0x0, 0x50, 0xff, 0x18, 0x2, 0x32, 0x2, 0x32, 0x0, 0xe, 0x0, 0x69, - 0x40, 0x2a, 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0xc, 0xb, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, - 0x8, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xe, 0xd, 0xa, 0x3, 0x9, 0x8, 0x0, 0x8, - 0x7, 0x3, 0x2, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x15, 0x23, 0x37, 0x21, 0x35, - 0x1, 0x33, 0x3, 0x33, 0x35, 0x33, 0x15, 0x33, 0x2, 0x32, 0x5d, 0x55, 0x1, 0xfe, 0xcf, 0x1, - 0x1, 0x58, 0xef, 0xc7, 0x54, 0x5d, 0xe8, 0xe8, 0x32, 0x2, 0x0, 0xfe, 0x17, 0xed, 0xed, 0x0, - 0x0, 0x1, 0x0, 0x50, 0xff, 0x1d, 0x1, 0xed, 0x2, 0x34, 0x0, 0x1e, 0x0, 0x59, 0x40, 0x20, - 0x1, 0x1f, 0x1f, 0x40, 0x20, 0x0, 0x19, 0x14, 0x13, 0xb, 0x7, 0x19, 0x18, 0x17, 0x16, 0x14, - 0xf, 0x6, 0x0, 0x18, 0x17, 0x8, 0x15, 0x11, 0x8, 0x1b, 0x16, 0x15, 0x4, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x6, 0x0, 0x1f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x1f, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x13, 0x21, 0x15, 0x23, - 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1, 0xed, 0x30, 0x38, 0x6d, 0x78, 0x50, 0x39, 0x23, 0x11, - 0x24, 0x30, 0x44, 0x23, 0x1e, 0x82, 0x35, 0x2a, 0x44, 0x1, 0x1, 0x4d, 0xf8, 0x2a, 0x37, 0x66, - 0x34, 0x2b, 0x26, 0x6d, 0x47, 0x55, 0x67, 0x30, 0x28, 0xd, 0x1b, 0x36, 0x30, 0x53, 0xbb, 0x20, - 0x1, 0x7c, 0x4a, 0xe0, 0x16, 0x53, 0x44, 0x0, 0x0, 0x2, 0x0, 0x50, 0xff, 0xf2, 0x2, 0x1e, - 0x2, 0xef, 0x0, 0x20, 0x0, 0x2e, 0x0, 0x4d, 0x40, 0x1a, 0x1, 0x2f, 0x2f, 0x40, 0x30, 0x0, - 0x2d, 0x19, 0x11, 0x29, 0x21, 0x19, 0x10, 0x8, 0x0, 0x15, 0x7, 0xc, 0x25, 0x7, 0x1d, 0xc, - 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x2f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x2f, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x7, 0x26, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x36, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, - 0x17, 0x16, 0x33, 0x32, 0x2, 0x1e, 0x51, 0x3d, 0x59, 0x59, 0x38, 0x56, 0x3f, 0x41, 0x7b, 0x2a, - 0x2e, 0x28, 0xe, 0x23, 0x14, 0x13, 0x1a, 0x26, 0x48, 0x30, 0x35, 0x1a, 0x35, 0x2a, 0x25, 0x4f, - 0x3e, 0x51, 0x55, 0x1d, 0x26, 0x51, 0x50, 0x25, 0x1b, 0x1e, 0x27, 0x4c, 0x93, 0xf0, 0x8a, 0x42, - 0x32, 0x35, 0x50, 0xc1, 0xcf, 0x72, 0x76, 0x15, 0x12, 0x13, 0x33, 0xe, 0xd, 0xe, 0x47, 0x4e, - 0x88, 0x26, 0x16, 0x12, 0x31, 0x3f, 0x80, 0x45, 0x2c, 0x39, 0x3e, 0x2d, 0x45, 0x40, 0x30, 0x3e, - 0x0, 0x1, 0x0, 0x50, 0xff, 0x20, 0x1, 0xd0, 0x2, 0x2e, 0x0, 0x6, 0x0, 0x48, 0x40, 0x17, - 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, 0x6, 0x5, 0x4, 0x3, 0x2, 0x0, 0x4, 0x3, 0x8, 0x5, - 0x6, 0x5, 0x2, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x13, 0x21, 0x35, 0x21, 0x1, 0xd0, 0xe7, - 0x58, 0xe9, 0xfe, 0xd6, 0x1, 0x80, 0x1, 0xfb, 0xfd, 0x25, 0x2, 0xc6, 0x48, 0x0, 0x0, 0x3, - 0x0, 0x50, 0xff, 0xf0, 0x2, 0x12, 0x2, 0xf8, 0x0, 0x15, 0x0, 0x25, 0x0, 0x35, 0x0, 0x53, - 0x40, 0x1d, 0x1, 0x36, 0x36, 0x40, 0x37, 0x0, 0x2a, 0x22, 0x2e, 0x26, 0x1e, 0x16, 0x14, 0x12, - 0xa, 0x8, 0x6, 0x0, 0x32, 0x8, 0x3, 0x1a, 0x8, 0xe, 0xe, 0x3, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, - 0x0, 0x36, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x36, 0xff, - 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x16, 0x27, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0x12, 0x7c, 0x65, 0x65, 0x7c, 0x6c, - 0x52, 0x3f, 0x37, 0x50, 0x51, 0x38, 0x3f, 0x56, 0x70, 0x65, 0x2c, 0x23, 0x2e, 0x2d, 0x23, 0x2b, - 0x2b, 0x25, 0x2c, 0x2c, 0x24, 0x2c, 0x19, 0x38, 0x27, 0x36, 0x36, 0x27, 0x38, 0x38, 0x28, 0x35, - 0x36, 0x27, 0x38, 0xce, 0x62, 0x7c, 0x7d, 0x62, 0x8a, 0x43, 0x37, 0x6d, 0x58, 0x33, 0x2d, 0x2d, - 0x33, 0x58, 0x60, 0x44, 0x3d, 0xdc, 0x3b, 0x20, 0x1a, 0x1a, 0x20, 0x3b, 0x3c, 0x23, 0x1e, 0x1e, - 0x24, 0xfe, 0xd4, 0x5b, 0x2a, 0x1e, 0x1d, 0x2a, 0x5b, 0x58, 0x28, 0x1d, 0x1d, 0x28, 0x0, 0x2, - 0x0, 0x50, 0xff, 0x1b, 0x2, 0x1e, 0x2, 0x41, 0x0, 0x18, 0x0, 0x24, 0x0, 0x50, 0x40, 0x1c, - 0x1, 0x25, 0x25, 0x40, 0x26, 0x0, 0xd, 0x7, 0x1f, 0x19, 0x13, 0xd, 0x6, 0x0, 0x9, 0x7, - 0x4, 0x21, 0x7, 0xf, 0x1d, 0x7, 0x17, 0x17, 0x4, 0x1, 0x13, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x2f, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x13, 0x0, 0x25, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, - 0x32, 0x37, 0x36, 0x2, 0x1e, 0x3a, 0x41, 0x83, 0x42, 0x3b, 0x20, 0x34, 0x25, 0x51, 0x30, 0x2e, - 0x32, 0x67, 0x53, 0x3f, 0x50, 0x43, 0x3c, 0x64, 0xeb, 0x55, 0x1e, 0x28, 0x4b, 0x93, 0x94, 0x50, - 0x25, 0x1b, 0xfa, 0xda, 0x7b, 0x8a, 0x25, 0x3c, 0x1d, 0x5c, 0x58, 0x85, 0x42, 0x33, 0x40, 0x79, - 0x81, 0x42, 0x3c, 0xf5, 0x40, 0x30, 0x3e, 0xb4, 0xaa, 0x3e, 0x2e, 0x0, 0x0, 0x2, 0x0, 0x3b, - 0xff, 0xf2, 0x0, 0xbc, 0x2, 0x1d, 0x0, 0xb, 0x0, 0x17, 0x0, 0x43, 0x40, 0x15, 0x1, 0x18, - 0x18, 0x40, 0x19, 0x0, 0x12, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x15, 0x8, 0xf, 0x9, 0xf, - 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x18, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x13, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x11, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x1, 0xdc, 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0xfe, 0x3c, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, 0x2, 0x0, 0x3b, 0xff, 0x8e, - 0x0, 0xbf, 0x2, 0x1d, 0x0, 0xb, 0x0, 0x1b, 0x0, 0x44, 0x40, 0x15, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0x0, 0x19, 0x16, 0x12, 0xf, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x9, 0xe, 0x1, 0x16, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x16, 0x0, 0x1c, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x3, 0x14, 0x7, 0x27, 0x3e, 0x1, - 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbf, 0x26, 0x1a, 0x1b, 0x26, 0x26, - 0x1b, 0x1a, 0x26, 0x3, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, 0x26, 0x1, 0xdc, - 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0xfe, 0x3a, 0x51, 0x52, 0x14, 0xa, 0x36, 0x10, 0xc, - 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x0, 0x1, 0x0, 0x19, 0xff, 0xf6, 0x2, 0x34, 0x2, 0x7f, - 0x0, 0x9, 0x0, 0x4a, 0x40, 0x18, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x1, 0x0, - 0x9, 0x8, 0x7, 0x5, 0x4, 0x2, 0x1, 0x0, 0x6, 0x3, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xa, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x21, - 0x17, 0x7, 0x3, 0x35, 0x13, 0x17, 0x7, 0x21, 0x2, 0x34, 0xfe, 0x58, 0x8c, 0x43, 0xbc, 0xbc, - 0x3d, 0x80, 0x1, 0xa2, 0x1, 0x13, 0xfb, 0x22, 0x1, 0x40, 0x14, 0x1, 0x35, 0x29, 0xef, 0x0, - 0x0, 0x2, 0x0, 0x69, 0x0, 0xec, 0x1, 0xde, 0x1, 0xc3, 0x0, 0x3, 0x0, 0x7, 0x0, 0x53, - 0x40, 0x1d, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, - 0x1, 0x0, 0x7, 0x2, 0x7, 0x6, 0x7, 0x4, 0x3, 0x2, 0x5, 0x4, 0x1, 0x1, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, - 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x1, 0xde, 0xfe, 0x8b, 0x1, - 0x75, 0xfe, 0x8b, 0x1, 0x75, 0x1, 0x83, 0x40, 0xd7, 0x40, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xf6, - 0x2, 0x56, 0x2, 0x7f, 0x0, 0x9, 0x0, 0x4a, 0x40, 0x18, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, - 0x6, 0x5, 0x4, 0x3, 0x9, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x0, 0x8, 0x1, 0x1, 0x1, - 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, - 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x3, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x13, 0x2, 0x56, 0xbc, 0x43, - 0x8c, 0xfe, 0x58, 0x1, 0xa2, 0x80, 0x3d, 0xbc, 0x1, 0x36, 0xfe, 0xc0, 0x22, 0xfb, 0x54, 0xef, - 0x29, 0xfe, 0xcb, 0x0, 0x0, 0x2, 0x0, 0x3e, 0xff, 0xf0, 0x1, 0xdd, 0x3, 0x13, 0x0, 0x18, - 0x0, 0x24, 0x0, 0x51, 0x40, 0x1c, 0x1, 0x25, 0x25, 0x40, 0x26, 0x0, 0x22, 0x13, 0x8, 0x7, - 0x1f, 0x19, 0x14, 0xf, 0x9, 0x8, 0x7, 0x6, 0x0, 0x11, 0x8, 0x16, 0x1c, 0x16, 0x3, 0x1, - 0x14, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x14, 0x0, 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x25, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0xe, 0x2, 0x1d, 0x1, 0x23, 0x35, 0x34, 0x37, - 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x3, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0xdd, 0x29, 0x2b, 0x55, 0x21, 0x50, - 0x5b, 0x22, 0x22, 0x20, 0x86, 0x49, 0x4a, 0x2b, 0x60, 0x61, 0x66, 0x78, 0xb6, 0x25, 0x1a, 0x1a, - 0x24, 0x25, 0x19, 0x1a, 0x25, 0x2, 0x53, 0x3f, 0x2b, 0x24, 0x4a, 0x3b, 0x27, 0x57, 0x5f, 0x64, - 0x4f, 0x1b, 0x1b, 0x20, 0x2f, 0x6c, 0x32, 0x41, 0x3f, 0x64, 0xfd, 0x7f, 0x1a, 0x24, 0x24, 0x1a, - 0x1a, 0x24, 0x24, 0x0, 0x0, 0x2, 0x0, 0x55, 0xff, 0x2c, 0x3, 0xb4, 0x2, 0xe0, 0x0, 0x3f, - 0x0, 0x48, 0x0, 0x7d, 0x40, 0x35, 0x1, 0x49, 0x49, 0x40, 0x4a, 0x28, 0x3d, 0x2f, 0x19, 0x9, - 0x8, 0x2, 0x48, 0x44, 0x40, 0x3e, 0x3d, 0x37, 0x28, 0x20, 0x1a, 0x13, 0xb, 0x8, 0x7, 0x3, - 0x0, 0x7, 0x5, 0xf, 0x7, 0x24, 0x17, 0x7, 0x1c, 0x46, 0x7, 0x33, 0x42, 0x7, 0x3b, 0x24, - 0x1c, 0x33, 0x1, 0x2d, 0x2c, 0x1, 0x5, 0x2, 0x1, 0x20, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3f, 0x3c, 0x3f, 0x2f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, 0x49, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x49, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x15, 0x11, 0x33, 0x36, 0x35, 0x34, 0x27, 0x26, - 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, 0x7, 0x23, 0x26, - 0x27, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, - 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0xb, 0x42, 0x30, 0x1b, 0x46, - 0x52, 0xad, 0x77, 0x2f, 0x5a, 0x5f, 0xa9, 0xa8, 0x61, 0x5b, 0x5b, 0x60, 0xa9, 0x2c, 0x25, 0x7, - 0x3c, 0x1c, 0xca, 0x76, 0x72, 0x72, 0x76, 0xca, 0xca, 0x74, 0x6f, 0x15, 0x17, 0x26, 0xe8, 0x7, - 0x4, 0x18, 0xa, 0x25, 0x37, 0x4f, 0x2f, 0x34, 0x3b, 0x36, 0x4d, 0x48, 0x2a, 0x25, 0x3e, 0x73, - 0x65, 0x3d, 0x34, 0x1, 0xd4, 0x20, 0x42, 0x24, 0xb1, 0xfe, 0xda, 0x5b, 0x68, 0xb4, 0x6d, 0x73, - 0x73, 0x6e, 0xb3, 0xb4, 0x6d, 0x73, 0x5, 0x44, 0x7, 0x85, 0x82, 0xd3, 0xd3, 0x82, 0x85, 0x85, - 0x81, 0xd4, 0x45, 0x47, 0x4e, 0x2c, 0xb, 0x1c, 0x15, 0x6, 0x15, 0x26, 0x2a, 0x51, 0x4d, 0x2e, - 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, - 0x2, 0x96, 0x3, 0x11, 0x0, 0x7, 0x0, 0xc, 0x0, 0x50, 0x40, 0x1d, 0x1, 0xd, 0xd, 0x40, - 0xe, 0x0, 0xa, 0x9, 0xc, 0x8, 0x5, 0x0, 0xc, 0x8, 0x7, 0x3, 0x2, 0x7, 0x6, 0x3, - 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, - 0x3c, 0x3f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xd, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xd, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x21, 0x7, 0x23, - 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x2, 0x96, 0x54, 0x56, 0xfe, 0xde, 0x57, 0x53, 0x1, - 0x13, 0x50, 0x52, 0x77, 0x7, 0xd, 0x6a, 0xf6, 0xf6, 0x3, 0x11, 0xfe, 0x2b, 0x1, 0x6c, 0x2f, - 0xfe, 0xc3, 0x0, 0x3, 0x0, 0x75, 0x0, 0x0, 0x2, 0x71, 0x3, 0xc, 0x0, 0xd, 0x0, 0x15, - 0x0, 0x1d, 0x0, 0x65, 0x40, 0x27, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x0, 0x1a, 0x19, 0x14, 0x13, - 0x1b, 0x1a, 0x16, 0x13, 0x12, 0xe, 0xc, 0xb, 0x9, 0x4, 0x3, 0x0, 0x1c, 0x1b, 0x8, 0x2, - 0x12, 0x11, 0x8, 0x4, 0x5, 0x4, 0x3, 0x3, 0x2, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x21, 0x23, 0x11, 0x21, 0x32, - 0x17, 0x16, 0x15, 0x14, 0x7, 0x15, 0x16, 0x27, 0x34, 0x26, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x17, - 0x34, 0x26, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x2, 0x71, 0xff, 0x0, 0xfc, 0x1, 0x7, 0x6b, 0x3e, - 0x3a, 0x73, 0x85, 0x67, 0x4e, 0x4c, 0xab, 0xa3, 0xa2, 0x10, 0x5c, 0x4b, 0xae, 0xc1, 0x94, 0xd3, - 0xd3, 0x3, 0xc, 0x3b, 0x35, 0x51, 0x83, 0x31, 0x6, 0x31, 0xe3, 0x3a, 0x44, 0xfe, 0xf0, 0xda, - 0x47, 0x51, 0xfe, 0xdc, 0x0, 0x1, 0x0, 0x57, 0xff, 0xf8, 0x2, 0x7b, 0x3, 0x14, 0x0, 0x1b, - 0x0, 0x43, 0x40, 0x15, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x1b, 0x19, 0x11, 0xf, 0x15, 0xe, - 0x8, 0x0, 0xc, 0x3, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x2, 0x7b, 0x2d, 0x35, 0x3f, 0x5a, 0x77, 0x53, 0x5f, 0x61, 0x51, 0x73, 0xa4, 0x56, 0x49, - 0x35, 0x73, 0x6b, 0x38, 0x31, 0x39, 0x3b, 0x64, 0x6e, 0x42, 0x8f, 0x4a, 0x24, 0x29, 0x5f, 0x6e, - 0xc0, 0xc8, 0x6d, 0x5a, 0x93, 0x24, 0x6c, 0x60, 0x56, 0x8e, 0x8e, 0x59, 0x5c, 0x71, 0x0, 0x2, - 0x0, 0x75, 0x0, 0x0, 0x2, 0x98, 0x3, 0xc, 0x0, 0xa, 0x0, 0x15, 0x0, 0x51, 0x40, 0x1d, - 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x11, 0x10, 0xb, 0x6, 0x5, 0x0, 0x12, 0x11, 0x8, 0x4, - 0x10, 0xf, 0x8, 0x6, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x16, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x14, 0x7, 0x6, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x2b, 0x1, - 0x11, 0x33, 0x32, 0x37, 0x36, 0x2, 0x98, 0x5d, 0x4f, 0x8b, 0xec, 0xef, 0x7e, 0x4f, 0x67, 0x5a, - 0x2e, 0x38, 0x87, 0x85, 0x85, 0x85, 0x3a, 0x2e, 0x1, 0x8b, 0xd1, 0x65, 0x55, 0x3, 0xc, 0x4a, - 0x62, 0xd5, 0x96, 0x49, 0x59, 0xfd, 0x85, 0x60, 0x4e, 0x0, 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, - 0x2, 0x3f, 0x3, 0xc, 0x0, 0xb, 0x0, 0x64, 0x40, 0x27, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x0, 0x5, 0x4, 0x8, 0x2, 0x9, - 0x8, 0x8, 0x7, 0x6, 0xb, 0xa, 0x8, 0x0, 0x3, 0x2, 0x3, 0x1, 0x0, 0x1, 0x1, 0x2, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, - 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x3, 0x21, - 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x2, 0x3f, 0xfe, 0x37, 0x1, 0x1, 0xb9, 0xfe, - 0x9e, 0x1, 0x3b, 0xfe, 0xc5, 0x1, 0x73, 0x3, 0xc, 0x48, 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0x0, - 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x36, 0x3, 0xc, 0x0, 0x9, 0x0, 0x5b, 0x40, 0x22, - 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, - 0x5, 0x4, 0x8, 0x3, 0x2, 0x1, 0x0, 0x8, 0x8, 0x9, 0x8, 0x3, 0x7, 0x6, 0x1, 0x1, - 0x7, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, - 0x23, 0x11, 0x21, 0x2, 0x36, 0xfe, 0x99, 0x1, 0x3b, 0xfe, 0xc5, 0x5a, 0x1, 0xc1, 0x2, 0xc4, - 0xfe, 0xf1, 0x48, 0xfe, 0x93, 0x3, 0xc, 0x0, 0x0, 0x1, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xb3, - 0x3, 0x12, 0x0, 0x23, 0x0, 0x62, 0x40, 0x26, 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x1b, 0x11, - 0x2, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x17, 0x10, 0xa, 0x2, 0x1, 0x0, 0x13, 0x8, 0xe, 0x23, - 0x22, 0x8, 0x21, 0x20, 0xe, 0x3, 0x6, 0x1, 0x1, 0x0, 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x35, 0x6, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, - 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x1, 0x23, 0x35, 0x21, 0x2, 0xb3, 0x40, 0x17, - 0x33, 0x41, 0x4f, 0x7e, 0x5a, 0x6a, 0x6d, 0x58, 0x7e, 0xa5, 0x55, 0x48, 0x39, 0x76, 0x75, 0x3f, - 0x37, 0x3c, 0x41, 0x6d, 0x5c, 0x35, 0x30, 0xbb, 0x1, 0x11, 0x61, 0x27, 0x1e, 0x24, 0x5b, 0x6d, - 0xc3, 0xcb, 0x6c, 0x58, 0x94, 0x24, 0x6f, 0x65, 0x59, 0x88, 0x87, 0x5a, 0x61, 0x3d, 0x37, 0x53, - 0x42, 0x48, 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x83, 0x3, 0xc, 0x0, 0xb, 0x0, 0x60, - 0x40, 0x26, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, - 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x8, 0x9, 0x8, 0xb, 0xa, 0x7, 0x3, 0x6, 0x3, 0x5, - 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, - 0x21, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x2, 0x83, 0x56, 0xfe, - 0x9f, 0x57, 0x57, 0x1, 0x61, 0x56, 0x1, 0x6b, 0xfe, 0x95, 0x3, 0xc, 0xfe, 0xab, 0x1, 0x55, - 0x0, 0x1, 0x0, 0x39, 0x0, 0x0, 0x1, 0x7, 0x3, 0xc, 0x0, 0xb, 0x0, 0x63, 0x40, 0x28, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x0, 0x9, 0x8, 0x5, 0x3, 0x4, 0x7, 0x6, 0xb, 0xa, 0x3, 0x3, 0x2, 0x7, 0x0, 0x7, - 0x6, 0x3, 0x1, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, - 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0xc, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, - 0x59, 0x21, 0x23, 0x27, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x1, 0x7, 0xcd, - 0x1, 0x3c, 0x3c, 0xce, 0x3c, 0x3c, 0x38, 0x2, 0x9c, 0x38, 0x38, 0xfd, 0x64, 0x0, 0x0, 0x1, - 0x0, 0x30, 0xff, 0x40, 0x0, 0xf3, 0x3, 0xc, 0x0, 0x9, 0x0, 0x3e, 0x40, 0x12, 0x1, 0xa, - 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x7, 0x5, 0x0, 0x4, 0x9, 0x8, 0x3, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x14, 0x7, 0x6, 0x7, 0x27, - 0x36, 0x35, 0x11, 0x33, 0xf3, 0x2b, 0x2f, 0x58, 0x11, 0x70, 0x53, 0x38, 0x63, 0x41, 0x46, 0xe, - 0x46, 0x11, 0x97, 0x2, 0xde, 0x0, 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x93, 0x3, 0xc, - 0x0, 0xb, 0x0, 0x55, 0x40, 0x20, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, - 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x0, 0xa, 0x9, 0x7, 0x3, 0x6, 0x3, 0x5, 0x4, 0x1, - 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x1, 0x7, 0x11, 0x23, 0x11, - 0x33, 0x11, 0x1, 0x33, 0x3, 0x2, 0x93, 0x60, 0xfe, 0xfd, 0x64, 0x57, 0x57, 0x1, 0x36, 0x62, - 0xff, 0x1, 0x90, 0x7d, 0xfe, 0xed, 0x3, 0xc, 0xfe, 0x7f, 0x1, 0x81, 0xfe, 0xc4, 0x0, 0x1, - 0x0, 0x75, 0x0, 0x0, 0x2, 0x1c, 0x3, 0xc, 0x0, 0x5, 0x0, 0x48, 0x40, 0x18, 0x1, 0x6, - 0x6, 0x40, 0x7, 0x0, 0x5, 0x4, 0x3, 0x2, 0x0, 0x5, 0x4, 0x8, 0x0, 0x3, 0x2, 0x3, - 0x1, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x2, 0x0, 0x6, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x6, - 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x3, 0x33, 0x11, 0x21, 0x2, 0x1c, 0xfe, 0x5a, 0x1, 0x57, - 0x1, 0x50, 0x3, 0xc, 0xfd, 0x3c, 0x0, 0x1, 0x0, 0x75, 0xff, 0xfb, 0x2, 0xf7, 0x3, 0xc, - 0x0, 0xf, 0x0, 0x60, 0x40, 0x26, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xd, 0xc, 0x7, 0x6, - 0x3, 0x2, 0xf, 0xa, 0x9, 0x8, 0x7, 0x2, 0x1, 0x0, 0xf, 0xe, 0xb, 0x3, 0xa, 0x3, - 0x5, 0x4, 0x1, 0x9, 0x8, 0x1, 0x3, 0x0, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x9, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, - 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, 0x23, 0x3, 0x23, 0x3, 0x23, 0x11, 0x23, 0x11, 0x33, - 0x13, 0x33, 0x13, 0x33, 0x2, 0xf7, 0x4c, 0x6, 0xd1, 0x3c, 0xd1, 0x6, 0x4c, 0x7e, 0xc0, 0x6, - 0xc1, 0x7d, 0x2, 0xb3, 0xfd, 0x48, 0x2, 0xbf, 0xfd, 0x46, 0x3, 0xc, 0xfd, 0x6b, 0x2, 0x95, - 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x85, 0x3, 0xc, 0x0, 0xb, 0x0, 0x57, 0x40, 0x21, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x9, 0x8, 0x3, 0x2, 0xb, 0xa, 0x9, 0x6, 0x5, 0x4, - 0x3, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x3, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x1, 0x33, 0x11, - 0x33, 0x2, 0x85, 0x6e, 0xfe, 0xb2, 0x8, 0x4c, 0x7a, 0x1, 0x44, 0x7, 0x4b, 0x2, 0xb1, 0xfd, - 0x4f, 0x3, 0xc, 0xfd, 0x5b, 0x2, 0xa5, 0x0, 0x0, 0x2, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xe7, - 0x3, 0x14, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x42, 0x40, 0x15, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, - 0x14, 0x18, 0x10, 0x8, 0x0, 0x1c, 0x8, 0x4, 0xc, 0x3, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0xe7, 0x69, 0x5a, 0x84, 0x85, - 0x5a, 0x6a, 0x6a, 0x5a, 0x85, 0x84, 0x5a, 0x69, 0x5a, 0x39, 0x40, 0x75, 0x75, 0x40, 0x39, 0x39, - 0x40, 0x75, 0x75, 0x40, 0x39, 0x1, 0x86, 0xc6, 0x6c, 0x5c, 0x5c, 0x6b, 0xc7, 0xc7, 0x6b, 0x5c, - 0x5c, 0x6b, 0xc7, 0x87, 0x58, 0x64, 0x64, 0x58, 0x87, 0x87, 0x58, 0x65, 0x65, 0x58, 0x0, 0x2, - 0x0, 0x76, 0x0, 0x0, 0x2, 0x60, 0x3, 0xc, 0x0, 0xc, 0x0, 0x17, 0x0, 0x56, 0x40, 0x1f, - 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x14, 0x13, 0x5, 0x4, 0x13, 0x12, 0xd, 0x8, 0x7, 0x6, - 0x5, 0x0, 0x12, 0x11, 0x8, 0x8, 0x9, 0x8, 0x3, 0x7, 0x6, 0x1, 0x1, 0x7, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x7, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x2b, 0x1, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x37, 0x36, 0x2, 0x60, 0x3f, 0x41, - 0x77, 0x9d, 0x56, 0x1, 0x2, 0x70, 0x3f, 0x39, 0x55, 0x25, 0x2a, 0x4a, 0xa6, 0xa3, 0x4e, 0x29, - 0x25, 0x2, 0x32, 0x68, 0x3b, 0x3e, 0xfe, 0xaf, 0x3, 0xc, 0x42, 0x3c, 0x5c, 0x3c, 0x29, 0x2d, - 0xfe, 0xd5, 0x2d, 0x29, 0x0, 0x2, 0x0, 0x57, 0xff, 0xc9, 0x3, 0x8, 0x3, 0x13, 0x0, 0x12, - 0x0, 0x25, 0x0, 0x52, 0x40, 0x1d, 0x1, 0x26, 0x26, 0x40, 0x27, 0x0, 0x24, 0x23, 0x17, 0x2, - 0x22, 0x21, 0x1b, 0x13, 0x12, 0x10, 0x8, 0x0, 0x1f, 0x8, 0x4, 0x1, 0xc, 0x3, 0x4, 0x1, - 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x8, 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x26, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x7, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x3, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x3, 0x8, 0x39, 0x70, - 0x54, 0x6b, 0x85, 0x5a, 0x6a, 0x6a, 0x5a, 0x85, 0x84, 0x5a, 0x69, 0x50, 0xa, 0x39, 0x40, 0x75, - 0x75, 0x40, 0x39, 0x39, 0x40, 0x75, 0x4b, 0x3b, 0x6f, 0x39, 0x6a, 0x34, 0x1, 0x38, 0x6f, 0x40, - 0x5c, 0x6b, 0xc7, 0xc6, 0x6c, 0x5b, 0x5b, 0x6c, 0xc6, 0xad, 0x68, 0x1, 0x15, 0x87, 0x58, 0x63, - 0x63, 0x58, 0x87, 0x87, 0x58, 0x65, 0x2e, 0x6e, 0x38, 0x69, 0x5a, 0x0, 0x0, 0x2, 0x0, 0x75, - 0x0, 0x0, 0x2, 0x77, 0x3, 0xc, 0x0, 0xd, 0x0, 0x16, 0x0, 0x5e, 0x40, 0x24, 0x1, 0x17, - 0x17, 0x40, 0x18, 0x0, 0x15, 0x14, 0x3, 0x2, 0x14, 0x13, 0xe, 0xd, 0xb, 0x6, 0x5, 0x4, - 0x3, 0x0, 0x13, 0x12, 0x8, 0x6, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, - 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x17, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x17, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x3, 0x23, 0x11, 0x23, - 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x37, 0x34, 0x27, 0x26, 0x2b, 0x1, 0x11, 0x33, - 0x32, 0x2, 0x77, 0x56, 0xb5, 0xa0, 0x57, 0x1, 0x6, 0x6b, 0x3e, 0x3a, 0xa1, 0x49, 0x25, 0x29, - 0x4b, 0xa1, 0xa4, 0x96, 0x1, 0x5b, 0xfe, 0xa5, 0x3, 0xc, 0x3e, 0x39, 0x5a, 0xa8, 0x2e, 0xd3, - 0x3c, 0x26, 0x2a, 0xfe, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x3e, 0xff, 0xf8, 0x2, 0x2d, 0x3, 0x14, - 0x0, 0x28, 0x0, 0x4a, 0x40, 0x19, 0x1, 0x29, 0x29, 0x40, 0x2a, 0x0, 0x1c, 0xb, 0x7, 0x22, - 0x1b, 0x15, 0xf, 0x6, 0x0, 0x1e, 0x8, 0x19, 0x19, 0x3, 0x4, 0x1, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x29, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x29, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, - 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, - 0x15, 0x14, 0x17, 0x1e, 0x1, 0x17, 0x16, 0x2, 0x2d, 0x52, 0x45, 0x62, 0x84, 0x72, 0x2b, 0x25, - 0x36, 0x3c, 0x36, 0x41, 0x28, 0x34, 0x43, 0x1f, 0x5a, 0xcf, 0x4c, 0x46, 0x69, 0x6b, 0x6b, 0x23, - 0x5b, 0x55, 0x3e, 0x2d, 0x38, 0x3e, 0x17, 0xc5, 0x2b, 0x45, 0xbc, 0x64, 0x34, 0x2c, 0x4d, 0x41, - 0x1c, 0x13, 0x15, 0x18, 0x1f, 0x42, 0x3c, 0x35, 0x18, 0x30, 0x6e, 0x77, 0x57, 0x34, 0x30, 0x42, - 0x44, 0x3a, 0x18, 0x1d, 0x38, 0x33, 0x2f, 0x11, 0x6d, 0x29, 0x43, 0x0, 0x0, 0x1, 0x0, 0x2f, - 0x0, 0x0, 0x2, 0x4e, 0x3, 0xc, 0x0, 0x7, 0x0, 0x52, 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, - 0x9, 0x0, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x5, 0x4, 0x1, 0x3, 0x0, 0x8, - 0x6, 0x7, 0x6, 0x3, 0x3, 0x2, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x11, 0x23, - 0x11, 0x23, 0x35, 0x21, 0x2, 0x4e, 0xe4, 0x56, 0xe5, 0x2, 0x1f, 0x2, 0xc4, 0xfd, 0x3c, 0x2, - 0xc4, 0x48, 0x0, 0x1, 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xc, 0x0, 0x15, 0x0, 0x4b, - 0x40, 0x1a, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0xf, 0x15, 0x14, 0x13, 0xb, 0xa, 0x9, 0x8, - 0x0, 0x15, 0x14, 0xa, 0x3, 0x9, 0x3, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, - 0x33, 0x2, 0x7e, 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, 0x3d, - 0x57, 0x1, 0x14, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xf8, 0xfe, 0x9, 0x72, 0x36, 0x2c, - 0x2a, 0x37, 0x73, 0x1, 0xf7, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, 0x0, 0x2, 0x5d, 0x3, 0xc, - 0x0, 0x8, 0x0, 0x43, 0x40, 0x16, 0x1, 0x9, 0x9, 0x40, 0xa, 0x0, 0x6, 0x5, 0x3, 0x0, - 0x2, 0x1, 0x1, 0x8, 0x4, 0x3, 0x3, 0x0, 0x3, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x3, 0x0, 0x9, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x9, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x33, 0x13, 0x33, 0x37, 0x13, - 0x2, 0x5d, 0xed, 0x67, 0xed, 0x5b, 0xc2, 0x8, 0x14, 0xaf, 0x3, 0xc, 0xfc, 0xf4, 0x3, 0xc, - 0xfd, 0x5b, 0x4d, 0x2, 0x58, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, 0x0, 0x3, 0x99, 0x3, 0xc, - 0x0, 0x12, 0x0, 0x51, 0x40, 0x1f, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x10, 0xf, 0xb, 0xa, - 0x4, 0x3, 0x8, 0x0, 0x7, 0x6, 0x2, 0x3, 0x1, 0x1, 0x12, 0xe, 0xd, 0x9, 0x8, 0x5, - 0x0, 0x3, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, - 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x23, 0x7, 0x3, 0x23, 0x3, 0x33, 0x13, - 0x33, 0x37, 0x13, 0x33, 0x13, 0x33, 0x37, 0x13, 0x3, 0x99, 0xb3, 0x60, 0xa8, 0x6, 0xd, 0x9b, - 0x61, 0xb3, 0x53, 0x96, 0x6, 0xa, 0x9b, 0x55, 0xa6, 0x6, 0xa, 0x8c, 0x3, 0xc, 0xfc, 0xf4, - 0x2, 0x92, 0x3d, 0xfd, 0xab, 0x3, 0xc, 0xfd, 0x66, 0x38, 0x2, 0x62, 0xfd, 0x66, 0x38, 0x2, - 0x62, 0x0, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x2, 0x6f, 0x3, 0xc, 0x0, 0xb, 0x0, 0x4f, - 0x40, 0x1d, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, 0x6, 0x5, 0x4, 0x0, - 0xa, 0x9, 0x7, 0x3, 0x6, 0x3, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x1, 0x4, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xc, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, - 0x23, 0xb, 0x1, 0x23, 0x13, 0x3, 0x33, 0x1b, 0x1, 0x33, 0x3, 0x2, 0x6f, 0x5f, 0xc6, 0xc9, - 0x5f, 0xfc, 0xe8, 0x5e, 0xbb, 0xab, 0x5e, 0xdf, 0x1, 0x52, 0xfe, 0xae, 0x1, 0x9e, 0x1, 0x6e, - 0xfe, 0xd7, 0x1, 0x29, 0xfe, 0x92, 0x0, 0x1, 0x0, 0x1d, 0x0, 0x0, 0x2, 0x79, 0x3, 0xc, - 0x0, 0x9, 0x0, 0x4b, 0x40, 0x1a, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x8, 0x7, 0x5, 0x4, - 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x1, 0x9, 0x6, 0x5, 0x3, 0x0, 0x3, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xa, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x9, - 0x1, 0x11, 0x23, 0x11, 0x1, 0x33, 0x13, 0x33, 0x13, 0x2, 0x79, 0xfe, 0xfd, 0x57, 0xfe, 0xfe, - 0x63, 0xc7, 0x7, 0xc7, 0x3, 0xc, 0xfe, 0x36, 0xfe, 0xbe, 0x1, 0x42, 0x1, 0xca, 0xfe, 0x97, - 0x1, 0x69, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x2, 0x38, 0x3, 0xc, 0x0, 0x9, 0x0, 0x57, - 0x40, 0x20, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x0, 0x4, 0x3, 0x8, 0x5, 0x9, 0x8, 0x8, 0x0, 0x6, 0x5, 0x3, 0x1, 0x0, 0x1, 0x1, - 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x2, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x27, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, - 0x21, 0x2, 0x38, 0xfd, 0xee, 0x1, 0x1, 0x9c, 0xfe, 0x75, 0x1, 0xfb, 0xfe, 0x5b, 0x1, 0xac, - 0x43, 0x2, 0x81, 0x48, 0x3a, 0xfd, 0x76, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x39, 0x1, 0x13, - 0x3, 0x32, 0x0, 0x7, 0x0, 0x54, 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, - 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x7, 0x0, 0x5, 0x4, 0x7, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x4, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, - 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x23, 0x11, 0x33, 0x15, 0x23, - 0x11, 0x33, 0x1, 0x13, 0xd8, 0xd8, 0x83, 0x83, 0xc7, 0x3, 0xf9, 0x46, 0xfc, 0x93, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0x0, 0x1, 0x9d, 0x3, 0x56, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, - 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x1, 0x33, 0x1, 0x9d, 0x4f, 0xfe, 0xed, 0x4f, - 0x3, 0x56, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x39, 0x1, 0x13, 0x3, 0x32, 0x0, 0x7, 0x0, 0x54, - 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x7, 0x0, 0x5, 0x4, 0x7, 0x6, 0x1, 0x0, 0x7, 0x6, 0x4, 0x1, 0x1, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x1, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, - 0xff, 0xc0, 0x38, 0x59, 0x5, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x1, 0x13, 0xd8, 0x83, - 0x83, 0xd8, 0xc7, 0x46, 0x3, 0x6d, 0x46, 0x0, 0x0, 0x1, 0x0, 0x5, 0x2, 0x73, 0x1, 0x19, - 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, 0x2, 0x4, - 0x0, 0x6, 0x5, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x19, 0x47, 0x43, - 0x43, 0x47, 0x6a, 0x40, 0x2, 0x73, 0x56, 0x56, 0x92, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xc0, - 0x1, 0xc9, 0x0, 0x0, 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, - 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x4, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x21, 0x35, 0x21, 0x1, 0xc9, 0xfe, 0x72, 0x1, 0x8e, 0x40, - 0x40, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x6d, 0x0, 0xbb, 0x3, 0x7, 0x0, 0x3, 0x0, 0x3c, - 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x8, 0x0, 0x2, 0x1, 0x0, - 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x23, 0x27, 0x17, - 0xbb, 0x42, 0x3e, 0x4b, 0x2, 0x6d, 0x9a, 0x1, 0x0, 0x2, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, - 0x2, 0x1a, 0x0, 0x1d, 0x0, 0x26, 0x0, 0x61, 0x40, 0x26, 0x1, 0x27, 0x27, 0x40, 0x28, 0x0, - 0x14, 0xf, 0x3, 0x23, 0x1f, 0x1e, 0x1a, 0x19, 0x15, 0x10, 0xf, 0x9, 0x0, 0x12, 0x7, 0x17, - 0x25, 0x7, 0x5, 0x21, 0x7, 0xd, 0x17, 0x2, 0x5, 0x1, 0x1, 0x0, 0x1, 0x1, 0x9, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, - 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x27, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, - 0x1, 0xc1, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x62, - 0x43, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0x59, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0xd, 0x1a, - 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, - 0x14, 0x4, 0x51, 0x78, 0x11, 0x68, 0x57, 0x0, 0x0, 0x2, 0x0, 0x5a, 0xff, 0xf8, 0x1, 0xf9, - 0x3, 0x32, 0x0, 0x10, 0x0, 0x1b, 0x0, 0x54, 0x40, 0x1f, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, - 0xb, 0x16, 0x15, 0x11, 0xb, 0xa, 0x9, 0x8, 0x0, 0x18, 0x7, 0x4, 0x13, 0x7, 0xd, 0xd, - 0x2, 0xa, 0x9, 0x4, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3c, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, - 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, - 0x22, 0x7, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x1, 0xf9, 0x48, 0x37, 0x59, 0x54, 0x32, 0x41, - 0x55, 0x32, 0x53, 0x52, 0x32, 0x41, 0x5b, 0x77, 0x51, 0x27, 0x72, 0x3b, 0x1c, 0x26, 0x1, 0xe, - 0x9b, 0x46, 0x35, 0x2e, 0x3a, 0x7f, 0x2, 0x53, 0xfe, 0xb8, 0x30, 0x35, 0x44, 0x97, 0xc9, 0x3a, - 0xc1, 0x9d, 0x24, 0x2f, 0x0, 0x1, 0x0, 0x32, 0xff, 0xf7, 0x1, 0xa3, 0x2, 0x1a, 0x0, 0x15, - 0x0, 0x49, 0x40, 0x19, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x15, 0xd, 0x11, 0xc, 0x6, 0x0, - 0x13, 0x7, 0x2, 0xf, 0x7, 0xa, 0xa, 0x2, 0x2, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, - 0x37, 0x1, 0xa3, 0x3f, 0x60, 0x5c, 0x37, 0x3f, 0x3c, 0x36, 0x60, 0x56, 0x38, 0x31, 0x28, 0x35, - 0x78, 0x78, 0x44, 0x2a, 0x3f, 0x48, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x40, 0x3e, 0x31, 0x29, 0xcd, - 0xcb, 0x34, 0x0, 0x2, 0x0, 0x32, 0xff, 0xf9, 0x1, 0xd1, 0x3, 0x32, 0x0, 0x10, 0x0, 0x1b, - 0x0, 0x5c, 0x40, 0x23, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x1a, 0xe, 0x2, 0x16, 0x12, 0x11, - 0x10, 0xf, 0xe, 0x8, 0x2, 0x1, 0x0, 0x14, 0x8, 0xc, 0x10, 0xf, 0x4, 0xc, 0x2, 0x4, - 0x1, 0x1, 0x0, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, - 0x3f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, - 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x3, - 0x11, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x1, 0xd1, 0x55, 0x2c, 0x57, 0x53, - 0x34, 0x40, 0x40, 0x36, 0x4c, 0x55, 0x33, 0x55, 0x55, 0x2c, 0x4f, 0x75, 0x24, 0x1f, 0x3d, 0x4c, - 0x27, 0x2e, 0x3b, 0x48, 0x92, 0x84, 0x4a, 0x3e, 0x32, 0x1, 0x4a, 0xfd, 0x49, 0x1, 0x16, 0x40, - 0xc7, 0x71, 0x30, 0x29, 0x0, 0x2, 0x0, 0x32, 0xff, 0xf7, 0x1, 0xcd, 0x2, 0x1b, 0x0, 0x16, - 0x0, 0x1c, 0x0, 0x56, 0x40, 0x20, 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0x0, 0x7, 0x1c, 0x17, 0x16, - 0xe, 0x8, 0x1, 0x0, 0x1, 0x0, 0x7, 0x1c, 0x17, 0x5, 0x8, 0xa, 0x1a, 0x7, 0x12, 0x12, - 0x2, 0xa, 0x1, 0x1, 0xe, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x10, - 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xe, 0x0, 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x16, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0x7, 0x1, 0xcd, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, - 0x30, 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, - 0x35, 0x6f, 0xd, 0xf7, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, 0x89, 0x8b, 0x4a, 0x41, - 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x1, 0x0, 0x2d, 0x0, 0x0, 0x1, 0x2e, - 0x3, 0x31, 0x0, 0x15, 0x0, 0x7a, 0x40, 0x34, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x9, 0x8, - 0x1, 0x0, 0x15, 0x14, 0x13, 0x11, 0x10, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, - 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x3, 0x3, 0x2, 0x7, 0x4, 0x11, 0x7, 0x10, 0x10, 0x4, - 0x15, 0x14, 0xb, 0x3, 0xa, 0x2, 0x5, 0x4, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x3f, 0x17, 0x3c, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x16, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x23, 0x11, 0x33, 0x15, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x15, 0x22, 0x1d, 0x1, 0x33, 0x1, 0x2e, 0x64, 0x4a, 0xd3, 0x34, 0x48, 0x48, 0x3a, 0x30, - 0x4f, 0x64, 0x64, 0x1, 0xcf, 0xfe, 0x71, 0x40, 0x40, 0x1, 0x8f, 0x43, 0x87, 0x50, 0x28, 0x20, - 0x44, 0x52, 0x89, 0x0, 0x0, 0x3, 0x0, 0x32, 0xfe, 0xe3, 0x2, 0x5, 0x2, 0x68, 0x0, 0x2d, - 0x0, 0x35, 0x0, 0x3d, 0x0, 0x65, 0x40, 0x26, 0x1, 0x3e, 0x3e, 0x40, 0x3f, 0x0, 0x3c, 0x38, - 0x34, 0x30, 0x2a, 0x28, 0x24, 0x22, 0x15, 0x3a, 0x36, 0x32, 0x2e, 0x26, 0x1f, 0x1d, 0x1a, 0x19, - 0x10, 0xe, 0xc, 0xa, 0x8, 0x0, 0x19, 0x13, 0x2, 0x4, 0x0, 0x1, 0x8, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x3e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x3e, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x14, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x36, 0x37, 0x36, 0x37, 0x15, 0x22, 0x6, 0x7, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, - 0x6, 0x15, 0x14, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x3, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, - 0x32, 0x13, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x2, 0x5, 0x48, 0x3d, 0x64, 0x65, 0x3d, - 0x48, 0x41, 0x20, 0x24, 0x35, 0x73, 0x5a, 0x37, 0x2c, 0x10, 0x12, 0x21, 0x3d, 0x1e, 0x31, 0x3, - 0x3e, 0x75, 0x5a, 0x34, 0x2b, 0x14, 0x1c, 0x2f, 0x35, 0x64, 0x3d, 0x48, 0x7b, 0x7b, 0x7a, 0x7a, - 0x7b, 0x2e, 0x9c, 0x9d, 0x9d, 0x9c, 0x78, 0x56, 0x2b, 0x24, 0x24, 0x2b, 0x55, 0x51, 0x2b, 0x30, - 0x32, 0x38, 0x2a, 0x37, 0x54, 0x58, 0x6f, 0x16, 0x26, 0x12, 0x23, 0xa, 0x4a, 0x26, 0x14, 0x35, - 0x5d, 0x57, 0x6f, 0x14, 0x1a, 0x1f, 0x2b, 0x1c, 0xc, 0x24, 0x2b, 0x1, 0x75, 0x87, 0x87, 0x86, - 0xfe, 0xbc, 0x63, 0x64, 0x63, 0x0, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x1, 0xf8, 0x3, 0x32, - 0x0, 0x13, 0x0, 0x59, 0x40, 0x22, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0xd, 0x13, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x2, 0x1, 0x0, 0x6, 0x8, 0xf, 0xf, 0x2, 0xc, 0xb, 0x4, 0xa, - 0x9, 0x1, 0x3, 0x0, 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, - 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x1, 0xf8, 0x55, 0x13, 0x17, 0x39, 0x4c, 0x40, 0x55, 0x55, 0x42, 0x53, 0x50, 0x29, 0x36, - 0x1, 0x54, 0x3e, 0x1d, 0x22, 0x47, 0xfe, 0x76, 0x3, 0x32, 0xfe, 0xab, 0x3d, 0x25, 0x31, 0x75, - 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x0, 0xf8, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x13, 0x0, 0x5d, - 0x40, 0x24, 0x1, 0x14, 0x14, 0x40, 0x15, 0xc, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, - 0x6, 0x0, 0x3, 0x8, 0x9, 0x13, 0x12, 0xf, 0x3, 0xe, 0x7, 0xc, 0x9, 0x11, 0x10, 0x2, - 0xd, 0xc, 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, - 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0xc3, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x35, 0xd0, 0x3b, 0x55, 0x40, 0x2, - 0xa2, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0xfd, 0x47, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, - 0x0, 0x2, 0x0, 0x0, 0xfe, 0xf1, 0x0, 0xb4, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x15, 0x0, 0x47, - 0x40, 0x17, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x3, 0x15, 0x14, 0x13, 0xf, 0xc, 0x6, 0x0, - 0x9, 0x15, 0x14, 0x2, 0xe, 0x0, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xf, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x3, 0x14, 0x7, 0x27, 0x36, 0x37, 0x36, 0x35, 0x11, 0x33, 0xb4, 0x20, 0x16, - 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xd, 0x81, 0x26, 0x33, 0x10, 0x10, 0x54, 0x2, 0xa2, 0x16, - 0x1f, 0x1f, 0x16, 0x16, 0x20, 0x1f, 0xfd, 0x2f, 0xc9, 0x2e, 0x3f, 0x18, 0x2a, 0x27, 0x5f, 0x2, - 0x19, 0x0, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x2, 0x1, 0x3, 0x32, 0x0, 0xb, 0x0, 0x56, - 0x40, 0x20, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, 0x8, 0x7, 0x6, 0x5, - 0x4, 0x3, 0x0, 0xa, 0x9, 0x2, 0x7, 0x6, 0x4, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, - 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x3, 0x7, 0x15, 0x23, 0x11, 0x33, 0x11, 0x37, - 0x33, 0x7, 0x2, 0x1, 0x5c, 0xa8, 0x49, 0x55, 0x55, 0xce, 0x68, 0xb5, 0x1, 0x23, 0x48, 0xdb, - 0x3, 0x32, 0xfe, 0x10, 0xcf, 0xb5, 0x0, 0x1, 0x0, 0x5a, 0xff, 0xf5, 0x0, 0xe6, 0x3, 0x32, - 0x0, 0x9, 0x0, 0x46, 0x40, 0x17, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x5, 0x4, 0x3, - 0x2, 0x0, 0x9, 0x8, 0x0, 0x4, 0x3, 0x4, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x17, 0x22, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x17, 0x16, 0x17, 0xe6, 0x8c, 0x55, 0x8, 0xb, 0x24, 0xb, 0x94, 0x2, 0xa9, 0xfd, 0x6c, - 0x34, 0x11, 0x15, 0x3, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x16, 0x2, 0x1a, 0x0, 0x1c, - 0x0, 0x69, 0x40, 0x2b, 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0x0, 0x16, 0x12, 0x1c, 0x12, 0x11, 0x10, - 0xf, 0xe, 0xd, 0x9, 0x8, 0x7, 0x6, 0x2, 0x1, 0x0, 0xb, 0x4, 0x8, 0x14, 0x18, 0x14, - 0x2, 0x11, 0x10, 0x2, 0xf, 0xe, 0x8, 0x7, 0x1, 0x5, 0x0, 0x1, 0x1, 0xf, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, 0x34, 0x23, - 0x22, 0x7, 0x11, 0x23, 0x11, 0x34, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, - 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x3, 0x16, 0x55, 0x63, 0x4d, 0x2c, 0x55, 0x62, - 0x47, 0x33, 0x55, 0x55, 0x36, 0x55, 0x5e, 0x30, 0x3d, 0x60, 0x49, 0x2e, 0x35, 0x1, 0x4d, 0x84, - 0x4f, 0xfe, 0x7e, 0x1, 0x4d, 0x84, 0x47, 0xfe, 0x76, 0x2, 0x12, 0x35, 0x3d, 0x49, 0x49, 0x2b, - 0x32, 0x60, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x1, 0xf8, 0x2, 0x1a, 0x0, 0x13, 0x0, 0x59, - 0x40, 0x22, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0xd, 0x13, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, - 0x2, 0x1, 0x0, 0x6, 0x8, 0xf, 0xf, 0x2, 0xc, 0xb, 0x2, 0xa, 0x9, 0x1, 0x3, 0x0, - 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x10, - 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, - 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x1, 0xf8, 0x55, - 0x12, 0x16, 0x39, 0x4c, 0x42, 0x55, 0x55, 0x42, 0x53, 0x51, 0x28, 0x36, 0x1, 0x54, 0x3f, 0x1c, - 0x22, 0x47, 0xfe, 0x76, 0x2, 0x11, 0x34, 0x3d, 0x23, 0x2e, 0x75, 0x0, 0x0, 0x2, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x2, 0x1a, 0x0, 0xf, 0x0, 0x17, 0x0, 0x45, 0x40, 0x17, 0x1, 0x18, - 0x18, 0x40, 0x19, 0x0, 0x14, 0x10, 0x8, 0x0, 0x16, 0x7, 0x4, 0x12, 0x7, 0xc, 0xc, 0x2, - 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x18, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0xe1, 0x41, 0x38, 0x5e, 0x62, 0x37, - 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x1, 0x8, 0x8d, 0x46, - 0x3d, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x0, 0x2, - 0x0, 0x5f, 0xfe, 0xe4, 0x1, 0xfe, 0x2, 0x1a, 0x0, 0x10, 0x0, 0x1b, 0x0, 0x5c, 0x40, 0x23, - 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x13, 0xb, 0x6, 0x16, 0x15, 0x11, 0xb, 0xa, 0x9, 0x8, - 0x7, 0x6, 0x0, 0x18, 0x7, 0x4, 0xd, 0x2, 0xa, 0x9, 0x2, 0x8, 0x7, 0x0, 0x4, 0x1, - 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, 0x3c, 0x3f, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x7, - 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x1, 0xfe, 0x3f, 0x34, 0x53, 0x4f, 0x35, 0x55, 0x55, 0x35, - 0x51, 0x4b, 0x35, 0x44, 0x5b, 0x72, 0x54, 0x29, 0x24, 0x4e, 0x3d, 0x1d, 0x23, 0x1, 0xf, 0x92, - 0x48, 0x3b, 0x29, 0xfe, 0xc1, 0x3, 0x2e, 0x2e, 0x36, 0x38, 0x48, 0x8f, 0xc7, 0x41, 0xfe, 0xe3, - 0x34, 0x29, 0x30, 0x0, 0x0, 0x2, 0x0, 0x32, 0xfe, 0xe3, 0x1, 0xd1, 0x2, 0x1a, 0x0, 0x10, - 0x0, 0x19, 0x0, 0x5c, 0x40, 0x23, 0x1, 0x1a, 0x1a, 0x40, 0x1b, 0x0, 0x14, 0xe, 0x2, 0x16, - 0x12, 0x11, 0x10, 0xf, 0xe, 0x8, 0x2, 0x1, 0x0, 0x18, 0x7, 0x4, 0x10, 0xf, 0x2, 0xc, - 0x2, 0x4, 0x1, 0x1, 0x0, 0x0, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3f, 0x3f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1a, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1a, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, - 0x33, 0x3, 0x11, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0xd1, 0x55, 0x2d, 0x5a, 0x52, - 0x33, 0x3e, 0x40, 0x36, 0x4c, 0x60, 0x28, 0x55, 0x55, 0x2b, 0x4e, 0x76, 0x7b, 0x4d, 0xfe, 0xe3, - 0x1, 0x45, 0x2e, 0x3f, 0x4b, 0x93, 0x83, 0x46, 0x3a, 0x37, 0x2e, 0xfe, 0x6c, 0x1, 0x14, 0x41, - 0xbf, 0xd3, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x0, 0x1, 0x92, 0x2, 0x1a, 0x0, 0x11, 0x0, 0x61, - 0x40, 0x26, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, 0xe, 0x3, 0x1, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x6, 0x5, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x8, 0x10, 0x2, 0xd, - 0xc, 0x2, 0x9, 0x8, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, - 0x3c, 0x3f, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x12, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x33, 0x15, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, - 0x36, 0x33, 0x32, 0x1, 0x92, 0x24, 0x23, 0x21, 0x3d, 0x2a, 0x4b, 0xd3, 0x33, 0x55, 0x2f, 0x40, - 0x34, 0x1, 0xfe, 0x3e, 0x11, 0x3e, 0xfe, 0xad, 0x40, 0x40, 0x1, 0xd2, 0x2b, 0x33, 0x0, 0x1, - 0x0, 0x28, 0xff, 0xf8, 0x1, 0x8b, 0x2, 0x1b, 0x0, 0x29, 0x0, 0x4a, 0x40, 0x19, 0x1, 0x2a, - 0x2a, 0x40, 0x2b, 0x0, 0x1c, 0xb, 0x9, 0x22, 0x1b, 0x15, 0xd, 0x8, 0x0, 0x1e, 0x7, 0x19, - 0x19, 0x2, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x8, 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, - 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, - 0x1, 0x8b, 0x39, 0x32, 0x4c, 0x38, 0x2e, 0x14, 0x32, 0x28, 0x41, 0x40, 0x62, 0x21, 0x13, 0x3d, - 0x43, 0x1a, 0x33, 0x37, 0x30, 0x48, 0x53, 0x4c, 0x21, 0x46, 0x30, 0x26, 0x19, 0x1e, 0x21, 0xf, - 0x3f, 0x47, 0x18, 0x31, 0x88, 0x48, 0x26, 0x22, 0x13, 0x8, 0x1e, 0x3f, 0x2f, 0x42, 0x26, 0x1b, - 0x10, 0x1f, 0x22, 0x16, 0x2b, 0x38, 0x45, 0x26, 0x22, 0x2c, 0x3e, 0x23, 0xf, 0x12, 0x21, 0x1e, - 0x1a, 0xb, 0x23, 0x27, 0x16, 0x2c, 0x0, 0x1, 0x0, 0x26, 0xff, 0xf8, 0x1, 0x27, 0x2, 0x8c, - 0x0, 0x12, 0x0, 0x66, 0x40, 0x28, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0xe, 0xd, 0x6, 0x5, - 0x12, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x0, 0x12, 0x8, - 0x0, 0xa, 0x9, 0xc, 0xb, 0x8, 0x3, 0x7, 0x2, 0x0, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x22, 0x27, 0x26, 0x35, 0x11, - 0x23, 0x35, 0x17, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x1, 0x27, 0x4f, - 0x31, 0x39, 0x48, 0x48, 0x55, 0x64, 0x64, 0x33, 0x31, 0x8, 0x27, 0x2c, 0x52, 0x1, 0x33, 0x42, - 0x1, 0x7b, 0x7a, 0x42, 0xfe, 0xcc, 0x28, 0x34, 0x0, 0x1, 0x0, 0x5f, 0xff, 0xf8, 0x1, 0xec, - 0x2, 0x12, 0x0, 0x13, 0x0, 0x59, 0x40, 0x22, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0x2, 0x13, - 0x12, 0x11, 0xb, 0xa, 0x9, 0x8, 0x2, 0x1, 0x0, 0xf, 0x8, 0x4, 0x13, 0x12, 0xa, 0x3, - 0x9, 0x2, 0x4, 0x1, 0x1, 0x0, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x14, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x21, - 0x23, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x11, 0x33, 0x1, 0xec, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, 0x3a, 0x4d, - 0x35, 0x55, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, - 0x90, 0x0, 0x0, 0x1, 0x0, 0x14, 0x0, 0x0, 0x1, 0xdc, 0x2, 0x12, 0x0, 0x9, 0x0, 0x43, - 0x40, 0x16, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x7, 0x6, 0x3, 0x0, 0x2, 0x1, 0x1, 0x9, - 0x4, 0x3, 0x3, 0x0, 0x2, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, - 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x33, 0x13, 0x17, 0x33, 0x37, 0x13, 0x1, 0xdc, 0xb8, - 0x58, 0xb8, 0x5b, 0x77, 0x10, 0x4, 0x12, 0x77, 0x2, 0x12, 0xfd, 0xee, 0x2, 0x12, 0xfe, 0x95, - 0x41, 0x41, 0x1, 0x6b, 0x0, 0x1, 0x0, 0x20, 0x0, 0x0, 0x2, 0xe9, 0x2, 0x12, 0x0, 0x12, - 0x0, 0x51, 0x40, 0x1f, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x10, 0xf, 0xb, 0xa, 0x4, 0x3, - 0x8, 0x0, 0x7, 0x6, 0x2, 0x3, 0x1, 0x1, 0x12, 0xe, 0xd, 0x9, 0x8, 0x5, 0x0, 0x2, - 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, - 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x23, 0x7, 0x3, 0x23, 0x3, 0x33, 0x13, 0x33, 0x37, - 0x13, 0x33, 0x13, 0x33, 0x37, 0x13, 0x2, 0xe9, 0x9e, 0x52, 0x71, 0x4, 0x12, 0x5f, 0x51, 0xa2, - 0x57, 0x72, 0x3, 0xf, 0x63, 0x50, 0x72, 0x3, 0xf, 0x63, 0x2, 0x12, 0xfd, 0xee, 0x1, 0x8c, - 0x46, 0xfe, 0xba, 0x2, 0x12, 0xfe, 0x54, 0x42, 0x1, 0x6a, 0xfe, 0x54, 0x42, 0x1, 0x6a, 0x0, - 0x0, 0x1, 0x0, 0xf, 0x0, 0x0, 0x1, 0xd6, 0x2, 0x12, 0x0, 0xb, 0x0, 0x4f, 0x40, 0x1d, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, 0x6, 0x5, 0x4, 0x0, 0xa, 0x9, - 0x7, 0x3, 0x6, 0x2, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, - 0x7, 0x23, 0x13, 0x27, 0x33, 0x17, 0x37, 0x33, 0x7, 0x1, 0xd6, 0x64, 0x83, 0x80, 0x60, 0xb0, - 0x9a, 0x63, 0x6f, 0x6a, 0x5f, 0x99, 0xd6, 0xd6, 0x1, 0x1c, 0xf6, 0xb6, 0xb6, 0xfd, 0x0, 0x1, - 0x0, 0x14, 0xfe, 0xdf, 0x1, 0xcd, 0x2, 0x11, 0x0, 0xe, 0x0, 0x4a, 0x40, 0x1a, 0x1, 0xf, - 0xf, 0x40, 0x10, 0x0, 0xd, 0xc, 0xa, 0x9, 0x4, 0x0, 0x4, 0x7, 0x3, 0x3, 0x0, 0xe, - 0xb, 0xa, 0x3, 0x0, 0x2, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0xa, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x3f, 0x1, - 0x3, 0x33, 0x13, 0x33, 0x13, 0x1, 0xcd, 0xcf, 0x3f, 0x9d, 0x8, 0x3d, 0x24, 0x23, 0x19, 0xf, - 0xb2, 0x5b, 0x7d, 0x4, 0x87, 0x2, 0x11, 0xfd, 0x98, 0xbd, 0xd, 0x42, 0x6, 0x28, 0x25, 0x52, - 0x31, 0x2, 0x1a, 0xfe, 0x59, 0x1, 0xa7, 0x0, 0x0, 0x1, 0x0, 0x32, 0x0, 0x0, 0x1, 0x9c, - 0x2, 0x12, 0x0, 0x9, 0x0, 0x59, 0x40, 0x21, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, - 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x9, 0x8, 0x7, 0x0, 0x4, 0x3, 0x7, 0x5, - 0x6, 0x5, 0x2, 0x1, 0x0, 0x1, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0xa, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x29, - 0x1, 0x35, 0x1, 0x23, 0x35, 0x21, 0x15, 0x1, 0x21, 0x1, 0x9c, 0xfe, 0x96, 0x1, 0x3, 0xef, - 0x1, 0x56, 0xfe, 0xf7, 0x1, 0x9, 0x3c, 0x1, 0x94, 0x42, 0x33, 0xfe, 0x64, 0x0, 0x0, 0x1, - 0x0, 0x3b, 0xff, 0x39, 0x1, 0x1e, 0x3, 0x32, 0x0, 0x1b, 0x0, 0x69, 0x40, 0x29, 0x1, 0x1c, - 0x1c, 0x40, 0x1d, 0x0, 0x1b, 0x18, 0x17, 0x15, 0x14, 0x12, 0x11, 0xe, 0xd, 0xa, 0x9, 0x7, - 0x6, 0x4, 0x3, 0x0, 0x1b, 0x1a, 0x7, 0x0, 0x6, 0x7, 0x7, 0xf, 0xe, 0x7, 0xc, 0x1, - 0x0, 0xd, 0xc, 0x4, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x6, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x23, 0x22, 0x35, 0x11, 0x34, 0x23, 0x35, 0x32, 0x35, 0x11, - 0x34, 0x3b, 0x1, 0x15, 0x23, 0x22, 0x15, 0x11, 0x14, 0x7, 0x15, 0x16, 0x15, 0x11, 0x14, 0x3b, - 0x1, 0x1, 0x1e, 0x48, 0x5d, 0x3e, 0x3e, 0x5d, 0x48, 0x26, 0x2d, 0x4a, 0x4a, 0x2d, 0x26, 0xc7, - 0x6e, 0x1, 0x35, 0x4e, 0x34, 0x4e, 0x1, 0x18, 0x6e, 0x39, 0x38, 0xfe, 0xd3, 0x43, 0xc, 0x2, - 0xc, 0x43, 0xfe, 0xb6, 0x38, 0x0, 0x0, 0x1, 0x0, 0x69, 0xff, 0x38, 0x0, 0xad, 0x3, 0x56, - 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, - 0x59, 0x17, 0x23, 0x11, 0x33, 0xad, 0x44, 0x44, 0xc8, 0x4, 0x1e, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0xff, 0x39, 0x1, 0x1e, 0x3, 0x32, 0x0, 0x1b, 0x0, 0x5e, 0x40, 0x22, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0x0, 0x14, 0x13, 0x8, 0x7, 0x1b, 0x19, 0x18, 0x15, 0x14, 0x11, 0x10, 0xe, 0xd, 0xb, - 0xa, 0x7, 0x6, 0x3, 0x2, 0x0, 0x6, 0x5, 0x16, 0x15, 0x4, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x22, 0x15, 0x11, 0x14, 0x2b, 0x1, 0x35, - 0x33, 0x32, 0x35, 0x11, 0x34, 0x37, 0x35, 0x26, 0x35, 0x11, 0x34, 0x2b, 0x1, 0x35, 0x33, 0x32, - 0x15, 0x11, 0x14, 0x33, 0x1, 0x1e, 0x3e, 0x5d, 0x48, 0x26, 0x2d, 0x4a, 0x4a, 0x2d, 0x26, 0x48, - 0x5d, 0x3e, 0x1, 0x2a, 0x4e, 0xfe, 0xcb, 0x6e, 0x39, 0x38, 0x1, 0x4a, 0x43, 0xc, 0x2, 0xc, - 0x43, 0x1, 0x2d, 0x38, 0x39, 0x6e, 0xfe, 0xe8, 0x4e, 0x0, 0x0, 0x1, 0x0, 0xb, 0x2, 0x7c, - 0x1, 0x3c, 0x2, 0xdf, 0x0, 0x11, 0x0, 0x40, 0x40, 0x13, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, - 0x11, 0xd, 0x7, 0x8, 0x0, 0x5, 0x7, 0xa, 0xa, 0x2, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, - 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x1, 0x3c, 0x31, 0x2f, 0x16, 0x46, - 0x15, 0x22, 0x1c, 0x22, 0x30, 0x35, 0x17, 0x47, 0xd, 0x13, 0x6, 0xf, 0x1a, 0x2, 0xa2, 0x26, - 0x1f, 0x19, 0x34, 0x29, 0x21, 0x2, 0x4, 0x14, 0x0, 0x1, 0x0, 0x3d, 0x0, 0x0, 0x1, 0xed, - 0x3, 0x32, 0x0, 0xb, 0x0, 0x60, 0x40, 0x26, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x5, 0x4, 0x1, 0x3, 0x0, 0x7, - 0xb, 0xa, 0x7, 0x3, 0x6, 0x9, 0x8, 0x4, 0x3, 0x2, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x1, 0xed, 0xb0, 0x50, 0xb0, 0xb0, 0x50, 0xb0, 0x1, 0xce, 0xfe, 0x32, 0x1, 0xce, - 0x42, 0x1, 0x22, 0xfe, 0xde, 0x0, 0x0, 0x1, 0x0, 0x32, 0xff, 0x93, 0x1, 0xa3, 0x2, 0x7b, - 0x0, 0x1b, 0x0, 0x55, 0x40, 0x1d, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x1b, 0x19, 0x15, 0x13, - 0x17, 0x12, 0x10, 0xf, 0xe, 0xd, 0x9, 0x5, 0x4, 0x3, 0x2, 0x0, 0xf, 0xe, 0x4, 0x3, - 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, - 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0xa3, 0x33, 0x47, 0x3d, 0x53, 0x30, 0x37, 0x35, 0x2f, 0x56, - 0x3d, 0x3e, 0x2b, 0x31, 0x26, 0x37, 0x78, 0x78, 0x46, 0x28, 0x3f, 0x3a, 0xb, 0x67, 0x65, 0x9, - 0x3e, 0x47, 0x81, 0x82, 0x47, 0x41, 0x8, 0x62, 0x64, 0xb, 0x30, 0x31, 0x27, 0xcb, 0xc8, 0x31, - 0x0, 0x1, 0x0, 0x3d, 0xff, 0xf6, 0x2, 0x4a, 0x2, 0xdc, 0x0, 0x2b, 0x0, 0x75, 0x40, 0x31, - 0x1, 0x2c, 0x2c, 0x40, 0x2d, 0x0, 0x2b, 0x28, 0x19, 0x6, 0x26, 0x24, 0x23, 0x22, 0x21, 0x20, - 0x1f, 0x18, 0xe, 0xd, 0xc, 0xb, 0x9, 0x8, 0x0, 0x9, 0x7, 0x8, 0x21, 0x20, 0xf, 0x3, - 0xe, 0x7, 0x23, 0x22, 0xd, 0x3, 0xc, 0x1d, 0x7, 0x14, 0x14, 0x8, 0x2, 0x1, 0x1, 0x8, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, - 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, - 0x0, 0x2c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2c, 0xff, - 0xc0, 0x38, 0x59, 0x25, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x6, 0x7, 0x35, 0x36, 0x3d, 0x1, - 0x23, 0x35, 0x33, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x7, 0x26, 0x27, 0x26, - 0x23, 0x22, 0x1d, 0x1, 0x33, 0x15, 0x23, 0x15, 0x14, 0x7, 0x16, 0x33, 0x32, 0x36, 0x37, 0x2, - 0x4a, 0x1e, 0xa2, 0x35, 0x2a, 0x18, 0x3e, 0x2f, 0x69, 0x65, 0x5e, 0x5e, 0x1, 0x1, 0x28, 0x2f, - 0x5d, 0x39, 0x2a, 0x22, 0x27, 0x2f, 0x24, 0xe, 0x1c, 0x2b, 0x6a, 0x63, 0x63, 0x2, 0x52, 0x3b, - 0x42, 0x3e, 0xd, 0xa5, 0xaf, 0x11, 0x9, 0x23, 0x39, 0x2, 0x40, 0x1, 0x54, 0xbd, 0x3d, 0x7b, - 0x5a, 0x3a, 0x46, 0x1a, 0x16, 0x32, 0x2e, 0x2d, 0xb, 0x16, 0x95, 0x7e, 0x3d, 0xb6, 0x10, 0xa, - 0x3c, 0x34, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x3d, 0xff, 0x7c, 0x1, 0x9d, 0x2, 0xff, 0x0, 0x33, - 0x0, 0x43, 0x0, 0x5b, 0x40, 0x21, 0x1, 0x44, 0x44, 0x40, 0x45, 0x0, 0x40, 0x38, 0x20, 0x9, - 0x3c, 0x34, 0x32, 0x2e, 0x26, 0x1f, 0x19, 0x17, 0x15, 0xd, 0x8, 0x0, 0xb, 0x7, 0x4, 0x22, - 0x7, 0x1d, 0x1d, 0x4, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x44, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x44, 0xff, 0xc0, 0x38, 0x59, 0x25, - 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, - 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, - 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x7, - 0x6, 0x7, 0x16, 0x27, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x1, 0x9d, 0x38, 0x32, 0x4c, 0x32, 0x27, 0x1f, 0x30, 0x26, 0x3f, 0x40, 0x65, - 0x26, 0x9, 0x3e, 0x53, 0x21, 0x2b, 0x7b, 0x6a, 0x35, 0x2f, 0x47, 0x52, 0x4a, 0x1f, 0x46, 0x2e, - 0x27, 0x1a, 0x1f, 0x2b, 0x23, 0x23, 0x3e, 0x1d, 0x2f, 0x18, 0x1c, 0x34, 0x68, 0x4c, 0x1e, 0x1a, - 0x28, 0x29, 0x1c, 0x20, 0x20, 0x1c, 0x29, 0x28, 0x1a, 0x1e, 0xa, 0x46, 0x27, 0x21, 0xe, 0xc, - 0x1e, 0x3a, 0x2d, 0x45, 0x28, 0x1e, 0x8, 0x24, 0x30, 0x27, 0x31, 0x47, 0x7a, 0x2b, 0x3a, 0x4d, - 0x44, 0x26, 0x22, 0x2b, 0x3a, 0x23, 0x10, 0x13, 0x23, 0x20, 0x1e, 0x15, 0x15, 0x28, 0x21, 0x37, - 0x46, 0x34, 0x2c, 0x33, 0x1c, 0x36, 0xdf, 0x3b, 0x20, 0x1c, 0x1c, 0x20, 0x3b, 0x3b, 0x20, 0x1c, - 0x1c, 0x20, 0x0, 0x1, 0x0, 0x3b, 0x0, 0xda, 0x1, 0x47, 0x1, 0xe6, 0x0, 0xb, 0x0, 0x35, - 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x1, 0x47, 0x4e, 0x38, 0x37, 0x4f, 0x4f, 0x37, 0x38, 0x4e, 0x1, 0x60, 0x37, 0x4f, 0x4f, - 0x37, 0x38, 0x4e, 0x4e, 0x0, 0x2, 0x0, 0x55, 0xff, 0xa9, 0x1, 0xfd, 0x3, 0x31, 0x0, 0x8, - 0x0, 0xe, 0x0, 0x55, 0x40, 0x1f, 0x1, 0xf, 0xf, 0x40, 0x10, 0x9, 0x1, 0x0, 0xe, 0xd, - 0xb, 0xa, 0x9, 0x8, 0x4, 0x0, 0x9, 0xa, 0x7, 0x7, 0xc, 0xb, 0xe, 0xd, 0x8, 0x3, - 0x7, 0x4, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x3b, 0x1, 0x17, 0x7, 0x11, 0x23, 0x3, 0x33, 0x1, 0xb, 0x9, 0x48, 0x65, 0x65, 0x48, 0x9, - 0xf2, 0x58, 0x54, 0x1, 0xad, 0x1, 0xd7, 0x65, 0x48, 0x48, 0x65, 0x43, 0x1, 0xfc, 0xbc, 0x3, - 0x88, 0x0, 0x0, 0x1, 0x0, 0x5f, 0xff, 0x39, 0x2, 0x0, 0x3, 0x2c, 0x0, 0x2a, 0x0, 0x55, - 0x40, 0x1e, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x0, 0x8, 0x6, 0x28, 0x25, 0x1e, 0x1d, 0x1c, 0x1b, - 0x14, 0x11, 0xb, 0x5, 0x0, 0x17, 0x7, 0x21, 0x21, 0x1d, 0x1c, 0x3, 0x1, 0x1, 0x1d, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1d, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x6, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x6, 0x15, 0x14, 0x16, - 0x2, 0x0, 0x5d, 0x47, 0x3f, 0x33, 0x27, 0x1d, 0x27, 0x23, 0x30, 0x21, 0x1f, 0x1f, 0x21, 0x4c, - 0x2e, 0x2b, 0x32, 0x1c, 0x19, 0x55, 0x64, 0x53, 0x62, 0x33, 0x28, 0x4f, 0x7c, 0xae, 0x51, 0x65, - 0x1d, 0x3f, 0x13, 0x38, 0x2b, 0x26, 0x2b, 0x27, 0x26, 0x31, 0x31, 0x38, 0x7b, 0x30, 0x28, 0x39, - 0x25, 0x20, 0x2b, 0xfc, 0xc1, 0x3, 0x3d, 0x57, 0x5f, 0x39, 0x2d, 0x37, 0x42, 0x84, 0x1c, 0x2d, - 0x98, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x6d, 0x0, 0xbb, 0x3, 0x7, 0x0, 0x3, 0x0, 0x37, - 0x40, 0xe, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x0, 0x2, 0x1, 0x1, 0x2, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x7, 0x23, 0x37, 0xbb, 0x3e, 0x42, 0x35, 0x3, - 0x7, 0x9a, 0x99, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x2, 0x6b, 0x1, 0x63, 0x2, 0xd7, 0x0, 0xb, - 0x0, 0x17, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x12, 0xc, 0x6, 0x0, - 0x15, 0x9, 0xf, 0x3, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x18, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x63, 0x20, 0x16, 0x16, 0x1f, 0x1f, - 0x16, 0x17, 0x1f, 0xbc, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x2, 0xa1, 0x16, 0x20, - 0x20, 0x16, 0x16, 0x20, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x0, 0x0, 0x2, - 0x0, 0x20, 0x0, 0x0, 0x3, 0x75, 0x3, 0xc, 0x0, 0xf, 0x0, 0x12, 0x0, 0x7d, 0x40, 0x35, - 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x11, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x5, 0x2, 0x1, 0x0, 0x9, 0x8, 0x8, 0x6, 0xd, 0xc, 0x8, 0xb, 0xa, - 0xf, 0xe, 0x8, 0x0, 0x12, 0x10, 0x7, 0x3, 0x2, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x3, - 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x2f, - 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x35, 0x23, 0x7, - 0x23, 0x1, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x25, 0x11, 0x3, 0x3, 0x75, - 0xfe, 0x6e, 0xdd, 0x8e, 0x58, 0x1, 0xb8, 0x1, 0x8c, 0xfe, 0xd5, 0x1, 0x5, 0xfe, 0xfb, 0x1, - 0x3c, 0xfe, 0x6e, 0xb9, 0xf6, 0xf6, 0x3, 0xc, 0x48, 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0xf4, 0x1, - 0x49, 0xfe, 0xb7, 0x0, 0x0, 0x3, 0x0, 0x57, 0xff, 0xc5, 0x2, 0xe7, 0x3, 0x48, 0x0, 0x15, - 0x0, 0x1e, 0x0, 0x27, 0x0, 0x5e, 0x40, 0x23, 0x1, 0x28, 0x28, 0x40, 0x29, 0x0, 0x27, 0x21, - 0x18, 0x11, 0x6, 0x25, 0x1f, 0x19, 0x16, 0x14, 0x13, 0xb, 0x9, 0x8, 0x0, 0x1b, 0x8, 0x4, - 0x13, 0x12, 0x8, 0x7, 0xf, 0x3, 0x4, 0x1, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0xb, 0x0, 0x28, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x28, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x7, 0x34, 0x27, 0x1, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x3, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x2, 0xe7, 0x69, 0x5a, - 0x84, 0x4a, 0x41, 0x27, 0x4f, 0x39, 0x81, 0x6a, 0x5a, 0x85, 0x43, 0x3d, 0x25, 0x4f, 0x36, 0x89, - 0x5a, 0x53, 0xfe, 0xfb, 0x2f, 0x3b, 0x75, 0x40, 0x39, 0x8e, 0x2b, 0x35, 0x75, 0x40, 0x39, 0x4c, - 0x1, 0x86, 0xc6, 0x6c, 0x5c, 0x20, 0x53, 0x7a, 0x6a, 0xdd, 0xc7, 0x6b, 0x5c, 0x1b, 0x4f, 0x73, - 0x6a, 0xe5, 0xa8, 0x59, 0xfd, 0xd6, 0x1b, 0x64, 0x59, 0x1, 0xb4, 0x16, 0x64, 0x58, 0x87, 0x9f, - 0x5a, 0x0, 0x0, 0x1, 0x0, 0x1d, 0x0, 0x0, 0x2, 0x79, 0x3, 0xc, 0x0, 0xf, 0x0, 0x68, - 0x40, 0x2b, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xe, 0xd, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, - 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xa, 0x9, 0x2, 0x3, 0x1, 0x7, 0x8, 0x7, 0x4, 0x3, - 0x3, 0x6, 0x5, 0x1, 0xf, 0xc, 0xb, 0x3, 0x0, 0x3, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, - 0x23, 0x35, 0x33, 0x3, 0x33, 0x13, 0x33, 0x13, 0x2, 0x79, 0xf5, 0x8a, 0x98, 0x57, 0x90, 0x83, - 0xf5, 0x63, 0xc7, 0x7, 0xc7, 0x3, 0xc, 0xfe, 0x4e, 0x3f, 0xfe, 0xe5, 0x1, 0x1b, 0x3f, 0x1, - 0xb2, 0xfe, 0x97, 0x1, 0x69, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xb6, 0x1, 0x74, 0x3, 0x35, - 0x0, 0x1d, 0x0, 0x26, 0x0, 0x5b, 0x40, 0x21, 0x1, 0x27, 0x27, 0x40, 0x28, 0xc, 0x24, 0x1b, - 0xf, 0xd, 0xc, 0x2, 0x26, 0x22, 0x1e, 0x1c, 0x1b, 0x15, 0xc, 0x8, 0x7, 0x3, 0x0, 0x7, - 0x5, 0x20, 0x7, 0x19, 0x5, 0x11, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x2f, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x27, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, - 0x59, 0x13, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, - 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, - 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0xd7, 0x31, 0x28, 0x13, 0x34, 0x40, 0x85, 0x5, - 0x6, 0x5, 0x43, 0x7, 0x5, 0x34, 0x34, 0x38, 0x23, 0x27, 0x2f, 0x29, 0x38, 0x32, 0x27, 0x25, - 0x2b, 0x57, 0x4b, 0x35, 0x27, 0x2, 0xff, 0x18, 0x34, 0x1a, 0x7d, 0xa0, 0x29, 0x14, 0x10, 0xf, - 0x9, 0x16, 0x25, 0x1b, 0x1d, 0x39, 0x35, 0x21, 0x1d, 0xe, 0x30, 0x43, 0xa7, 0xe, 0x43, 0x39, - 0x2e, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xb5, 0x1, 0x87, 0x3, 0x33, 0x0, 0xf, 0x0, 0x1f, - 0x0, 0x40, 0x40, 0x13, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1c, 0x18, 0x10, 0x8, 0x0, 0x14, - 0x7, 0xc, 0xc, 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, - 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, - 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x36, 0x1, 0x87, 0x35, 0x2d, 0x44, 0x46, 0x2c, 0x34, 0x34, 0x2c, 0x46, 0x44, 0x2d, 0x35, - 0x3e, 0x1f, 0x1b, 0x2e, 0x2e, 0x1b, 0x1f, 0x1f, 0x1b, 0x2e, 0x2e, 0x1b, 0x1f, 0x2, 0x73, 0x61, - 0x33, 0x2a, 0x2c, 0x32, 0x60, 0x60, 0x33, 0x2d, 0x2b, 0x33, 0x62, 0x48, 0x26, 0x22, 0x22, 0x26, - 0x48, 0x48, 0x25, 0x22, 0x22, 0x25, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x2, 0xda, 0x2, 0x1b, - 0x0, 0x27, 0x0, 0x2e, 0x0, 0x36, 0x0, 0x74, 0x40, 0x31, 0x1, 0x37, 0x37, 0x40, 0x38, 0x0, - 0x21, 0x1c, 0xc, 0x7, 0x3, 0x32, 0x2f, 0x2e, 0x28, 0x27, 0x1d, 0x17, 0x12, 0x8, 0x1, 0x0, - 0x30, 0x2f, 0x1, 0x3, 0x0, 0x7, 0x2e, 0x28, 0x17, 0x3, 0x16, 0x34, 0x7, 0xa, 0x2c, 0x1a, - 0x7, 0x1f, 0x23, 0x1f, 0x2, 0xe, 0xa, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x37, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x37, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x14, 0x33, - 0x32, 0x37, 0x36, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x3b, 0x1, 0x27, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0xf, 0x1, 0x23, 0x22, 0x15, 0x14, - 0x33, 0x32, 0x37, 0x2, 0xda, 0xfe, 0xc9, 0x7f, 0x26, 0x26, 0x20, 0x13, 0x30, 0x4b, 0x64, 0x6c, - 0x32, 0x37, 0x6e, 0x4f, 0x2f, 0x34, 0x41, 0x38, 0x50, 0x5e, 0x1, 0x2, 0x61, 0x42, 0x30, 0x1c, - 0x46, 0x52, 0x6e, 0x29, 0x32, 0x5e, 0x54, 0x30, 0x35, 0x57, 0x6, 0x13, 0x16, 0x33, 0x6f, 0xd, - 0x52, 0x4e, 0x7e, 0x66, 0x3d, 0x28, 0xf7, 0xb8, 0x13, 0x10, 0x16, 0x31, 0x50, 0x4d, 0x4d, 0x26, - 0x2a, 0x51, 0x4b, 0x2b, 0x25, 0x3a, 0x67, 0x20, 0x42, 0x24, 0x4d, 0x4e, 0x3c, 0x42, 0x7b, 0x11, - 0x56, 0x23, 0x28, 0xa1, 0x3c, 0x65, 0x57, 0x36, 0x0, 0x3, 0x0, 0x32, 0xff, 0xc4, 0x1, 0xe1, - 0x2, 0x48, 0x0, 0x15, 0x0, 0x1c, 0x0, 0x23, 0x0, 0x61, 0x40, 0x25, 0x1, 0x24, 0x24, 0x40, - 0x25, 0x0, 0x23, 0x18, 0x11, 0x6, 0x21, 0x1d, 0x19, 0x16, 0x14, 0x13, 0xb, 0x9, 0x8, 0x0, - 0x1b, 0x7, 0x4, 0x1f, 0x7, 0xf, 0x13, 0x12, 0x8, 0x7, 0xf, 0x2, 0x4, 0x1, 0x1, 0xb, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, - 0x16, 0x7, 0x34, 0x27, 0x3, 0x16, 0x33, 0x32, 0x3, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x1, - 0xe1, 0x41, 0x38, 0x5e, 0x2c, 0x25, 0x20, 0x4a, 0x31, 0x4e, 0x3f, 0x38, 0x61, 0x37, 0x2c, 0x22, - 0x4a, 0x37, 0x3f, 0x58, 0x11, 0x9f, 0x16, 0x1b, 0x7f, 0x3c, 0x1c, 0x27, 0x80, 0x1c, 0x1, 0x8, - 0x8d, 0x46, 0x3d, 0xd, 0x41, 0x63, 0x45, 0x9c, 0x8c, 0x47, 0x3f, 0x17, 0x45, 0x6e, 0x48, 0x8a, - 0x4c, 0x30, 0xfe, 0xc1, 0x9, 0x1, 0x86, 0x14, 0xce, 0x62, 0x32, 0x0, 0x0, 0x2, 0x0, 0x3d, - 0xff, 0xf0, 0x1, 0xdc, 0x3, 0x14, 0x0, 0xb, 0x0, 0x25, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x26, - 0x26, 0x40, 0x27, 0xc, 0x25, 0x23, 0x1a, 0x19, 0x21, 0x1b, 0x19, 0x18, 0x11, 0xc, 0x6, 0x0, - 0x3, 0x8, 0x9, 0xe, 0x9, 0x3, 0x1, 0x11, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x11, 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x26, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x37, 0x3e, 0x1, 0x3d, 0x1, 0x33, 0x17, 0x16, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, - 0x37, 0x1, 0x70, 0x24, 0x1a, 0x1a, 0x24, 0x25, 0x19, 0x1a, 0x24, 0x6c, 0x5f, 0x62, 0x66, 0x78, - 0x29, 0x2b, 0x2c, 0x29, 0x21, 0x50, 0x1, 0x1, 0x5d, 0x22, 0x22, 0x20, 0x86, 0x4a, 0x4a, 0x2, - 0xd6, 0x1a, 0x25, 0x25, 0x1a, 0x1a, 0x24, 0x24, 0xfd, 0x3e, 0x3e, 0x64, 0x5b, 0x3f, 0x2b, 0x25, - 0x25, 0x24, 0x3c, 0x27, 0x56, 0x5f, 0x62, 0x51, 0x1b, 0x1b, 0x1f, 0x2f, 0x6d, 0x32, 0x0, 0x2, - 0x0, 0x73, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x13, 0x0, 0xb, 0x0, 0xf, 0x0, 0x46, 0x40, 0x17, - 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xf, 0xe, 0xd, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0xd, - 0xc, 0x1, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x10, - 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x6, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, - 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x3, 0x23, 0x13, 0x33, 0xf4, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0xf, 0x60, 0xe, - 0x44, 0x2, 0xd2, 0x1b, 0x25, 0x25, 0x1b, 0x1b, 0x26, 0x26, 0xfd, 0x13, 0x2, 0x48, 0x0, 0x1, - 0x0, 0x3b, 0xff, 0x61, 0x1, 0x97, 0x3, 0x32, 0x0, 0x1d, 0x0, 0x6d, 0x40, 0x2d, 0x1, 0x1e, - 0x1e, 0x40, 0x1f, 0x0, 0x1, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x11, 0x10, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x0, 0x3, 0x7, 0x1c, 0x15, 0x14, 0xb, 0x3, 0xa, 0x7, 0x17, 0x16, 0x9, - 0x3, 0x8, 0x11, 0x7, 0x10, 0x10, 0x1c, 0x4, 0x1, 0x10, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x2f, 0x10, 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x10, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, - 0x1d, 0x1, 0x33, 0x15, 0x23, 0x11, 0x14, 0x7, 0x6, 0x23, 0x35, 0x32, 0x35, 0x11, 0x23, 0x35, - 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x1, 0x97, 0x1b, 0x22, 0x2b, 0x26, 0xc, 0x8, 0x64, - 0x64, 0x3a, 0x30, 0x50, 0x65, 0x48, 0x48, 0x24, 0x1e, 0x43, 0x40, 0x3, 0xe, 0x42, 0x20, 0x1d, - 0x15, 0x38, 0xaf, 0x42, 0xfe, 0x68, 0x50, 0x28, 0x20, 0x44, 0x52, 0x1, 0x9a, 0x42, 0xad, 0x65, - 0x2a, 0x23, 0x0, 0x2, 0x0, 0x3b, 0x0, 0x3c, 0x2, 0x5a, 0x2, 0x12, 0x0, 0x6, 0x0, 0xd, - 0x0, 0x50, 0x40, 0x1d, 0x1, 0xe, 0xe, 0x40, 0xf, 0x0, 0xd, 0xc, 0xa, 0x9, 0x7, 0x6, - 0x5, 0x2, 0x0, 0x8, 0x7, 0x1, 0x3, 0x0, 0xc, 0xb, 0x5, 0x3, 0x4, 0x2, 0x1, 0x9, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, - 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, 0xff, 0xc0, - 0x38, 0x59, 0x25, 0x23, 0x27, 0x3f, 0x1, 0x33, 0xf, 0x1, 0x23, 0x27, 0x35, 0x37, 0x33, 0x7, - 0x2, 0x5a, 0x5d, 0xcf, 0x1, 0xce, 0x5d, 0xce, 0x25, 0x5d, 0xcf, 0xcf, 0x5d, 0xce, 0x3c, 0xe4, - 0x11, 0xe1, 0xe8, 0xee, 0xe4, 0x11, 0xe1, 0xe8, 0x0, 0x2, 0x0, 0x3b, 0x0, 0x3c, 0x2, 0x5a, - 0x2, 0x12, 0x0, 0x6, 0x0, 0xd, 0x0, 0x52, 0x40, 0x1e, 0x1, 0xe, 0xe, 0x40, 0xf, 0x0, - 0xd, 0xb, 0xa, 0x9, 0x7, 0x6, 0x4, 0x3, 0x2, 0x0, 0x9, 0x8, 0x2, 0x3, 0x1, 0xc, - 0xb, 0x5, 0x3, 0x4, 0x2, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x27, 0x33, - 0x17, 0xf, 0x1, 0x23, 0x37, 0x27, 0x33, 0x17, 0x2, 0x5a, 0xcf, 0x5d, 0xce, 0xce, 0x5d, 0xcf, - 0xf4, 0xce, 0x5d, 0xce, 0xce, 0x5d, 0xce, 0x1, 0x20, 0xe4, 0xee, 0xe8, 0xe1, 0x11, 0xe4, 0xee, - 0xe8, 0xe1, 0x0, 0x3, 0x0, 0x55, 0xff, 0xf2, 0x2, 0xcd, 0x0, 0x73, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x23, 0x0, 0x45, 0x40, 0x15, 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x1e, 0x18, 0x12, 0xc, - 0x6, 0x0, 0x21, 0x15, 0x9, 0x1b, 0xf, 0x3, 0x1, 0x1e, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x3c, 0x2f, 0x3c, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1e, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x2, 0xcd, 0x26, - 0x1b, 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, 0xfb, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0xfc, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x33, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0x26, 0x0, 0x0, 0x2, 0x0, 0x57, 0xff, 0xf7, 0x4, 0x3, 0x3, 0x13, 0x0, 0x1a, 0x0, 0x2a, - 0x0, 0x7e, 0x40, 0x35, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x0, 0x27, 0x1f, 0x10, 0x2, 0x23, 0x1b, - 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x8, 0x2, 0x1, 0x0, 0x14, - 0x13, 0x8, 0x11, 0x18, 0x17, 0x8, 0x16, 0x15, 0x1a, 0x19, 0x8, 0x0, 0x12, 0x11, 0x3, 0xc, - 0x3, 0x4, 0x1, 0x1, 0x0, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3f, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x2b, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, - 0x29, 0x1, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x17, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x1, 0x34, 0x27, 0x26, 0x23, - 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x4, 0x3, 0xfe, 0x37, 0x51, - 0x75, 0x76, 0x50, 0x57, 0x57, 0x4f, 0x75, 0x3a, 0x34, 0x38, 0x22, 0x1, 0xb8, 0xfe, 0x9e, 0x1, - 0x3b, 0xfe, 0xc5, 0x1, 0x73, 0xfe, 0x3b, 0x2a, 0x37, 0x6b, 0x69, 0x33, 0x25, 0x25, 0x33, 0x69, - 0x6b, 0x37, 0x2a, 0x6a, 0x73, 0x64, 0x6e, 0xbc, 0xbc, 0x6e, 0x64, 0x1e, 0x21, 0x3a, 0x72, 0x48, - 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0x1, 0x3d, 0x76, 0x59, 0x74, 0x74, 0x55, 0x7a, 0x7a, 0x55, 0x74, - 0x73, 0x59, 0x0, 0x3, 0x0, 0x32, 0xff, 0xf7, 0x3, 0x19, 0x2, 0x1b, 0x0, 0x1e, 0x0, 0x24, - 0x0, 0x2c, 0x0, 0x66, 0x40, 0x28, 0x1, 0x2d, 0x2d, 0x40, 0x2e, 0x0, 0x18, 0xc, 0x7, 0x5, - 0x29, 0x25, 0x24, 0x1f, 0x1e, 0x12, 0x8, 0x1, 0x0, 0x1, 0x0, 0x7, 0x24, 0x1f, 0x2b, 0x7, - 0xe, 0x27, 0x22, 0x7, 0x1a, 0x1a, 0x16, 0x2, 0xe, 0xa, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x2d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x16, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0xf, 0x1, - 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x3, 0x19, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x4b, - 0x2e, 0x31, 0x4e, 0x5c, 0x77, 0x3e, 0x39, 0x6f, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x6e, 0x39, - 0x3c, 0x6a, 0x55, 0x34, 0x39, 0x56, 0x5, 0x32, 0x35, 0x70, 0xd, 0x51, 0x7f, 0x80, 0x80, 0x7f, - 0xf7, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x5d, 0x5c, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x5c, - 0x5d, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x2b, 0xce, 0xce, 0xcc, 0x0, 0x1, 0x0, 0x3b, - 0x0, 0xf4, 0x1, 0xc9, 0x1, 0x34, 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x35, 0x21, 0x1, 0xc9, 0xfe, 0x72, 0x1, - 0x8e, 0xf4, 0x40, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x0, 0xf4, 0x2, 0x4a, 0x1, 0x34, 0x0, 0x3, - 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, - 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x25, - 0x21, 0x35, 0x21, 0x2, 0x4a, 0xfd, 0xf1, 0x2, 0xf, 0xf4, 0x40, 0x0, 0x0, 0x2, 0x0, 0x3b, - 0x2, 0x4b, 0x1, 0x74, 0x3, 0x33, 0x0, 0x10, 0x0, 0x21, 0x0, 0x45, 0x40, 0x15, 0x1, 0x22, - 0x22, 0x40, 0x23, 0x0, 0x1d, 0x1a, 0x17, 0x11, 0xc, 0x9, 0x6, 0x0, 0x19, 0x8, 0x14, 0x3, - 0x1, 0x17, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x17, 0x0, 0x22, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x17, 0xe, 0x1, 0x15, 0x14, 0x17, - 0x1e, 0x1, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x17, 0xe, 0x1, 0x15, 0x14, - 0x17, 0x1e, 0x1, 0x1, 0x74, 0x25, 0x1c, 0x1b, 0x26, 0x4f, 0x17, 0xb, 0x1a, 0x9, 0x18, 0x20, - 0xb8, 0x25, 0x1b, 0x1b, 0x26, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, 0x2, 0x87, 0x1b, 0x21, - 0x2b, 0x1b, 0x50, 0x52, 0x13, 0xa, 0x36, 0xf, 0xd, 0x1, 0x3, 0x21, 0x18, 0x1a, 0x22, 0x2b, - 0x1b, 0x51, 0x51, 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x21, 0x0, 0x0, 0x2, 0x0, 0x3b, - 0x2, 0x4c, 0x1, 0x7a, 0x3, 0x34, 0x0, 0x10, 0x0, 0x21, 0x0, 0x45, 0x40, 0x15, 0x1, 0x22, - 0x22, 0x40, 0x23, 0x0, 0x1c, 0x17, 0x14, 0x11, 0xb, 0x6, 0x3, 0x0, 0x1f, 0xe, 0x13, 0x2, - 0x1, 0x1c, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1c, 0x0, 0x22, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x2e, 0x1, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x7, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x2e, 0x1, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x1, 0x7a, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, 0x26, 0x1b, 0x1a, 0x26, - 0xbe, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, 0x26, 0x1b, 0x1a, 0x26, 0x2, 0xee, 0x51, 0x51, - 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x22, 0x18, 0x1a, 0x21, 0x2b, 0x1b, 0x51, 0x51, 0x13, - 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x22, 0x18, 0x1a, 0x21, 0x2b, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x4b, 0x0, 0xbc, 0x3, 0x33, 0x0, 0x10, 0x0, 0x39, 0x40, 0xf, 0x1, 0x11, 0x11, 0x40, - 0x12, 0x0, 0xc, 0x9, 0x6, 0x0, 0x8, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, - 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x11, 0xff, - 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x17, 0xe, 0x1, 0x15, - 0x14, 0x17, 0x1e, 0x1, 0xbc, 0x25, 0x1b, 0x1b, 0x26, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, - 0x2, 0x87, 0x1a, 0x22, 0x2b, 0x1b, 0x51, 0x51, 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x21, - 0x0, 0x1, 0x0, 0x3b, 0x2, 0x4c, 0x0, 0xbc, 0x3, 0x34, 0x0, 0x10, 0x0, 0x39, 0x40, 0xf, - 0x1, 0x11, 0x11, 0x40, 0x12, 0x0, 0xb, 0x6, 0x3, 0x0, 0xe, 0x2, 0x1, 0xb, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xb, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x11, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, - 0x2e, 0x1, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, - 0x26, 0x1b, 0x1a, 0x26, 0x2, 0xee, 0x51, 0x51, 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x22, - 0x18, 0x1a, 0x21, 0x2b, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x0, 0x1, 0x9d, 0x3, 0x56, 0x0, 0x3, - 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, - 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x23, 0x1, - 0x1, 0x9d, 0xfe, 0xed, 0x4f, 0x1, 0x13, 0x3, 0x56, 0xfc, 0xaa, 0x3, 0x56, 0x0, 0x0, 0x1, - 0x0, 0x3d, 0xff, 0xf8, 0x2, 0x78, 0x3, 0x13, 0x0, 0x2e, 0x0, 0x82, 0x40, 0x3a, 0x1, 0x2f, - 0x2f, 0x40, 0x30, 0x0, 0x2e, 0x2a, 0x1c, 0x1a, 0x28, 0x27, 0x26, 0x23, 0x20, 0x1f, 0x1e, 0x19, - 0x11, 0x10, 0xf, 0xd, 0xb, 0xa, 0x9, 0x0, 0x26, 0x25, 0xb, 0x3, 0xa, 0x7, 0x28, 0x27, - 0x9, 0x3, 0x8, 0x21, 0x20, 0x10, 0x3, 0xf, 0x7, 0x1f, 0x1e, 0x12, 0x3, 0x11, 0x6, 0x8, - 0x4, 0x16, 0x3, 0x4, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, - 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x2f, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2f, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x26, 0x35, 0x34, 0x37, 0x23, 0x35, - 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x21, 0x15, 0x21, - 0x6, 0x15, 0x14, 0x17, 0x21, 0x15, 0x21, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x2, 0x78, 0x2e, - 0x2f, 0x3b, 0x59, 0x65, 0x4a, 0x52, 0x17, 0x32, 0x2c, 0x1, 0x2, 0x2d, 0x34, 0x19, 0x53, 0x48, - 0x5e, 0x53, 0x6f, 0x2d, 0x48, 0x38, 0x67, 0x98, 0x28, 0x1, 0x4f, 0xfe, 0xaa, 0x2, 0x1, 0x1, - 0x57, 0xfe, 0xaf, 0x2a, 0x9c, 0x44, 0x2f, 0x15, 0x1f, 0x8f, 0x4c, 0x22, 0x29, 0x49, 0x50, 0x94, - 0x3a, 0xe, 0x18, 0xe, 0x26, 0x3a, 0x92, 0x4c, 0x42, 0x46, 0x4d, 0x24, 0x6c, 0xd5, 0x3a, 0x13, - 0x21, 0x18, 0xe, 0x3a, 0xe3, 0x2b, 0x14, 0x32, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x3c, 0x1, 0x67, - 0x2, 0x12, 0x0, 0x6, 0x0, 0x40, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, 0x6, 0x5, - 0x3, 0x2, 0x0, 0x1, 0x0, 0x5, 0x4, 0x2, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x2, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x27, 0x35, 0x37, 0x33, 0x7, 0x1, 0x67, 0x5d, - 0xcf, 0xcf, 0x5d, 0xce, 0x3c, 0xe4, 0x11, 0xe1, 0xe8, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x3c, - 0x1, 0x66, 0x2, 0x12, 0x0, 0x6, 0x0, 0x40, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, - 0x6, 0x4, 0x3, 0x2, 0x0, 0x2, 0x1, 0x5, 0x4, 0x2, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x27, 0x33, 0x17, 0x1, - 0x66, 0xce, 0x5d, 0xce, 0xce, 0x5d, 0xce, 0x1, 0x20, 0xe4, 0xee, 0xe8, 0xe1, 0x0, 0x0, 0x3, - 0x0, 0x2d, 0x0, 0x0, 0x2, 0x57, 0x3, 0x31, 0x0, 0xb, 0x0, 0x13, 0x0, 0x29, 0x0, 0x9d, - 0x40, 0x4a, 0x1, 0x2a, 0x2a, 0x40, 0x2b, 0xc, 0x1d, 0x1c, 0x15, 0x14, 0x29, 0x28, 0x27, 0x25, - 0x24, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, - 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x1b, 0x1a, 0x17, 0x16, 0x13, - 0x12, 0xf, 0x7, 0xe, 0x7, 0xc, 0x25, 0x7, 0x24, 0x24, 0x4, 0x29, 0x28, 0x1f, 0x1e, 0x11, - 0x5, 0x10, 0x2, 0x19, 0x18, 0xd, 0x3, 0xc, 0x1, 0x1, 0x1d, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1d, 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x1, 0x23, 0x11, 0x33, 0x15, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x15, 0x22, 0x1d, 0x1, 0x33, 0x2, 0x22, 0x1f, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, - 0x1f, 0x35, 0xd0, 0x3c, 0x55, 0x3f, 0xfe, 0xd7, 0x64, 0x4a, 0xd3, 0x34, 0x48, 0x48, 0x3a, 0x30, - 0x4f, 0x64, 0x64, 0x2, 0xa2, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x20, 0xfd, 0x48, 0x40, 0x1, - 0xd1, 0xfe, 0x2f, 0x1, 0x8f, 0xfe, 0x71, 0x40, 0x40, 0x1, 0x8f, 0x43, 0x87, 0x50, 0x28, 0x20, - 0x44, 0x52, 0x89, 0x0, 0x0, 0x2, 0x0, 0x2d, 0xff, 0xf5, 0x2, 0x43, 0x3, 0x32, 0x0, 0x9, - 0x0, 0x1f, 0x0, 0x8e, 0x40, 0x3f, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x13, 0x12, 0xb, 0xa, - 0x1f, 0x1e, 0x1d, 0x1b, 0x1a, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x5, 0x4, 0x3, 0x2, 0x0, 0x11, 0x10, 0xd, 0x9, 0x4, 0xc, 0x7, 0xe, - 0x1b, 0x7, 0x1a, 0x1f, 0x1e, 0x15, 0x3, 0x14, 0x2, 0xf, 0xe, 0x1, 0x1a, 0x4, 0x3, 0x4, - 0x0, 0x1, 0x1, 0x13, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3c, 0x3f, 0x3c, - 0x3f, 0x17, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x13, 0x0, - 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, - 0x38, 0x59, 0x5, 0x22, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x1, 0x23, 0x11, 0x33, - 0x15, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x15, 0x22, 0x1d, - 0x1, 0x33, 0x2, 0x43, 0x8c, 0x55, 0x8, 0xb, 0x24, 0xfe, 0xeb, 0x64, 0x4a, 0xd3, 0x34, 0x48, - 0x48, 0x3a, 0x30, 0x4f, 0x64, 0x64, 0xb, 0x94, 0x2, 0xa9, 0xfd, 0x6c, 0x34, 0x11, 0x15, 0x3, - 0x1, 0x8e, 0xfe, 0x71, 0x40, 0x40, 0x1, 0x8f, 0x43, 0x87, 0x50, 0x28, 0x20, 0x44, 0x52, 0x89, - 0x0, 0x1, 0x0, 0x57, 0xff, 0x38, 0x2, 0x7, 0x3, 0x32, 0x0, 0x13, 0x0, 0x7f, 0x40, 0x35, - 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0x13, 0x12, 0x7, 0x6, 0x5, 0x4, 0x1, 0x0, 0x13, 0x12, - 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x1, 0x0, 0x11, 0x10, 0x9, 0x3, 0x8, 0x7, 0xf, 0xe, 0xb, 0x3, 0xa, 0x3, 0x2, 0xd, - 0xc, 0x4, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x17, - 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x11, - 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, - 0x33, 0x2, 0x7, 0xb0, 0x50, 0xb0, 0xb0, 0xb0, 0xb0, 0x50, 0xb0, 0xb0, 0xb0, 0x7f, 0xfe, 0xb9, - 0x1, 0x47, 0x41, 0x1, 0xe, 0x42, 0x1, 0x22, 0xfe, 0xde, 0x42, 0xfe, 0xf2, 0x0, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0xe1, 0x0, 0xbc, 0x1, 0x62, 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, - 0xc, 0x40, 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, - 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, - 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x1, 0x22, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, - 0x0, 0x1, 0x0, 0x3b, 0xff, 0x8d, 0x0, 0xbc, 0x0, 0x75, 0x0, 0xf, 0x0, 0x39, 0x40, 0xf, - 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xa, 0x6, 0x3, 0x0, 0xd, 0x2, 0x1, 0xa, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, - 0x1a, 0x26, 0x30, 0x51, 0x52, 0x14, 0xa, 0x36, 0x10, 0xc, 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, - 0x0, 0x2, 0x0, 0x5f, 0xff, 0x8d, 0x1, 0x9e, 0x0, 0x75, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x45, - 0x40, 0x15, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1a, 0x16, 0x13, 0x10, 0xa, 0x6, 0x3, 0x0, - 0x1d, 0xd, 0x12, 0x2, 0x1, 0x1a, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1a, 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x20, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x9e, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, - 0x26, 0xbe, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, 0x26, 0x30, 0x51, 0x52, 0x14, - 0xa, 0x36, 0x10, 0xc, 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x1b, 0x51, 0x52, 0x14, 0xa, 0x36, - 0x10, 0xc, 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x0, 0x7, 0x0, 0x55, 0xff, 0xec, 0x5, 0x43, - 0x3, 0x4e, 0x0, 0xb, 0x0, 0x17, 0x0, 0x1b, 0x0, 0x27, 0x0, 0x33, 0x0, 0x3f, 0x0, 0x4b, - 0x0, 0x6f, 0x40, 0x2c, 0x1, 0x4c, 0x4c, 0x40, 0x4d, 0x0, 0x43, 0x2b, 0x25, 0x9, 0x46, 0x40, - 0x3a, 0x34, 0x2e, 0x28, 0x22, 0x1c, 0x1a, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x7, 0x3d, 0x49, - 0x31, 0x7, 0x3, 0x37, 0x7, 0x15, 0x1b, 0x18, 0x1a, 0x19, 0x1f, 0x3, 0x1, 0x1, 0x12, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, - 0x2f, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x4c, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4c, 0xff, 0xc0, 0x38, - 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x1, 0x23, 0x1, 0x13, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x5, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x5, 0x43, 0x69, - 0x4b, 0x4c, 0x69, 0x69, 0x4c, 0x4b, 0x69, 0xfc, 0x7b, 0x69, 0x4c, 0x4b, 0x69, 0x69, 0x4b, 0x4c, - 0x69, 0x1, 0x4a, 0xfd, 0xfb, 0x4f, 0x2, 0x5, 0xba, 0x69, 0x4c, 0x4b, 0x69, 0x69, 0x4b, 0x4c, - 0x69, 0x1, 0x8d, 0x41, 0x30, 0x31, 0x41, 0x41, 0x31, 0x30, 0x41, 0xfc, 0x7b, 0x41, 0x31, 0x30, - 0x41, 0x41, 0x30, 0x31, 0x41, 0x1, 0xb5, 0x41, 0x31, 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0xb1, - 0x4b, 0x68, 0x67, 0x4c, 0x4c, 0x67, 0x67, 0x1, 0x9b, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, - 0x6a, 0xfc, 0x9e, 0x3, 0x62, 0xfd, 0x63, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, 0x4c, 0x32, - 0x3f, 0x3f, 0x32, 0x32, 0x3e, 0x3f, 0x2, 0x18, 0x32, 0x3e, 0x3f, 0x31, 0x31, 0x3f, 0x3e, 0xfe, - 0x4b, 0x32, 0x3f, 0x3f, 0x32, 0x31, 0x3f, 0x3e, 0x0, 0x1, 0x0, 0x28, 0x0, 0x0, 0x0, 0xf8, - 0x2, 0x11, 0x0, 0x7, 0x0, 0x52, 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, - 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x3, 0x3, 0x2, 0x7, 0x0, 0x5, 0x4, 0x2, - 0x1, 0x0, 0x1, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x33, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, - 0xf8, 0xd0, 0x3b, 0x55, 0x40, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x73, - 0x1, 0x4f, 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, - 0x2, 0x4, 0x0, 0x6, 0x5, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x4f, - 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x2, 0x73, 0x56, 0x56, 0x92, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x7c, 0x1, 0x6c, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x40, 0x40, 0x13, 0x1, 0x10, 0x10, 0x40, - 0x11, 0x0, 0xf, 0xd, 0x7, 0x8, 0x0, 0x5, 0x7, 0xa, 0xa, 0x2, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, - 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x1, 0x6c, 0x31, 0x30, 0x15, 0x46, - 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, 0xd, 0x1f, 0x23, 0x2, 0xa2, 0x26, 0x1f, 0x19, - 0x34, 0x29, 0x21, 0x1a, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x97, 0x1, 0x33, 0x2, 0xd7, 0x0, 0x3, - 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, - 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x23, 0x35, 0x33, 0x1, 0x33, 0xf8, 0xf8, 0x2, 0x97, 0x40, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x7b, - 0x1, 0x86, 0x3, 0x8, 0x0, 0xd, 0x0, 0x3c, 0x40, 0x11, 0x1, 0xe, 0xe, 0x40, 0xf, 0x0, - 0x6, 0x0, 0xa, 0x7, 0x3, 0xd, 0x7, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x6, 0x0, 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0xe, 0x1, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x1, 0x33, 0x32, - 0x36, 0x37, 0x1, 0x86, 0x10, 0x5e, 0x38, 0x38, 0x58, 0x15, 0x33, 0xe, 0x40, 0x24, 0x23, 0x40, - 0xe, 0x2, 0xf4, 0x34, 0x45, 0x3f, 0x3a, 0x14, 0x26, 0x2e, 0x2e, 0x26, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x7c, 0x0, 0xbc, 0x2, 0xfd, 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, - 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x13, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x2, 0xbc, 0x1b, 0x25, 0x25, 0x1b, 0x1b, 0x26, 0x26, 0x0, 0x0, 0x2, - 0x0, 0x3b, 0x2, 0x41, 0x1, 0x2, 0x3, 0x9, 0x0, 0xb, 0x0, 0x17, 0x0, 0x40, 0x40, 0x13, - 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x15, 0x12, 0xc, 0x6, 0x0, 0xf, 0x7, 0x9, 0x9, 0x3, - 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x18, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x34, 0x26, 0x23, 0x22, 0x6, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x2, 0x3a, 0x29, 0x29, 0x3b, 0x3b, 0x29, 0x29, 0x3a, - 0x2f, 0x1e, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x1e, 0x2, 0xa5, 0x29, 0x3b, 0x3b, 0x29, 0x29, - 0x3b, 0x3b, 0x29, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x1e, 0x1e, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x7, - 0x0, 0xdf, 0x0, 0x1a, 0x0, 0x13, 0x0, 0x4a, 0x40, 0x18, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, - 0xf, 0xd, 0x6, 0x12, 0x11, 0xf, 0xb, 0x5, 0x0, 0x8, 0x7, 0x3, 0x11, 0x10, 0x3, 0x1, - 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, - 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, - 0x38, 0x59, 0x17, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, - 0x26, 0x7, 0x37, 0x33, 0x7, 0x16, 0xdf, 0x35, 0x2b, 0x25, 0x1f, 0x1d, 0x13, 0x14, 0x19, 0x1d, - 0x2c, 0x12, 0x17, 0x22, 0x32, 0x19, 0x44, 0x8f, 0x2d, 0x3d, 0x1d, 0x1e, 0x11, 0x25, 0x1b, 0x36, - 0xa, 0x4, 0x4, 0x69, 0x47, 0x13, 0x0, 0x2, 0x0, 0x3b, 0x2, 0x62, 0x1, 0xbf, 0x3, 0x32, - 0x0, 0x3, 0x0, 0x7, 0x0, 0x46, 0x40, 0x18, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x6, 0x4, - 0x2, 0x0, 0x6, 0x5, 0x2, 0x3, 0x1, 0x7, 0x4, 0x3, 0x3, 0x0, 0x4, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, - 0x23, 0x7, 0x23, 0x37, 0x1, 0xbf, 0xa9, 0x33, 0x81, 0x4d, 0xa9, 0x33, 0x81, 0x3, 0x32, 0xd0, - 0xd0, 0xd0, 0xd0, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x7, 0x0, 0xdf, 0x0, 0x1a, 0x0, 0x12, - 0x0, 0x47, 0x40, 0x16, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x12, 0x10, 0xc, 0xa, 0xe, 0xa, - 0x8, 0x7, 0x5, 0x0, 0x9, 0x8, 0x2, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, - 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x17, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x37, 0x27, 0x33, 0x17, 0x26, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0xdf, 0x1f, 0x25, 0x2b, - 0x35, 0x44, 0x19, 0x32, 0x21, 0x16, 0x12, 0x2c, 0x36, 0x15, 0x11, 0xdc, 0x1d, 0x3d, 0x2d, 0x4f, - 0x13, 0x47, 0x69, 0x4, 0x4, 0xa, 0x36, 0x40, 0x11, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x73, - 0x1, 0x4f, 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, - 0x5, 0x3, 0x0, 0x6, 0x4, 0x3, 0x3, 0x0, 0x2, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x3, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x27, 0x33, 0x17, 0x37, 0x1, 0x4f, - 0x6a, 0x40, 0x6a, 0x47, 0x43, 0x43, 0x3, 0x5, 0x92, 0x92, 0x56, 0x56, 0x0, 0x2, 0x0, 0x3b, - 0x0, 0x0, 0x2, 0xb7, 0x2, 0xec, 0x0, 0x7, 0x0, 0xc, 0x0, 0x4f, 0x40, 0x1c, 0x1, 0xd, - 0xd, 0x40, 0xe, 0x0, 0xa, 0x9, 0xc, 0x8, 0x5, 0x0, 0xc, 0x8, 0x8, 0x3, 0x2, 0x7, - 0x6, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xd, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xd, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x21, 0x7, - 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x2, 0xb7, 0x5e, 0x49, 0xfe, 0xd1, 0x47, 0x5f, - 0x1, 0xf, 0x5e, 0x50, 0x7e, 0x3, 0x10, 0x6e, 0xd3, 0xd3, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, - 0x2e, 0xfe, 0xbb, 0x0, 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0x85, 0x0, 0xb, - 0x0, 0x17, 0x0, 0x1f, 0x0, 0x24, 0x0, 0x62, 0x40, 0x26, 0x1, 0x25, 0x25, 0x40, 0x26, 0x18, - 0x22, 0x21, 0x1f, 0x1e, 0x24, 0x20, 0x1d, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, - 0x24, 0x20, 0x8, 0x1b, 0x1a, 0x15, 0x9, 0x1d, 0x1c, 0x19, 0x3, 0x18, 0x1, 0x1, 0x1d, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1d, 0x0, 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x1, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x2, - 0x1, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0xde, 0x1f, 0x16, 0x16, 0x20, 0x20, 0x16, - 0x16, 0x1f, 0x1, 0x78, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, - 0x10, 0x6e, 0x3, 0x4f, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, - 0x17, 0x1f, 0x20, 0xfc, 0x9b, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, 0xfe, 0xbb, - 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0xe3, 0x0, 0xb, 0x0, 0x13, 0x0, 0x1f, - 0x0, 0x24, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x25, 0x25, 0x40, 0x26, 0xc, 0x22, 0x21, 0x1d, 0x17, - 0x13, 0x12, 0x3, 0x24, 0x20, 0x1a, 0x14, 0x11, 0xc, 0x6, 0x0, 0x24, 0x20, 0x8, 0xf, 0xe, - 0x9, 0x11, 0x10, 0xd, 0x3, 0xc, 0x1, 0x1, 0x11, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x17, 0x3c, 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x11, - 0x0, 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, - 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x37, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xc2, 0x3b, 0x29, 0x29, 0x3a, 0x3a, 0x29, - 0x29, 0x3b, 0xd9, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x7, 0x1f, 0x16, 0x16, - 0x1e, 0x1e, 0x16, 0x16, 0x1f, 0x49, 0x7d, 0x3, 0x10, 0x6e, 0x3, 0x7f, 0x29, 0x3b, 0x3b, 0x29, - 0x29, 0x3b, 0x3b, 0xfc, 0x58, 0xd8, 0xd8, 0x2, 0xec, 0x93, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, - 0x1e, 0xfd, 0xb7, 0x1, 0x73, 0x2e, 0xfe, 0xbb, 0x0, 0x1, 0x0, 0x57, 0xfe, 0xf8, 0x2, 0x7b, - 0x3, 0x14, 0x0, 0x2c, 0x0, 0x56, 0x40, 0x1e, 0x1, 0x2d, 0x2d, 0x40, 0x2e, 0x0, 0x2c, 0x2a, - 0x22, 0x20, 0x14, 0x12, 0xd, 0xb, 0x26, 0x1f, 0x19, 0x15, 0x14, 0xf, 0xa, 0x5, 0x3, 0x0, - 0x8, 0x1d, 0x3, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x2d, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0xf, 0x1, - 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x27, 0x26, - 0x7, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x2, 0x7b, 0x54, 0x8a, 0x13, 0x44, 0x36, - 0x2b, 0x24, 0x1f, 0x1d, 0x14, 0x12, 0x37, 0x19, 0x13, 0x13, 0x16, 0x1c, 0x71, 0x4c, 0x57, 0x61, - 0x51, 0x73, 0xa4, 0x56, 0x49, 0x35, 0x73, 0x6b, 0x38, 0x31, 0x39, 0x3b, 0x64, 0x6e, 0x42, 0x8f, - 0x8b, 0xb, 0x36, 0x12, 0x4f, 0x2d, 0x3d, 0x1d, 0x1d, 0x11, 0x41, 0x17, 0x25, 0x4, 0x4, 0x5, - 0x58, 0x9, 0x5f, 0x6c, 0xb8, 0xc8, 0x6d, 0x5a, 0x93, 0x24, 0x6c, 0x60, 0x56, 0x8e, 0x8e, 0x59, - 0x5c, 0x71, 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, 0x2, 0x3f, 0x3, 0xb9, 0x0, 0x3, 0x0, 0xf, - 0x0, 0x6f, 0x40, 0x2c, 0x1, 0x10, 0x10, 0x40, 0x11, 0x4, 0x2, 0x1, 0xf, 0xe, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, 0xf, 0xe, 0x7, 0x4, 0x9, 0x8, - 0x8, 0x7, 0x6, 0xb, 0xa, 0x8, 0xd, 0xc, 0x3, 0x0, 0x5, 0x4, 0x1, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, - 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x10, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, - 0x21, 0x1, 0xbe, 0x3f, 0x42, 0x36, 0xcc, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, - 0xca, 0x1, 0x6e, 0x3, 0xb9, 0x99, 0x99, 0xfc, 0x47, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, - 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, 0x2, 0x8a, 0x3, 0x7b, 0x0, 0x11, 0x0, 0x1d, 0x0, 0x69, - 0x40, 0x29, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x12, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x15, 0x14, - 0x11, 0xd, 0x7, 0x2, 0x1d, 0x1c, 0x1b, 0x18, 0x17, 0x16, 0x15, 0x12, 0x8, 0x0, 0x5, 0x7, - 0xa, 0xa, 0x17, 0x16, 0x13, 0x3, 0x12, 0x1, 0x1, 0x17, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x17, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, - 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x23, 0x1, 0x23, 0x11, - 0x23, 0x11, 0x33, 0x1, 0x33, 0x11, 0x33, 0x2, 0x1f, 0x2f, 0x31, 0x16, 0x46, 0x15, 0x22, 0x1c, - 0x22, 0x30, 0x34, 0x17, 0x48, 0xd, 0x13, 0x6, 0xf, 0x1a, 0x8a, 0x74, 0xfe, 0xae, 0x3, 0x4c, - 0x73, 0x1, 0x55, 0x3, 0x4a, 0x3, 0x3e, 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x2, 0x4, 0x14, - 0xfc, 0x8c, 0x2, 0x7b, 0xfd, 0x85, 0x2, 0xda, 0xfd, 0x7c, 0x2, 0x84, 0x0, 0x4, 0x0, 0x57, - 0xff, 0xf8, 0x2, 0xce, 0x3, 0x8a, 0x0, 0xb, 0x0, 0x17, 0x0, 0x27, 0x0, 0x37, 0x0, 0x52, - 0x40, 0x1d, 0x1, 0x38, 0x38, 0x40, 0x39, 0x18, 0x34, 0x30, 0x28, 0x20, 0x18, 0x12, 0xc, 0x6, - 0x0, 0xf, 0x3, 0x8, 0x9, 0x2c, 0x8, 0x24, 0x15, 0x9, 0x1c, 0x1, 0x1, 0x20, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, - 0x38, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x38, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0x38, 0x1f, 0x17, 0x16, 0x20, - 0x20, 0x16, 0x17, 0x1f, 0xe5, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1, 0x7b, 0x5c, - 0x57, 0x89, 0x88, 0x57, 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, - 0x3c, 0x2d, 0x2d, 0x3c, 0x73, 0x74, 0x3c, 0x2d, 0x3, 0x54, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, - 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0xfd, 0xfe, 0xab, 0x66, 0x60, 0x61, 0x66, - 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x69, 0x52, 0x6c, - 0x6b, 0x52, 0x0, 0x3, 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0x84, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x2d, 0x0, 0x5d, 0x40, 0x22, 0x1, 0x2e, 0x2e, 0x40, 0x2f, 0x18, 0x2d, 0x2c, 0x27, 0x22, - 0x21, 0x2d, 0x2c, 0x2b, 0x23, 0x22, 0x21, 0x20, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, - 0x9, 0x15, 0x9, 0x1c, 0x1, 0x1, 0x20, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, 0x2e, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2e, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x2, - 0x4, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbe, 0x1f, 0x16, 0x16, 0x20, 0x20, 0x16, - 0x16, 0x1f, 0x1, 0x38, 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, - 0x3d, 0x57, 0x3, 0x4e, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, - 0x17, 0x1f, 0x20, 0xfd, 0xb0, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xe3, 0xfe, 0x1e, 0x72, - 0x36, 0x2c, 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, - 0x3, 0x7, 0x0, 0x3, 0x0, 0x21, 0x0, 0x2a, 0x0, 0x6e, 0x40, 0x2d, 0x1, 0x2b, 0x2b, 0x40, - 0x2c, 0x10, 0x1f, 0x13, 0x6, 0x2a, 0x26, 0x22, 0x20, 0x1f, 0x19, 0x10, 0xc, 0xb, 0x7, 0x2, - 0x0, 0x2, 0x1, 0x8, 0x0, 0x4, 0x7, 0x9, 0x28, 0x7, 0x15, 0x1d, 0x7, 0x24, 0x0, 0x15, - 0x1, 0x11, 0x10, 0x1, 0x9, 0x2, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3c, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x3, 0x22, 0x7, 0x27, - 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, - 0x33, 0x32, 0x37, 0x1, 0x62, 0x3e, 0x42, 0x35, 0x1d, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, - 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, - 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x3, 0x7, 0x9a, 0x99, 0xfe, 0xce, 0x20, 0x42, 0x24, 0xb1, 0xf4, - 0x3d, 0x14, 0x4, 0x20, 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, - 0xeb, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x3, 0x6, - 0x0, 0x3, 0x0, 0x21, 0x0, 0x2a, 0x0, 0x70, 0x40, 0x2e, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x10, - 0x1f, 0x13, 0x6, 0x2a, 0x26, 0x22, 0x20, 0x1f, 0x19, 0x10, 0xc, 0xb, 0x7, 0x2, 0x0, 0x1, - 0x0, 0x8, 0x2, 0x4, 0x7, 0x9, 0x28, 0x7, 0x15, 0x1d, 0x7, 0x24, 0x3, 0x2, 0x15, 0x1, - 0x11, 0x10, 0x1, 0x9, 0x2, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, - 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x33, 0x13, 0x22, 0x7, 0x27, - 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, - 0x33, 0x32, 0x37, 0x1, 0x2b, 0x42, 0x3e, 0x4b, 0x4, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, - 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, - 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0x6d, 0x99, 0xfe, 0xce, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, - 0x14, 0x4, 0x20, 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, - 0x11, 0x68, 0x57, 0x36, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x3, 0x5, 0x0, 0x6, - 0x0, 0x24, 0x0, 0x2d, 0x0, 0x73, 0x40, 0x2f, 0x1, 0x2e, 0x2e, 0x40, 0x2f, 0x13, 0x22, 0x16, - 0x9, 0x4, 0x3, 0x2, 0x1, 0x0, 0x2d, 0x29, 0x25, 0x23, 0x22, 0x1c, 0x13, 0xf, 0xe, 0xa, - 0x4, 0x0, 0x7, 0x7, 0xc, 0x2b, 0x7, 0x18, 0x20, 0x7, 0x27, 0x6, 0x5, 0x18, 0x1, 0x14, - 0x13, 0x1, 0xc, 0x2, 0x1, 0x1c, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, - 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1c, 0x0, 0x2e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x2e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, - 0x3, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, - 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, - 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0x89, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x25, - 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, - 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0x73, 0x56, 0x56, - 0x92, 0xfe, 0xcf, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, 0x20, 0xd, 0x1a, 0x30, 0x26, - 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x4, - 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x2, 0xd7, 0x0, 0xb, 0x0, 0x17, 0x0, 0x35, 0x0, 0x3e, - 0x0, 0x74, 0x40, 0x30, 0x1, 0x3f, 0x3f, 0x40, 0x40, 0x24, 0x33, 0x27, 0x1a, 0x3e, 0x3a, 0x36, - 0x34, 0x33, 0x2d, 0x24, 0x20, 0x1f, 0x1b, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x18, - 0x7, 0x1d, 0x3c, 0x7, 0x29, 0x31, 0x7, 0x38, 0x15, 0x9, 0x29, 0x1, 0x25, 0x24, 0x1, 0x1d, - 0x2, 0x1, 0x2d, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, 0x2f, 0x3c, 0x2f, - 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x2d, 0x0, 0x3f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x3f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x22, - 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, - 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0x9b, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbd, - 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x1c, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, - 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, - 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0xa1, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, - 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0xe4, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, 0x20, - 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, 0x57, - 0x36, 0x0, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x2d, - 0x0, 0x36, 0x0, 0x74, 0x40, 0x30, 0x1, 0x37, 0x37, 0x40, 0x38, 0x1c, 0x2b, 0x1f, 0x12, 0xf, - 0xd, 0x7, 0x2, 0x36, 0x32, 0x2e, 0x2c, 0x2b, 0x25, 0x1c, 0x18, 0x17, 0x13, 0x8, 0x0, 0x10, - 0x7, 0x15, 0x34, 0x7, 0x21, 0x29, 0x7, 0x30, 0x5, 0x7, 0xa, 0xa, 0x21, 0x1, 0x1d, 0x1c, - 0x1, 0x15, 0x2, 0x1, 0x25, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, 0x2f, - 0x10, 0xfd, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x25, 0x0, 0x37, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x37, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, - 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x3, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, - 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, - 0x94, 0x31, 0x30, 0x15, 0x46, 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, 0xd, 0x1f, 0x23, - 0x7b, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, - 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0xa2, 0x26, - 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1a, 0xfe, 0xfc, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, - 0x20, 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, - 0x57, 0x36, 0x0, 0x4, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x3, 0x13, 0x0, 0xb, 0x0, 0x29, - 0x0, 0x35, 0x0, 0x3e, 0x0, 0x75, 0x40, 0x31, 0x1, 0x3f, 0x3f, 0x40, 0x40, 0x18, 0x33, 0x27, - 0x1b, 0xe, 0x3, 0x3e, 0x3a, 0x36, 0x30, 0x2a, 0x28, 0x27, 0x21, 0x18, 0x14, 0x13, 0xf, 0x6, - 0x0, 0x2d, 0x7, 0x9, 0xc, 0x7, 0x11, 0x3c, 0x7, 0x1d, 0x25, 0x7, 0x38, 0x1d, 0x1, 0x19, - 0x18, 0x1, 0x11, 0x2, 0x9, 0x3, 0x1, 0x21, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3f, 0x3c, 0x3f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x21, 0x0, 0x3f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x3f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x3, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, - 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x35, 0x34, 0x27, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x13, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0x6a, 0x3b, 0x29, 0x29, 0x3a, - 0x3a, 0x29, 0x29, 0x3b, 0x70, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0xb, 0x58, 0xa, - 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x22, 0x1f, 0x16, 0x16, 0x1e, - 0x1e, 0x16, 0x16, 0x1f, 0x22, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0xaf, 0x29, 0x3b, 0x3b, - 0x29, 0x29, 0x3b, 0x3b, 0xfe, 0xfc, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, 0x20, 0xd, - 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xdb, 0x16, 0x1f, 0x1f, 0x16, - 0x16, 0x1e, 0x1e, 0xfe, 0x50, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x1, 0x0, 0x32, 0xfe, 0xf9, - 0x1, 0xa3, 0x2, 0x1a, 0x0, 0x28, 0x0, 0x59, 0x40, 0x20, 0x1, 0x29, 0x29, 0x40, 0x2a, 0x0, - 0x28, 0x26, 0x20, 0x14, 0x12, 0xd, 0xb, 0x24, 0x1f, 0x19, 0x15, 0x14, 0xf, 0xa, 0x5, 0x3, - 0x0, 0x22, 0x8, 0x1d, 0x8, 0x1d, 0x2, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x29, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x29, 0xff, 0xc0, 0x38, - 0x59, 0x25, 0x6, 0xf, 0x1, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, - 0x35, 0x34, 0x26, 0x27, 0x26, 0x7, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, - 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0xa3, 0x35, 0x4b, 0x13, 0x44, - 0x35, 0x2b, 0x25, 0x1f, 0x1e, 0x13, 0x13, 0x37, 0x1a, 0x13, 0x16, 0x12, 0x1b, 0x55, 0x32, 0x38, - 0x3c, 0x36, 0x60, 0x56, 0x38, 0x31, 0x26, 0x37, 0x78, 0x78, 0x46, 0x28, 0x3f, 0x3d, 0x9, 0x35, - 0x12, 0x4f, 0x2d, 0x3d, 0x1d, 0x1d, 0x11, 0x41, 0x17, 0x24, 0x4, 0x5, 0x5, 0x56, 0x6, 0x3f, - 0x47, 0x83, 0x8c, 0x47, 0x40, 0x3e, 0x31, 0x27, 0xcb, 0xc8, 0x31, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf7, 0x1, 0xcd, 0x3, 0x7, 0x0, 0x3, 0x0, 0x1a, 0x0, 0x20, 0x0, 0x63, 0x40, 0x27, - 0x1, 0x21, 0x21, 0x40, 0x22, 0x4, 0xb, 0x20, 0x1b, 0x1a, 0x12, 0xc, 0x5, 0x4, 0x2, 0x0, - 0x2, 0x1, 0x8, 0x0, 0x20, 0x1b, 0x7, 0x5, 0x4, 0x9, 0x8, 0xe, 0x1e, 0x7, 0x16, 0x0, - 0x16, 0x2, 0xe, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, - 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x21, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, - 0x22, 0x7, 0x1, 0x76, 0x3e, 0x42, 0x35, 0xa2, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, - 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, - 0x6f, 0xd, 0x3, 0x7, 0x9a, 0x99, 0xfd, 0xf1, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, - 0x89, 0x8b, 0x4a, 0x41, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf7, 0x1, 0xcd, 0x3, 0x7, 0x0, 0x3, 0x0, 0x1a, 0x0, 0x20, 0x0, 0x63, 0x40, 0x27, - 0x1, 0x21, 0x21, 0x40, 0x22, 0x4, 0xb, 0x20, 0x1b, 0x1a, 0x12, 0xc, 0x5, 0x4, 0x2, 0x0, - 0x1, 0x0, 0x8, 0x3, 0x20, 0x1b, 0x7, 0x5, 0x4, 0x9, 0x8, 0xe, 0x1e, 0x7, 0x16, 0x2, - 0x16, 0x2, 0xe, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, - 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x21, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x23, 0x27, 0x17, 0x13, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, - 0x22, 0x7, 0x1, 0x3a, 0x42, 0x3e, 0x4b, 0xc8, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, - 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, - 0x6f, 0xd, 0x2, 0x6d, 0x9a, 0x1, 0xfd, 0xf1, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, - 0x89, 0x8b, 0x4a, 0x41, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf7, 0x1, 0xcd, 0x3, 0x5, 0x0, 0x6, 0x0, 0x1d, 0x0, 0x23, 0x0, 0x68, 0x40, 0x29, - 0x1, 0x24, 0x24, 0x40, 0x25, 0x7, 0xe, 0x4, 0x3, 0x2, 0x1, 0x0, 0x23, 0x1e, 0x1d, 0x15, - 0xf, 0x8, 0x7, 0x4, 0x0, 0x23, 0x1e, 0x7, 0x8, 0x7, 0xc, 0x8, 0x11, 0x21, 0x7, 0x19, - 0x6, 0x5, 0x19, 0x2, 0x11, 0x1, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x15, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x21, 0x16, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0x7, 0x1, 0x9a, 0x47, 0x43, 0x43, 0x47, - 0x6a, 0x40, 0x9d, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, 0x30, 0x4b, 0x5f, 0x63, 0x3e, - 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, 0x6f, 0xd, 0x2, 0x73, 0x56, - 0x56, 0x92, 0xfd, 0xf2, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, 0x89, 0x8b, 0x4a, 0x41, - 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x4, 0x0, 0x32, 0xff, 0xf7, 0x1, 0xcd, - 0x2, 0xd7, 0x0, 0xb, 0x0, 0x17, 0x0, 0x2e, 0x0, 0x34, 0x0, 0x69, 0x40, 0x2a, 0x1, 0x35, - 0x35, 0x40, 0x36, 0x18, 0x1f, 0x34, 0x2f, 0x2e, 0x26, 0x20, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, - 0xf, 0x3, 0x8, 0x9, 0x34, 0x2f, 0x7, 0x19, 0x18, 0x1d, 0x8, 0x22, 0x32, 0x7, 0x2a, 0x15, - 0x9, 0x2a, 0x2, 0x22, 0x1, 0x1, 0x26, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, - 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x26, 0x0, 0x35, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x35, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x21, 0x16, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0x7, 0x1, 0xa9, 0x20, 0x16, 0x16, 0x20, - 0x20, 0x16, 0x17, 0x1f, 0xbd, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xe1, 0xfe, 0xc0, - 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, - 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, 0x6f, 0xd, 0x2, 0xa1, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, - 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0xfe, 0x3f, 0x5b, 0x31, 0x2c, 0x39, 0x31, - 0x50, 0x3e, 0x47, 0x89, 0x8b, 0x4a, 0x41, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x2, - 0x0, 0x3b, 0x0, 0x0, 0x1, 0xb, 0x3, 0x7, 0x0, 0x3, 0x0, 0xb, 0x0, 0x5f, 0x40, 0x25, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x4, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, - 0x2, 0x1, 0x8, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x4, 0x0, 0x9, 0x8, 0x2, 0x5, - 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, - 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, - 0x37, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1, 0x4, 0x3e, 0x42, 0x35, 0x52, 0xd0, - 0x3b, 0x55, 0x40, 0x3, 0x7, 0x9a, 0x99, 0xfc, 0xfa, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x2, - 0x0, 0x3b, 0x0, 0x0, 0x1, 0xb, 0x3, 0x7, 0x0, 0x3, 0x0, 0xb, 0x0, 0x5f, 0x40, 0x25, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x4, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, - 0x1, 0x0, 0x8, 0x3, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x4, 0x2, 0x9, 0x8, 0x2, 0x5, - 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, - 0xfd, 0x17, 0x3c, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x23, 0x27, - 0x17, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0xc3, 0x42, 0x3f, 0x4c, 0x7d, 0xd0, 0x3b, - 0x55, 0x40, 0x2, 0x6d, 0x9a, 0x1, 0xfc, 0xfa, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x0, 0x2, - 0x0, 0x41, 0x0, 0x0, 0x1, 0x55, 0x3, 0x5, 0x0, 0x6, 0x0, 0xe, 0x0, 0x64, 0x40, 0x27, - 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0x4, 0x3, 0x2, 0x1, 0x0, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x4, 0x0, 0xe, 0xd, 0xa, 0x3, 0x9, 0x7, 0x7, 0x6, 0x5, 0xc, 0xb, - 0x2, 0x8, 0x7, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, - 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, - 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x1, 0x55, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x46, 0xd1, 0x3c, 0x55, 0x40, 0x2, 0x73, - 0x56, 0x56, 0x92, 0xfc, 0xfb, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x3, 0x0, 0x1b, 0x0, 0x0, - 0x1, 0x22, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x17, 0x0, 0x1f, 0x0, 0x65, 0x40, 0x28, 0x1, 0x20, - 0x20, 0x40, 0x21, 0x0, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, - 0xf, 0x3, 0x8, 0x9, 0x1f, 0x1e, 0x1b, 0x3, 0x1a, 0x7, 0x18, 0x15, 0x9, 0x1d, 0x1c, 0x2, - 0x19, 0x18, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, - 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x20, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x1, 0x22, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x9b, 0x20, 0x16, 0x16, 0x20, - 0x20, 0x16, 0x17, 0x1f, 0x82, 0xd1, 0x3c, 0x55, 0x40, 0x2, 0xa2, 0x16, 0x20, 0x20, 0x16, 0x17, - 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0xfd, 0x47, 0x40, 0x1, 0xd1, 0xfe, - 0x2f, 0x0, 0x0, 0x2, 0x0, 0x5f, 0x0, 0x0, 0x1, 0xf8, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x23, - 0x0, 0x6c, 0x40, 0x2c, 0x1, 0x24, 0x24, 0x40, 0x25, 0x10, 0x1d, 0xf, 0xd, 0x7, 0x2, 0x23, - 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0x11, 0x10, 0x8, 0x0, 0x16, 0x8, 0x1f, 0x5, 0x7, - 0xa, 0xa, 0x1f, 0x2, 0x1c, 0x1b, 0x2, 0x1a, 0x19, 0x11, 0x3, 0x10, 0x1, 0x1, 0x1a, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1a, 0x0, 0x24, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, - 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x13, 0x23, - 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x15, 0x1, 0xc4, 0x31, 0x30, 0x15, 0x46, 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, - 0xd, 0x1f, 0x23, 0x53, 0x55, 0x12, 0x16, 0x39, 0x4c, 0x42, 0x55, 0x55, 0x42, 0x53, 0x51, 0x28, - 0x36, 0x2, 0xa2, 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1a, 0xfd, 0x28, 0x1, 0x54, 0x3f, 0x1c, - 0x22, 0x47, 0xfe, 0x76, 0x2, 0x11, 0x34, 0x3d, 0x23, 0x2e, 0x75, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x3, 0x7, 0x0, 0x3, 0x0, 0x13, 0x0, 0x1b, 0x0, 0x52, 0x40, 0x1e, - 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x4, 0x18, 0x14, 0xc, 0x4, 0x2, 0x0, 0x2, 0x1, 0x8, 0x0, - 0x1a, 0x7, 0x8, 0x16, 0x7, 0x10, 0x0, 0x10, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x1c, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x23, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x76, 0x3e, 0x42, - 0x35, 0xb6, 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, - 0x80, 0x80, 0x7f, 0x3, 0x7, 0x9a, 0x99, 0xfe, 0x2, 0x8d, 0x46, 0x3d, 0x3f, 0x46, 0x8b, 0x8c, - 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x3, 0x0, 0x32, 0xff, 0xf8, 0x1, 0xe1, - 0x3, 0x7, 0x0, 0x3, 0x0, 0x13, 0x0, 0x1b, 0x0, 0x52, 0x40, 0x1e, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0x4, 0x18, 0x14, 0xc, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, 0x3, 0x1a, 0x7, 0x8, 0x16, - 0x7, 0x10, 0x2, 0x10, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x17, - 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x3f, 0x41, 0x3f, 0x4b, 0xd7, 0x41, 0x38, - 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x2, - 0x6d, 0x9a, 0x1, 0xfe, 0x2, 0x8d, 0x46, 0x3d, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, - 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x3, 0x0, 0x32, 0xff, 0xf8, 0x1, 0xe1, 0x3, 0x5, 0x0, 0x6, - 0x0, 0x16, 0x0, 0x1e, 0x0, 0x57, 0x40, 0x20, 0x1, 0x1f, 0x1f, 0x40, 0x20, 0x7, 0x4, 0x3, - 0x2, 0x1, 0x0, 0x1b, 0x17, 0xf, 0x7, 0x4, 0x0, 0x1d, 0x7, 0xb, 0x19, 0x7, 0x13, 0x6, - 0x5, 0x13, 0x2, 0xb, 0x1, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, - 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x1f, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, - 0x7, 0x23, 0x37, 0x33, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x90, 0x47, 0x43, - 0x43, 0x47, 0x6a, 0x40, 0xbb, 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, - 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x2, 0x73, 0x56, 0x56, 0x92, 0xfe, 0x3, 0x8d, 0x46, 0x3d, - 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x4, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x17, 0x0, 0x27, 0x0, 0x2f, 0x0, 0x55, - 0x40, 0x1f, 0x1, 0x30, 0x30, 0x40, 0x31, 0x18, 0xf, 0x3, 0x2c, 0x28, 0x20, 0x18, 0x12, 0xc, - 0x6, 0x0, 0x2e, 0x7, 0x1c, 0x2a, 0x7, 0x24, 0x15, 0x9, 0x24, 0x2, 0x1c, 0x1, 0x1, 0x20, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x20, 0x0, 0x30, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x30, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x14, 0x7, - 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, - 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0xaa, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbd, - 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xf4, 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, - 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x2, 0xa2, 0x16, 0x1f, 0x1f, 0x16, - 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x20, 0x1f, 0xfe, 0x4f, 0x8d, 0x46, 0x3d, - 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x27, 0x0, 0x58, 0x40, 0x21, - 0x1, 0x28, 0x28, 0x40, 0x29, 0x10, 0xf, 0xd, 0x7, 0x2, 0x24, 0x20, 0x18, 0x10, 0x8, 0x0, - 0x26, 0x7, 0x14, 0x22, 0x7, 0x1c, 0x5, 0x7, 0xa, 0xa, 0x1c, 0x2, 0x14, 0x1, 0x1, 0x18, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x18, 0x0, 0x28, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x28, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, - 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x9e, - 0x31, 0x30, 0x15, 0x46, 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, 0xd, 0x1f, 0x23, 0x62, - 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, - 0x7f, 0x2, 0xa2, 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1a, 0xfe, 0x30, 0x8d, 0x46, 0x3d, 0x3f, - 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x0, 0x2, 0x0, 0x5f, - 0xff, 0xf8, 0x1, 0xec, 0x3, 0x7, 0x0, 0x3, 0x0, 0x17, 0x0, 0x66, 0x40, 0x29, 0x1, 0x18, - 0x18, 0x40, 0x19, 0x4, 0x6, 0x17, 0x16, 0x15, 0xf, 0xe, 0xd, 0xc, 0x6, 0x5, 0x4, 0x2, - 0x0, 0x2, 0x1, 0x8, 0x0, 0x13, 0x8, 0x8, 0x0, 0x17, 0x16, 0xe, 0x3, 0xd, 0x2, 0x8, - 0x1, 0x5, 0x4, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, - 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, - 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x23, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x1, 0x7f, 0x3e, 0x42, 0x35, 0xb8, - 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, 0x3a, 0x4d, 0x35, 0x55, 0x3, 0x7, 0x9a, - 0x99, 0xfc, 0xfa, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, - 0x1, 0x90, 0x0, 0x2, 0x0, 0x5f, 0xff, 0xf8, 0x1, 0xec, 0x3, 0x7, 0x0, 0x3, 0x0, 0x17, - 0x0, 0x66, 0x40, 0x29, 0x1, 0x18, 0x18, 0x40, 0x19, 0x4, 0x6, 0x17, 0x16, 0x15, 0xf, 0xe, - 0xd, 0xc, 0x6, 0x5, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, 0x3, 0x13, 0x8, 0x8, 0x2, 0x17, - 0x16, 0xe, 0x3, 0xd, 0x2, 0x8, 0x1, 0x5, 0x4, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x17, 0x13, 0x23, 0x35, 0x6, - 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, - 0x1, 0x4d, 0x42, 0x3e, 0x4b, 0xd4, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, 0x3a, - 0x4d, 0x35, 0x55, 0x2, 0x6d, 0x9a, 0x1, 0xfc, 0xfa, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, - 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, 0x90, 0x0, 0x2, 0x0, 0x5f, 0xff, 0xf8, 0x1, 0xec, - 0x3, 0x5, 0x0, 0x6, 0x0, 0x1a, 0x0, 0x6b, 0x40, 0x2b, 0x1, 0x1b, 0x1b, 0x40, 0x1c, 0x7, - 0x9, 0x4, 0x3, 0x2, 0x1, 0x0, 0x1a, 0x19, 0x18, 0x12, 0x11, 0x10, 0xf, 0x9, 0x8, 0x7, - 0x4, 0x0, 0x16, 0x8, 0xb, 0x6, 0x5, 0x1a, 0x19, 0x11, 0x3, 0x10, 0x2, 0xb, 0x1, 0x8, - 0x7, 0x1, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x17, 0x3c, - 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, - 0x0, 0x1b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1b, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x35, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x1, 0xae, - 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0xa8, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, - 0x3a, 0x4d, 0x35, 0x55, 0x2, 0x73, 0x56, 0x56, 0x92, 0xfc, 0xfb, 0x2f, 0x37, 0x25, 0x31, 0x75, - 0x1, 0x4f, 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, 0x90, 0x0, 0x3, 0x0, 0x5f, 0xff, 0xf8, - 0x1, 0xec, 0x2, 0xd6, 0x0, 0xb, 0x0, 0x17, 0x0, 0x2b, 0x0, 0x6c, 0x40, 0x2c, 0x1, 0x2c, - 0x2c, 0x40, 0x2d, 0x18, 0x1a, 0x2b, 0x2a, 0x29, 0x23, 0x22, 0x21, 0x20, 0x1a, 0x19, 0x18, 0x12, - 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x27, 0x8, 0x1c, 0x15, 0x9, 0x2b, 0x2a, 0x22, 0x3, - 0x21, 0x2, 0x1c, 0x1, 0x19, 0x18, 0x1, 0x1, 0x20, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, 0x2c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x2c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x13, 0x23, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x11, 0x33, 0x1, 0xbe, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xbc, 0x20, - 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xea, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, - 0x15, 0x3a, 0x4d, 0x35, 0x55, 0x2, 0xa0, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0x17, 0x16, - 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0xfd, 0x49, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, 0xfe, - 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, 0x90, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xe5, 0x1, 0xa4, - 0x3, 0x4b, 0x0, 0xb, 0x0, 0x17, 0x0, 0x43, 0x40, 0x15, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, - 0x12, 0xc, 0x6, 0x0, 0x15, 0x7, 0x3, 0xf, 0x7, 0x9, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x1, 0xa4, 0x69, 0x4c, 0x4b, 0x69, 0x69, 0x4b, 0x4c, 0x69, 0x43, 0x41, 0x31, - 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0x2, 0x98, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, 0x4c, - 0x32, 0x3e, 0x3f, 0x31, 0x31, 0x3f, 0x3e, 0x0, 0x0, 0x4, 0x0, 0x3b, 0xff, 0x29, 0x3, 0x9f, - 0x2, 0xdd, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x2b, 0x0, 0x34, 0x0, 0x75, 0x40, 0x31, 0x1, 0x35, - 0x35, 0x40, 0x36, 0x0, 0x30, 0x2f, 0x2c, 0x2b, 0x29, 0x26, 0x25, 0x24, 0x23, 0x20, 0x18, 0x10, - 0x8, 0x0, 0x1c, 0x8, 0x4, 0x14, 0x8, 0xc, 0x31, 0x30, 0x8, 0x23, 0x22, 0x2f, 0x2e, 0x8, - 0x26, 0xc, 0x4, 0x27, 0x26, 0x2, 0x25, 0x24, 0x21, 0x3, 0x20, 0x1, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x2f, 0x2f, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x35, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x35, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x7, 0x23, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x32, 0x15, 0x14, 0x7, 0x37, 0x34, 0x2b, - 0x1, 0x15, 0x33, 0x32, 0x37, 0x36, 0x3, 0x9f, 0x71, 0x76, 0xcb, 0xca, 0x76, 0x72, 0x72, 0x76, - 0xca, 0xcb, 0x76, 0x71, 0x53, 0x58, 0x5e, 0xa9, 0xa8, 0x5e, 0x59, 0x59, 0x5d, 0xa9, 0xa9, 0x5e, - 0x58, 0x8f, 0x5b, 0x58, 0x7d, 0x52, 0xb2, 0xcb, 0x61, 0xe, 0x6d, 0x6b, 0x68, 0x38, 0x19, 0x1f, - 0x1, 0x3, 0xd4, 0x81, 0x85, 0x85, 0x82, 0xd3, 0xd3, 0x82, 0x85, 0x85, 0x81, 0xd4, 0xb4, 0x6b, - 0x70, 0x71, 0x6b, 0xb3, 0xb4, 0x6b, 0x70, 0x71, 0x6b, 0x50, 0xca, 0xca, 0x2, 0x11, 0xa3, 0x6b, - 0x2e, 0x9a, 0x58, 0xb3, 0x11, 0x14, 0x0, 0x3, 0x0, 0x3b, 0xff, 0x29, 0x3, 0x9f, 0x2, 0xdd, - 0x0, 0xf, 0x0, 0x1f, 0x0, 0x35, 0x0, 0x5f, 0x40, 0x25, 0x1, 0x36, 0x36, 0x40, 0x37, 0x0, - 0x35, 0x2d, 0x31, 0x2c, 0x26, 0x20, 0x18, 0x10, 0x8, 0x0, 0x1c, 0x8, 0x4, 0x14, 0x8, 0xc, - 0x33, 0x8, 0x22, 0x2f, 0x8, 0x2a, 0xc, 0x4, 0x2a, 0x2, 0x22, 0x1, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x8, 0x0, 0x36, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x36, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, - 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x3, 0x9f, 0x71, - 0x76, 0xcb, 0xca, 0x76, 0x72, 0x72, 0x76, 0xca, 0xcb, 0x76, 0x71, 0x53, 0x58, 0x5e, 0xa9, 0xa8, - 0x5e, 0x59, 0x59, 0x5d, 0xa9, 0xa9, 0x5e, 0x58, 0xb8, 0x3f, 0x60, 0x5c, 0x37, 0x3f, 0x3c, 0x36, - 0x60, 0x56, 0x38, 0x31, 0x24, 0x39, 0x78, 0x78, 0x46, 0x28, 0x1, 0x3, 0xd4, 0x81, 0x85, 0x85, - 0x82, 0xd3, 0xd3, 0x82, 0x85, 0x85, 0x81, 0xd4, 0xb4, 0x6b, 0x70, 0x71, 0x6b, 0xb3, 0xb4, 0x6b, - 0x70, 0x71, 0x6b, 0x14, 0x47, 0x3e, 0x47, 0x8a, 0x8c, 0x47, 0x40, 0x3e, 0x31, 0x27, 0xcb, 0xc7, - 0x30, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xae, 0x3, 0x3e, 0x3, 0x32, 0x0, 0xf, 0x0, 0x17, - 0x0, 0x7d, 0x40, 0x34, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, - 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, 0x1, 0x0, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, - 0xf, 0xa, 0x9, 0x8, 0x7, 0x2, 0x1, 0x0, 0x5, 0x4, 0xd, 0xc, 0x2, 0x17, 0x16, 0xf, - 0xe, 0xb, 0x5, 0xa, 0x4, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x18, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x23, 0x35, 0x23, 0x7, 0x23, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x13, 0x33, 0x13, 0x33, 0x5, - 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x3, 0x3e, 0x43, 0x3, 0x6b, 0x23, 0x6b, 0x4, 0x43, - 0x49, 0x79, 0x4, 0x7b, 0x45, 0xfe, 0x4f, 0x8a, 0x43, 0x85, 0x1, 0x52, 0x1, 0xb1, 0xf6, 0xf9, - 0xfb, 0xf8, 0x1, 0x81, 0xfe, 0xe6, 0x1, 0x1a, 0x3b, 0xfe, 0xba, 0x1, 0x46, 0x3b, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0x8a, 0x1, 0xb5, 0x2, 0x2c, 0x0, 0x13, 0x0, 0x73, 0x40, 0x31, 0x1, 0x14, - 0x14, 0x40, 0x15, 0x0, 0x13, 0x12, 0x10, 0xf, 0xe, 0xd, 0xa, 0x9, 0x8, 0x6, 0x5, 0x4, - 0x3, 0x0, 0x13, 0x12, 0x7, 0x3, 0x6, 0x7, 0x5, 0x4, 0x1, 0x3, 0x0, 0x11, 0x10, 0x9, - 0x3, 0x8, 0x7, 0xf, 0xe, 0xb, 0x3, 0xa, 0xd, 0xc, 0x3, 0x2, 0x1, 0x5, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, - 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x14, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x25, - 0x23, 0x7, 0x23, 0x37, 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x33, 0x37, 0x33, 0x7, 0x33, 0x15, - 0x23, 0x7, 0x33, 0x1, 0xb5, 0xd2, 0x23, 0x3d, 0x23, 0x6b, 0x83, 0x20, 0xa3, 0xba, 0x27, 0x3d, - 0x27, 0x83, 0x9a, 0x20, 0xba, 0xec, 0x62, 0x62, 0x40, 0x57, 0x40, 0x69, 0x69, 0x40, 0x57, 0x0, - 0x0, 0x2, 0x0, 0x3b, 0x0, 0x61, 0x1, 0xae, 0x2, 0x3a, 0x0, 0xb, 0x0, 0xf, 0x0, 0x71, - 0x40, 0x2e, 0x1, 0x10, 0x10, 0x40, 0x11, 0xc, 0x3, 0x2, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x5, 0x4, 0x1, 0x3, 0x0, 0x7, - 0xb, 0xa, 0x7, 0x3, 0x6, 0xf, 0xe, 0x7, 0xc, 0x9, 0x8, 0xd, 0xc, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, - 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x10, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x13, 0x21, 0x35, - 0x21, 0x1, 0xad, 0x99, 0x40, 0x99, 0x99, 0x40, 0x99, 0x1, 0xfe, 0x8e, 0x1, 0x72, 0x1, 0x61, - 0x99, 0x99, 0x40, 0x99, 0x99, 0xfe, 0xc0, 0x40, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xfc, 0x2, 0xc4, - 0x2, 0x17, 0x0, 0x9, 0x0, 0x4b, 0x40, 0x19, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x6, 0x5, - 0x2, 0x1, 0x7, 0x5, 0x4, 0x3, 0x2, 0x0, 0x9, 0x8, 0x2, 0x4, 0x3, 0x1, 0x1, 0x7, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0xa, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x27, 0x11, 0x23, 0x11, 0x7, 0x27, 0x25, 0x33, 0x2, 0xc4, 0x23, 0xfb, 0x53, - 0xef, 0x29, 0x1, 0x34, 0x14, 0x1, 0x5b, 0x43, 0x8b, 0xfe, 0x59, 0x1, 0xa2, 0x81, 0x3e, 0xbc, - 0x0, 0x1, 0x0, 0x3b, 0xff, 0xf9, 0x2, 0xc4, 0x2, 0x15, 0x0, 0x9, 0x0, 0x4b, 0x40, 0x19, - 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x5, 0x4, 0x8, 0x7, 0x6, 0x5, 0x3, 0x0, - 0x7, 0x6, 0x2, 0x2, 0x1, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x5, 0x23, 0x25, 0x37, 0x17, 0x11, - 0x33, 0x11, 0x37, 0x2, 0xc4, 0xfe, 0xcb, 0x13, 0xfe, 0xbf, 0x22, 0xfc, 0x53, 0xef, 0xb6, 0xbd, - 0xbd, 0x42, 0x8b, 0x1, 0xa8, 0xfe, 0x5d, 0x81, 0x0, 0x1, 0x0, 0x5f, 0xfe, 0xd8, 0x1, 0xfe, - 0x2, 0x12, 0x0, 0x17, 0x0, 0x61, 0x40, 0x26, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x7, 0x3, - 0x15, 0x14, 0x13, 0x12, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x0, 0x10, 0x8, 0x5, 0x9, 0x8, - 0x14, 0x13, 0xb, 0x3, 0xa, 0x2, 0x5, 0x1, 0x1, 0x0, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x9, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, 0x11, - 0x23, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x14, 0x16, 0x1, - 0xfe, 0x58, 0xa, 0x5, 0x38, 0x53, 0x35, 0x23, 0x55, 0x55, 0x14, 0x16, 0x37, 0x4d, 0x35, 0x55, - 0xb, 0xd, 0x22, 0x37, 0x10, 0xfe, 0xd0, 0x3, 0x3a, 0xfe, 0x9d, 0x3b, 0x18, 0x1b, 0x41, 0x1, - 0x90, 0xfe, 0x63, 0x3c, 0x27, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xe6, 0x2, 0xde, 0x3, 0xc, - 0x0, 0x11, 0x0, 0x62, 0x40, 0x27, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, 0x11, 0xf, 0xe, 0xd, - 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x0, 0xe, 0xd, 0xa, 0x9, 0x5, 0x5, - 0x6, 0x8, 0xb, 0x0, 0xc, 0xb, 0x3, 0x8, 0x7, 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0xa, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x22, 0x27, 0x26, 0x35, 0x11, 0x25, 0x11, 0x23, 0x11, - 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x14, 0x33, 0x2, 0xde, 0x5d, 0x37, 0x3f, 0xfe, 0xf9, 0x5c, - 0x6d, 0x2, 0xa3, 0x78, 0x78, 0x1a, 0x2e, 0x34, 0x6b, 0x2, 0x6, 0x1, 0xfd, 0x46, 0x2, 0xba, - 0x52, 0x52, 0xfe, 0xe, 0x92, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xe6, 0x2, 0x31, 0x2, 0x12, - 0x0, 0x11, 0x0, 0x67, 0x40, 0x2a, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, 0x11, 0x10, 0xf, 0xe, - 0xd, 0xc, 0xb, 0xa, 0x9, 0x7, 0x6, 0x2, 0x1, 0x0, 0x6, 0x8, 0x7, 0xf, 0xe, 0xb, - 0xa, 0x1, 0x5, 0x0, 0x7, 0x10, 0x7, 0x11, 0x10, 0x2, 0xd, 0xc, 0x1, 0x1, 0xf, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x11, 0x14, 0x17, - 0x16, 0x17, 0x15, 0x22, 0x35, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x2, 0x31, 0x43, - 0x8, 0xb, 0x24, 0x8c, 0xc4, 0x55, 0x45, 0x1, 0xf6, 0x1, 0xd2, 0xfe, 0xbd, 0x34, 0x11, 0x15, - 0x3, 0x4c, 0x94, 0x1, 0x58, 0xfe, 0x2e, 0x1, 0xd2, 0x40, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x61, - 0x1, 0x97, 0x3, 0x32, 0x0, 0x15, 0x0, 0x4c, 0x40, 0x1a, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, - 0x1, 0x10, 0xf, 0xd, 0xc, 0x8, 0x7, 0x0, 0x3, 0x7, 0x14, 0xd, 0x7, 0xc, 0xc, 0x14, - 0x4, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0xc, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x11, 0x14, 0x7, 0x6, - 0x23, 0x35, 0x32, 0x35, 0x11, 0x34, 0x37, 0x36, 0x33, 0x32, 0x1, 0x97, 0x1b, 0x22, 0x2b, 0x26, - 0xc, 0x8, 0x3a, 0x30, 0x50, 0x65, 0x24, 0x1e, 0x43, 0x40, 0x3, 0xe, 0x42, 0x20, 0x1d, 0x15, - 0x38, 0xfd, 0x77, 0x50, 0x28, 0x20, 0x44, 0x52, 0x2, 0x89, 0x65, 0x2a, 0x23, 0x0, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0xae, 0x1, 0xb7, 0x1, 0x66, 0x0, 0x5, 0x0, 0x48, 0x40, 0x17, 0x1, 0x6, - 0x6, 0x40, 0x7, 0x0, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x7, 0x4, 0x5, 0x4, - 0x1, 0x0, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x3, 0x0, 0x6, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x6, - 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x35, 0x21, 0x35, 0x21, 0x1, 0xb7, 0x40, 0xfe, 0xc4, 0x1, - 0x7c, 0xae, 0x78, 0x40, 0x0, 0x5, 0x0, 0x55, 0xff, 0xfb, 0x3, 0x62, 0x3, 0x28, 0x0, 0xb, - 0x0, 0x1a, 0x0, 0x26, 0x0, 0x32, 0x0, 0x3e, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x3f, 0x3f, 0x40, - 0x40, 0x0, 0x38, 0x34, 0x17, 0x39, 0x33, 0x2d, 0x27, 0x21, 0x1b, 0x13, 0xc, 0x6, 0x0, 0x2a, - 0x1e, 0x8, 0x30, 0x24, 0x10, 0x7, 0x9, 0x3b, 0x7, 0x36, 0x9, 0x3, 0x1, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x3f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x3f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x16, - 0x33, 0x32, 0x37, 0x36, 0x3, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x7, 0x26, 0x23, - 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x3, 0x62, 0xe2, 0xa5, 0xa4, 0xe2, 0xe2, 0xa4, - 0xa5, 0xe2, 0x4e, 0x57, 0x5a, 0x88, 0x87, 0xb1, 0x57, 0x5a, 0x87, 0x88, 0x5a, 0x57, 0xa7, 0x1e, - 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0xae, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x15, 0x16, 0x1e, - 0x1, 0xb, 0x2b, 0x57, 0x68, 0x67, 0x56, 0x2d, 0x79, 0x71, 0x4a, 0x45, 0x24, 0x1, 0x91, 0xa8, - 0xee, 0xee, 0xa8, 0xa8, 0xef, 0xef, 0xa8, 0x8c, 0x61, 0x64, 0xc5, 0x8c, 0x8c, 0x61, 0x64, 0x64, - 0x61, 0x1, 0xd, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, - 0x1e, 0x1e, 0xfe, 0xe5, 0x2d, 0x5a, 0x5c, 0x2d, 0x70, 0x28, 0x15, 0x0, 0x0, 0x1c, 0x0, 0x64, - 0xff, 0x50, 0x4, 0xb7, 0x3, 0x8e, 0x0, 0xd, 0x0, 0x14, 0x0, 0x19, 0x0, 0x1d, 0x0, 0x21, - 0x0, 0x25, 0x0, 0x29, 0x0, 0x2d, 0x0, 0x33, 0x0, 0x37, 0x0, 0x3b, 0x0, 0x40, 0x0, 0x45, - 0x0, 0x49, 0x0, 0x4d, 0x0, 0x51, 0x0, 0x55, 0x0, 0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x68, - 0x0, 0x6c, 0x0, 0x71, 0x0, 0x76, 0x0, 0x7a, 0x0, 0x7e, 0x0, 0x83, 0x0, 0x87, 0x1, 0x1c, - 0x40, 0x81, 0x1, 0x88, 0x88, 0x40, 0x89, 0x0, 0x86, 0x84, 0x82, 0x80, 0x7d, 0x7b, 0x7a, 0x78, - 0x76, 0x73, 0x70, 0x6e, 0x6b, 0x69, 0x68, 0x66, 0x64, 0x62, 0x5d, 0x5a, 0x57, 0x55, 0x53, 0x51, - 0x4f, 0x4d, 0x4b, 0x48, 0x46, 0x44, 0x41, 0x3f, 0x3c, 0x3b, 0x39, 0x37, 0x35, 0x32, 0x2f, 0x2d, - 0x2b, 0x28, 0x26, 0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x18, 0x16, 0x14, 0x10, 0x9, 0x8, 0x86, - 0x84, 0x80, 0x7f, 0x7d, 0x7b, 0x79, 0x77, 0x74, 0x72, 0x70, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x62, - 0x61, 0x5f, 0x5c, 0x59, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x43, 0x41, 0x3e, - 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x31, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, - 0x1a, 0x18, 0x15, 0x13, 0x12, 0xe, 0xb, 0x8, 0x7, 0x3, 0x2, 0x0, 0xc, 0x6, 0x5f, 0x1, - 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x88, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x88, 0xff, 0xc0, 0x38, 0x59, 0x1, 0xf, 0x1, 0x17, - 0x3, 0x1, 0x7, 0x27, 0x37, 0x7, 0x27, 0x3, 0x25, 0x5, 0x7, 0x2f, 0x1, 0xf, 0x1, 0x15, - 0x17, 0x37, 0x27, 0xf, 0x1, 0x37, 0x2f, 0x1, 0x7, 0x1f, 0x1, 0x27, 0x7, 0x17, 0x3, 0x27, - 0x7, 0x17, 0x5, 0xf, 0x1, 0x37, 0x3, 0x27, 0x7, 0x17, 0x5, 0x27, 0xf, 0x1, 0x17, 0x37, - 0x1, 0x27, 0x7, 0x17, 0x5, 0x27, 0x7, 0x1f, 0x1, 0xf, 0x1, 0x17, 0x3f, 0x1, 0xf, 0x1, - 0x17, 0x37, 0x3, 0xf, 0x1, 0x37, 0x3, 0x27, 0x7, 0x17, 0x2f, 0x1, 0x7, 0x17, 0x1, 0x27, - 0x7, 0x17, 0x37, 0x27, 0xf, 0x1, 0x17, 0x37, 0x2f, 0x1, 0xf, 0x1, 0x37, 0x1, 0x27, 0x1f, - 0x2, 0x27, 0x7, 0x17, 0x1, 0x2f, 0x1, 0x17, 0x1, 0x27, 0xf, 0x1, 0x37, 0x1, 0x27, 0x7, - 0x1f, 0x2, 0x27, 0x7, 0x17, 0x1, 0x2f, 0x1, 0x17, 0x5, 0x27, 0x1f, 0x1, 0x37, 0x2f, 0x2, - 0x17, 0x4, 0xb7, 0x3d, 0x1c, 0x10, 0x73, 0xfe, 0xe1, 0x19, 0xad, 0x1, 0x30, 0xfe, 0x85, 0x2, - 0x5c, 0x1, 0xe1, 0x10, 0x8, 0x7e, 0x8, 0x3e, 0x8b, 0x4b, 0x2, 0x49, 0x3a, 0x4a, 0x69, 0x95, - 0x75, 0xa3, 0xb3, 0xac, 0x83, 0xc0, 0x86, 0x8e, 0x83, 0x9b, 0x1, 0x65, 0x66, 0x33, 0x5e, 0x81, - 0xa6, 0x96, 0xb7, 0x1, 0x54, 0xb, 0x33, 0x2a, 0xb, 0x2f, 0xfe, 0xa4, 0x9d, 0xa8, 0xac, 0x1, - 0x97, 0xc4, 0xaf, 0xdd, 0xd1, 0x60, 0x29, 0xf, 0x47, 0x50, 0x45, 0x27, 0xb, 0x2a, 0x21, 0x83, - 0x29, 0x78, 0xa9, 0xb9, 0xc7, 0xcf, 0x20, 0xae, 0xdd, 0xc1, 0x1, 0xd3, 0xd9, 0x7, 0xbb, 0xc3, - 0xc, 0x46, 0x1f, 0xf, 0x42, 0x19, 0x7, 0x6a, 0x1f, 0x65, 0xfe, 0xd4, 0xcd, 0x16, 0xb3, 0xcc, - 0xb7, 0x7, 0xa2, 0xfe, 0x88, 0x18, 0xbe, 0x2b, 0x2, 0x9d, 0xa, 0x58, 0x14, 0x58, 0xfe, 0xf4, - 0x84, 0x27, 0xa, 0x9d, 0xb1, 0xa0, 0x4, 0x93, 0xfe, 0xb2, 0x12, 0xa9, 0x25, 0x1, 0x43, 0x9a, - 0xd, 0x4d, 0x3f, 0x9b, 0xf, 0x96, 0x1d, 0x2, 0x8e, 0x95, 0x1b, 0xb, 0xfe, 0xb9, 0xfe, 0xc6, - 0x2, 0x5c, 0x34, 0x19, 0x8d, 0x2, 0x81, 0xb9, 0xc7, 0x26, 0x18, 0x36, 0x5, 0x24, 0x1e, 0x3b, - 0x1a, 0x6, 0x3c, 0x9e, 0x48, 0xfc, 0x3c, 0x31, 0x45, 0x5b, 0x49, 0x4c, 0x54, 0x1, 0x30, 0x3a, - 0x29, 0x41, 0xca, 0x55, 0xb0, 0x62, 0x1, 0x17, 0x46, 0x40, 0x51, 0xa2, 0x7, 0x35, 0x77, 0x7, - 0x30, 0x1, 0xb8, 0x42, 0x35, 0x4c, 0xc8, 0x57, 0x66, 0x67, 0x1, 0x61, 0x81, 0x8, 0x52, 0x46, - 0x4d, 0x7c, 0x5, 0x31, 0x1, 0x44, 0x6c, 0xc6, 0x7b, 0x1, 0x3b, 0x52, 0x54, 0x62, 0xc1, 0x4d, - 0x45, 0x5a, 0xff, 0x0, 0x67, 0xce, 0x60, 0x12, 0x9, 0x54, 0x68, 0x9, 0x4e, 0xb0, 0x6, 0x6e, - 0x99, 0x71, 0x1, 0x76, 0x62, 0xd6, 0x5c, 0x81, 0x5f, 0xa6, 0x57, 0x1, 0x87, 0xd5, 0x5a, 0xd8, - 0xfe, 0x6f, 0x7, 0x62, 0x71, 0x63, 0x1, 0x23, 0x44, 0x26, 0x6f, 0x55, 0x72, 0x56, 0x7b, 0x4f, - 0x1, 0x44, 0xad, 0x57, 0xb5, 0xc0, 0x54, 0x81, 0x29, 0x22, 0xf, 0x82, 0x51, 0x87, 0x0, 0x2, - 0x0, 0x59, 0x0, 0x1, 0x2, 0xc3, 0x3, 0x20, 0x0, 0x5, 0x0, 0xe, 0x0, 0x4a, 0x40, 0x18, - 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0xc, 0x9, 0x6, 0xc, 0x6, 0x3, 0x0, 0xe, 0xd, 0x8, - 0x1, 0x5, 0x4, 0x2, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, - 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x7, 0x21, 0x27, 0x1, 0x33, 0x13, 0x27, - 0x3, 0x27, 0x7, 0x3, 0x7, 0x37, 0x21, 0x2, 0xc3, 0xa, 0xfd, 0xaa, 0xa, 0x1, 0x2a, 0x16, - 0xc4, 0x16, 0xa6, 0x13, 0x12, 0xa5, 0x17, 0x33, 0x1, 0x37, 0xd, 0xc, 0xc, 0x3, 0x13, 0xfd, - 0x23, 0x2b, 0x1, 0xcd, 0x46, 0x46, 0xfe, 0x33, 0x2b, 0x8, 0x0, 0x3, 0x0, 0x20, 0x0, 0x0, - 0x2, 0x9b, 0x3, 0xbb, 0x0, 0x3, 0x0, 0xb, 0x0, 0x10, 0x0, 0x5e, 0x40, 0x24, 0x1, 0x11, - 0x11, 0x40, 0x12, 0x4, 0xe, 0xd, 0xb, 0xa, 0x10, 0xc, 0x9, 0x4, 0x2, 0x0, 0x1, 0x0, - 0x8, 0x2, 0x10, 0xc, 0x8, 0x7, 0x6, 0x3, 0x2, 0x9, 0x8, 0x5, 0x3, 0x4, 0x1, 0x1, - 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x11, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x33, 0x1, 0x23, - 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0x7c, 0x42, 0x3e, 0x4b, - 0x1, 0x54, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, - 0x3, 0x22, 0x99, 0xfc, 0x45, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, 0xfe, 0xbb, - 0x0, 0x3, 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0x7e, 0x0, 0xf, 0x0, 0x17, 0x0, 0x1c, - 0x0, 0x5f, 0x40, 0x24, 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0x10, 0x1a, 0x19, 0x17, 0x16, 0xf, 0xd, - 0x7, 0x5, 0x2, 0x1c, 0x18, 0x15, 0x10, 0x8, 0x0, 0x1c, 0x18, 0x8, 0x13, 0x12, 0xa, 0x15, - 0x14, 0x11, 0x3, 0x10, 0x1, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x1d, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, - 0x37, 0x13, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xf6, - 0x31, 0x2f, 0x16, 0x46, 0x15, 0x20, 0x1e, 0x22, 0x30, 0x35, 0x17, 0x47, 0xd, 0x1e, 0x24, 0xc4, - 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, 0x3, 0x41, - 0x26, 0x20, 0x19, 0x33, 0x29, 0x21, 0x1a, 0xfc, 0x89, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, - 0x73, 0x2e, 0xfe, 0xbb, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xce, 0x3, 0x60, 0x0, 0x11, - 0x0, 0x21, 0x0, 0x31, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x32, 0x32, 0x40, 0x33, 0x12, 0x2e, 0x11, - 0xd, 0x7, 0x5, 0x2, 0x2a, 0x22, 0x1a, 0x12, 0x8, 0x0, 0x26, 0x8, 0x1e, 0xa, 0x16, 0x1, - 0x1, 0x1a, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1a, 0x0, 0x32, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x32, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, - 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, - 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0x2b, 0x30, 0x30, 0x16, 0x46, 0x15, 0x20, 0x1e, - 0x22, 0x30, 0x35, 0x17, 0x47, 0xd, 0x13, 0x6, 0xf, 0x1a, 0xc2, 0x5c, 0x57, 0x89, 0x88, 0x57, - 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, 0x2d, 0x3c, - 0x73, 0x74, 0x3c, 0x2d, 0x3, 0x23, 0x25, 0x1f, 0x19, 0x33, 0x29, 0x20, 0x2, 0x4, 0x14, 0xfe, - 0xf, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, - 0x6b, 0x52, 0x69, 0x69, 0x52, 0x6c, 0x6b, 0x52, 0x0, 0x3, 0x0, 0x3b, 0x0, 0x38, 0x1, 0x97, - 0x1, 0xf4, 0x0, 0xb, 0x0, 0xf, 0x0, 0x1b, 0x0, 0x54, 0x40, 0x1e, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0xc, 0x16, 0x10, 0xf, 0xe, 0xd, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x19, 0x8, 0x13, - 0xf, 0xe, 0x7, 0xd, 0xc, 0x9, 0x13, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, - 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x1c, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x21, 0x35, 0x21, 0x7, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x2a, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x6d, 0xfe, 0xa4, 0x1, 0x5c, 0x6d, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, - 0x1a, 0x26, 0x1, 0xb4, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0xda, 0x40, 0xbc, 0x1b, 0x25, - 0x25, 0x1b, 0x1b, 0x26, 0x26, 0x0, 0x0, 0x3, 0x0, 0x14, 0xfe, 0xdf, 0x1, 0xcd, 0x2, 0xd7, - 0x0, 0xb, 0x0, 0x17, 0x0, 0x26, 0x0, 0x5d, 0x40, 0x24, 0x1, 0x27, 0x27, 0x40, 0x28, 0x18, - 0x25, 0x24, 0x22, 0x21, 0x1c, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x1c, 0x7, - 0x1b, 0x15, 0x9, 0x1b, 0x0, 0x26, 0x23, 0x22, 0x3, 0x18, 0x2, 0x1, 0x22, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x22, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x27, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x5, 0x3, 0x6, - 0x7, 0x27, 0x36, 0x37, 0x36, 0x3f, 0x1, 0x3, 0x33, 0x13, 0x33, 0x13, 0x1, 0x86, 0x20, 0x16, - 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbd, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x1, - 0x4, 0xcf, 0x3f, 0x9d, 0x8, 0x3d, 0x24, 0x23, 0x19, 0xf, 0xb2, 0x5b, 0x7d, 0x4, 0x87, 0x2, - 0xa1, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, - 0xa7, 0xfd, 0x98, 0xbd, 0xd, 0x42, 0x6, 0x28, 0x25, 0x52, 0x31, 0x2, 0x1a, 0xfe, 0x59, 0x1, - 0xa7, 0x0, 0x0, 0x3, 0x0, 0x1d, 0x0, 0x0, 0x2, 0x79, 0x3, 0x82, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x21, 0x0, 0x5b, 0x40, 0x22, 0x1, 0x22, 0x22, 0x40, 0x23, 0x18, 0x20, 0x1f, 0xf, 0x3, - 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, 0x15, 0x9, 0x1b, 0x1a, 0x1, 0x21, - 0x1e, 0x1d, 0x3, 0x18, 0x3, 0x1, 0x1d, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1d, 0x0, 0x22, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x5, 0x1, 0x11, 0x23, 0x11, 0x1, 0x33, 0x13, 0x33, - 0x13, 0x1, 0xd3, 0x1e, 0x16, 0x15, 0x1e, 0x1e, 0x15, 0x16, 0x1e, 0xaa, 0x1e, 0x15, 0x15, 0x1e, - 0x1e, 0x15, 0x15, 0x1e, 0x1, 0x50, 0xfe, 0xfd, 0x57, 0xfe, 0xfe, 0x63, 0xc7, 0x7, 0xc7, 0x3, - 0x4e, 0x16, 0x1e, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x15, 0x16, 0x1e, 0x1e, 0x16, 0x15, 0x1f, 0x1f, - 0x57, 0xfe, 0x36, 0xfe, 0xbe, 0x1, 0x42, 0x1, 0xca, 0xfe, 0x97, 0x1, 0x69, 0x0, 0x0, 0x3, - 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0xab, 0x0, 0x6, 0x0, 0xe, 0x0, 0x13, 0x0, 0x61, - 0x40, 0x25, 0x1, 0x14, 0x14, 0x40, 0x15, 0x7, 0x11, 0x10, 0xe, 0xd, 0x4, 0x3, 0x2, 0x1, - 0x0, 0x13, 0xf, 0xc, 0x7, 0x4, 0x0, 0x13, 0xf, 0x8, 0xa, 0x9, 0x6, 0x5, 0xc, 0xb, - 0x8, 0x3, 0x7, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, - 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x14, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, - 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xea, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x1, 0x1b, 0x5d, - 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, 0x3, 0x19, 0x56, - 0x56, 0x92, 0xfc, 0x55, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, 0xfe, 0xbb, 0x0, - 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, 0x2, 0x3f, 0x3, 0xb2, 0x0, 0x6, 0x0, 0x12, 0x0, 0x75, - 0x40, 0x2f, 0x1, 0x13, 0x13, 0x40, 0x14, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x12, 0x11, 0x10, - 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x4, 0x0, 0x12, 0x11, 0x7, 0x7, 0xc, - 0xb, 0x8, 0xa, 0x9, 0xe, 0xd, 0x8, 0x10, 0xf, 0x6, 0x5, 0x8, 0x7, 0x1, 0x1, 0x8, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x21, 0x11, 0x21, - 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x1, 0xe5, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, - 0xc4, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, 0xca, 0x1, 0x6e, 0x3, 0x20, 0x56, - 0x56, 0x92, 0xfc, 0x4e, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, 0x0, 0x0, 0x3, 0x0, 0x20, - 0x0, 0x0, 0x2, 0x9b, 0x3, 0xb8, 0x0, 0x3, 0x0, 0xb, 0x0, 0x10, 0x0, 0x5c, 0x40, 0x23, - 0x1, 0x11, 0x11, 0x40, 0x12, 0x4, 0xe, 0xd, 0xb, 0xa, 0x10, 0xc, 0x9, 0x4, 0x2, 0x0, - 0x2, 0x1, 0x8, 0x0, 0x10, 0xc, 0x8, 0x7, 0x6, 0x0, 0x9, 0x8, 0x5, 0x3, 0x4, 0x1, - 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x11, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x27, 0x37, 0x1, 0x23, - 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xbb, 0x3e, 0x42, 0x35, - 0x1, 0x2b, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, - 0x3, 0xb8, 0x9a, 0x1, 0x98, 0xfc, 0x49, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, - 0xfe, 0xbb, 0x0, 0x3, 0x0, 0x75, 0x0, 0x0, 0x2, 0x3f, 0x3, 0x86, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x23, 0x0, 0x76, 0x40, 0x30, 0x1, 0x24, 0x24, 0x40, 0x25, 0x18, 0x23, 0x22, 0x21, 0x20, - 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, - 0x23, 0x22, 0x7, 0x18, 0x1d, 0x1c, 0x8, 0x1b, 0x1a, 0x1f, 0x1e, 0x8, 0x21, 0x20, 0x15, 0x9, - 0x19, 0x18, 0x1, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, - 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x1, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x1, 0xf3, - 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xc9, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, - 0x1f, 0x1, 0x15, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, 0xca, 0x1, 0x6e, 0x3, - 0x50, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, - 0xfc, 0x99, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, 0x0, 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, - 0x2, 0x3f, 0x3, 0xb9, 0x0, 0xb, 0x0, 0xf, 0x0, 0x6a, 0x40, 0x28, 0x1, 0x10, 0x10, 0x40, - 0x11, 0x0, 0xe, 0xd, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0xe, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xf, 0xc, 0x1, 0x0, - 0x1, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x1, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, - 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, - 0x1, 0x17, 0x33, 0x27, 0x2, 0x3f, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, 0xca, - 0x1, 0x6e, 0xfe, 0xd6, 0x3e, 0x42, 0x36, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, 0x3, 0x72, - 0x99, 0x99, 0x0, 0x2, 0x0, 0x39, 0x0, 0x0, 0x1, 0x7, 0x3, 0xb9, 0x0, 0x3, 0x0, 0xf, - 0x0, 0x6e, 0x40, 0x2d, 0x1, 0x10, 0x10, 0x40, 0x11, 0x4, 0x2, 0x1, 0xf, 0xe, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, 0xd, 0xc, 0x9, 0x3, 0x8, 0x7, - 0xb, 0xa, 0xf, 0xe, 0x7, 0x3, 0x6, 0x7, 0x4, 0x3, 0x0, 0x5, 0x4, 0x1, 0x1, 0x5, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x10, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, - 0x13, 0x7, 0x23, 0x37, 0x13, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, - 0xfd, 0x3e, 0x42, 0x35, 0x55, 0xce, 0x3c, 0x3c, 0xce, 0x3c, 0x3c, 0x3, 0xb9, 0x99, 0x99, 0xfc, - 0x47, 0x38, 0x2, 0x66, 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x2, 0x0, 0x33, 0x0, 0x0, 0x1, 0x47, - 0x3, 0xb2, 0x0, 0x6, 0x0, 0x12, 0x0, 0x74, 0x40, 0x30, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, - 0x4, 0x3, 0x2, 0x1, 0x0, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, - 0x7, 0x4, 0x0, 0x10, 0xf, 0xc, 0x3, 0xb, 0x7, 0xe, 0xd, 0x12, 0x11, 0xa, 0x3, 0x9, - 0x7, 0x7, 0x6, 0x5, 0x8, 0x7, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, - 0x23, 0x37, 0x33, 0x13, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x1, - 0x47, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x47, 0xcd, 0x3c, 0x3c, 0xcd, 0x3b, 0x3b, 0x3, 0x20, - 0x56, 0x56, 0x92, 0xfc, 0x4e, 0x38, 0x2, 0x66, 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x3, 0x0, 0x23, - 0x0, 0x0, 0x1, 0x56, 0x3, 0x85, 0x0, 0xb, 0x0, 0x17, 0x0, 0x23, 0x0, 0x75, 0x40, 0x31, - 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, - 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x21, 0x20, 0x1d, 0x3, 0x1c, 0x7, - 0x1f, 0x1e, 0x23, 0x22, 0x1b, 0x3, 0x1a, 0x7, 0x18, 0x15, 0x9, 0x19, 0x18, 0x1, 0x1, 0x12, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, - 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, - 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, - 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x1, 0x56, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, - 0x20, 0xc7, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x95, 0xcd, 0x3c, 0x3c, 0xcd, 0x3b, - 0x3b, 0x3, 0x4f, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, - 0x20, 0x20, 0xfc, 0x9b, 0x38, 0x2, 0x66, 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x0, 0x2, 0x0, 0x4d, - 0x0, 0x0, 0x1, 0x1e, 0x3, 0xb9, 0x0, 0x3, 0x0, 0xf, 0x0, 0x71, 0x40, 0x2f, 0x1, 0x10, - 0x10, 0x40, 0x11, 0x4, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, - 0x2, 0x0, 0x1, 0x0, 0x8, 0x2, 0xd, 0xc, 0x9, 0x3, 0x8, 0x7, 0xb, 0xa, 0xf, 0xe, - 0x7, 0x3, 0x6, 0x7, 0x4, 0x3, 0x2, 0x5, 0x4, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, 0xfd, 0x17, 0x3c, 0x10, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x23, 0x27, - 0x33, 0x13, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0xce, 0x42, 0x3f, - 0x4c, 0x85, 0xcd, 0x3c, 0x3c, 0xcd, 0x3b, 0x3b, 0x3, 0x20, 0x99, 0xfc, 0x47, 0x38, 0x2, 0x66, - 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xce, 0x3, 0xba, 0x0, 0x3, - 0x0, 0x13, 0x0, 0x23, 0x0, 0x4c, 0x40, 0x1a, 0x1, 0x24, 0x24, 0x40, 0x25, 0x4, 0x20, 0x1c, - 0x14, 0xc, 0x4, 0x2, 0x0, 0x2, 0x1, 0x8, 0x0, 0x18, 0x8, 0x10, 0x0, 0x8, 0x1, 0x1, - 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, - 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x1, 0xe6, 0x3f, 0x41, 0x35, 0x1, 0x33, 0x5c, 0x57, 0x89, - 0x88, 0x57, 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, - 0x2d, 0x3c, 0x73, 0x74, 0x3c, 0x2d, 0x3, 0xba, 0x9a, 0x99, 0xfd, 0xb0, 0xab, 0x66, 0x60, 0x61, - 0x66, 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x69, 0x52, - 0x6c, 0x6b, 0x52, 0x0, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xce, 0x3, 0xb2, 0x0, 0x6, - 0x0, 0x16, 0x0, 0x26, 0x0, 0x54, 0x40, 0x1e, 0x1, 0x27, 0x27, 0x40, 0x28, 0x7, 0x4, 0x3, - 0x2, 0x1, 0x0, 0x1f, 0x17, 0xf, 0x7, 0x4, 0x0, 0x23, 0x8, 0xb, 0x1b, 0x8, 0x13, 0x6, - 0x5, 0xb, 0x1, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, - 0x33, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x2, 0x1b, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x1, 0x1d, 0x5c, 0x57, 0x89, 0x88, 0x57, - 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, 0x2d, 0x3c, - 0x73, 0x74, 0x3c, 0x2d, 0x3, 0x20, 0x56, 0x56, 0x92, 0xfd, 0xb7, 0xab, 0x66, 0x60, 0x61, 0x66, - 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x6a, 0x52, 0x6c, - 0x6c, 0x51, 0x0, 0x5, 0x0, 0x55, 0xff, 0xf6, 0x3, 0x62, 0x3, 0x28, 0x0, 0xb, 0x0, 0x19, - 0x0, 0x25, 0x0, 0x31, 0x0, 0x3f, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x40, 0x40, 0x40, 0x41, 0x0, - 0x3f, 0x3b, 0x16, 0x3a, 0x32, 0x2c, 0x26, 0x20, 0x1a, 0x13, 0xc, 0x6, 0x0, 0x29, 0x1d, 0x8, - 0x2f, 0x23, 0x10, 0x7, 0x9, 0x3d, 0x7, 0x36, 0x9, 0x3, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x6, 0x0, 0x40, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x40, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x3, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x3, 0x62, 0xe2, 0xa5, 0xa4, 0xe2, 0xe2, 0xa4, 0xa5, - 0xe2, 0x4e, 0x57, 0x5a, 0x88, 0x87, 0xb1, 0xb1, 0x87, 0x87, 0x5b, 0x57, 0xa7, 0x1e, 0x16, 0x16, - 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0xae, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x15, 0x16, 0x1e, 0xff, 0x1d, - 0x1a, 0x3f, 0x68, 0x69, 0x40, 0x25, 0x10, 0x3a, 0x2c, 0x78, 0x78, 0x2a, 0x1, 0x91, 0xa8, 0xf3, - 0xf3, 0xa8, 0xa8, 0xef, 0xef, 0xa8, 0x8c, 0x61, 0x64, 0xc5, 0x8c, 0x8c, 0xca, 0x66, 0x64, 0x1, - 0xd, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, - 0xc0, 0x4d, 0x23, 0x52, 0x52, 0x30, 0x40, 0x18, 0x99, 0x98, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, - 0x2, 0xce, 0x3, 0xb9, 0x0, 0x3, 0x0, 0x13, 0x0, 0x23, 0x0, 0x51, 0x40, 0x1d, 0x1, 0x24, - 0x24, 0x40, 0x25, 0x4, 0x1c, 0x14, 0xc, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, 0x2, 0x20, 0x8, - 0x8, 0x18, 0x8, 0x10, 0x3, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, - 0x33, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x1, 0xb9, 0x42, 0x3e, 0x4b, 0x1, 0x4a, 0x5c, 0x57, 0x89, 0x88, 0x57, 0x5c, 0x5c, 0x57, - 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, 0x2d, 0x3c, 0x73, 0x74, 0x3c, - 0x2d, 0x3, 0x20, 0x99, 0xfd, 0xb0, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0xab, 0x66, 0x60, 0x61, - 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x6a, 0x52, 0x6c, 0x6c, 0x51, 0x0, 0x0, 0x2, - 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xba, 0x0, 0x3, 0x0, 0x19, 0x0, 0x57, 0x40, 0x1f, - 0x1, 0x1a, 0x1a, 0x40, 0x1b, 0x4, 0x19, 0x18, 0x13, 0xe, 0xd, 0x19, 0x18, 0x17, 0xf, 0xe, - 0xd, 0xc, 0x4, 0x2, 0x0, 0x2, 0x1, 0x8, 0x0, 0x0, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0xc, 0x0, 0x1a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x1a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x1, - 0xcd, 0x3f, 0x41, 0x35, 0xfc, 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, - 0x2f, 0x3d, 0x57, 0x3, 0xba, 0x9a, 0x99, 0xfd, 0x5b, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, - 0xe3, 0xfe, 0x1e, 0x72, 0x36, 0x2c, 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x2, 0x0, 0x62, - 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xb2, 0x0, 0x6, 0x0, 0x1c, 0x0, 0x5c, 0x40, 0x21, 0x1, 0x1d, - 0x1d, 0x40, 0x1e, 0x7, 0x1c, 0x1b, 0x16, 0x11, 0x10, 0x4, 0x3, 0x2, 0x1, 0x0, 0x1c, 0x1b, - 0x1a, 0x12, 0x11, 0x10, 0xf, 0x7, 0x4, 0x0, 0x6, 0x5, 0xb, 0x1, 0x1, 0xf, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, - 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x36, 0x35, 0x11, 0x33, 0x2, 0x1, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0xe7, 0x58, 0x48, - 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, 0x3d, 0x57, 0x3, 0x20, 0x56, 0x56, - 0x92, 0xfd, 0x62, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xe3, 0xfe, 0x1e, 0x72, 0x36, 0x2c, - 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x2, 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xb9, - 0x0, 0x3, 0x0, 0x19, 0x0, 0x59, 0x40, 0x20, 0x1, 0x1a, 0x1a, 0x40, 0x1b, 0x4, 0x19, 0x18, - 0x13, 0xe, 0xd, 0x19, 0x18, 0x17, 0xf, 0xe, 0xd, 0xc, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, - 0x2, 0x3, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x1a, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1a, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x23, 0x27, 0x33, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x1, 0x96, 0x42, 0x3e, 0x4b, 0x1, 0x1d, - 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, 0x3d, 0x57, 0x3, 0x20, - 0x99, 0xfd, 0x5b, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xe3, 0xfe, 0x1e, 0x72, 0x36, 0x2c, - 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0xfe, - 0x0, 0x0, 0x1, 0x6c, 0x0, 0x0, 0x2, 0x64, 0x0, 0x0, 0x3, 0x48, 0x0, 0x0, 0x4, 0x48, - 0x0, 0x0, 0x5, 0x24, 0x0, 0x0, 0x5, 0x78, 0x0, 0x0, 0x5, 0xdc, 0x0, 0x0, 0x6, 0x42, - 0x0, 0x0, 0x6, 0xd8, 0x0, 0x0, 0x7, 0x5e, 0x0, 0x0, 0x7, 0xce, 0x0, 0x0, 0x8, 0x24, - 0x0, 0x0, 0x8, 0x84, 0x0, 0x0, 0x8, 0xde, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x9, 0xfe, - 0x0, 0x0, 0xa, 0x9e, 0x0, 0x0, 0xb, 0x7a, 0x0, 0x0, 0xc, 0x18, 0x0, 0x0, 0xc, 0xd0, - 0x0, 0x0, 0xd, 0xa8, 0x0, 0x0, 0xe, 0x16, 0x0, 0x0, 0xf, 0x6, 0x0, 0x0, 0xf, 0xc4, - 0x0, 0x0, 0x10, 0x52, 0x0, 0x0, 0x10, 0xee, 0x0, 0x0, 0x11, 0x68, 0x0, 0x0, 0x11, 0xe2, - 0x0, 0x0, 0x12, 0x5c, 0x0, 0x0, 0x13, 0x1c, 0x0, 0x0, 0x14, 0x62, 0x0, 0x0, 0x14, 0xea, - 0x0, 0x0, 0x15, 0xac, 0x0, 0x0, 0x16, 0x46, 0x0, 0x0, 0x16, 0xe2, 0x0, 0x0, 0x17, 0x78, - 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x18, 0xca, 0x0, 0x0, 0x19, 0x58, 0x0, 0x0, 0x19, 0xe6, - 0x0, 0x0, 0x1a, 0x4e, 0x0, 0x0, 0x1a, 0xd6, 0x0, 0x0, 0x1b, 0x3e, 0x0, 0x0, 0x1b, 0xd8, - 0x0, 0x0, 0x1c, 0x60, 0x0, 0x0, 0x1d, 0x6, 0x0, 0x0, 0x1d, 0xac, 0x0, 0x0, 0x1e, 0x74, - 0x0, 0x0, 0x1f, 0x1e, 0x0, 0x0, 0x1f, 0xe4, 0x0, 0x0, 0x20, 0x5a, 0x0, 0x0, 0x20, 0xee, - 0x0, 0x0, 0x21, 0x5e, 0x0, 0x0, 0x21, 0xfa, 0x0, 0x0, 0x22, 0x7e, 0x0, 0x0, 0x22, 0xfa, - 0x0, 0x0, 0x23, 0x80, 0x0, 0x0, 0x23, 0xf6, 0x0, 0x0, 0x24, 0x4a, 0x0, 0x0, 0x24, 0xc0, - 0x0, 0x0, 0x25, 0x22, 0x0, 0x0, 0x25, 0x7a, 0x0, 0x0, 0x25, 0xd0, 0x0, 0x0, 0x26, 0xa0, - 0x0, 0x0, 0x27, 0x4c, 0x0, 0x0, 0x27, 0xda, 0x0, 0x0, 0x28, 0x8c, 0x0, 0x0, 0x29, 0x40, - 0x0, 0x0, 0x29, 0xfc, 0x0, 0x0, 0x2b, 0xe, 0x0, 0x0, 0x2b, 0xa8, 0x0, 0x0, 0x2c, 0x48, - 0x0, 0x0, 0x2c, 0xda, 0x0, 0x0, 0x2d, 0x5e, 0x0, 0x0, 0x2d, 0xcc, 0x0, 0x0, 0x2e, 0x8a, - 0x0, 0x0, 0x2f, 0x24, 0x0, 0x0, 0x2f, 0xb6, 0x0, 0x0, 0x30, 0x6c, 0x0, 0x0, 0x31, 0x1a, - 0x0, 0x0, 0x31, 0xb6, 0x0, 0x0, 0x32, 0x7e, 0x0, 0x0, 0x33, 0x20, 0x0, 0x0, 0x33, 0xba, - 0x0, 0x0, 0x34, 0x2c, 0x0, 0x0, 0x34, 0xc8, 0x0, 0x0, 0x35, 0x46, 0x0, 0x0, 0x35, 0xd0, - 0x0, 0x0, 0x36, 0x56, 0x0, 0x0, 0x37, 0xe, 0x0, 0x0, 0x37, 0x64, 0x0, 0x0, 0x38, 0x12, - 0x0, 0x0, 0x38, 0x90, 0x0, 0x0, 0x39, 0x1e, 0x0, 0x0, 0x39, 0xc8, 0x0, 0x0, 0x3a, 0xbc, - 0x0, 0x0, 0x3b, 0xda, 0x0, 0x0, 0x3c, 0x3c, 0x0, 0x0, 0x3c, 0xca, 0x0, 0x0, 0x3d, 0x9a, - 0x0, 0x0, 0x3d, 0xec, 0x0, 0x0, 0x3e, 0x76, 0x0, 0x0, 0x3f, 0x3c, 0x0, 0x0, 0x40, 0x1a, - 0x0, 0x0, 0x40, 0xbe, 0x0, 0x0, 0x41, 0x8a, 0x0, 0x0, 0x42, 0x2e, 0x0, 0x0, 0x43, 0x40, - 0x0, 0x0, 0x44, 0x14, 0x0, 0x0, 0x44, 0xd6, 0x0, 0x0, 0x45, 0x56, 0x0, 0x0, 0x46, 0x1a, - 0x0, 0x0, 0x46, 0xa0, 0x0, 0x0, 0x47, 0x2a, 0x0, 0x0, 0x47, 0xda, 0x0, 0x0, 0x48, 0xda, - 0x0, 0x0, 0x49, 0xc4, 0x0, 0x0, 0x4a, 0x1c, 0x0, 0x0, 0x4a, 0x74, 0x0, 0x0, 0x4b, 0x24, - 0x0, 0x0, 0x4b, 0xd4, 0x0, 0x0, 0x4c, 0x48, 0x0, 0x0, 0x4c, 0xbc, 0x0, 0x0, 0x4d, 0x16, - 0x0, 0x0, 0x4e, 0x20, 0x0, 0x0, 0x4e, 0x82, 0x0, 0x0, 0x4e, 0xe6, 0x0, 0x0, 0x4f, 0xfc, - 0x0, 0x0, 0x50, 0xe8, 0x0, 0x0, 0x51, 0xa6, 0x0, 0x0, 0x52, 0x8, 0x0, 0x0, 0x52, 0x78, - 0x0, 0x0, 0x53, 0x20, 0x0, 0x0, 0x54, 0x70, 0x0, 0x0, 0x54, 0xe2, 0x0, 0x0, 0x55, 0x44, - 0x0, 0x0, 0x55, 0xbc, 0x0, 0x0, 0x56, 0x12, 0x0, 0x0, 0x56, 0x84, 0x0, 0x0, 0x56, 0xe6, - 0x0, 0x0, 0x57, 0x72, 0x0, 0x0, 0x57, 0xfe, 0x0, 0x0, 0x58, 0x6c, 0x0, 0x0, 0x58, 0xf2, - 0x0, 0x0, 0x59, 0x54, 0x0, 0x0, 0x59, 0xdc, 0x0, 0x0, 0x5a, 0xb8, 0x0, 0x0, 0x5b, 0x90, - 0x0, 0x0, 0x5c, 0x6a, 0x0, 0x0, 0x5d, 0x18, 0x0, 0x0, 0x5d, 0xe4, 0x0, 0x0, 0x5e, 0xda, - 0x0, 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x60, 0xae, 0x0, 0x0, 0x61, 0x9c, 0x0, 0x0, 0x62, 0x96, - 0x0, 0x0, 0x63, 0xba, 0x0, 0x0, 0x64, 0xca, 0x0, 0x0, 0x65, 0xf2, 0x0, 0x0, 0x66, 0xc4, - 0x0, 0x0, 0x67, 0x94, 0x0, 0x0, 0x68, 0x64, 0x0, 0x0, 0x69, 0x40, 0x0, 0x0, 0x6a, 0x46, - 0x0, 0x0, 0x6a, 0xd6, 0x0, 0x0, 0x6b, 0x66, 0x0, 0x0, 0x6c, 0x2, 0x0, 0x0, 0x6c, 0xca, - 0x0, 0x0, 0x6d, 0xa4, 0x0, 0x0, 0x6e, 0x50, 0x0, 0x0, 0x6e, 0xfc, 0x0, 0x0, 0x6f, 0xb4, - 0x0, 0x0, 0x70, 0x94, 0x0, 0x0, 0x71, 0x64, 0x0, 0x0, 0x72, 0x1a, 0x0, 0x0, 0x72, 0xd0, - 0x0, 0x0, 0x73, 0x92, 0x0, 0x0, 0x74, 0x80, 0x0, 0x0, 0x75, 0x10, 0x0, 0x0, 0x76, 0x1e, - 0x0, 0x0, 0x77, 0x1a, 0x0, 0x0, 0x77, 0xe6, 0x0, 0x0, 0x78, 0x98, 0x0, 0x0, 0x78, 0x98, - 0x0, 0x0, 0x79, 0x40, 0x0, 0x0, 0x79, 0xb8, 0x0, 0x0, 0x7a, 0x30, 0x0, 0x0, 0x7a, 0xde, - 0x0, 0x0, 0x7a, 0xde, 0x0, 0x0, 0x7a, 0xde, 0x0, 0x0, 0x7b, 0x7e, 0x0, 0x0, 0x7c, 0x22, - 0x0, 0x0, 0x7c, 0xb6, 0x0, 0x0, 0x7c, 0xb6, 0x0, 0x0, 0x7d, 0x1c, 0x0, 0x0, 0x7e, 0x34, - 0x0, 0x0, 0x81, 0x46, 0x0, 0x0, 0x81, 0xd2, 0x0, 0x0, 0x81, 0xd2, 0x0, 0x0, 0x82, 0x78, - 0x0, 0x0, 0x83, 0x3c, 0x0, 0x0, 0x84, 0x20, 0x0, 0x0, 0x84, 0xce, 0x0, 0x0, 0x84, 0xce, - 0x0, 0x0, 0x85, 0xaa, 0x0, 0x0, 0x86, 0x76, 0x0, 0x0, 0x87, 0x28, 0x0, 0x0, 0x87, 0xe4, - 0x0, 0x0, 0x88, 0x8a, 0x0, 0x0, 0x89, 0x72, 0x0, 0x0, 0x8a, 0x1a, 0x0, 0x0, 0x8a, 0xc0, - 0x0, 0x0, 0x8b, 0x74, 0x0, 0x0, 0x8c, 0x54, 0x0, 0x0, 0x8c, 0xfc, 0x0, 0x0, 0x8d, 0xbc, - 0x0, 0x0, 0x8e, 0x8a, 0x0, 0x0, 0x8f, 0xa2, 0x0, 0x0, 0x90, 0x66, 0x0, 0x0, 0x91, 0x14, - 0x0, 0x0, 0x91, 0xce, 0x0, 0x0, 0x92, 0x7e, 0x1, 0xf4, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd2, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x1, 0x67, 0x0, 0x73, 0x1, 0x4c, 0x0, 0x5, - 0x2, 0xbe, 0x0, 0x3b, 0x2, 0x67, 0x0, 0x3c, 0x3, 0x94, 0x0, 0x3b, 0x2, 0x98, 0x0, 0x3b, - 0x0, 0xd2, 0x0, 0x3b, 0x1, 0x46, 0x0, 0x3b, 0x1, 0x46, 0x0, 0x3b, 0x2, 0x17, 0x0, 0x5f, - 0x1, 0xe8, 0x0, 0x3b, 0x1, 0x3f, 0x0, 0x5f, 0x1, 0x46, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, - 0x1, 0xa2, 0x0, 0x3b, 0x2, 0x93, 0x0, 0x50, 0x1, 0xf7, 0x0, 0x50, 0x2, 0x3e, 0x0, 0x50, - 0x2, 0x4a, 0x0, 0x50, 0x2, 0x78, 0x0, 0x50, 0x2, 0x33, 0x0, 0x50, 0x2, 0x64, 0x0, 0x50, - 0x2, 0x16, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x64, 0x0, 0x50, 0x0, 0xf7, 0x0, 0x3b, - 0x0, 0xfa, 0x0, 0x3b, 0x2, 0x91, 0x0, 0x19, 0x2, 0x47, 0x0, 0x69, 0x2, 0x91, 0x0, 0x3b, - 0x2, 0x1a, 0x0, 0x3e, 0x4, 0x9, 0x0, 0x55, 0x2, 0xc4, 0x0, 0x20, 0x2, 0xba, 0x0, 0x75, - 0x2, 0xac, 0x0, 0x57, 0x2, 0xe6, 0x0, 0x75, 0x2, 0x82, 0x0, 0x75, 0x2, 0x48, 0x0, 0x75, - 0x3, 0x1f, 0x0, 0x57, 0x2, 0xf9, 0x0, 0x75, 0x1, 0x40, 0x0, 0x39, 0x1, 0x68, 0x0, 0x30, - 0x2, 0x9d, 0x0, 0x75, 0x2, 0x37, 0x0, 0x75, 0x3, 0x6c, 0x0, 0x75, 0x2, 0xfb, 0x0, 0x75, - 0x3, 0x3e, 0x0, 0x57, 0x2, 0x7c, 0x0, 0x76, 0x3, 0x4d, 0x0, 0x57, 0x2, 0x9e, 0x0, 0x75, - 0x2, 0x66, 0x0, 0x3e, 0x2, 0xf, 0x0, 0x2f, 0x2, 0xdf, 0x0, 0x62, 0x2, 0x79, 0x0, 0x1c, - 0x3, 0xb5, 0x0, 0x1c, 0x2, 0x91, 0x0, 0x22, 0x2, 0x50, 0x0, 0x1d, 0x2, 0x5d, 0x0, 0x25, - 0x1, 0x4e, 0x0, 0x3b, 0x1, 0x38, 0x0, 0x3b, 0x1, 0x4e, 0x0, 0x3b, 0x1, 0x8a, 0x0, 0x5, - 0x2, 0x4, 0x0, 0x3b, 0x0, 0xf6, 0x0, 0x3b, 0x2, 0x11, 0x0, 0x2d, 0x2, 0x3f, 0x0, 0x5a, - 0x1, 0xc6, 0x0, 0x32, 0x2, 0x30, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, 0x1, 0x56, 0x0, 0x2d, - 0x2, 0x28, 0x0, 0x32, 0x2, 0x57, 0x0, 0x5f, 0x1, 0x20, 0x0, 0x28, 0x1, 0x4, 0x0, 0x0, - 0x2, 0x10, 0x0, 0x5f, 0x1, 0x1d, 0x0, 0x5a, 0x3, 0x75, 0x0, 0x5f, 0x2, 0x57, 0x0, 0x5f, - 0x2, 0x13, 0x0, 0x32, 0x2, 0x35, 0x0, 0x5f, 0x2, 0x30, 0x0, 0x32, 0x1, 0xa1, 0x0, 0x3b, - 0x1, 0xb3, 0x0, 0x28, 0x1, 0x5e, 0x0, 0x26, 0x2, 0x4b, 0x0, 0x5f, 0x1, 0xf0, 0x0, 0x14, - 0x3, 0x8, 0x0, 0x20, 0x1, 0xe5, 0x0, 0xf, 0x1, 0xe1, 0x0, 0x14, 0x1, 0xce, 0x0, 0x32, - 0x1, 0x59, 0x0, 0x3b, 0x1, 0x16, 0x0, 0x69, 0x1, 0x59, 0x0, 0x3b, 0x1, 0xa7, 0x0, 0xb, - 0x2, 0x2a, 0x0, 0x3d, 0x1, 0xc6, 0x0, 0x32, 0x2, 0x88, 0x0, 0x3d, 0x1, 0xdb, 0x0, 0x3d, - 0x1, 0x82, 0x0, 0x3b, 0x2, 0x52, 0x0, 0x55, 0x2, 0x2d, 0x0, 0x5f, 0x1, 0x38, 0x0, 0x3b, - 0x1, 0x9e, 0x0, 0x3b, 0x3, 0xb9, 0x0, 0x20, 0x3, 0x3e, 0x0, 0x57, 0x2, 0x50, 0x0, 0x1d, - 0x1, 0xaf, 0x0, 0x3b, 0x1, 0xc2, 0x0, 0x3b, 0x3, 0xc, 0x0, 0x2d, 0x2, 0x13, 0x0, 0x32, - 0x2, 0x1a, 0x0, 0x3d, 0x1, 0x67, 0x0, 0x73, 0x1, 0xd2, 0x0, 0x3b, 0x2, 0x95, 0x0, 0x3b, - 0x2, 0x95, 0x0, 0x3b, 0x3, 0x22, 0x0, 0x55, 0x4, 0x46, 0x0, 0x57, 0x3, 0x5a, 0x0, 0x32, - 0x2, 0x4, 0x0, 0x3b, 0x2, 0x85, 0x0, 0x3b, 0x1, 0xaf, 0x0, 0x3b, 0x1, 0xb5, 0x0, 0x3b, - 0x0, 0xf7, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, 0x1, 0xa2, 0x0, 0x3b, 0x2, 0xca, 0x0, 0x3d, - 0x1, 0xa2, 0x0, 0x3b, 0x1, 0xa1, 0x0, 0x3b, 0x2, 0x7f, 0x0, 0x2d, 0x2, 0x7a, 0x0, 0x2d, - 0x2, 0x5e, 0x0, 0x57, 0x0, 0xf7, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, 0x1, 0xd9, 0x0, 0x5f, - 0x5, 0x98, 0x0, 0x55, 0x1, 0x20, 0x0, 0x28, 0x1, 0x8a, 0x0, 0x3b, 0x1, 0xa7, 0x0, 0x3b, - 0x1, 0x6e, 0x0, 0x3b, 0x1, 0xc1, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, 0x1, 0x3d, 0x0, 0x3b, - 0x1, 0x1a, 0x0, 0x3b, 0x1, 0xfa, 0x0, 0x3b, 0x1, 0x1a, 0x0, 0x3b, 0x1, 0x8a, 0x0, 0x3b, - 0x1, 0x38, 0x0, 0x3b, 0x2, 0xc9, 0x0, 0x20, 0x2, 0xc9, 0x0, 0x20, 0x2, 0xac, 0x0, 0x57, - 0x2, 0x83, 0x0, 0x75, 0x3, 0x0, 0x0, 0x75, 0x3, 0x25, 0x0, 0x57, 0x2, 0xe4, 0x0, 0x62, - 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, - 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, 0x1, 0xc6, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, - 0x2, 0xe, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, 0x1, 0x20, 0x0, 0x3b, - 0x1, 0x20, 0x0, 0x3b, 0x1, 0x20, 0x0, 0x41, 0x1, 0x20, 0x0, 0x1b, 0x2, 0x57, 0x0, 0x5f, - 0x2, 0x13, 0x0, 0x32, 0x2, 0x13, 0x0, 0x32, 0x2, 0x13, 0x0, 0x32, 0x2, 0x13, 0x0, 0x32, - 0x2, 0x13, 0x0, 0x32, 0x2, 0x4b, 0x0, 0x5f, 0x2, 0x4b, 0x0, 0x5f, 0x2, 0x4b, 0x0, 0x5f, - 0x2, 0x4b, 0x0, 0x5f, 0x1, 0xdf, 0x0, 0x3b, 0x3, 0xda, 0x0, 0x3b, 0x3, 0xda, 0x0, 0x3b, - 0x3, 0x79, 0x0, 0x3b, 0x1, 0xf0, 0x0, 0x3b, 0x1, 0x38, 0x0, 0x0, 0x1, 0xe9, 0x0, 0x3b, - 0x2, 0xff, 0x0, 0x3b, 0x2, 0xff, 0x0, 0x3b, 0x2, 0x5d, 0x0, 0x5f, 0x1, 0x38, 0x0, 0x0, - 0x1, 0x38, 0x0, 0x0, 0x3, 0x19, 0x0, 0x3b, 0x2, 0x6c, 0x0, 0x3b, 0x1, 0xd2, 0x0, 0x3b, - 0x1, 0x38, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x3b, 0x3, 0xb7, 0x0, 0x55, 0x5, 0x2f, 0x0, 0x64, - 0x3, 0x1d, 0x0, 0x59, 0x1, 0x38, 0x0, 0x0, 0x2, 0xc9, 0x0, 0x20, 0x2, 0xc9, 0x0, 0x20, - 0x3, 0x25, 0x0, 0x57, 0x1, 0xd2, 0x0, 0x3b, 0x1, 0x38, 0x0, 0x0, 0x1, 0xe1, 0x0, 0x14, - 0x2, 0x50, 0x0, 0x1d, 0x2, 0xc9, 0x0, 0x20, 0x2, 0x83, 0x0, 0x75, 0x2, 0xc9, 0x0, 0x20, - 0x2, 0x83, 0x0, 0x75, 0x2, 0x83, 0x0, 0x75, 0x1, 0x40, 0x0, 0x39, 0x1, 0x82, 0x0, 0x33, - 0x1, 0x79, 0x0, 0x23, 0x1, 0x58, 0x0, 0x4d, 0x3, 0x25, 0x0, 0x57, 0x3, 0x25, 0x0, 0x57, - 0x3, 0xb7, 0x0, 0x55, 0x3, 0x25, 0x0, 0x57, 0x2, 0xe4, 0x0, 0x62, 0x2, 0xe4, 0x0, 0x62, - 0x2, 0xe4, 0x0, 0x62, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x7b, 0x0, 0x14, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, - 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, - 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, - 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, - 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, - 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, - 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, - 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, - 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, - 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, 0x0, 0x49, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, - 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, - 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, - 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x82, 0x0, 0x84, 0x0, 0x85, - 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x90, 0x0, 0x91, - 0x0, 0x96, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa6, - 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, - 0x0, 0xb5, 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, - 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xd7, 0x0, 0xd8, - 0x0, 0xd9, 0x0, 0xda, 0x0, 0xdb, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, - 0x0, 0xe1, 0x1, 0x2, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, - 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x6d, 0x0, 0x6e, 0x0, 0x6f, - 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, - 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, - 0x0, 0x80, 0x0, 0x81, 0x0, 0x83, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8f, 0x0, 0x92, - 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, - 0x0, 0x9c, 0x0, 0x9f, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xac, 0x0, 0xad, - 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xc7, 0x0, 0xc8, - 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, - 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x3, 0x44, 0x45, 0x4c, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x24, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0x3, 0x0, 0x1, 0x0, 0x0, 0x1, 0x24, 0x0, 0x0, 0x1, 0x6, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x7f, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, - 0x41, 0x42, 0x7e, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, - 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x73, 0x63, 0x64, 0x80, 0x6d, 0x74, 0x65, 0x81, 0xa, 0x7c, 0x75, 0x82, 0x83, - 0x84, 0x85, 0x0, 0x7a, 0x62, 0x86, 0x87, 0x0, 0x67, 0x66, 0x88, 0x89, 0x7d, 0x76, 0x77, 0x8a, - 0x0, 0x72, 0x0, 0x43, 0x69, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x6a, 0x0, 0x91, 0x92, 0x0, 0x93, - 0x94, 0x95, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6b, 0x0, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x78, 0x6f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x71, 0x79, 0x68, 0x96, 0x97, - 0x98, 0x99, 0x0, 0x0, 0x0, 0x4, 0x3, 0x5e, 0x0, 0x0, 0x0, 0x60, 0x0, 0x40, 0x0, 0x5, - 0x0, 0x20, 0x0, 0x7e, 0x0, 0xa5, 0x0, 0xac, 0x0, 0xb1, 0x0, 0xb8, 0x0, 0xbb, 0x0, 0xcf, - 0x0, 0xd6, 0x0, 0xdc, 0x0, 0xef, 0x0, 0xfc, 0x0, 0xff, 0x1, 0x31, 0x1, 0x53, 0x1, 0x78, - 0x1, 0x92, 0x2, 0xc7, 0x2, 0xc9, 0x2, 0xdd, 0x3, 0x94, 0x3, 0xa9, 0x3, 0xbc, 0x3, 0xc0, - 0x20, 0x10, 0x20, 0x14, 0x20, 0x1a, 0x20, 0x1e, 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x3a, - 0x20, 0x44, 0x21, 0x22, 0x21, 0x26, 0x22, 0x2, 0x22, 0x6, 0x22, 0xf, 0x22, 0x11, 0x22, 0x1a, - 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x65, 0x22, 0xf2, 0x25, 0xca, 0xf0, 0x2, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x20, 0x0, 0xa0, 0x0, 0xa7, 0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, - 0x0, 0xbf, 0x0, 0xd1, 0x0, 0xd8, 0x0, 0xdf, 0x0, 0xf1, 0x0, 0xff, 0x1, 0x31, 0x1, 0x52, - 0x1, 0x78, 0x1, 0x92, 0x2, 0xc6, 0x2, 0xc9, 0x2, 0xd8, 0x3, 0x94, 0x3, 0xa9, 0x3, 0xbc, - 0x3, 0xc0, 0x20, 0x10, 0x20, 0x13, 0x20, 0x18, 0x20, 0x1c, 0x20, 0x20, 0x20, 0x26, 0x20, 0x30, - 0x20, 0x39, 0x20, 0x44, 0x21, 0x22, 0x21, 0x26, 0x22, 0x2, 0x22, 0x6, 0x22, 0xf, 0x22, 0x11, - 0x22, 0x19, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, 0x22, 0xf2, 0x25, 0xca, - 0xf0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x60, 0x1, 0x1c, 0x1, 0x26, 0x1, 0x30, 0x1, 0x36, 0x1, 0x3e, - 0x1, 0x40, 0x1, 0x60, 0x1, 0x6a, 0x1, 0x72, 0x1, 0x92, 0x1, 0xa8, 0x1, 0xa8, 0x1, 0xa8, - 0x1, 0xaa, 0x1, 0xaa, 0x1, 0xaa, 0x1, 0xac, 0x1, 0xac, 0x1, 0xb6, 0x1, 0xb6, 0x1, 0xb6, - 0x1, 0xb6, 0x1, 0xb6, 0x1, 0xb6, 0x1, 0xb8, 0x1, 0xbc, 0x1, 0xc0, 0x1, 0xc4, 0x1, 0xc4, - 0x1, 0xc4, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, - 0x1, 0xc6, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xca, 0x1, 0xca, - 0x1, 0xca, 0xff, 0xff, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, - 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, - 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, - 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, - 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, - 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, - 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, - 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, - 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, - 0x0, 0x49, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, - 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, - 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, - 0x0, 0x61, 0x0, 0xcb, 0x0, 0x73, 0x0, 0x63, 0x0, 0x64, 0x0, 0x81, 0x0, 0x6d, 0x0, 0x65, - 0x0, 0x6a, 0x0, 0xb9, 0x0, 0x6e, 0x0, 0x75, 0x0, 0xc7, 0x0, 0xb8, 0x0, 0x8e, 0x0, 0xb7, - 0x0, 0xbd, 0x0, 0x69, 0x0, 0xc0, 0x0, 0x67, 0x0, 0x87, 0x0, 0x92, 0x0, 0x6f, 0x0, 0x76, - 0x0, 0x72, 0x0, 0xcc, 0x0, 0xd5, 0x0, 0xd3, 0x0, 0xcd, 0x0, 0x97, 0x0, 0x98, 0x0, 0x6b, - 0x0, 0x99, 0x0, 0xd7, 0x0, 0x9a, 0x0, 0xd4, 0x0, 0xd6, 0x0, 0xdb, 0x0, 0xd8, 0x0, 0xd9, - 0x0, 0xda, 0x0, 0x9b, 0x0, 0xdf, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xce, 0x0, 0x9c, 0x0, 0x6c, - 0x0, 0xe2, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x9d, 0x0, 0x68, 0x0, 0x9f, 0x0, 0x9e, 0x0, 0xa0, - 0x0, 0xa2, 0x0, 0xa1, 0x0, 0xa3, 0x0, 0x70, 0x0, 0xa4, 0x0, 0xa6, 0x0, 0xa5, 0x0, 0xa7, - 0x0, 0xa8, 0x0, 0xaa, 0x0, 0xa9, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xaf, 0x0, 0xae, - 0x0, 0xb0, 0x0, 0xb2, 0x0, 0xb1, 0x0, 0xcf, 0x0, 0x71, 0x0, 0xb4, 0x0, 0xb3, 0x0, 0xb5, - 0x0, 0xb6, 0x0, 0xd1, 0x0, 0x8b, 0x0, 0x78, 0x0, 0x79, 0x0, 0xd2, 0x0, 0x74, 0x0, 0x8c, - 0x0, 0x95, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x91, 0x0, 0x94, 0x0, 0x8d, 0x0, 0x93, - 0x0, 0xca, 0x0, 0xc6, 0x0, 0xc0, 0x0, 0xc4, 0x0, 0x10, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7e, - 0x0, 0x7f, 0x0, 0x88, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x89, 0x0, 0x62, 0x0, 0x86, 0x0, 0x66, - 0x0, 0x77, 0x0, 0x8a, 0x0, 0x82, 0x0, 0x83, 0x0, 0x80, 0x0, 0xba, 0x0, 0xc6, 0x0, 0xc1, - 0x0, 0xca, 0x0, 0xc3, 0x0, 0xc2, 0x0, 0x87, 0x0, 0xc8, 0x0, 0xbc, 0x0, 0xc5, 0x0, 0xc9, - 0x0, 0xbb, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc9, 0x0, 0xd0, 0x0, 0xde, 0x0, 0x84, 0x0, 0x85, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x24, 0xa4, 0x0, 0x1, 0x6, 0x19, - 0x0, 0x3c, 0x0, 0xa, 0x24, 0x5a, 0x0, 0x3, 0x0, 0x6d, 0x0, 0x96, 0x0, 0x5, 0x0, 0x24, - 0xff, 0xce, 0x0, 0x5, 0x0, 0x2c, 0x0, 0x32, 0x0, 0x5, 0x0, 0x37, 0x0, 0x32, 0x0, 0x5, - 0x0, 0x39, 0x0, 0x32, 0x0, 0x5, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x5, 0x0, 0x3b, 0x0, 0x1e, - 0x0, 0x5, 0x0, 0x3c, 0x0, 0x32, 0x0, 0x5, 0x0, 0x97, 0xff, 0xce, 0x0, 0x5, 0x0, 0x98, - 0xff, 0xce, 0x0, 0x5, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x5, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x5, - 0x0, 0xd2, 0x0, 0x32, 0x0, 0x5, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x5, 0x0, 0xd5, 0xff, 0xce, - 0x0, 0x5, 0x0, 0xd8, 0x0, 0x32, 0x0, 0x5, 0x0, 0xd9, 0x0, 0x32, 0x0, 0x5, 0x0, 0xda, - 0x0, 0x32, 0x0, 0x5, 0x0, 0xdb, 0x0, 0x32, 0x0, 0x9, 0x0, 0x37, 0xff, 0xa6, 0x0, 0x9, - 0x0, 0x3c, 0xff, 0xa6, 0x0, 0x9, 0x0, 0xd2, 0xff, 0xa6, 0x0, 0xa, 0x0, 0x24, 0xff, 0xce, - 0x0, 0x10, 0x0, 0x37, 0xff, 0x9c, 0x0, 0x10, 0x0, 0x3c, 0xff, 0xb0, 0x0, 0x10, 0x0, 0xd2, - 0xff, 0xb0, 0x0, 0x12, 0x0, 0x24, 0xff, 0xba, 0x0, 0x12, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x12, - 0x0, 0x3c, 0x0, 0x32, 0x0, 0x12, 0x0, 0x46, 0xff, 0xd8, 0x0, 0x12, 0x0, 0x47, 0xff, 0xd8, - 0x0, 0x12, 0x0, 0x48, 0xff, 0xd8, 0x0, 0x12, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x12, 0x0, 0x54, - 0xff, 0xd8, 0x0, 0x12, 0x0, 0x55, 0xff, 0xe2, 0x0, 0x12, 0x0, 0x56, 0xff, 0xe2, 0x0, 0x12, - 0x0, 0x5d, 0xff, 0xe2, 0x0, 0x12, 0x0, 0xa4, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xa5, 0xff, 0xd8, - 0x0, 0x12, 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xa7, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xa8, - 0xff, 0xd8, 0x0, 0x12, 0x0, 0xae, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xaf, 0xff, 0xd8, 0x0, 0x12, - 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xb1, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xb2, 0xff, 0xd8, - 0x0, 0x13, 0x0, 0x13, 0x0, 0x14, 0x0, 0x13, 0x0, 0x16, 0xff, 0xf6, 0x0, 0x13, 0x0, 0x17, - 0xff, 0xec, 0x0, 0x13, 0x0, 0x19, 0x0, 0x14, 0x0, 0x13, 0x0, 0x1a, 0xff, 0xe2, 0x0, 0x13, - 0x0, 0x1b, 0x0, 0x14, 0x0, 0x13, 0x0, 0x1c, 0x0, 0x14, 0x0, 0x14, 0x0, 0x15, 0x0, 0x14, - 0x0, 0x14, 0x0, 0x17, 0x0, 0x14, 0x0, 0x14, 0x0, 0x18, 0x0, 0xa, 0x0, 0x14, 0x0, 0x1a, - 0xff, 0xd8, 0x0, 0x14, 0x0, 0x1c, 0xff, 0xec, 0x0, 0x15, 0x0, 0x16, 0xff, 0xec, 0x0, 0x15, - 0x0, 0x17, 0xff, 0xf6, 0x0, 0x15, 0x0, 0x18, 0xff, 0xf6, 0x0, 0x15, 0x0, 0x19, 0x0, 0xa, - 0x0, 0x15, 0x0, 0x1a, 0xff, 0xec, 0x0, 0x16, 0x0, 0x1a, 0xff, 0xec, 0x0, 0x17, 0x0, 0x13, - 0xff, 0xec, 0x0, 0x17, 0x0, 0x16, 0xff, 0xec, 0x0, 0x17, 0x0, 0x18, 0xff, 0xd8, 0x0, 0x17, - 0x0, 0x19, 0xff, 0xe2, 0x0, 0x17, 0x0, 0x1a, 0xff, 0xc4, 0x0, 0x17, 0x0, 0x1b, 0xff, 0xe2, - 0x0, 0x17, 0x0, 0x1c, 0xff, 0xce, 0x0, 0x18, 0x0, 0x18, 0xff, 0xf6, 0x0, 0x18, 0x0, 0x1a, - 0xff, 0xec, 0x0, 0x18, 0x0, 0x1c, 0xff, 0xe2, 0x0, 0x19, 0x0, 0x5, 0x0, 0x32, 0x0, 0x19, - 0x0, 0x13, 0x0, 0x1e, 0x0, 0x19, 0x0, 0x16, 0xff, 0xec, 0x0, 0x19, 0x0, 0x18, 0x0, 0xa, - 0x0, 0x19, 0x0, 0x19, 0x0, 0x1e, 0x0, 0x19, 0x0, 0x1a, 0xff, 0xd8, 0x0, 0x19, 0x0, 0x1b, - 0x0, 0x1e, 0x0, 0x19, 0x0, 0x1c, 0x0, 0x14, 0x0, 0x1a, 0x0, 0x5, 0x0, 0x32, 0x0, 0x1a, - 0x0, 0xf, 0xff, 0xce, 0x0, 0x1a, 0x0, 0x15, 0xff, 0xec, 0x0, 0x1a, 0x0, 0x17, 0xff, 0xb0, - 0x0, 0x1a, 0x0, 0x1b, 0xff, 0xec, 0x0, 0x1a, 0x0, 0x1c, 0xff, 0xec, 0x0, 0x1b, 0x0, 0x5, - 0x0, 0x32, 0x0, 0x1b, 0x0, 0x16, 0xff, 0xe2, 0x0, 0x1b, 0x0, 0x17, 0xff, 0xe2, 0x0, 0x1b, - 0x0, 0x18, 0xff, 0xec, 0x0, 0x1b, 0x0, 0x19, 0x0, 0xa, 0x0, 0x1b, 0x0, 0x1a, 0xff, 0xe2, - 0x0, 0x1c, 0x0, 0x13, 0x0, 0xa, 0x0, 0x1c, 0x0, 0x19, 0x0, 0x14, 0x0, 0x1c, 0x0, 0x1a, - 0xff, 0xe2, 0x0, 0x1c, 0x0, 0x1b, 0x0, 0xa, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0xa, 0x0, 0x23, - 0x0, 0x37, 0xff, 0xb0, 0x0, 0x23, 0x0, 0x3c, 0xff, 0xba, 0x0, 0x23, 0x0, 0xd2, 0xff, 0xba, - 0x0, 0x24, 0x0, 0x5, 0xff, 0xce, 0x0, 0x24, 0x0, 0x26, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0x24, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x24, 0x0, 0x32, 0xff, 0xdd, 0x0, 0x24, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x37, 0xff, 0xa1, 0x0, 0x24, 0x0, 0x39, 0xff, 0xce, - 0x0, 0x24, 0x0, 0x3a, 0xff, 0xec, 0x0, 0x24, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x24, 0x0, 0x45, - 0xff, 0xf1, 0x0, 0x24, 0x0, 0x57, 0xff, 0xe7, 0x0, 0x24, 0x0, 0x58, 0xff, 0xec, 0x0, 0x24, - 0x0, 0x59, 0xff, 0xe2, 0x0, 0x24, 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x24, 0x0, 0x5b, 0x0, 0xa, - 0x0, 0x24, 0x0, 0x5c, 0xff, 0xe2, 0x0, 0x24, 0x0, 0x6c, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x78, - 0xff, 0xdd, 0x0, 0x24, 0x0, 0x99, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0x24, - 0x0, 0xb3, 0xff, 0xec, 0x0, 0x24, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x24, 0x0, 0xb5, 0xff, 0xec, - 0x0, 0x24, 0x0, 0xb6, 0xff, 0xec, 0x0, 0x24, 0x0, 0xce, 0xff, 0xdd, 0x0, 0x24, 0x0, 0xd1, - 0xff, 0xe2, 0x0, 0x24, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x24, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0x24, - 0x0, 0xdd, 0xff, 0xdd, 0x0, 0x24, 0x0, 0xdf, 0xff, 0xdd, 0x0, 0x25, 0x0, 0x5, 0x0, 0x1e, - 0x0, 0x25, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x25, 0x0, 0x37, 0xff, 0xec, 0x0, 0x25, 0x0, 0x3c, - 0xff, 0xec, 0x0, 0x25, 0x0, 0x5b, 0xff, 0xf1, 0x0, 0x25, 0x0, 0xd2, 0xff, 0xec, 0x0, 0x26, - 0x0, 0x5, 0x0, 0x32, 0x0, 0x26, 0x0, 0x25, 0x0, 0x14, 0x0, 0x26, 0x0, 0x27, 0x0, 0x14, - 0x0, 0x26, 0x0, 0x28, 0x0, 0x14, 0x0, 0x26, 0x0, 0x29, 0x0, 0x14, 0x0, 0x26, 0x0, 0x2b, - 0x0, 0x14, 0x0, 0x26, 0x0, 0x2e, 0x0, 0x14, 0x0, 0x26, 0x0, 0x2f, 0x0, 0x14, 0x0, 0x26, - 0x0, 0x30, 0x0, 0x14, 0x0, 0x26, 0x0, 0x31, 0x0, 0x14, 0x0, 0x26, 0x0, 0x33, 0x0, 0x14, - 0x0, 0x26, 0x0, 0x35, 0x0, 0x14, 0x0, 0x26, 0x0, 0x3d, 0x0, 0x1e, 0x0, 0x26, 0x0, 0x59, - 0xff, 0xf6, 0x0, 0x26, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x26, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0x26, - 0x0, 0x9a, 0x0, 0x14, 0x0, 0x26, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x26, 0x0, 0xd4, 0x0, 0x14, - 0x0, 0x26, 0x0, 0xd6, 0x0, 0x14, 0x0, 0x26, 0x0, 0xd7, 0x0, 0x14, 0x0, 0x27, 0x0, 0xf, - 0xff, 0xce, 0x0, 0x27, 0x0, 0x24, 0xff, 0xd8, 0x0, 0x27, 0x0, 0x2d, 0xff, 0xd8, 0x0, 0x27, - 0x0, 0x37, 0xff, 0xd8, 0x0, 0x27, 0x0, 0x3c, 0xff, 0xd3, 0x0, 0x27, 0x0, 0x3d, 0xff, 0xec, - 0x0, 0x27, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x27, 0x0, 0x55, 0xff, 0xf6, 0x0, 0x27, 0x0, 0x5b, - 0xff, 0xf1, 0x0, 0x27, 0x0, 0x5d, 0xff, 0xf6, 0x0, 0x27, 0x0, 0x97, 0xff, 0xd8, 0x0, 0x27, - 0x0, 0x98, 0xff, 0xd8, 0x0, 0x27, 0x0, 0xcc, 0xff, 0xd8, 0x0, 0x27, 0x0, 0xcd, 0xff, 0xd8, - 0x0, 0x27, 0x0, 0xd2, 0xff, 0xd3, 0x0, 0x27, 0x0, 0xd3, 0xff, 0xd8, 0x0, 0x27, 0x0, 0xd5, - 0xff, 0xd8, 0x0, 0x28, 0x0, 0x5, 0x0, 0x3c, 0x0, 0x28, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x28, - 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x2d, 0xff, 0xec, 0x0, 0x28, 0x0, 0x32, 0xff, 0xe2, - 0x0, 0x28, 0x0, 0x34, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x45, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x57, - 0xff, 0xf1, 0x0, 0x28, 0x0, 0x58, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x28, - 0x0, 0x78, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x9c, 0xff, 0xe2, - 0x0, 0x28, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb5, - 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb6, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x28, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x28, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x28, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0x29, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x29, 0x0, 0xf, 0xff, 0xc4, 0x0, 0x29, 0x0, 0x22, - 0x0, 0x32, 0x0, 0x29, 0x0, 0x24, 0xff, 0xce, 0x0, 0x29, 0x0, 0x25, 0x0, 0x1e, 0x0, 0x29, - 0x0, 0x27, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x28, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x29, 0x0, 0x1e, - 0x0, 0x29, 0x0, 0x2b, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x2c, 0x0, 0x32, 0x0, 0x29, 0x0, 0x2e, - 0x0, 0x1e, 0x0, 0x29, 0x0, 0x2f, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x30, 0x0, 0x1e, 0x0, 0x29, - 0x0, 0x31, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x33, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x35, 0x0, 0x1e, - 0x0, 0x29, 0x0, 0x36, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x37, 0x0, 0x28, 0x0, 0x29, 0x0, 0x38, - 0x0, 0x14, 0x0, 0x29, 0x0, 0x39, 0x0, 0x32, 0x0, 0x29, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x29, - 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x3c, 0x0, 0x32, 0x0, 0x29, 0x0, 0x3d, 0x0, 0x32, - 0x0, 0x29, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x29, 0x0, 0x44, 0xff, 0xf1, 0x0, 0x29, 0x0, 0x58, - 0xff, 0xf1, 0x0, 0x29, 0x0, 0x5b, 0xff, 0xf6, 0x0, 0x29, 0x0, 0x70, 0xff, 0xf1, 0x0, 0x29, - 0x0, 0x7d, 0x0, 0x50, 0x0, 0x29, 0x0, 0x7f, 0x0, 0x32, 0x0, 0x29, 0x0, 0x97, 0xff, 0xce, - 0x0, 0x29, 0x0, 0x98, 0xff, 0xce, 0x0, 0x29, 0x0, 0x9a, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x9d, - 0x0, 0x14, 0x0, 0x29, 0x0, 0x9e, 0xff, 0xf1, 0x0, 0x29, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x29, - 0x0, 0xa0, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xa2, 0xff, 0xf1, - 0x0, 0x29, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb4, - 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb5, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb6, 0xff, 0xf1, 0x0, 0x29, - 0x0, 0xcc, 0xff, 0xce, 0x0, 0x29, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x29, 0x0, 0xd2, 0x0, 0x32, - 0x0, 0x29, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x29, 0x0, 0xd4, 0x0, 0x1e, 0x0, 0x29, 0x0, 0xd5, - 0xff, 0xce, 0x0, 0x29, 0x0, 0xd6, 0x0, 0x1e, 0x0, 0x29, 0x0, 0xd7, 0x0, 0x1e, 0x0, 0x29, - 0x0, 0xd8, 0x0, 0x32, 0x0, 0x29, 0x0, 0xd9, 0x0, 0x32, 0x0, 0x29, 0x0, 0xda, 0x0, 0x32, - 0x0, 0x29, 0x0, 0xdb, 0x0, 0x32, 0x0, 0x29, 0x0, 0xe0, 0x0, 0x14, 0x0, 0x29, 0x0, 0xe1, - 0x0, 0x14, 0x0, 0x29, 0x0, 0xe2, 0x0, 0x14, 0x0, 0x2a, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x2a, - 0x0, 0x37, 0xff, 0xd8, 0x0, 0x2a, 0x0, 0x3c, 0xff, 0xe2, 0x0, 0x2a, 0x0, 0x46, 0xff, 0xf2, - 0x0, 0x2a, 0x0, 0x47, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0x48, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0x52, - 0xff, 0xf2, 0x0, 0x2a, 0x0, 0x54, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xa4, 0xff, 0xf2, 0x0, 0x2a, - 0x0, 0xa5, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xa6, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xa7, 0xff, 0xf2, - 0x0, 0x2a, 0x0, 0xa8, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xae, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xaf, - 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xb0, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xb1, 0xff, 0xf2, 0x0, 0x2a, - 0x0, 0xb2, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xd2, 0xff, 0xe2, 0x0, 0x2b, 0x0, 0x2d, 0xff, 0xd8, - 0x0, 0x2c, 0x0, 0x5, 0x0, 0x3c, 0x0, 0x2c, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x2c, 0x0, 0x3c, - 0x0, 0x1e, 0x0, 0x2c, 0x0, 0x3d, 0x0, 0x28, 0x0, 0x2c, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0x2d, - 0x0, 0x24, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0x26, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x2a, 0xff, 0xec, - 0x0, 0x2d, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0x32, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x34, - 0xff, 0xec, 0x0, 0x2d, 0x0, 0x37, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x3b, 0xff, 0xec, 0x0, 0x2d, - 0x0, 0x3c, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x58, 0xff, 0xf6, 0x0, 0x2d, 0x0, 0x59, 0xff, 0xf1, - 0x0, 0x2d, 0x0, 0x5a, 0xff, 0xf1, 0x0, 0x2d, 0x0, 0x5c, 0xff, 0xf1, 0x0, 0x2d, 0x0, 0x6c, - 0xff, 0xec, 0x0, 0x2d, 0x0, 0x78, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x97, 0xff, 0xe2, 0x0, 0x2d, - 0x0, 0x98, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0x99, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x9c, 0xff, 0xec, - 0x0, 0x2d, 0x0, 0xcc, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xce, - 0xff, 0xec, 0x0, 0x2d, 0x0, 0xd1, 0xff, 0xf1, 0x0, 0x2d, 0x0, 0xd2, 0xff, 0xec, 0x0, 0x2d, - 0x0, 0xd3, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xdc, 0xff, 0xec, - 0x0, 0x2d, 0x0, 0xdd, 0xff, 0xec, 0x0, 0x2d, 0x0, 0xdf, 0xff, 0xec, 0x0, 0x2e, 0x0, 0x5, - 0x0, 0x3c, 0x0, 0x2e, 0x0, 0x24, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x26, 0xff, 0xd8, 0x0, 0x2e, - 0x0, 0x2a, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x2c, 0x0, 0x1e, 0x0, 0x2e, 0x0, 0x32, 0xff, 0xd8, - 0x0, 0x2e, 0x0, 0x34, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x3b, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x3d, - 0x0, 0x32, 0x0, 0x2e, 0x0, 0x44, 0x0, 0xf, 0x0, 0x2e, 0x0, 0x4c, 0x0, 0x14, 0x0, 0x2e, - 0x0, 0x57, 0xff, 0xf1, 0x0, 0x2e, 0x0, 0x59, 0xff, 0xec, 0x0, 0x2e, 0x0, 0x5a, 0xff, 0xec, - 0x0, 0x2e, 0x0, 0x5b, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x5c, 0xff, 0xec, 0x0, 0x2e, 0x0, 0x5d, - 0x0, 0x19, 0x0, 0x2e, 0x0, 0x6c, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x78, 0xff, 0xd8, 0x0, 0x2e, - 0x0, 0x8b, 0x0, 0x14, 0x0, 0x2e, 0x0, 0x97, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x98, 0x0, 0x28, - 0x0, 0x2e, 0x0, 0x99, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x9c, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x9e, - 0x0, 0xf, 0x0, 0x2e, 0x0, 0x9f, 0x0, 0xf, 0x0, 0x2e, 0x0, 0xa0, 0x0, 0xf, 0x0, 0x2e, - 0x0, 0xa1, 0x0, 0xf, 0x0, 0x2e, 0x0, 0xa2, 0x0, 0xf, 0x0, 0x2e, 0x0, 0xa3, 0x0, 0xf, - 0x0, 0x2e, 0x0, 0xa9, 0x0, 0x14, 0x0, 0x2e, 0x0, 0xaa, 0x0, 0x14, 0x0, 0x2e, 0x0, 0xab, - 0x0, 0x14, 0x0, 0x2e, 0x0, 0xac, 0x0, 0x14, 0x0, 0x2e, 0x0, 0xcc, 0x0, 0x28, 0x0, 0x2e, - 0x0, 0xcd, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xce, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0xd1, 0xff, 0xec, - 0x0, 0x2e, 0x0, 0xd3, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xd5, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xd8, - 0x0, 0x1e, 0x0, 0x2e, 0x0, 0xd9, 0x0, 0x1e, 0x0, 0x2e, 0x0, 0xda, 0x0, 0x1e, 0x0, 0x2e, - 0x0, 0xdb, 0x0, 0x1e, 0x0, 0x2e, 0x0, 0xdc, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0xdd, 0xff, 0xd8, - 0x0, 0x2e, 0x0, 0xdf, 0xff, 0xd8, 0x0, 0x2f, 0x0, 0x5, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x24, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x26, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x2a, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0x2c, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x32, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x34, 0xff, 0xce, - 0x0, 0x2f, 0x0, 0x37, 0xff, 0x9c, 0x0, 0x2f, 0x0, 0x38, 0xff, 0xec, 0x0, 0x2f, 0x0, 0x39, - 0xff, 0xba, 0x0, 0x2f, 0x0, 0x3a, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x2f, - 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x2f, 0x0, 0x3d, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x4c, 0x0, 0xf, - 0x0, 0x2f, 0x0, 0x56, 0x0, 0x14, 0x0, 0x2f, 0x0, 0x57, 0xff, 0xec, 0x0, 0x2f, 0x0, 0x59, - 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x2f, - 0x0, 0x5c, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x6c, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x78, 0xff, 0xce, - 0x0, 0x2f, 0x0, 0x8b, 0x0, 0xf, 0x0, 0x2f, 0x0, 0x97, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x98, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x99, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x9c, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0x9d, 0xff, 0xec, 0x0, 0x2f, 0x0, 0xa9, 0x0, 0xf, 0x0, 0x2f, 0x0, 0xaa, 0x0, 0xf, - 0x0, 0x2f, 0x0, 0xab, 0xff, 0xf1, 0x0, 0x2f, 0x0, 0xac, 0x0, 0xf, 0x0, 0x2f, 0x0, 0xcc, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xcd, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xce, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0xd1, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x2f, 0x0, 0xd3, 0x0, 0x1e, - 0x0, 0x2f, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xd8, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xd9, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xda, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xdb, 0x0, 0x1e, 0x0, 0x2f, - 0x0, 0xdc, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xdd, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xdf, 0xff, 0xce, - 0x0, 0x2f, 0x0, 0xe0, 0xff, 0xec, 0x0, 0x2f, 0x0, 0xe1, 0xff, 0xec, 0x0, 0x2f, 0x0, 0xe2, - 0xff, 0xec, 0x0, 0x30, 0x0, 0x2d, 0xff, 0xd8, 0x0, 0x31, 0x0, 0x2d, 0xff, 0xd8, 0x0, 0x32, - 0x0, 0xf, 0xff, 0xce, 0x0, 0x32, 0x0, 0x12, 0xff, 0xce, 0x0, 0x32, 0x0, 0x24, 0xff, 0xce, - 0x0, 0x32, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x32, 0x0, 0x37, 0xff, 0xba, 0x0, 0x32, 0x0, 0x3b, - 0xff, 0xd8, 0x0, 0x32, 0x0, 0x3c, 0xff, 0xce, 0x0, 0x32, 0x0, 0x3d, 0xff, 0xec, 0x0, 0x32, - 0x0, 0x42, 0xff, 0xb0, 0x0, 0x32, 0x0, 0x5b, 0xff, 0xf1, 0x0, 0x32, 0x0, 0x5d, 0xff, 0xf1, - 0x0, 0x32, 0x0, 0x97, 0xff, 0xce, 0x0, 0x32, 0x0, 0x98, 0xff, 0xce, 0x0, 0x32, 0x0, 0xcc, - 0xff, 0xce, 0x0, 0x32, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x32, 0x0, 0xd2, 0xff, 0xce, 0x0, 0x32, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0x32, 0x0, 0xd5, 0xff, 0xce, 0x0, 0x33, 0x0, 0x5, 0x0, 0x5a, - 0x0, 0x33, 0x0, 0x8, 0x0, 0x1e, 0x0, 0x33, 0x0, 0xf, 0xff, 0x9c, 0x0, 0x33, 0x0, 0x12, - 0xff, 0xce, 0x0, 0x33, 0x0, 0x24, 0xff, 0xce, 0x0, 0x33, 0x0, 0x25, 0x0, 0x19, 0x0, 0x33, - 0x0, 0x27, 0x0, 0x19, 0x0, 0x33, 0x0, 0x28, 0x0, 0x19, 0x0, 0x33, 0x0, 0x29, 0x0, 0x19, - 0x0, 0x33, 0x0, 0x2b, 0x0, 0x19, 0x0, 0x33, 0x0, 0x2c, 0x0, 0x14, 0x0, 0x33, 0x0, 0x2e, - 0x0, 0x19, 0x0, 0x33, 0x0, 0x2f, 0x0, 0x19, 0x0, 0x33, 0x0, 0x30, 0x0, 0x19, 0x0, 0x33, - 0x0, 0x31, 0x0, 0x19, 0x0, 0x33, 0x0, 0x33, 0x0, 0x19, 0x0, 0x33, 0x0, 0x35, 0x0, 0x19, - 0x0, 0x33, 0x0, 0x39, 0x0, 0x1e, 0x0, 0x33, 0x0, 0x3a, 0x0, 0x1e, 0x0, 0x33, 0x0, 0x42, - 0xff, 0x9c, 0x0, 0x33, 0x0, 0x44, 0xff, 0xec, 0x0, 0x33, 0x0, 0x49, 0x0, 0xa, 0x0, 0x33, - 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x33, 0x0, 0x55, 0xff, 0xf1, 0x0, 0x33, 0x0, 0x57, 0x0, 0xf, - 0x0, 0x33, 0x0, 0x59, 0x0, 0xf, 0x0, 0x33, 0x0, 0x5a, 0x0, 0xf, 0x0, 0x33, 0x0, 0x5c, - 0x0, 0xf, 0x0, 0x33, 0x0, 0x84, 0x0, 0xa, 0x0, 0x33, 0x0, 0x85, 0x0, 0xa, 0x0, 0x33, - 0x0, 0x97, 0xff, 0xce, 0x0, 0x33, 0x0, 0x98, 0xff, 0xce, 0x0, 0x33, 0x0, 0x9a, 0x0, 0x19, - 0x0, 0x33, 0x0, 0x9e, 0xff, 0xec, 0x0, 0x33, 0x0, 0x9f, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa0, - 0xff, 0xec, 0x0, 0x33, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x33, - 0x0, 0xa3, 0xff, 0xec, 0x0, 0x33, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x33, 0x0, 0xcd, 0xff, 0xce, - 0x0, 0x33, 0x0, 0xd1, 0x0, 0xf, 0x0, 0x33, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x33, 0x0, 0xd4, - 0x0, 0x19, 0x0, 0x33, 0x0, 0xd5, 0xff, 0xce, 0x0, 0x33, 0x0, 0xd6, 0x0, 0x19, 0x0, 0x33, - 0x0, 0xd7, 0x0, 0x19, 0x0, 0x33, 0x0, 0xd8, 0x0, 0x14, 0x0, 0x33, 0x0, 0xd9, 0x0, 0x14, - 0x0, 0x33, 0x0, 0xda, 0x0, 0x14, 0x0, 0x33, 0x0, 0xdb, 0x0, 0x14, 0x0, 0x34, 0x0, 0x37, - 0xff, 0xba, 0x0, 0x34, 0x0, 0x39, 0xff, 0xe2, 0x0, 0x34, 0x0, 0x3c, 0xff, 0xba, 0x0, 0x34, - 0x0, 0xd2, 0xff, 0xba, 0x0, 0x35, 0x0, 0x5, 0x0, 0x46, 0x0, 0x35, 0x0, 0x2d, 0xff, 0xec, - 0x0, 0x35, 0x0, 0x37, 0xff, 0xec, 0x0, 0x35, 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x35, 0x0, 0x3c, - 0xff, 0xf1, 0x0, 0x35, 0x0, 0x3d, 0x0, 0x1e, 0x0, 0x35, 0x0, 0x5b, 0x0, 0x19, 0x0, 0x35, - 0x0, 0xd2, 0xff, 0xf1, 0x0, 0x36, 0x0, 0x5, 0x0, 0x32, 0x0, 0x36, 0x0, 0x24, 0xff, 0xf1, - 0x0, 0x36, 0x0, 0x26, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x2a, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x2d, - 0xff, 0xe2, 0x0, 0x36, 0x0, 0x32, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x34, 0xff, 0xf6, 0x0, 0x36, - 0x0, 0x59, 0xff, 0xec, 0x0, 0x36, 0x0, 0x5a, 0xff, 0xec, 0x0, 0x36, 0x0, 0x5c, 0xff, 0xec, - 0x0, 0x36, 0x0, 0x6c, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x78, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x97, - 0xff, 0xf1, 0x0, 0x36, 0x0, 0x98, 0xff, 0xf1, 0x0, 0x36, 0x0, 0x99, 0xff, 0xf6, 0x0, 0x36, - 0x0, 0x9c, 0xff, 0xf6, 0x0, 0x36, 0x0, 0xcc, 0xff, 0xf1, 0x0, 0x36, 0x0, 0xcd, 0xff, 0xf1, - 0x0, 0x36, 0x0, 0xce, 0xff, 0xf6, 0x0, 0x36, 0x0, 0xd1, 0xff, 0xec, 0x0, 0x36, 0x0, 0xd3, - 0xff, 0xf1, 0x0, 0x36, 0x0, 0xd5, 0xff, 0xf1, 0x0, 0x36, 0x0, 0xdc, 0xff, 0xf6, 0x0, 0x36, - 0x0, 0xdd, 0xff, 0xf6, 0x0, 0x36, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x37, 0x0, 0x4, 0x0, 0x5a, - 0x0, 0x37, 0x0, 0x5, 0x0, 0xbe, 0x0, 0x37, 0x0, 0x7, 0x0, 0x50, 0x0, 0x37, 0x0, 0x8, - 0x0, 0x5a, 0x0, 0x37, 0x0, 0x9, 0x0, 0x46, 0x0, 0x37, 0x0, 0xc, 0x0, 0x5a, 0x0, 0x37, - 0x0, 0xd, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x22, 0x0, 0x78, 0x0, 0x37, 0x0, 0x25, 0x0, 0x6e, - 0x0, 0x37, 0x0, 0x26, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x27, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x28, - 0x0, 0x6e, 0x0, 0x37, 0x0, 0x29, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0x37, - 0x0, 0x2b, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x2c, 0x0, 0x82, 0x0, 0x37, 0x0, 0x2d, 0x0, 0x3c, - 0x0, 0x37, 0x0, 0x2e, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x2f, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x30, - 0x0, 0x6e, 0x0, 0x37, 0x0, 0x31, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x32, 0x0, 0x1e, 0x0, 0x37, - 0x0, 0x33, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x34, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x35, 0x0, 0x6e, - 0x0, 0x37, 0x0, 0x36, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x37, 0x0, 0x82, 0x0, 0x37, 0x0, 0x38, - 0x0, 0x50, 0x0, 0x37, 0x0, 0x39, 0x0, 0x82, 0x0, 0x37, 0x0, 0x3a, 0x0, 0x82, 0x0, 0x37, - 0x0, 0x3b, 0x0, 0x78, 0x0, 0x37, 0x0, 0x3c, 0x0, 0x78, 0x0, 0x37, 0x0, 0x3d, 0x0, 0x78, - 0x0, 0x37, 0x0, 0x40, 0x0, 0x78, 0x0, 0x37, 0x0, 0x44, 0xff, 0xf1, 0x0, 0x37, 0x0, 0x45, - 0x0, 0x46, 0x0, 0x37, 0x0, 0x46, 0xff, 0xec, 0x0, 0x37, 0x0, 0x47, 0xff, 0xec, 0x0, 0x37, - 0x0, 0x48, 0xff, 0xec, 0x0, 0x37, 0x0, 0x49, 0x0, 0x32, 0x0, 0x37, 0x0, 0x4a, 0xff, 0xf1, - 0x0, 0x37, 0x0, 0x4b, 0x0, 0x46, 0x0, 0x37, 0x0, 0x4c, 0x0, 0x32, 0x0, 0x37, 0x0, 0x4d, - 0x0, 0x3c, 0x0, 0x37, 0x0, 0x4e, 0x0, 0x46, 0x0, 0x37, 0x0, 0x4f, 0x0, 0x46, 0x0, 0x37, - 0x0, 0x52, 0xff, 0xec, 0x0, 0x37, 0x0, 0x54, 0xff, 0xec, 0x0, 0x37, 0x0, 0x57, 0x0, 0xa, - 0x0, 0x37, 0x0, 0x5f, 0x0, 0x50, 0x0, 0x37, 0x0, 0x60, 0x0, 0x64, 0x0, 0x37, 0x0, 0x62, - 0x0, 0x32, 0x0, 0x37, 0x0, 0x65, 0x0, 0x32, 0x0, 0x37, 0x0, 0x67, 0x0, 0x50, 0x0, 0x37, - 0x0, 0x68, 0x0, 0x32, 0x0, 0x37, 0x0, 0x6c, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x6e, 0x0, 0x50, - 0x0, 0x37, 0x0, 0x6f, 0x0, 0x50, 0x0, 0x37, 0x0, 0x73, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x78, - 0x0, 0x1e, 0x0, 0x37, 0x0, 0x7d, 0x0, 0x64, 0x0, 0x37, 0x0, 0x7f, 0x0, 0x64, 0x0, 0x37, - 0x0, 0x84, 0x0, 0x32, 0x0, 0x37, 0x0, 0x85, 0x0, 0x32, 0x0, 0x37, 0x0, 0x99, 0x0, 0x1e, - 0x0, 0x37, 0x0, 0x9a, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x9c, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x9d, - 0x0, 0x50, 0x0, 0x37, 0x0, 0x9e, 0xff, 0xf1, 0x0, 0x37, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x37, - 0x0, 0xa4, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa6, 0xff, 0xec, - 0x0, 0x37, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa8, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa9, - 0x0, 0x1e, 0x0, 0x37, 0x0, 0xaa, 0x0, 0x46, 0x0, 0x37, 0x0, 0xab, 0x0, 0x32, 0x0, 0x37, - 0x0, 0xac, 0x0, 0x64, 0x0, 0x37, 0x0, 0xae, 0xff, 0xec, 0x0, 0x37, 0x0, 0xaf, 0xff, 0xec, - 0x0, 0x37, 0x0, 0xb0, 0xff, 0xec, 0x0, 0x37, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x37, 0x0, 0xb2, - 0xff, 0xec, 0x0, 0x37, 0x0, 0xba, 0x0, 0x96, 0x0, 0x37, 0x0, 0xce, 0x0, 0x1e, 0x0, 0x37, - 0x0, 0xd2, 0x0, 0x78, 0x0, 0x37, 0x0, 0xd4, 0x0, 0x6e, 0x0, 0x37, 0x0, 0xd6, 0x0, 0x6e, - 0x0, 0x37, 0x0, 0xd7, 0x0, 0x6e, 0x0, 0x37, 0x0, 0xd8, 0x0, 0x82, 0x0, 0x37, 0x0, 0xd9, - 0x0, 0x82, 0x0, 0x37, 0x0, 0xda, 0x0, 0x82, 0x0, 0x37, 0x0, 0xdb, 0x0, 0x82, 0x0, 0x37, - 0x0, 0xdc, 0x0, 0x1e, 0x0, 0x37, 0x0, 0xdd, 0x0, 0x1e, 0x0, 0x37, 0x0, 0xdf, 0x0, 0x1e, - 0x0, 0x37, 0x0, 0xe0, 0x0, 0x50, 0x0, 0x37, 0x0, 0xe1, 0x0, 0x50, 0x0, 0x37, 0x0, 0xe2, - 0x0, 0x50, 0x0, 0x38, 0x0, 0x5, 0x0, 0x32, 0x0, 0x38, 0x0, 0x24, 0xff, 0xe2, 0x0, 0x38, - 0x0, 0x2d, 0xff, 0xec, 0x0, 0x38, 0x0, 0x59, 0xff, 0xf1, 0x0, 0x38, 0x0, 0x5a, 0xff, 0xf1, - 0x0, 0x38, 0x0, 0x5b, 0xff, 0xf1, 0x0, 0x38, 0x0, 0x5c, 0xff, 0xf1, 0x0, 0x38, 0x0, 0x5d, - 0xff, 0xf1, 0x0, 0x38, 0x0, 0x97, 0xff, 0xe2, 0x0, 0x38, 0x0, 0x98, 0xff, 0xe2, 0x0, 0x38, - 0x0, 0xcc, 0xff, 0xe2, 0x0, 0x38, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0x38, 0x0, 0xd1, 0xff, 0xf1, - 0x0, 0x38, 0x0, 0xd3, 0xff, 0xe2, 0x0, 0x38, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x5, - 0x0, 0x50, 0x0, 0x39, 0x0, 0xf, 0xff, 0xa6, 0x0, 0x39, 0x0, 0x24, 0xff, 0xb0, 0x0, 0x39, - 0x0, 0x26, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x2c, 0x0, 0x1e, - 0x0, 0x39, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x34, - 0xff, 0xe2, 0x0, 0x39, 0x0, 0x37, 0x0, 0x1e, 0x0, 0x39, 0x0, 0x39, 0x0, 0x1e, 0x0, 0x39, - 0x0, 0x3a, 0x0, 0x1e, 0x0, 0x39, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x14, - 0x0, 0x39, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x39, 0x0, 0x44, 0xff, 0xba, 0x0, 0x39, 0x0, 0x46, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0x47, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x48, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0x4a, 0xff, 0xce, 0x0, 0x39, 0x0, 0x50, 0xff, 0xec, 0x0, 0x39, 0x0, 0x51, 0xff, 0xec, - 0x0, 0x39, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x53, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x54, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0x55, 0xff, 0xce, 0x0, 0x39, 0x0, 0x56, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0x58, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x5b, 0xff, 0xec, 0x0, 0x39, 0x0, 0x5d, 0xff, 0xd8, - 0x0, 0x39, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x97, - 0xff, 0xb0, 0x0, 0x39, 0x0, 0x98, 0xff, 0xb0, 0x0, 0x39, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x39, - 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x9e, 0xff, 0xba, 0x0, 0x39, 0x0, 0x9f, 0xff, 0xba, - 0x0, 0x39, 0x0, 0xa0, 0xff, 0xba, 0x0, 0x39, 0x0, 0xa1, 0xff, 0xba, 0x0, 0x39, 0x0, 0xa2, - 0xff, 0xba, 0x0, 0x39, 0x0, 0xa3, 0xff, 0xba, 0x0, 0x39, 0x0, 0xa4, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0xa5, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xa7, 0xff, 0xd8, - 0x0, 0x39, 0x0, 0xa8, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xad, 0xff, 0xec, 0x0, 0x39, 0x0, 0xae, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0xaf, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0xb1, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb2, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb3, 0xff, 0xd8, - 0x0, 0x39, 0x0, 0xb4, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb5, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb6, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0xcc, 0xff, 0xb0, 0x0, 0x39, 0x0, 0xcd, 0xff, 0xb0, 0x0, 0x39, - 0x0, 0xce, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0x39, 0x0, 0xd3, 0xff, 0xb0, - 0x0, 0x39, 0x0, 0xd5, 0xff, 0xb0, 0x0, 0x39, 0x0, 0xd8, 0x0, 0x1e, 0x0, 0x39, 0x0, 0xd9, - 0x0, 0x1e, 0x0, 0x39, 0x0, 0xda, 0x0, 0x1e, 0x0, 0x39, 0x0, 0xdb, 0x0, 0x1e, 0x0, 0x39, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0x5, 0x0, 0x50, 0x0, 0x3a, 0x0, 0xf, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x24, - 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x3a, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x34, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0x37, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x39, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x3a, - 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x3a, - 0x0, 0x44, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x46, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x47, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0x48, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x52, - 0xff, 0xec, 0x0, 0x3a, 0x0, 0x54, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x56, 0xff, 0xec, 0x0, 0x3a, - 0x0, 0x58, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x5d, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x6c, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x97, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x98, - 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x3a, - 0x0, 0x9e, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x9f, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa0, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa3, - 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x3a, - 0x0, 0xa6, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa8, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0xae, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xaf, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xb0, - 0xff, 0xec, 0x0, 0x3a, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xb2, 0xff, 0xec, 0x0, 0x3a, - 0x0, 0xcc, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xcd, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xce, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0xd3, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xd5, - 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x3a, - 0x0, 0xdf, 0xff, 0xe2, 0x0, 0x3b, 0x0, 0x5, 0x0, 0x32, 0x0, 0x3b, 0x0, 0x26, 0xff, 0xc4, - 0x0, 0x3b, 0x0, 0x2a, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x32, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x34, - 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x57, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x59, 0xff, 0xe2, 0x0, 0x3b, - 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x3b, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x3b, 0x0, 0x5c, 0xff, 0xe2, - 0x0, 0x3b, 0x0, 0x6c, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x78, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x99, - 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x9c, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0xce, 0xff, 0xc4, 0x0, 0x3b, - 0x0, 0xd1, 0xff, 0xe2, 0x0, 0x3b, 0x0, 0xdc, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0xdd, 0xff, 0xc4, - 0x0, 0x3b, 0x0, 0xdf, 0xff, 0xc4, 0x0, 0x3c, 0x0, 0x5, 0x0, 0x96, 0x0, 0x3c, 0x0, 0x7, - 0x0, 0x28, 0x0, 0x3c, 0x0, 0x8, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x9, 0x0, 0x3c, 0x0, 0x3c, - 0x0, 0xc, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0xd, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xf, 0xff, 0xc4, - 0x0, 0x3c, 0x0, 0x22, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x24, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x25, - 0x0, 0x46, 0x0, 0x3c, 0x0, 0x27, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x28, 0x0, 0x46, 0x0, 0x3c, - 0x0, 0x29, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x2b, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x2c, 0x0, 0x46, - 0x0, 0x3c, 0x0, 0x2e, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x2f, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x30, - 0x0, 0x46, 0x0, 0x3c, 0x0, 0x31, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x33, 0x0, 0x46, 0x0, 0x3c, - 0x0, 0x35, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x36, 0x0, 0x28, 0x0, 0x3c, 0x0, 0x37, 0x0, 0x50, - 0x0, 0x3c, 0x0, 0x38, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x39, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x3a, - 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x5a, 0x0, 0x3c, - 0x0, 0x3d, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x40, 0x0, 0x64, 0x0, 0x3c, 0x0, 0x42, 0xff, 0xb0, - 0x0, 0x3c, 0x0, 0x44, 0xff, 0xce, 0x0, 0x3c, 0x0, 0x45, 0x0, 0x14, 0x0, 0x3c, 0x0, 0x46, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x47, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x48, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0x4a, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x4b, 0x0, 0x14, 0x0, 0x3c, 0x0, 0x4e, 0x0, 0x14, - 0x0, 0x3c, 0x0, 0x4f, 0x0, 0x14, 0x0, 0x3c, 0x0, 0x50, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x51, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x53, 0xff, 0xe2, 0x0, 0x3c, - 0x0, 0x54, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x55, 0xff, 0xe2, 0x0, 0x3c, 0x0, 0x56, 0xff, 0xe2, - 0x0, 0x3c, 0x0, 0x58, 0xff, 0xe2, 0x0, 0x3c, 0x0, 0x5b, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x5d, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0x5f, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x60, 0x0, 0x64, 0x0, 0x3c, - 0x0, 0x6e, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x6f, 0x0, 0x50, 0x0, 0x3c, 0x0, 0x7d, 0x0, 0x64, - 0x0, 0x3c, 0x0, 0x7f, 0x0, 0x64, 0x0, 0x3c, 0x0, 0x97, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x98, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x9a, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x9d, 0x0, 0x32, 0x0, 0x3c, - 0x0, 0x9e, 0xff, 0xce, 0x0, 0x3c, 0x0, 0x9f, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa0, 0xff, 0xce, - 0x0, 0x3c, 0x0, 0xa1, 0xff, 0xe2, 0x0, 0x3c, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa3, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa4, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa5, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa7, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa8, 0xff, 0xd8, - 0x0, 0x3c, 0x0, 0xad, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xae, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xaf, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xb1, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0xb2, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xba, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0xcc, 0xff, 0xd8, - 0x0, 0x3c, 0x0, 0xcd, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xd2, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0xd3, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xd4, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xd5, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0xd6, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xd7, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xd8, 0x0, 0x46, - 0x0, 0x3c, 0x0, 0xd9, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xda, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xdb, - 0x0, 0x46, 0x0, 0x3c, 0x0, 0xe0, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xe1, 0x0, 0x32, 0x0, 0x3c, - 0x0, 0xe2, 0x0, 0x32, 0x0, 0x3d, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x3d, 0x0, 0x26, 0xff, 0xce, - 0x0, 0x3d, 0x0, 0x2a, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x2c, 0x0, 0x28, 0x0, 0x3d, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0x3d, 0x0, 0x32, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x34, 0xff, 0xce, 0x0, 0x3d, - 0x0, 0x37, 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x39, 0x0, 0x14, 0x0, 0x3d, 0x0, 0x3a, 0x0, 0x14, - 0x0, 0x3d, 0x0, 0x3b, 0x0, 0x14, 0x0, 0x3d, 0x0, 0x3c, 0x0, 0x14, 0x0, 0x3d, 0x0, 0x3d, - 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x59, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x3d, - 0x0, 0x5c, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x6c, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x78, 0xff, 0xce, - 0x0, 0x3d, 0x0, 0x99, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x9c, 0xff, 0xce, 0x0, 0x3d, 0x0, 0xce, - 0xff, 0xce, 0x0, 0x3d, 0x0, 0xd1, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0xd8, 0x0, 0x28, 0x0, 0x3d, - 0x0, 0xd9, 0x0, 0x28, 0x0, 0x3d, 0x0, 0xda, 0x0, 0x28, 0x0, 0x3d, 0x0, 0xdb, 0x0, 0x28, - 0x0, 0x3d, 0x0, 0xdc, 0xff, 0xce, 0x0, 0x3d, 0x0, 0xdd, 0xff, 0xce, 0x0, 0x3d, 0x0, 0xdf, - 0xff, 0xce, 0x0, 0x3e, 0x0, 0x16, 0x0, 0x1e, 0x0, 0x42, 0x0, 0x26, 0xff, 0xb0, 0x0, 0x42, - 0x0, 0x2a, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x32, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x34, 0xff, 0xb0, - 0x0, 0x42, 0x0, 0x37, 0xff, 0x6a, 0x0, 0x42, 0x0, 0x38, 0xff, 0x9c, 0x0, 0x42, 0x0, 0x39, - 0xff, 0x7e, 0x0, 0x42, 0x0, 0x3a, 0xff, 0x7e, 0x0, 0x42, 0x0, 0x3c, 0xff, 0x38, 0x0, 0x42, - 0x0, 0x46, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x47, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x48, 0xff, 0xd8, - 0x0, 0x42, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x54, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x57, - 0xff, 0xc4, 0x0, 0x42, 0x0, 0x59, 0xff, 0x9c, 0x0, 0x42, 0x0, 0x5a, 0xff, 0x9c, 0x0, 0x42, - 0x0, 0x5c, 0xff, 0x9c, 0x0, 0x42, 0x0, 0x6c, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x78, 0xff, 0xb0, - 0x0, 0x42, 0x0, 0x99, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x9c, 0xff, 0xb0, 0x0, 0x42, 0x0, 0xa4, - 0xff, 0xd8, 0x0, 0x42, 0x0, 0xa5, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x42, - 0x0, 0xa7, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xa8, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xae, 0xff, 0xd8, - 0x0, 0x42, 0x0, 0xaf, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xb1, - 0xff, 0xd8, 0x0, 0x42, 0x0, 0xb2, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xce, 0xff, 0xb0, 0x0, 0x42, - 0x0, 0xd1, 0xff, 0x9c, 0x0, 0x42, 0x0, 0xd2, 0xff, 0x38, 0x0, 0x42, 0x0, 0xdc, 0xff, 0xb0, - 0x0, 0x42, 0x0, 0xdd, 0xff, 0xb0, 0x0, 0x42, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x45, 0x0, 0x59, - 0xff, 0xf6, 0x0, 0x45, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x45, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0x45, - 0x0, 0x5d, 0xff, 0xf1, 0x0, 0x45, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x47, 0x0, 0x5, 0x0, 0x32, - 0x0, 0x48, 0x0, 0x45, 0xff, 0xf6, 0x0, 0x48, 0x0, 0x53, 0xff, 0xf6, 0x0, 0x48, 0x0, 0x56, - 0x0, 0xa, 0x0, 0x48, 0x0, 0x59, 0xff, 0xf1, 0x0, 0x48, 0x0, 0x5a, 0xff, 0xf1, 0x0, 0x48, - 0x0, 0x5c, 0xff, 0xf1, 0x0, 0x48, 0x0, 0x8c, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x8d, 0x0, 0x1e, - 0x0, 0x48, 0x0, 0x8e, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x8f, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x90, - 0x0, 0x1e, 0x0, 0x48, 0x0, 0x91, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x92, 0x0, 0x1e, 0x0, 0x48, - 0x0, 0x93, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x94, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x95, 0x0, 0x1e, - 0x0, 0x49, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x49, 0x0, 0x4c, 0x0, 0x6, 0x0, 0x49, 0x0, 0x7c, - 0xff, 0xba, 0x0, 0x49, 0x0, 0x8b, 0xff, 0xf9, 0x0, 0x4a, 0x0, 0x5, 0x0, 0x32, 0x0, 0x4a, - 0x0, 0x4d, 0x0, 0xf, 0x0, 0x4c, 0x0, 0x5, 0x0, 0x32, 0x0, 0x4d, 0x0, 0x5, 0x0, 0x32, - 0x0, 0x4e, 0x0, 0x5, 0x0, 0x28, 0x0, 0x4e, 0x0, 0x4c, 0x0, 0x10, 0x0, 0x4e, 0x0, 0x5b, - 0x0, 0xa, 0x0, 0x4e, 0x0, 0x8b, 0x0, 0x11, 0x0, 0x4f, 0x0, 0x5, 0x0, 0x32, 0x0, 0x52, - 0x0, 0x59, 0xff, 0xf6, 0x0, 0x52, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x52, 0x0, 0x5c, 0xff, 0xf6, - 0x0, 0x52, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0x52, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x53, 0x0, 0x48, - 0x0, 0xf, 0x0, 0x53, 0x0, 0x59, 0xff, 0xf6, 0x0, 0x53, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x53, - 0x0, 0x5c, 0xff, 0xf6, 0x0, 0x53, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0x53, 0x0, 0xa5, 0x0, 0xf, - 0x0, 0x53, 0x0, 0xa6, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa7, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa8, - 0x0, 0xf, 0x0, 0x53, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x55, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x55, - 0x0, 0xf, 0xff, 0xce, 0x0, 0x55, 0x0, 0x49, 0x0, 0xf, 0x0, 0x55, 0x0, 0x57, 0x0, 0xf, - 0x0, 0x55, 0x0, 0x59, 0x0, 0x1e, 0x0, 0x55, 0x0, 0x5a, 0x0, 0x1e, 0x0, 0x55, 0x0, 0x5b, - 0x0, 0x14, 0x0, 0x55, 0x0, 0x5c, 0x0, 0x1e, 0x0, 0x55, 0x0, 0x84, 0x0, 0xf, 0x0, 0x55, - 0x0, 0x85, 0x0, 0xf, 0x0, 0x55, 0x0, 0xd1, 0x0, 0x1e, 0x0, 0x56, 0x0, 0x44, 0x0, 0x1e, - 0x0, 0x56, 0x0, 0x70, 0x0, 0x1e, 0x0, 0x56, 0x0, 0x9e, 0x0, 0x1e, 0x0, 0x56, 0x0, 0x9f, - 0x0, 0x1e, 0x0, 0x56, 0x0, 0xa0, 0x0, 0x1e, 0x0, 0x56, 0x0, 0xa1, 0x0, 0x1e, 0x0, 0x56, - 0x0, 0xa2, 0x0, 0x1e, 0x0, 0x56, 0x0, 0xa3, 0x0, 0x1e, 0x0, 0x58, 0x0, 0x49, 0x0, 0x14, - 0x0, 0x58, 0x0, 0x55, 0x0, 0xa, 0x0, 0x58, 0x0, 0x84, 0x0, 0x14, 0x0, 0x58, 0x0, 0x85, - 0x0, 0x14, 0x0, 0x59, 0x0, 0x11, 0xff, 0xce, 0x0, 0x59, 0x0, 0x49, 0x0, 0x19, 0x0, 0x59, - 0x0, 0x4d, 0x0, 0xa, 0x0, 0x59, 0x0, 0x56, 0x0, 0xf, 0x0, 0x59, 0x0, 0x57, 0x0, 0x19, - 0x0, 0x59, 0x0, 0x59, 0x0, 0x23, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x23, 0x0, 0x59, 0x0, 0x5b, - 0x0, 0x14, 0x0, 0x59, 0x0, 0x5c, 0x0, 0x23, 0x0, 0x59, 0x0, 0x84, 0x0, 0x19, 0x0, 0x59, - 0x0, 0x85, 0x0, 0x19, 0x0, 0x59, 0x0, 0xd1, 0x0, 0x23, 0x0, 0x5a, 0x0, 0x11, 0xff, 0xce, - 0x0, 0x5a, 0x0, 0x49, 0x0, 0x19, 0x0, 0x5a, 0x0, 0x4d, 0x0, 0xf, 0x0, 0x5a, 0x0, 0x56, - 0x0, 0xa, 0x0, 0x5a, 0x0, 0x57, 0x0, 0x19, 0x0, 0x5a, 0x0, 0x59, 0x0, 0x23, 0x0, 0x5a, - 0x0, 0x5a, 0x0, 0x23, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x5a, 0x0, 0x5c, 0x0, 0x23, - 0x0, 0x5a, 0x0, 0x84, 0x0, 0x19, 0x0, 0x5a, 0x0, 0x85, 0x0, 0x19, 0x0, 0x5a, 0x0, 0xd1, - 0x0, 0x23, 0x0, 0x5c, 0x0, 0x5, 0x0, 0x32, 0x0, 0x5c, 0x0, 0x11, 0xff, 0xce, 0x0, 0x5c, - 0x0, 0x42, 0xff, 0xce, 0x0, 0x5c, 0x0, 0x49, 0x0, 0x19, 0x0, 0x5c, 0x0, 0x4d, 0x0, 0xf, - 0x0, 0x5c, 0x0, 0x56, 0x0, 0xf, 0x0, 0x5c, 0x0, 0x57, 0x0, 0x19, 0x0, 0x5c, 0x0, 0x59, - 0x0, 0x23, 0x0, 0x5c, 0x0, 0x5a, 0x0, 0x23, 0x0, 0x5c, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x5c, - 0x0, 0x5c, 0x0, 0x23, 0x0, 0x5c, 0x0, 0xd1, 0x0, 0x23, 0x0, 0x5d, 0x0, 0x49, 0x0, 0x14, - 0x0, 0x5d, 0x0, 0x56, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x57, 0x0, 0xf, 0x0, 0x5d, 0x0, 0x59, - 0x0, 0x14, 0x0, 0x5d, 0x0, 0x5a, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x5d, - 0x0, 0x5c, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x84, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x85, 0x0, 0x14, - 0x0, 0x5d, 0x0, 0xd1, 0x0, 0x14, 0x0, 0x68, 0x0, 0x44, 0x0, 0xa, 0x0, 0x68, 0x0, 0x46, - 0x0, 0xf, 0x0, 0x68, 0x0, 0x47, 0x0, 0xf, 0x0, 0x68, 0x0, 0x48, 0x0, 0xf, 0x0, 0x68, - 0x0, 0x52, 0x0, 0xf, 0x0, 0x68, 0x0, 0x54, 0x0, 0xf, 0x0, 0x68, 0x0, 0x9e, 0x0, 0xa, - 0x0, 0x68, 0x0, 0x9f, 0x0, 0xa, 0x0, 0x68, 0x0, 0xa0, 0x0, 0xa, 0x0, 0x68, 0x0, 0xa1, - 0x0, 0xa, 0x0, 0x68, 0x0, 0xa2, 0x0, 0xa, 0x0, 0x68, 0x0, 0xa3, 0x0, 0xa, 0x0, 0x68, - 0x0, 0xa4, 0x0, 0xf, 0x0, 0x68, 0x0, 0xa5, 0x0, 0xf, 0x0, 0x68, 0x0, 0xa6, 0x0, 0xf, - 0x0, 0x68, 0x0, 0xa7, 0x0, 0xf, 0x0, 0x68, 0x0, 0xa8, 0x0, 0xf, 0x0, 0x68, 0x0, 0xae, - 0x0, 0xf, 0x0, 0x68, 0x0, 0xaf, 0x0, 0xf, 0x0, 0x68, 0x0, 0xb0, 0x0, 0xf, 0x0, 0x68, - 0x0, 0xb1, 0x0, 0xf, 0x0, 0x68, 0x0, 0xb2, 0x0, 0xf, 0x0, 0x6b, 0x0, 0x5, 0x0, 0x3c, - 0x0, 0x6b, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0x6b, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x34, 0xff, 0xe2, 0x0, 0x6b, - 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x99, 0xff, 0xe2, - 0x0, 0x6b, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xdc, - 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0x6c, - 0x0, 0x12, 0xff, 0xce, 0x0, 0x6c, 0x0, 0x24, 0xff, 0xce, 0x0, 0x6c, 0x0, 0x2d, 0xff, 0xe2, - 0x0, 0x6c, 0x0, 0x37, 0xff, 0xba, 0x0, 0x6c, 0x0, 0x97, 0xff, 0xce, 0x0, 0x6c, 0x0, 0x98, - 0xff, 0xce, 0x0, 0x6c, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x6c, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x6c, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0x6c, 0x0, 0xd5, 0xff, 0xce, 0x0, 0x76, 0x0, 0x37, 0xff, 0x9c, - 0x0, 0x76, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x76, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x78, 0x0, 0x5, - 0x0, 0x3c, 0x0, 0x78, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x78, - 0x0, 0x2d, 0xff, 0xec, 0x0, 0x78, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x34, 0xff, 0xe2, - 0x0, 0x78, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x99, - 0xff, 0xe2, 0x0, 0x78, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x78, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x78, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x78, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x78, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0x7a, 0x0, 0x37, 0xff, 0x9c, 0x0, 0x7a, 0x0, 0x3c, 0xff, 0xce, 0x0, 0x7a, 0x0, 0xd2, - 0xff, 0xb0, 0x0, 0x80, 0x0, 0x39, 0x0, 0x32, 0x0, 0x80, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x80, - 0x0, 0x3c, 0x0, 0x32, 0x0, 0x80, 0x0, 0xd2, 0x0, 0x32, 0x0, 0x82, 0x0, 0x37, 0xff, 0x9c, - 0x0, 0x82, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x82, 0x0, 0xd2, 0xff, 0xba, 0x0, 0x87, 0x0, 0x37, - 0xff, 0x9c, 0x0, 0x87, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x87, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x88, - 0x0, 0x37, 0xff, 0x9c, 0x0, 0x88, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x88, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0x97, 0x0, 0x5, 0xff, 0xce, 0x0, 0x97, 0x0, 0x26, 0xff, 0xdd, 0x0, 0x97, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0x97, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x97, 0x0, 0x32, 0xff, 0xdd, 0x0, 0x97, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0x97, 0x0, 0x37, 0xff, 0xa1, 0x0, 0x97, 0x0, 0x39, 0xff, 0xce, - 0x0, 0x97, 0x0, 0x3a, 0xff, 0xec, 0x0, 0x97, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x97, 0x0, 0x6c, - 0xff, 0xdd, 0x0, 0x97, 0x0, 0x78, 0xff, 0xdd, 0x0, 0x97, 0x0, 0x99, 0xff, 0xdd, 0x0, 0x97, - 0x0, 0x9c, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xce, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0x97, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xdf, - 0xff, 0xdd, 0x0, 0x98, 0x0, 0x5, 0xff, 0xce, 0x0, 0x98, 0x0, 0x26, 0xff, 0xdd, 0x0, 0x98, - 0x0, 0x2a, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x98, 0x0, 0x32, 0xff, 0xdd, - 0x0, 0x98, 0x0, 0x34, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x37, 0xff, 0xa1, 0x0, 0x98, 0x0, 0x39, - 0xff, 0xce, 0x0, 0x98, 0x0, 0x3a, 0xff, 0xec, 0x0, 0x98, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x98, - 0x0, 0x6c, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x78, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x99, 0xff, 0xdd, - 0x0, 0x98, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0x98, 0x0, 0xce, 0xff, 0xdd, 0x0, 0x98, 0x0, 0xd2, - 0xff, 0x9c, 0x0, 0x98, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0x98, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0x98, - 0x0, 0xdf, 0xff, 0xdd, 0x0, 0x9a, 0x0, 0x5, 0x0, 0x3c, 0x0, 0x9a, 0x0, 0x26, 0xff, 0xe2, - 0x0, 0x9a, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x2d, 0xff, 0xec, 0x0, 0x9a, 0x0, 0x32, - 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x34, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x9a, - 0x0, 0x78, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x9c, 0xff, 0xe2, - 0x0, 0x9a, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0xdd, - 0xff, 0xe2, 0x0, 0x9a, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0x9c, 0x0, 0x12, 0xff, 0xce, 0x0, 0x9c, - 0x0, 0x24, 0xff, 0xce, 0x0, 0x9c, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x9c, 0x0, 0x37, 0xff, 0xba, - 0x0, 0x9c, 0x0, 0x3d, 0xff, 0xec, 0x0, 0x9c, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x9c, 0x0, 0x97, - 0xff, 0xce, 0x0, 0x9c, 0x0, 0x98, 0xff, 0xce, 0x0, 0x9c, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x9c, - 0x0, 0xcd, 0xff, 0xce, 0x0, 0x9c, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x9c, 0x0, 0xd5, 0xff, 0xce, - 0x0, 0x9d, 0x0, 0x5, 0x0, 0x32, 0x0, 0x9d, 0x0, 0x24, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0x9d, 0x0, 0x97, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0x98, 0xff, 0xe2, 0x0, 0x9d, - 0x0, 0xcc, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0xd3, 0xff, 0xe2, - 0x0, 0x9d, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0xa5, 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa5, 0x0, 0x56, - 0x0, 0xa, 0x0, 0xa5, 0x0, 0x8c, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x8d, 0x0, 0x1e, 0x0, 0xa5, - 0x0, 0x8e, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x8f, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x90, 0x0, 0x1e, - 0x0, 0xa5, 0x0, 0x91, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x92, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x93, - 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x94, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x95, 0x0, 0x1e, 0x0, 0xa6, - 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa6, 0x0, 0x56, 0x0, 0xa, 0x0, 0xa6, 0x0, 0x8c, 0x0, 0x1e, - 0x0, 0xa6, 0x0, 0x8d, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x8e, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x8f, - 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x90, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x91, 0x0, 0x1e, 0x0, 0xa6, - 0x0, 0x92, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x93, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x94, 0x0, 0x1e, - 0x0, 0xa6, 0x0, 0x95, 0x0, 0x1e, 0x0, 0xa7, 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa7, 0x0, 0x56, - 0x0, 0xa, 0x0, 0xa8, 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa8, 0x0, 0x56, 0x0, 0xa, 0x0, 0xa8, - 0x0, 0x8c, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x8d, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x8e, 0x0, 0x1e, - 0x0, 0xa8, 0x0, 0x8f, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x90, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x91, - 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x92, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x93, 0x0, 0x1e, 0x0, 0xa8, - 0x0, 0x94, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x95, 0x0, 0x1e, 0x0, 0xae, 0x0, 0x59, 0xff, 0xf6, - 0x0, 0xae, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0xae, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xae, 0x0, 0x5d, - 0xff, 0xf1, 0x0, 0xae, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0xaf, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xaf, - 0x0, 0x5a, 0xff, 0xf6, 0x0, 0xaf, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xaf, 0x0, 0x5d, 0xff, 0xf1, - 0x0, 0xaf, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x5a, - 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0xb0, - 0x0, 0xd1, 0xff, 0xf6, 0x0, 0xb1, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xb1, 0x0, 0x5a, 0xff, 0xf6, - 0x0, 0xb1, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xb1, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0xb1, 0x0, 0xd1, - 0xff, 0xf6, 0x0, 0xb2, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xb2, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0xb2, - 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xb2, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0xb2, 0x0, 0xd1, 0xff, 0xf6, - 0x0, 0xb3, 0x0, 0x49, 0x0, 0x14, 0x0, 0xb3, 0x0, 0x55, 0x0, 0xa, 0x0, 0xb4, 0x0, 0x49, - 0x0, 0x14, 0x0, 0xb4, 0x0, 0x55, 0x0, 0xa, 0x0, 0xb5, 0x0, 0x49, 0x0, 0x14, 0x0, 0xb5, - 0x0, 0x55, 0x0, 0xa, 0x0, 0xb6, 0x0, 0x49, 0x0, 0x14, 0x0, 0xb6, 0x0, 0x55, 0x0, 0xa, - 0x0, 0xcc, 0x0, 0x5, 0xff, 0xce, 0x0, 0xcc, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x2d, 0xff, 0xce, 0x0, 0xcc, 0x0, 0x32, 0xff, 0xdd, 0x0, 0xcc, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x37, 0xff, 0xa1, 0x0, 0xcc, 0x0, 0x39, 0xff, 0xce, - 0x0, 0xcc, 0x0, 0x3a, 0xff, 0xec, 0x0, 0xcc, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xcc, 0x0, 0x6c, - 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x78, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x99, 0xff, 0xdd, 0x0, 0xcc, - 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xce, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0xcc, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xdf, - 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x5, 0xff, 0xce, 0x0, 0xcd, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xcd, - 0x0, 0x2a, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x2d, 0xff, 0xce, 0x0, 0xcd, 0x0, 0x32, 0xff, 0xdd, - 0x0, 0xcd, 0x0, 0x34, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x37, 0xff, 0xa1, 0x0, 0xcd, 0x0, 0x39, - 0xff, 0xce, 0x0, 0xcd, 0x0, 0x3a, 0xff, 0xec, 0x0, 0xcd, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xcd, - 0x0, 0x6c, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x78, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x99, 0xff, 0xdd, - 0x0, 0xcd, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0xce, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0xd2, - 0xff, 0x9c, 0x0, 0xcd, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xcd, - 0x0, 0xdf, 0xff, 0xdd, 0x0, 0xce, 0x0, 0x12, 0xff, 0xce, 0x0, 0xce, 0x0, 0x24, 0xff, 0xce, - 0x0, 0xce, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xce, 0x0, 0x37, 0xff, 0xba, 0x0, 0xce, 0x0, 0x3c, - 0xff, 0xce, 0x0, 0xce, 0x0, 0x3d, 0xff, 0xec, 0x0, 0xce, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xce, - 0x0, 0x97, 0xff, 0xce, 0x0, 0xce, 0x0, 0x98, 0xff, 0xce, 0x0, 0xce, 0x0, 0xcc, 0xff, 0xce, - 0x0, 0xce, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xce, 0x0, 0xd2, 0xff, 0xce, 0x0, 0xce, 0x0, 0xd3, - 0xff, 0xce, 0x0, 0xce, 0x0, 0xd5, 0xff, 0xce, 0x0, 0xd1, 0x0, 0x5, 0x0, 0x32, 0x0, 0xd1, - 0x0, 0x11, 0xff, 0xce, 0x0, 0xd1, 0x0, 0x42, 0xff, 0xce, 0x0, 0xd1, 0x0, 0x49, 0x0, 0x19, - 0x0, 0xd1, 0x0, 0x4d, 0x0, 0xf, 0x0, 0xd1, 0x0, 0x56, 0x0, 0xf, 0x0, 0xd1, 0x0, 0x57, - 0x0, 0x19, 0x0, 0xd1, 0x0, 0x59, 0x0, 0x23, 0x0, 0xd1, 0x0, 0x5a, 0x0, 0x23, 0x0, 0xd1, - 0x0, 0x5b, 0x0, 0x14, 0x0, 0xd1, 0x0, 0x5c, 0x0, 0x23, 0x0, 0xd2, 0x0, 0x5, 0x0, 0x96, - 0x0, 0xd2, 0x0, 0x8, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x9, 0x0, 0x3c, 0x0, 0xd2, 0x0, 0xc, - 0x0, 0x5a, 0x0, 0xd2, 0x0, 0xd, 0x0, 0x32, 0x0, 0xd2, 0x0, 0xf, 0xff, 0xc4, 0x0, 0xd2, - 0x0, 0x22, 0x0, 0x3c, 0x0, 0xd2, 0x0, 0x24, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0x25, 0x0, 0x46, - 0x0, 0xd2, 0x0, 0x27, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x28, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x29, - 0x0, 0x46, 0x0, 0xd2, 0x0, 0x2b, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x2c, 0x0, 0x46, 0x0, 0xd2, - 0x0, 0x2e, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x2f, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x30, 0x0, 0x46, - 0x0, 0xd2, 0x0, 0x31, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x33, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x35, - 0x0, 0x46, 0x0, 0xd2, 0x0, 0x36, 0x0, 0x28, 0x0, 0xd2, 0x0, 0x37, 0x0, 0x50, 0x0, 0xd2, - 0x0, 0x38, 0x0, 0x32, 0x0, 0xd2, 0x0, 0x39, 0x0, 0x5a, 0x0, 0xd2, 0x0, 0x3a, 0x0, 0x5a, - 0x0, 0xd2, 0x0, 0x3b, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x3c, 0x0, 0x5a, 0x0, 0xd2, 0x0, 0x3d, - 0x0, 0x5a, 0x0, 0xd2, 0x0, 0x40, 0x0, 0x64, 0x0, 0xd2, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xd2, - 0x0, 0x5f, 0x0, 0x32, 0x0, 0xd2, 0x0, 0x60, 0x0, 0x64, 0x0, 0xd2, 0x0, 0x6e, 0x0, 0x50, - 0x0, 0xd2, 0x0, 0x6f, 0x0, 0x50, 0x0, 0xd2, 0x0, 0x7d, 0x0, 0x50, 0x0, 0xd2, 0x0, 0x7f, - 0x0, 0x64, 0x0, 0xd2, 0x0, 0x97, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0x98, 0xff, 0xd8, 0x0, 0xd2, - 0x0, 0x9a, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x9d, 0x0, 0x32, 0x0, 0xd2, 0x0, 0xba, 0x0, 0x5a, - 0x0, 0xd2, 0x0, 0xcc, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xcd, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xd2, - 0x0, 0x5a, 0x0, 0xd2, 0x0, 0xd3, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xd4, 0x0, 0x46, 0x0, 0xd2, - 0x0, 0xd5, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xd6, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xd7, 0x0, 0x46, - 0x0, 0xd2, 0x0, 0xd8, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xd9, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xda, - 0x0, 0x46, 0x0, 0xd2, 0x0, 0xdb, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xe0, 0x0, 0x32, 0x0, 0xd2, - 0x0, 0xe1, 0x0, 0x32, 0x0, 0xd2, 0x0, 0xe2, 0x0, 0x32, 0x0, 0xd3, 0x0, 0x5, 0xff, 0xce, - 0x0, 0xd3, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x2a, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x2d, - 0xff, 0xce, 0x0, 0xd3, 0x0, 0x32, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x34, 0xff, 0xdd, 0x0, 0xd3, - 0x0, 0x37, 0xff, 0xa1, 0x0, 0xd3, 0x0, 0x39, 0xff, 0xce, 0x0, 0xd3, 0x0, 0x3a, 0xff, 0xec, - 0x0, 0xd3, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xd3, 0x0, 0x6c, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x78, - 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x99, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xd3, - 0x0, 0xce, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0xd3, 0x0, 0xdc, 0xff, 0xdd, - 0x0, 0xd3, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0xdf, 0xff, 0xdd, 0x0, 0xd4, 0x0, 0x5, - 0x0, 0x3c, 0x0, 0xd4, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0xd4, - 0x0, 0x2d, 0xff, 0xec, 0x0, 0xd4, 0x0, 0x32, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x34, 0xff, 0xe2, - 0x0, 0xd4, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x78, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x99, - 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0xce, 0xff, 0xe2, 0x0, 0xd4, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0xd5, 0x0, 0x5, 0xff, 0xce, 0x0, 0xd5, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x2d, 0xff, 0xce, 0x0, 0xd5, 0x0, 0x32, 0xff, 0xdd, 0x0, 0xd5, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x37, 0xff, 0xa1, 0x0, 0xd5, 0x0, 0x39, 0xff, 0xce, - 0x0, 0xd5, 0x0, 0x3a, 0xff, 0xec, 0x0, 0xd5, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xd5, 0x0, 0x6c, - 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x78, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x99, 0xff, 0xdd, 0x0, 0xd5, - 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xce, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0xd5, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xdf, - 0xff, 0xdd, 0x0, 0xd6, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xd6, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xd6, - 0x0, 0x2a, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x32, 0xff, 0xe2, - 0x0, 0xd6, 0x0, 0x34, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x78, - 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x99, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0xd6, - 0x0, 0xce, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0xdd, 0xff, 0xe2, - 0x0, 0xd6, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xd7, 0x0, 0x26, - 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xd7, - 0x0, 0x32, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x34, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x6c, 0xff, 0xe2, - 0x0, 0xd7, 0x0, 0x78, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x99, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x9c, - 0xff, 0xe2, 0x0, 0xd7, 0x0, 0xce, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0xd7, - 0x0, 0xdd, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0xd8, 0x0, 0x5, 0x0, 0x3c, - 0x0, 0xd8, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xd8, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xd8, 0x0, 0x3d, - 0x0, 0x28, 0x0, 0xd8, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xd9, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xd9, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x3d, 0x0, 0x28, - 0x0, 0xd9, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0xda, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xda, 0x0, 0x2d, - 0xff, 0xe2, 0x0, 0xda, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xda, 0x0, 0x3d, 0x0, 0x28, 0x0, 0xda, - 0x0, 0xd2, 0x0, 0x1e, 0x0, 0xdb, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xdb, 0x0, 0x2d, 0xff, 0xe2, - 0x0, 0xdb, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xdb, 0x0, 0x3d, 0x0, 0x28, 0x0, 0xdb, 0x0, 0xd2, - 0x0, 0x1e, 0x0, 0xdc, 0x0, 0x12, 0xff, 0xce, 0x0, 0xdc, 0x0, 0x24, 0xff, 0xce, 0x0, 0xdc, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdc, 0x0, 0x37, 0xff, 0xba, 0x0, 0xdc, 0x0, 0x3d, 0xff, 0xec, - 0x0, 0xdc, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xdc, 0x0, 0x97, 0xff, 0xce, 0x0, 0xdc, 0x0, 0x98, - 0xff, 0xce, 0x0, 0xdc, 0x0, 0xcc, 0xff, 0xce, 0x0, 0xdc, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xdc, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0xdc, 0x0, 0xd5, 0xff, 0xce, 0x0, 0xdd, 0x0, 0x12, 0xff, 0xce, - 0x0, 0xdd, 0x0, 0x24, 0xff, 0xce, 0x0, 0xdd, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdd, 0x0, 0x37, - 0xff, 0xba, 0x0, 0xdd, 0x0, 0x3d, 0xff, 0xec, 0x0, 0xdd, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xdd, - 0x0, 0x97, 0xff, 0xce, 0x0, 0xdd, 0x0, 0x98, 0xff, 0xce, 0x0, 0xdd, 0x0, 0xcc, 0xff, 0xce, - 0x0, 0xdd, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xdd, 0x0, 0xd3, 0xff, 0xce, 0x0, 0xdd, 0x0, 0xd5, - 0xff, 0xce, 0x0, 0xdf, 0x0, 0x12, 0xff, 0xce, 0x0, 0xdf, 0x0, 0x24, 0xff, 0xce, 0x0, 0xdf, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdf, 0x0, 0x37, 0xff, 0xba, 0x0, 0xdf, 0x0, 0x3d, 0xff, 0xec, - 0x0, 0xdf, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xdf, 0x0, 0x97, 0xff, 0xce, 0x0, 0xdf, 0x0, 0x98, - 0xff, 0xce, 0x0, 0xdf, 0x0, 0xcc, 0xff, 0xce, 0x0, 0xdf, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xdf, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0xdf, 0x0, 0xd5, 0xff, 0xce, 0x0, 0xe0, 0x0, 0x5, 0x0, 0x32, - 0x0, 0xe0, 0x0, 0x24, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xe0, 0x0, 0x97, - 0xff, 0xe2, 0x0, 0xe0, 0x0, 0x98, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0xcc, 0xff, 0xe2, 0x0, 0xe0, - 0x0, 0xcd, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0xd3, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0xd5, 0xff, 0xe2, - 0x0, 0xe1, 0x0, 0x5, 0x0, 0x32, 0x0, 0xe1, 0x0, 0x24, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0xe1, 0x0, 0x97, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0x98, 0xff, 0xe2, 0x0, 0xe1, - 0x0, 0xcc, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0xd3, 0xff, 0xe2, - 0x0, 0xe1, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0x5, 0x0, 0x32, 0x0, 0xe2, 0x0, 0x24, - 0xff, 0xe2, 0x0, 0xe2, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x97, 0xff, 0xe2, 0x0, 0xe2, - 0x0, 0x98, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0xcc, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0xcd, 0xff, 0xe2, - 0x0, 0xe2, 0x0, 0xd3, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0xe8, 0x9, 0xd, 0x5, 0x0, 0x2, 0x2, 0x3, 0x3, 0x6, 0x6, 0x8, 0x6, - 0x2, 0x3, 0x3, 0x5, 0x4, 0x3, 0x3, 0x2, 0x4, 0x6, 0x5, 0x5, 0x5, 0x6, 0x5, 0x6, - 0x5, 0x5, 0x6, 0x2, 0x2, 0x6, 0x5, 0x6, 0x5, 0x9, 0x6, 0x6, 0x6, 0x7, 0x6, 0x5, - 0x7, 0x7, 0x3, 0x3, 0x6, 0x5, 0x8, 0x7, 0x7, 0x6, 0x8, 0x6, 0x6, 0x5, 0x7, 0x6, - 0x9, 0x6, 0x5, 0x5, 0x3, 0x3, 0x3, 0x4, 0x5, 0x2, 0x5, 0x5, 0x4, 0x5, 0x5, 0x3, - 0x5, 0x5, 0x3, 0x2, 0x5, 0x3, 0x8, 0x5, 0x5, 0x5, 0x5, 0x4, 0x4, 0x3, 0x5, 0x4, - 0x7, 0x4, 0x4, 0x4, 0x3, 0x3, 0x3, 0x4, 0x5, 0x4, 0x6, 0x4, 0x3, 0x5, 0x5, 0x3, - 0x4, 0x9, 0x7, 0x5, 0x4, 0x4, 0x7, 0x5, 0x5, 0x3, 0x4, 0x6, 0x6, 0x7, 0xa, 0x8, - 0x5, 0x6, 0x4, 0x4, 0x2, 0x2, 0x4, 0x6, 0x4, 0x4, 0x6, 0x6, 0x5, 0x2, 0x2, 0x4, - 0xd, 0x3, 0x4, 0x4, 0x3, 0x4, 0x2, 0x3, 0x3, 0x5, 0x3, 0x4, 0x3, 0x6, 0x6, 0x6, - 0x6, 0x7, 0x7, 0x7, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x5, 0x5, 0x5, 0x5, 0x3, - 0x3, 0x3, 0x3, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x9, 0x9, - 0x8, 0x4, 0x3, 0x4, 0x7, 0x7, 0x5, 0x3, 0x3, 0x7, 0x6, 0x4, 0x3, 0x4, 0x9, 0xc, - 0x7, 0x3, 0x6, 0x6, 0x7, 0x4, 0x3, 0x4, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, - 0x3, 0x3, 0x7, 0x7, 0x9, 0x7, 0x7, 0x7, 0x7, 0x0, 0x0, 0x0, 0xa, 0xe, 0x5, 0x0, - 0x2, 0x2, 0x4, 0x3, 0x7, 0x6, 0x9, 0x7, 0x2, 0x3, 0x3, 0x5, 0x5, 0x3, 0x3, 0x2, - 0x4, 0x7, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x6, 0x6, 0x2, 0x3, 0x7, 0x6, 0x7, - 0x5, 0xa, 0x7, 0x7, 0x7, 0x7, 0x6, 0x6, 0x8, 0x8, 0x3, 0x4, 0x7, 0x6, 0x9, 0x8, - 0x8, 0x6, 0x8, 0x7, 0x6, 0x5, 0x7, 0x6, 0x9, 0x7, 0x6, 0x6, 0x3, 0x3, 0x3, 0x4, - 0x5, 0x2, 0x5, 0x6, 0x5, 0x6, 0x5, 0x3, 0x6, 0x6, 0x3, 0x3, 0x5, 0x3, 0x9, 0x6, - 0x5, 0x6, 0x6, 0x4, 0x4, 0x4, 0x6, 0x5, 0x8, 0x5, 0x5, 0x5, 0x3, 0x3, 0x3, 0x4, - 0x6, 0x5, 0x6, 0x5, 0x4, 0x6, 0x6, 0x3, 0x4, 0xa, 0x8, 0x6, 0x4, 0x5, 0x8, 0x5, - 0x5, 0x4, 0x5, 0x7, 0x7, 0x8, 0xb, 0x9, 0x5, 0x6, 0x4, 0x4, 0x2, 0x2, 0x4, 0x7, - 0x4, 0x4, 0x6, 0x6, 0x6, 0x2, 0x2, 0x5, 0xe, 0x3, 0x4, 0x4, 0x4, 0x4, 0x2, 0x3, - 0x3, 0x5, 0x3, 0x4, 0x3, 0x7, 0x7, 0x7, 0x6, 0x8, 0x8, 0x7, 0x5, 0x5, 0x5, 0x5, - 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x3, 0x3, 0x3, 0x3, 0x6, 0x5, 0x5, 0x5, 0x5, - 0x5, 0x6, 0x6, 0x6, 0x6, 0x5, 0xa, 0xa, 0x9, 0x5, 0x3, 0x5, 0x8, 0x8, 0x6, 0x3, - 0x3, 0x8, 0x6, 0x5, 0x3, 0x5, 0xa, 0xd, 0x8, 0x3, 0x7, 0x7, 0x8, 0x5, 0x3, 0x5, - 0x6, 0x7, 0x6, 0x7, 0x6, 0x6, 0x3, 0x4, 0x4, 0x3, 0x8, 0x8, 0xa, 0x8, 0x7, 0x7, - 0x7, 0x0, 0x0, 0x0, 0xb, 0x10, 0x6, 0x0, 0x2, 0x2, 0x4, 0x4, 0x8, 0x7, 0xa, 0x7, - 0x2, 0x4, 0x4, 0x6, 0x5, 0x4, 0x4, 0x3, 0x5, 0x7, 0x6, 0x6, 0x6, 0x7, 0x6, 0x7, - 0x6, 0x7, 0x7, 0x3, 0x3, 0x7, 0x6, 0x7, 0x6, 0xb, 0x8, 0x8, 0x8, 0x8, 0x7, 0x6, - 0x9, 0x8, 0x4, 0x4, 0x7, 0x6, 0xa, 0x8, 0x9, 0x7, 0x9, 0x7, 0x7, 0x6, 0x8, 0x7, - 0xa, 0x7, 0x7, 0x7, 0x4, 0x3, 0x4, 0x4, 0x6, 0x3, 0x6, 0x6, 0x5, 0x6, 0x6, 0x4, - 0x6, 0x7, 0x3, 0x3, 0x6, 0x3, 0xa, 0x7, 0x6, 0x6, 0x6, 0x5, 0x5, 0x4, 0x6, 0x5, - 0x9, 0x5, 0x5, 0x5, 0x4, 0x3, 0x4, 0x5, 0x6, 0x5, 0x7, 0x5, 0x4, 0x7, 0x6, 0x3, - 0x5, 0xa, 0x9, 0x7, 0x5, 0x5, 0x9, 0x6, 0x6, 0x4, 0x5, 0x7, 0x7, 0x9, 0xc, 0x9, - 0x6, 0x7, 0x5, 0x5, 0x3, 0x3, 0x5, 0x8, 0x5, 0x5, 0x7, 0x7, 0x7, 0x3, 0x3, 0x5, - 0x10, 0x3, 0x4, 0x5, 0x4, 0x5, 0x3, 0x3, 0x3, 0x6, 0x3, 0x4, 0x3, 0x8, 0x8, 0x8, - 0x7, 0x8, 0x9, 0x8, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x6, 0x6, 0x6, 0x6, 0x3, - 0x3, 0x3, 0x3, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0xb, 0xb, - 0xa, 0x5, 0x3, 0x5, 0x8, 0x8, 0x7, 0x3, 0x3, 0x9, 0x7, 0x5, 0x3, 0x5, 0xa, 0xf, - 0x9, 0x3, 0x8, 0x8, 0x9, 0x5, 0x3, 0x5, 0x7, 0x8, 0x7, 0x8, 0x7, 0x7, 0x4, 0x4, - 0x4, 0x4, 0x9, 0x9, 0xa, 0x9, 0x8, 0x8, 0x8, 0x0, 0x0, 0x0, 0xc, 0x11, 0x6, 0x0, - 0x3, 0x3, 0x4, 0x4, 0x8, 0x7, 0xb, 0x8, 0x3, 0x4, 0x4, 0x6, 0x6, 0x4, 0x4, 0x3, - 0x5, 0x8, 0x6, 0x7, 0x7, 0x8, 0x7, 0x7, 0x6, 0x7, 0x7, 0x3, 0x3, 0x8, 0x7, 0x8, - 0x6, 0xc, 0x8, 0x8, 0x8, 0x9, 0x8, 0x7, 0xa, 0x9, 0x4, 0x4, 0x8, 0x7, 0xb, 0x9, - 0xa, 0x8, 0xa, 0x8, 0x7, 0x6, 0x9, 0x8, 0xb, 0x8, 0x7, 0x7, 0x4, 0x4, 0x4, 0x5, - 0x6, 0x3, 0x6, 0x7, 0x5, 0x7, 0x6, 0x4, 0x7, 0x7, 0x3, 0x3, 0x6, 0x3, 0xb, 0x7, - 0x6, 0x7, 0x7, 0x5, 0x5, 0x4, 0x7, 0x6, 0x9, 0x6, 0x6, 0x6, 0x4, 0x3, 0x4, 0x5, - 0x7, 0x5, 0x8, 0x6, 0x5, 0x7, 0x7, 0x4, 0x5, 0xb, 0xa, 0x7, 0x5, 0x5, 0x9, 0x6, - 0x6, 0x4, 0x6, 0x8, 0x8, 0xa, 0xd, 0xa, 0x6, 0x8, 0x5, 0x5, 0x3, 0x3, 0x5, 0x9, - 0x5, 0x5, 0x8, 0x8, 0x7, 0x3, 0x3, 0x6, 0x11, 0x3, 0x5, 0x5, 0x4, 0x5, 0x3, 0x4, - 0x3, 0x6, 0x3, 0x5, 0x4, 0x9, 0x9, 0x8, 0x8, 0x9, 0xa, 0x9, 0x6, 0x6, 0x6, 0x6, - 0x6, 0x6, 0x5, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, 0x3, 0x3, 0x7, 0x6, 0x6, 0x6, 0x6, - 0x6, 0x7, 0x7, 0x7, 0x7, 0x6, 0xc, 0xc, 0xb, 0x6, 0x4, 0x6, 0x9, 0x9, 0x7, 0x4, - 0x4, 0xa, 0x7, 0x6, 0x4, 0x6, 0xb, 0x10, 0xa, 0x4, 0x9, 0x9, 0xa, 0x6, 0x4, 0x6, - 0x7, 0x9, 0x8, 0x9, 0x8, 0x8, 0x4, 0x5, 0x5, 0x4, 0xa, 0xa, 0xb, 0xa, 0x9, 0x9, - 0x9, 0x0, 0x0, 0x0, 0xd, 0x13, 0x7, 0x0, 0x3, 0x3, 0x5, 0x4, 0x9, 0x8, 0xc, 0x9, - 0x3, 0x4, 0x4, 0x7, 0x6, 0x4, 0x4, 0x3, 0x5, 0x9, 0x7, 0x7, 0x8, 0x8, 0x7, 0x8, - 0x7, 0x8, 0x8, 0x3, 0x3, 0x9, 0x8, 0x9, 0x7, 0xd, 0x9, 0x9, 0x9, 0xa, 0x8, 0x8, - 0xa, 0xa, 0x4, 0x5, 0x9, 0x7, 0xb, 0xa, 0xb, 0x8, 0xb, 0x9, 0x8, 0x7, 0xa, 0x8, - 0xc, 0x9, 0x8, 0x8, 0x4, 0x4, 0x4, 0x5, 0x7, 0x3, 0x7, 0x7, 0x6, 0x7, 0x7, 0x4, - 0x7, 0x8, 0x4, 0x3, 0x7, 0x4, 0xc, 0x8, 0x7, 0x7, 0x7, 0x5, 0x6, 0x5, 0x8, 0x6, - 0xa, 0x6, 0x6, 0x6, 0x4, 0x4, 0x4, 0x5, 0x7, 0x6, 0x8, 0x6, 0x5, 0x8, 0x7, 0x4, - 0x5, 0xc, 0xb, 0x8, 0x6, 0x6, 0xa, 0x7, 0x7, 0x5, 0x6, 0x9, 0x9, 0xa, 0xe, 0xb, - 0x7, 0x8, 0x6, 0x6, 0x3, 0x3, 0x5, 0x9, 0x5, 0x5, 0x8, 0x8, 0x8, 0x3, 0x3, 0x6, - 0x13, 0x4, 0x5, 0x5, 0x5, 0x6, 0x3, 0x4, 0x4, 0x7, 0x4, 0x5, 0x4, 0x9, 0x9, 0x9, - 0x8, 0xa, 0xa, 0xa, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7, 0x7, 0x4, - 0x4, 0x4, 0x4, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8, 0x6, 0xd, 0xd, - 0xc, 0x6, 0x4, 0x6, 0xa, 0xa, 0x8, 0x4, 0x4, 0xa, 0x8, 0x6, 0x4, 0x6, 0xc, 0x11, - 0xa, 0x4, 0x9, 0x9, 0xa, 0x6, 0x4, 0x6, 0x8, 0x9, 0x8, 0x9, 0x8, 0x8, 0x4, 0x5, - 0x5, 0x4, 0xa, 0xa, 0xc, 0xa, 0xa, 0xa, 0xa, 0x0, 0x0, 0x0, 0xe, 0x14, 0x7, 0x0, - 0x3, 0x3, 0x5, 0x5, 0xa, 0x9, 0xd, 0x9, 0x3, 0x5, 0x5, 0x7, 0x7, 0x4, 0x5, 0x3, - 0x6, 0x9, 0x7, 0x8, 0x8, 0x9, 0x8, 0x9, 0x7, 0x8, 0x9, 0x3, 0x4, 0x9, 0x8, 0x9, - 0x8, 0xe, 0xa, 0xa, 0xa, 0xa, 0x9, 0x8, 0xb, 0xb, 0x4, 0x5, 0x9, 0x8, 0xc, 0xb, - 0xc, 0x9, 0xc, 0x9, 0x9, 0x7, 0xa, 0x9, 0xd, 0x9, 0x8, 0x8, 0x5, 0x4, 0x5, 0x6, - 0x7, 0x3, 0x7, 0x8, 0x6, 0x8, 0x7, 0x5, 0x8, 0x8, 0x4, 0x4, 0x7, 0x4, 0xc, 0x8, - 0x7, 0x8, 0x8, 0x6, 0x6, 0x5, 0x8, 0x7, 0xb, 0x7, 0x7, 0x6, 0x5, 0x4, 0x5, 0x6, - 0x8, 0x6, 0x9, 0x7, 0x5, 0x8, 0x8, 0x4, 0x6, 0xd, 0xc, 0x8, 0x6, 0x6, 0xb, 0x7, - 0x8, 0x5, 0x7, 0x9, 0x9, 0xb, 0xf, 0xc, 0x7, 0x9, 0x6, 0x6, 0x3, 0x3, 0x6, 0xa, - 0x6, 0x6, 0x9, 0x9, 0x8, 0x3, 0x3, 0x7, 0x14, 0x4, 0x6, 0x6, 0x5, 0x6, 0x3, 0x4, - 0x4, 0x7, 0x4, 0x6, 0x4, 0xa, 0xa, 0xa, 0x9, 0xb, 0xb, 0xa, 0x7, 0x7, 0x7, 0x7, - 0x7, 0x7, 0x6, 0x7, 0x7, 0x7, 0x7, 0x4, 0x4, 0x4, 0x4, 0x8, 0x7, 0x7, 0x7, 0x7, - 0x7, 0x8, 0x8, 0x8, 0x8, 0x7, 0xe, 0xe, 0xc, 0x7, 0x4, 0x7, 0xb, 0xb, 0x8, 0x4, - 0x4, 0xb, 0x9, 0x7, 0x4, 0x7, 0xd, 0x13, 0xb, 0x4, 0xa, 0xa, 0xb, 0x7, 0x4, 0x7, - 0x8, 0xa, 0x9, 0xa, 0x9, 0x9, 0x4, 0x5, 0x5, 0x5, 0xb, 0xb, 0xd, 0xb, 0xa, 0xa, - 0xa, 0x0, 0x0, 0x0, 0xf, 0x15, 0x8, 0x0, 0x3, 0x3, 0x5, 0x5, 0xb, 0x9, 0xe, 0xa, - 0x3, 0x5, 0x5, 0x8, 0x7, 0x5, 0x5, 0x4, 0x6, 0xa, 0x8, 0x9, 0x9, 0x9, 0x8, 0x9, - 0x8, 0x9, 0x9, 0x4, 0x4, 0xa, 0x9, 0xa, 0x8, 0xf, 0xb, 0xa, 0xa, 0xb, 0xa, 0x9, - 0xc, 0xb, 0x5, 0x5, 0xa, 0x9, 0xd, 0xb, 0xc, 0xa, 0xd, 0xa, 0x9, 0x8, 0xb, 0x9, - 0xe, 0xa, 0x9, 0x9, 0x5, 0x5, 0x5, 0x6, 0x8, 0x4, 0x8, 0x9, 0x7, 0x8, 0x8, 0x5, - 0x8, 0x9, 0x4, 0x4, 0x8, 0x4, 0xd, 0x9, 0x8, 0x8, 0x8, 0x6, 0x7, 0x5, 0x9, 0x7, - 0xc, 0x7, 0x7, 0x7, 0x5, 0x4, 0x5, 0x6, 0x8, 0x7, 0xa, 0x7, 0x6, 0x9, 0x8, 0x5, - 0x6, 0xe, 0xc, 0x9, 0x6, 0x7, 0xc, 0x8, 0x8, 0x5, 0x7, 0xa, 0xa, 0xc, 0x10, 0xd, - 0x8, 0xa, 0x6, 0x7, 0x4, 0x4, 0x6, 0xb, 0x6, 0x6, 0xa, 0xa, 0x9, 0x4, 0x4, 0x7, - 0x15, 0x4, 0x6, 0x6, 0x5, 0x7, 0x4, 0x5, 0x4, 0x8, 0x4, 0x6, 0x5, 0xb, 0xb, 0xa, - 0xa, 0xc, 0xc, 0xb, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x7, 0x8, 0x8, 0x8, 0x8, 0x4, - 0x4, 0x4, 0x4, 0x9, 0x8, 0x8, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x9, 0x7, 0xf, 0xf, - 0xd, 0x7, 0x5, 0x7, 0xc, 0xc, 0x9, 0x5, 0x5, 0xc, 0x9, 0x7, 0x5, 0x7, 0xe, 0x14, - 0xc, 0x5, 0xb, 0xb, 0xc, 0x7, 0x5, 0x7, 0x9, 0xb, 0xa, 0xb, 0xa, 0xa, 0x5, 0x6, - 0x6, 0x5, 0xc, 0xc, 0xe, 0xc, 0xb, 0xb, 0xb, 0x0, 0x0, 0x0, 0x10, 0x17, 0x8, 0x0, - 0x3, 0x3, 0x6, 0x5, 0xb, 0xa, 0xf, 0xb, 0x3, 0x5, 0x5, 0x9, 0x8, 0x5, 0x5, 0x4, - 0x7, 0xb, 0x8, 0x9, 0x9, 0xa, 0x9, 0xa, 0x9, 0xa, 0xa, 0x4, 0x4, 0xb, 0x9, 0xb, - 0x9, 0x11, 0xb, 0xb, 0xb, 0xc, 0xa, 0x9, 0xd, 0xc, 0x5, 0x6, 0xb, 0x9, 0xe, 0xc, - 0xd, 0xa, 0xe, 0xb, 0xa, 0x8, 0xc, 0xa, 0xf, 0xb, 0x9, 0xa, 0x5, 0x5, 0x5, 0x6, - 0x8, 0x4, 0x8, 0x9, 0x7, 0x9, 0x8, 0x5, 0x9, 0xa, 0x5, 0x4, 0x8, 0x5, 0xe, 0xa, - 0x8, 0x9, 0x9, 0x7, 0x7, 0x6, 0x9, 0x8, 0xc, 0x8, 0x8, 0x7, 0x6, 0x4, 0x6, 0x7, - 0x9, 0x7, 0xa, 0x8, 0x6, 0xa, 0x9, 0x5, 0x7, 0xf, 0xd, 0x9, 0x7, 0x7, 0xc, 0x8, - 0x9, 0x6, 0x7, 0xb, 0xb, 0xd, 0x12, 0xe, 0x8, 0xa, 0x7, 0x7, 0x4, 0x4, 0x7, 0xb, - 0x7, 0x7, 0xa, 0xa, 0xa, 0x4, 0x4, 0x8, 0x17, 0x5, 0x6, 0x7, 0x6, 0x7, 0x4, 0x5, - 0x5, 0x8, 0x5, 0x6, 0x5, 0xb, 0xb, 0xb, 0xa, 0xc, 0xd, 0xc, 0x8, 0x8, 0x8, 0x8, - 0x8, 0x8, 0x7, 0x8, 0x8, 0x8, 0x8, 0x5, 0x5, 0x5, 0x5, 0xa, 0x8, 0x8, 0x8, 0x8, - 0x8, 0x9, 0x9, 0x9, 0x9, 0x8, 0x10, 0x10, 0xe, 0x8, 0x5, 0x8, 0xc, 0xc, 0xa, 0x5, - 0x5, 0xd, 0xa, 0x7, 0x5, 0x8, 0xf, 0x15, 0xd, 0x5, 0xb, 0xb, 0xd, 0x7, 0x5, 0x8, - 0x9, 0xb, 0xa, 0xb, 0xa, 0xa, 0x5, 0x6, 0x6, 0x6, 0xd, 0xd, 0xf, 0xd, 0xc, 0xc, - 0xc, 0x0, 0x0, 0x0, 0x11, 0x18, 0x9, 0x0, 0x4, 0x4, 0x6, 0x6, 0xc, 0xa, 0x10, 0xb, - 0x4, 0x6, 0x6, 0x9, 0x8, 0x5, 0x6, 0x4, 0x7, 0xb, 0x9, 0xa, 0xa, 0xb, 0xa, 0xa, - 0x9, 0xa, 0xa, 0x4, 0x4, 0xb, 0xa, 0xb, 0x9, 0x12, 0xc, 0xc, 0xc, 0xd, 0xb, 0xa, - 0xe, 0xd, 0x5, 0x6, 0xb, 0xa, 0xf, 0xd, 0xe, 0xb, 0xe, 0xb, 0xa, 0x9, 0xc, 0xb, - 0x10, 0xb, 0xa, 0xa, 0x6, 0x5, 0x6, 0x7, 0x9, 0x4, 0x9, 0xa, 0x8, 0xa, 0x9, 0x6, - 0x9, 0xa, 0x5, 0x4, 0x9, 0x5, 0xf, 0xa, 0x9, 0xa, 0xa, 0x7, 0x7, 0x6, 0xa, 0x8, - 0xd, 0x8, 0x8, 0x8, 0x6, 0x5, 0x6, 0x7, 0x9, 0x8, 0xb, 0x8, 0x7, 0xa, 0x9, 0x5, - 0x7, 0x10, 0xe, 0xa, 0x7, 0x8, 0xd, 0x9, 0x9, 0x6, 0x8, 0xb, 0xb, 0xe, 0x13, 0xf, - 0x9, 0xb, 0x7, 0x7, 0x4, 0x4, 0x7, 0xc, 0x7, 0x7, 0xb, 0xb, 0xa, 0x4, 0x4, 0x8, - 0x18, 0x5, 0x7, 0x7, 0x6, 0x8, 0x4, 0x5, 0x5, 0x9, 0x5, 0x7, 0x5, 0xc, 0xc, 0xc, - 0xb, 0xd, 0xe, 0xd, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x8, 0x9, 0x9, 0x9, 0x9, 0x5, - 0x5, 0x5, 0x5, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0x8, 0x11, 0x11, - 0xf, 0x8, 0x5, 0x8, 0xd, 0xd, 0xa, 0x5, 0x5, 0xd, 0xb, 0x8, 0x5, 0x8, 0x10, 0x17, - 0xe, 0x5, 0xc, 0xc, 0xe, 0x8, 0x5, 0x8, 0xa, 0xc, 0xb, 0xc, 0xb, 0xb, 0x5, 0x7, - 0x6, 0x6, 0xe, 0xe, 0x10, 0xe, 0xd, 0xd, 0xd, 0x0, 0x0, 0x0, 0x12, 0x1a, 0x9, 0x0, - 0x4, 0x4, 0x6, 0x6, 0xd, 0xb, 0x10, 0xc, 0x4, 0x6, 0x6, 0xa, 0x9, 0x6, 0x6, 0x4, - 0x8, 0xc, 0x9, 0xa, 0xb, 0xb, 0xa, 0xb, 0xa, 0xb, 0xb, 0x4, 0x5, 0xc, 0xa, 0xc, - 0xa, 0x13, 0xd, 0xd, 0xc, 0xd, 0xc, 0xb, 0xe, 0xe, 0x6, 0x6, 0xc, 0xa, 0x10, 0xe, - 0xf, 0xb, 0xf, 0xc, 0xb, 0x9, 0xd, 0xb, 0x11, 0xc, 0xb, 0xb, 0x6, 0x6, 0x6, 0x7, - 0x9, 0x4, 0xa, 0xa, 0x8, 0xa, 0x9, 0x6, 0xa, 0xb, 0x5, 0x5, 0xa, 0x5, 0x10, 0xb, - 0xa, 0xa, 0xa, 0x8, 0x8, 0x6, 0xb, 0x9, 0xe, 0x9, 0x9, 0x8, 0x6, 0x5, 0x6, 0x8, - 0xa, 0x8, 0xc, 0x9, 0x7, 0xb, 0xa, 0x6, 0x7, 0x11, 0xf, 0xb, 0x8, 0x8, 0xe, 0xa, - 0xa, 0x6, 0x8, 0xc, 0xc, 0xe, 0x14, 0xf, 0x9, 0xc, 0x8, 0x8, 0x4, 0x4, 0x8, 0xd, - 0x8, 0x8, 0xc, 0xb, 0xb, 0x4, 0x4, 0x9, 0x1a, 0x5, 0x7, 0x8, 0x7, 0x8, 0x4, 0x6, - 0x5, 0x9, 0x5, 0x7, 0x6, 0xd, 0xd, 0xc, 0xc, 0xe, 0xe, 0xd, 0xa, 0xa, 0xa, 0xa, - 0xa, 0xa, 0x8, 0x9, 0x9, 0x9, 0x9, 0x5, 0x5, 0x5, 0x5, 0xb, 0xa, 0xa, 0xa, 0xa, - 0xa, 0xb, 0xb, 0xb, 0xb, 0x9, 0x12, 0x12, 0x10, 0x9, 0x6, 0x9, 0xe, 0xe, 0xb, 0x6, - 0x6, 0xe, 0xb, 0x8, 0x6, 0x9, 0x11, 0x18, 0xe, 0x6, 0xd, 0xd, 0xe, 0x8, 0x6, 0x9, - 0xb, 0xd, 0xc, 0xd, 0xc, 0xc, 0x6, 0x7, 0x7, 0x6, 0xe, 0xe, 0x11, 0xe, 0xd, 0xd, - 0xd, 0x0, 0x0, 0x0, 0x13, 0x1b, 0xa, 0x0, 0x4, 0x4, 0x7, 0x6, 0xd, 0xc, 0x11, 0xd, - 0x4, 0x6, 0x6, 0xa, 0x9, 0x6, 0x6, 0x5, 0x8, 0xd, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, - 0xa, 0xb, 0xc, 0x5, 0x5, 0xc, 0xb, 0xc, 0xa, 0x14, 0xd, 0xd, 0xd, 0xe, 0xc, 0xb, - 0xf, 0xe, 0x6, 0x7, 0xd, 0xb, 0x11, 0xe, 0x10, 0xc, 0x10, 0xd, 0xc, 0xa, 0xe, 0xc, - 0x12, 0xc, 0xb, 0xb, 0x6, 0x6, 0x6, 0x7, 0xa, 0x5, 0xa, 0xb, 0x9, 0xb, 0xa, 0x6, - 0xa, 0xb, 0x5, 0x5, 0xa, 0x5, 0x11, 0xb, 0xa, 0xb, 0xb, 0x8, 0x8, 0x7, 0xb, 0x9, - 0xf, 0x9, 0x9, 0x9, 0x7, 0x5, 0x7, 0x8, 0xb, 0x9, 0xc, 0x9, 0x7, 0xb, 0xb, 0x6, - 0x8, 0x12, 0x10, 0xb, 0x8, 0x9, 0xf, 0xa, 0xa, 0x7, 0x9, 0xd, 0xd, 0xf, 0x15, 0x10, - 0xa, 0xc, 0x8, 0x8, 0x5, 0x5, 0x8, 0xe, 0x8, 0x8, 0xc, 0xc, 0xc, 0x5, 0x5, 0x9, - 0x1b, 0x5, 0x7, 0x8, 0x7, 0x9, 0x5, 0x6, 0x5, 0xa, 0x5, 0x7, 0x6, 0xe, 0xe, 0xd, - 0xc, 0xf, 0xf, 0xe, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa, 0xa, 0x5, - 0x5, 0x5, 0x5, 0xb, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0xb, 0xb, 0x9, 0x13, 0x13, - 0x11, 0x9, 0x6, 0x9, 0xf, 0xf, 0xb, 0x6, 0x6, 0xf, 0xc, 0x9, 0x6, 0x9, 0x12, 0x19, - 0xf, 0x6, 0xe, 0xe, 0xf, 0x9, 0x6, 0x9, 0xb, 0xe, 0xc, 0xe, 0xc, 0xc, 0x6, 0x7, - 0x7, 0x7, 0xf, 0xf, 0x12, 0xf, 0xe, 0xe, 0xe, 0x0, 0x0, 0x0, 0x14, 0x1d, 0xa, 0x0, - 0x4, 0x4, 0x7, 0x7, 0xe, 0xc, 0x12, 0xd, 0x4, 0x7, 0x7, 0xb, 0xa, 0x6, 0x7, 0x5, - 0x8, 0xd, 0xa, 0xb, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 0xc, 0x5, 0x5, 0xd, 0xc, 0xd, - 0xb, 0x15, 0xe, 0xe, 0xe, 0xf, 0xd, 0xc, 0x10, 0xf, 0x6, 0x7, 0xd, 0xb, 0x12, 0xf, - 0x11, 0xd, 0x11, 0xd, 0xc, 0xb, 0xf, 0xd, 0x13, 0xd, 0xc, 0xc, 0x7, 0x6, 0x7, 0x8, - 0xa, 0x5, 0xb, 0xc, 0x9, 0xb, 0xb, 0x7, 0xb, 0xc, 0x6, 0x5, 0xb, 0x6, 0x12, 0xc, - 0xb, 0xb, 0xb, 0x8, 0x9, 0x7, 0xc, 0xa, 0x10, 0xa, 0xa, 0x9, 0x7, 0x6, 0x7, 0x8, - 0xb, 0x9, 0xd, 0xa, 0x8, 0xc, 0xb, 0x6, 0x8, 0x13, 0x11, 0xc, 0x9, 0x9, 0x10, 0xb, - 0xb, 0x7, 0x9, 0xd, 0xd, 0x10, 0x16, 0x11, 0xa, 0xd, 0x9, 0x9, 0x5, 0x5, 0x8, 0xe, - 0x8, 0x8, 0xd, 0xd, 0xc, 0x5, 0x5, 0x9, 0x1d, 0x6, 0x8, 0x8, 0x7, 0x9, 0x5, 0x6, - 0x6, 0xa, 0x6, 0x8, 0x6, 0xe, 0xe, 0xe, 0xd, 0xf, 0x10, 0xf, 0xb, 0xb, 0xb, 0xb, - 0xb, 0xb, 0x9, 0xb, 0xb, 0xb, 0xb, 0x6, 0x6, 0x6, 0x6, 0xc, 0xb, 0xb, 0xb, 0xb, - 0xb, 0xc, 0xc, 0xc, 0xc, 0xa, 0x14, 0x14, 0x12, 0xa, 0x6, 0xa, 0xf, 0xf, 0xc, 0x6, - 0x6, 0x10, 0xc, 0x9, 0x6, 0xa, 0x13, 0x1b, 0x10, 0x6, 0xe, 0xe, 0x10, 0x9, 0x6, 0xa, - 0xc, 0xe, 0xd, 0xe, 0xd, 0xd, 0x6, 0x8, 0x8, 0x7, 0x10, 0x10, 0x13, 0x10, 0xf, 0xf, - 0xf, 0x0, 0x0, 0x0, 0x15, 0x1e, 0xb, 0x0, 0x4, 0x4, 0x8, 0x7, 0xf, 0xd, 0x13, 0xe, - 0x4, 0x7, 0x7, 0xb, 0xa, 0x7, 0x7, 0x5, 0x9, 0xe, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, - 0xb, 0xd, 0xd, 0x5, 0x5, 0xe, 0xc, 0xe, 0xb, 0x16, 0xf, 0xf, 0xe, 0x10, 0xd, 0xc, - 0x11, 0x10, 0x7, 0x8, 0xe, 0xc, 0x12, 0x10, 0x11, 0xd, 0x12, 0xe, 0xd, 0xb, 0xf, 0xd, - 0x14, 0xe, 0xc, 0xd, 0x7, 0x7, 0x7, 0x8, 0xb, 0x5, 0xb, 0xc, 0xa, 0xc, 0xb, 0x7, - 0xc, 0xd, 0x6, 0x5, 0xb, 0x6, 0x13, 0xd, 0xb, 0xc, 0xc, 0x9, 0x9, 0x7, 0xc, 0xa, - 0x10, 0xa, 0xa, 0xa, 0x7, 0x6, 0x7, 0x9, 0xc, 0xa, 0xe, 0xa, 0x8, 0xc, 0xc, 0x7, - 0x9, 0x14, 0x11, 0xc, 0x9, 0x9, 0x10, 0xb, 0xb, 0x8, 0xa, 0xe, 0xe, 0x11, 0x17, 0x12, - 0xb, 0xe, 0x9, 0x9, 0x5, 0x5, 0x9, 0xf, 0x9, 0x9, 0xd, 0xd, 0xd, 0x5, 0x5, 0xa, - 0x1e, 0x6, 0x8, 0x9, 0x8, 0x9, 0x5, 0x7, 0x6, 0xb, 0x6, 0x8, 0x7, 0xf, 0xf, 0xe, - 0xe, 0x10, 0x11, 0x10, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb, 0xb, 0x6, - 0x6, 0x6, 0x6, 0xd, 0xb, 0xb, 0xb, 0xb, 0xb, 0xc, 0xc, 0xc, 0xc, 0xa, 0x15, 0x15, - 0x13, 0xa, 0x7, 0xa, 0x10, 0x10, 0xd, 0x7, 0x7, 0x11, 0xd, 0xa, 0x7, 0xa, 0x14, 0x1c, - 0x11, 0x7, 0xf, 0xf, 0x11, 0xa, 0x7, 0xa, 0xc, 0xf, 0xe, 0xf, 0xe, 0xe, 0x7, 0x8, - 0x8, 0x7, 0x11, 0x11, 0x14, 0x11, 0x10, 0x10, 0x10, 0x0, 0x0, 0x0, 0x16, 0x20, 0xb, 0x0, - 0x5, 0x5, 0x8, 0x7, 0xf, 0xe, 0x14, 0xf, 0x5, 0x7, 0x7, 0xc, 0xb, 0x7, 0x7, 0x5, - 0x9, 0xe, 0xb, 0xd, 0xd, 0xe, 0xc, 0xd, 0xc, 0xd, 0xd, 0x5, 0x6, 0xe, 0xd, 0xe, - 0xc, 0x17, 0x10, 0xf, 0xf, 0x10, 0xe, 0xd, 0x12, 0x11, 0x7, 0x8, 0xf, 0xc, 0x13, 0x11, - 0x12, 0xe, 0x13, 0xf, 0xe, 0xc, 0x10, 0xe, 0x15, 0xe, 0xd, 0xd, 0x7, 0x7, 0x7, 0x9, - 0xb, 0x5, 0xc, 0xd, 0xa, 0xc, 0xc, 0x8, 0xc, 0xd, 0x6, 0x6, 0xc, 0x6, 0x13, 0xd, - 0xc, 0xc, 0xc, 0x9, 0xa, 0x8, 0xd, 0xb, 0x11, 0xb, 0xb, 0xa, 0x8, 0x6, 0x8, 0x9, - 0xc, 0xa, 0xe, 0xa, 0x8, 0xd, 0xc, 0x7, 0x9, 0x15, 0x12, 0xd, 0x9, 0xa, 0x11, 0xc, - 0xc, 0x8, 0xa, 0xf, 0xf, 0x12, 0x18, 0x13, 0xb, 0xe, 0x9, 0xa, 0x5, 0x5, 0x9, 0x10, - 0x9, 0x9, 0xe, 0xe, 0xd, 0x5, 0x5, 0xa, 0x20, 0x6, 0x9, 0x9, 0x8, 0xa, 0x5, 0x7, - 0x6, 0xb, 0x6, 0x9, 0x7, 0x10, 0x10, 0xf, 0xe, 0x11, 0x12, 0x10, 0xc, 0xc, 0xc, 0xc, - 0xc, 0xc, 0xa, 0xc, 0xc, 0xc, 0xc, 0x6, 0x6, 0x6, 0x6, 0xd, 0xc, 0xc, 0xc, 0xc, - 0xc, 0xd, 0xd, 0xd, 0xd, 0xb, 0x16, 0x16, 0x14, 0xb, 0x7, 0xb, 0x11, 0x11, 0xd, 0x7, - 0x7, 0x11, 0xe, 0xa, 0x7, 0xb, 0x15, 0x1d, 0x12, 0x7, 0x10, 0x10, 0x12, 0xa, 0x7, 0xb, - 0xd, 0x10, 0xe, 0x10, 0xe, 0xe, 0x7, 0x8, 0x8, 0x8, 0x12, 0x12, 0x15, 0x12, 0x10, 0x10, - 0x10, 0x0, 0x0, 0x0, 0x17, 0x21, 0xc, 0x0, 0x5, 0x5, 0x8, 0x8, 0x10, 0xe, 0x15, 0xf, - 0x5, 0x7, 0x7, 0xc, 0xb, 0x7, 0x7, 0x6, 0xa, 0xf, 0xc, 0xd, 0xd, 0xf, 0xd, 0xe, - 0xc, 0xe, 0xe, 0x6, 0x6, 0xf, 0xd, 0xf, 0xc, 0x18, 0x10, 0x10, 0x10, 0x11, 0xf, 0xd, - 0x12, 0x12, 0x7, 0x8, 0xf, 0xd, 0x14, 0x12, 0x13, 0xf, 0x13, 0xf, 0xe, 0xc, 0x11, 0xf, - 0x16, 0xf, 0xe, 0xe, 0x8, 0x7, 0x8, 0x9, 0xc, 0x6, 0xc, 0xd, 0xa, 0xd, 0xc, 0x8, - 0xd, 0xe, 0x7, 0x6, 0xc, 0x7, 0x14, 0xe, 0xc, 0xd, 0xd, 0xa, 0xa, 0x8, 0xe, 0xb, - 0x12, 0xb, 0xb, 0xb, 0x8, 0x6, 0x8, 0xa, 0xd, 0xa, 0xf, 0xb, 0x9, 0xe, 0xd, 0x7, - 0xa, 0x16, 0x13, 0xe, 0xa, 0xa, 0x12, 0xc, 0xc, 0x8, 0xb, 0xf, 0xf, 0x12, 0x19, 0x14, - 0xc, 0xf, 0xa, 0xa, 0x6, 0x6, 0xa, 0x10, 0xa, 0xa, 0xf, 0xf, 0xe, 0x6, 0x6, 0xb, - 0x21, 0x7, 0x9, 0xa, 0x8, 0xa, 0x6, 0x7, 0x6, 0xc, 0x6, 0x9, 0x7, 0x10, 0x10, 0x10, - 0xf, 0x12, 0x13, 0x11, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xa, 0xc, 0xc, 0xc, 0xc, 0x7, - 0x7, 0x7, 0x7, 0xe, 0xc, 0xc, 0xc, 0xc, 0xc, 0xe, 0xe, 0xe, 0xe, 0xb, 0x17, 0x17, - 0x14, 0xb, 0x7, 0xb, 0x12, 0x12, 0xe, 0x7, 0x7, 0x12, 0xe, 0xb, 0x7, 0xb, 0x16, 0x1f, - 0x12, 0x7, 0x10, 0x10, 0x13, 0xb, 0x7, 0xb, 0xe, 0x10, 0xf, 0x10, 0xf, 0xf, 0x7, 0x9, - 0x9, 0x8, 0x13, 0x13, 0x16, 0x13, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x18, 0x22, 0xc, 0x0, - 0x5, 0x5, 0x9, 0x8, 0x11, 0xf, 0x16, 0x10, 0x5, 0x8, 0x8, 0xd, 0xc, 0x8, 0x8, 0x6, - 0xa, 0x10, 0xc, 0xe, 0xe, 0xf, 0xe, 0xf, 0xd, 0xe, 0xf, 0x6, 0x6, 0x10, 0xe, 0x10, - 0xd, 0x19, 0x11, 0x11, 0x10, 0x12, 0xf, 0xe, 0x13, 0x12, 0x8, 0x9, 0x10, 0xe, 0x15, 0x12, - 0x14, 0xf, 0x14, 0x10, 0xf, 0xd, 0x12, 0xf, 0x17, 0x10, 0xe, 0xf, 0x8, 0x7, 0x8, 0x9, - 0xc, 0x6, 0xd, 0xe, 0xb, 0xd, 0xd, 0x8, 0xd, 0xe, 0x7, 0x6, 0xd, 0x7, 0x15, 0xe, - 0xd, 0xe, 0xd, 0xa, 0xa, 0x8, 0xe, 0xc, 0x13, 0xc, 0xc, 0xb, 0x8, 0x7, 0x8, 0xa, - 0xd, 0xb, 0x10, 0xb, 0x9, 0xe, 0xd, 0x7, 0xa, 0x17, 0x14, 0xe, 0xa, 0xb, 0x13, 0xd, - 0xd, 0x9, 0xb, 0x10, 0x10, 0x13, 0x1a, 0x15, 0xc, 0xf, 0xa, 0xa, 0x6, 0x6, 0xa, 0x11, - 0xa, 0xa, 0xf, 0xf, 0xf, 0x6, 0x6, 0xb, 0x22, 0x7, 0x9, 0xa, 0x9, 0xb, 0x6, 0x8, - 0x7, 0xc, 0x7, 0x9, 0x7, 0x11, 0x11, 0x10, 0xf, 0x12, 0x13, 0x12, 0xd, 0xd, 0xd, 0xd, - 0xd, 0xd, 0xb, 0xd, 0xd, 0xd, 0xd, 0x7, 0x7, 0x7, 0x7, 0xe, 0xd, 0xd, 0xd, 0xd, - 0xd, 0xe, 0xe, 0xe, 0xe, 0xb, 0x18, 0x18, 0x15, 0xc, 0x7, 0xc, 0x12, 0x12, 0xf, 0x7, - 0x7, 0x13, 0xf, 0xb, 0x7, 0xc, 0x17, 0x20, 0x13, 0x7, 0x11, 0x11, 0x13, 0xb, 0x7, 0xc, - 0xe, 0x11, 0xf, 0x11, 0xf, 0xf, 0x8, 0x9, 0x9, 0x8, 0x13, 0x13, 0x17, 0x13, 0x12, 0x12, - 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbb, 0x1, 0x90, 0x0, 0x5, 0x0, 0x1, 0x2, 0xbc, - 0x2, 0x8a, 0x0, 0x0, 0x0, 0x8f, 0x2, 0xbc, 0x2, 0x8a, 0x0, 0x0, 0x1, 0xc5, 0x0, 0x32, - 0x1, 0x3, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0x6c, - 0x74, 0x73, 0x0, 0x40, 0x0, 0x20, 0xf0, 0x2, 0x3, 0xe3, 0xfe, 0xd8, 0x0, 0x0, 0x3, 0xe3, - 0x1, 0x28, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x45, 0x66, 0x95, 0x22, - 0x5f, 0xf, 0x3c, 0xf5, 0x0, 0x0, 0x3, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xba, 0x76, 0x9e, 0x49, - 0x0, 0x0, 0x0, 0x0, 0xba, 0x76, 0x9e, 0x49, 0x0, 0x0, 0xfe, 0xd8, 0x5, 0x43, 0x3, 0xe3, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x3, 0xe3, 0xfe, 0xd8, 0x0, 0x0, 0x5, 0x98, 0x0, 0x0, 0xfe, 0x81, 0x5, 0x43, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, - 0x0, 0x1, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x88, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x8, 0x0, 0x40, 0x0, 0xa, 0x0, 0x0, 0x0, 0x85, 0x1, 0x1c, 0x0, 0x1, 0x0, 0x1 -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Decorator.cpp b/libs/libRocket/Source/Core/Decorator.cpp deleted file mode 100644 index 9deff042c64..00000000000 --- a/libs/libRocket/Source/Core/Decorator.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Decorator.h" -#include "TextureDatabase.h" -#include "TextureResource.h" -#include "../../Include/Rocket/Core/DecoratorInstancer.h" -#include "../../Include/Rocket/Core/PropertyDefinition.h" - -namespace Rocket { -namespace Core { - -Decorator::Decorator() -{ - instancer = NULL; - z_index = 0; - specificity = -1; -} - -Decorator::~Decorator() -{ -} - -// Sets the z-index of the decorator. -void Decorator::SetZIndex(float _z_index) -{ - z_index = _z_index; -} - -// Returns the decorator's z-index. -float Decorator::GetZIndex() const -{ - return z_index; -} - -// Sets the specificity of the decorator. -void Decorator::SetSpecificity(int _specificity) -{ - specificity = _specificity; -} - -// Returns the specificity of the decorator. -int Decorator::GetSpecificity() const -{ - return specificity; -} - -// Releases the decorator through its instancer. -void Decorator::OnReferenceDeactivate() -{ - if (instancer != NULL) - instancer->ReleaseDecorator(this); -} - -// Attempts to load a texture into the list of textures in use by the decorator. -int Decorator::LoadTexture(const String& texture_name, const String& rcss_path) -{ - for (size_t i = 0; i < textures.size(); i++) - { - if (texture_name == textures[i].GetSource()) - return (int) i; - } - - Texture texture; - if (!texture.Load(texture_name, rcss_path)) - return -1; - - textures.push_back(texture); - return (int) textures.size() - 1; -} - -// Returns one of the decorator's previously loaded textures. -const Texture* Decorator::GetTexture(int index) const -{ - if (index < 0 || index >= (int) textures.size()) - return NULL; - - return &(textures[index]); -} - -// Returns the floating-point value of a numerical property from a dictionary of properties. -float Decorator::ResolveProperty(const PropertyDictionary& properties, const String& name, float base_value) const -{ - const Property* property = properties.GetProperty(name); - if (property == NULL) - { - ROCKET_ERROR; - return 0; - } - - // Need to include em! - if (property->unit & Property::RELATIVE_UNIT) - return base_value * property->value.Get< float >() * 0.01f; - - if (property->unit & Property::NUMBER || property->unit & Property::PX) - return property->value.Get< float >(); - - // Values based on pixels-per-inch. - if (property->unit & Property::PPI_UNIT) - { - float inch = property->value.Get< float >() * GetRenderInterface()->GetPixelsPerInch(); - - if (property->unit & Property::INCH) // inch - return inch; - if (property->unit & Property::CM) // centimeter - return inch / 2.54f; - if (property->unit & Property::MM) // millimeter - return inch / 25.4f; - if (property->unit & Property::PT) // point - return inch / 72.0f; - if (property->unit & Property::PC) // pica - return inch / 6.0f; - } - - ROCKET_ERROR; - return 0; -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorInstancer.cpp b/libs/libRocket/Source/Core/DecoratorInstancer.cpp deleted file mode 100644 index 7fadeb29834..00000000000 --- a/libs/libRocket/Source/Core/DecoratorInstancer.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/DecoratorInstancer.h" - -namespace Rocket { -namespace Core { - -DecoratorInstancer::DecoratorInstancer() -{ -} - -DecoratorInstancer::~DecoratorInstancer() -{ -} - -// Returns the property specification associated with the instancer. -const PropertySpecification& DecoratorInstancer::GetPropertySpecification() const -{ - return properties; -} - -// Registers a property for the decorator. -PropertyDefinition& DecoratorInstancer::RegisterProperty(const String& property_name, const String& default_value) -{ - return properties.RegisterProperty(property_name, default_value, false, false); -} - -// Registers a shorthand property definition. -bool DecoratorInstancer::RegisterShorthand(const String& shorthand_name, const String& property_names, PropertySpecification::ShorthandType type) -{ - return properties.RegisterShorthand(shorthand_name, property_names, type); -} - -// Releases the instancer. -void DecoratorInstancer::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorNone.cpp b/libs/libRocket/Source/Core/DecoratorNone.cpp deleted file mode 100644 index 870af90ddd8..00000000000 --- a/libs/libRocket/Source/Core/DecoratorNone.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorNone.h" - -namespace Rocket { -namespace Core { - -DecoratorNone::~DecoratorNone() -{ -} - -// Called on a decorator to generate any required per-element data for a newly decorated element. -DecoratorDataHandle DecoratorNone::GenerateElementData(Element* ROCKET_UNUSED_PARAMETER(element)) -{ - ROCKET_UNUSED(element); - - return 0; -} - -// Called to release element data generated by this decorator. -void DecoratorNone::ReleaseElementData(DecoratorDataHandle ROCKET_UNUSED_PARAMETER(element_data)) -{ - ROCKET_UNUSED(element_data); -} - -// Called to render the decorator on an element. -void DecoratorNone::RenderElement(Element* ROCKET_UNUSED_PARAMETER(element), DecoratorDataHandle ROCKET_UNUSED_PARAMETER(element_data)) -{ - ROCKET_UNUSED(element); - ROCKET_UNUSED(element_data); -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorNone.h b/libs/libRocket/Source/Core/DecoratorNone.h deleted file mode 100644 index 9439cb1b0ff..00000000000 --- a/libs/libRocket/Source/Core/DecoratorNone.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORNONE_H -#define ROCKETCOREDECORATORNONE_H - -#include "../../Include/Rocket/Core/Decorator.h" - -namespace Rocket { -namespace Core { - -/** - A decorator used to represent a 'none' decorator; that is, a decorator that does nothing. - - @author Peter Curry - */ - -class DecoratorNone : public Decorator -{ -public: - virtual ~DecoratorNone(); - - /// Called on a decorator to generate any required per-element data for a newly decorated element. - /// @param element[in] The newly decorated element. - /// @return A handle to a decorator-defined data handle, or NULL if none is needed for the element. - virtual DecoratorDataHandle GenerateElementData(Element* element); - /// Called to release element data generated by this decorator. - /// @param element_data[in] The element data handle to release. - virtual void ReleaseElementData(DecoratorDataHandle element_data); - - /// Called to render the decorator on an element. - /// @param element[in] The element to render the decorator on. - /// @param element_data[in] The handle to the data generated by the decorator for the element. - virtual void RenderElement(Element* element, DecoratorDataHandle element_data); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorNoneInstancer.cpp b/libs/libRocket/Source/Core/DecoratorNoneInstancer.cpp deleted file mode 100644 index e9e67bae095..00000000000 --- a/libs/libRocket/Source/Core/DecoratorNoneInstancer.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorNoneInstancer.h" -#include "DecoratorNone.h" - -namespace Rocket { -namespace Core { - -DecoratorNoneInstancer::~DecoratorNoneInstancer() -{ -} - -// Instances a decorator given the property tag and attributes from the RCSS file. -Decorator* DecoratorNoneInstancer::InstanceDecorator(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& ROCKET_UNUSED_PARAMETER(properties)) -{ - ROCKET_UNUSED(name); - ROCKET_UNUSED(properties); - - return new DecoratorNone(); -} - -// Releases the given decorator. -void DecoratorNoneInstancer::ReleaseDecorator(Decorator* decorator) -{ - delete decorator; -} - -// Releases the instancer. -void DecoratorNoneInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorNoneInstancer.h b/libs/libRocket/Source/Core/DecoratorNoneInstancer.h deleted file mode 100644 index 74065ecab92..00000000000 --- a/libs/libRocket/Source/Core/DecoratorNoneInstancer.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORNONEINSTANCER_H -#define ROCKETCOREDECORATORNONEINSTANCER_H - -#include "../../Include/Rocket/Core/DecoratorInstancer.h" - -namespace Rocket { -namespace Core { - -/** - The instancer for the none decorator. - - @author Peter Curry - */ - -class DecoratorNoneInstancer : public DecoratorInstancer -{ -public: - virtual ~DecoratorNoneInstancer(); - - /// Instances a decorator given the property tag and attributes from the RCSS file. - /// @param name The type of decorator desired. For example, "background-decorator: simple;" is declared as type "simple". - /// @param properties All RCSS properties associated with the decorator. - /// @return The decorator if it was instanced successful, NULL if an error occured. - virtual Decorator* InstanceDecorator(const String& name, const PropertyDictionary& properties); - /// Releases the given decorator. - /// @param decorator Decorator to release. This is guaranteed to have been constructed by this instancer. - virtual void ReleaseDecorator(Decorator* decorator); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiled.cpp b/libs/libRocket/Source/Core/DecoratorTiled.cpp deleted file mode 100644 index 0d2c163dc31..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiled.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiled.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -DecoratorTiled::DecoratorTiled() -{ - color_multiplier = Colourb(255, 255, 255, 255); -} - -DecoratorTiled::~DecoratorTiled() -{ -} - -static Vector2f oriented_texcoords[6][2] = {{Vector2f(0, 0), Vector2f(1, 1)}, - {Vector2f(0, 1), Vector2f(1, 0)}, - {Vector2f(1, 1), Vector2f(0, 0)}, - {Vector2f(1, 0), Vector2f(0, 1)}, - {Vector2f(1, 0), Vector2f(0, 1)}, - {Vector2f(0, 1), Vector2f(1, 0)}}; - -DecoratorTiled::Tile::Tile() -{ - texture_index = -1; - repeat_mode = STRETCH; - orientation = ROTATE_0_CW; - - texcoords[0].x = 0; - texcoords[0].y = 0; - texcoords[1].x = 1; - texcoords[1].y = 1; - - texcoords_absolute[0][0] = false; - texcoords_absolute[0][1] = false; - texcoords_absolute[1][0] = false; - texcoords_absolute[1][1] = false; -} - -// Calculates the tile's dimensions from the texture and texture coordinates. -void DecoratorTiled::Tile::CalculateDimensions(Element* element, const Texture& texture) -{ - RenderInterface* render_interface = element->GetRenderInterface(); - TileDataMap::iterator data_iterator = data.find(render_interface); - if (data_iterator == data.end()) - { - TileData new_data; - Vector2i texture_dimensions = texture.GetDimensions(render_interface); - - for (int i = 0; i < 2; i++) - { - new_data.texcoords[i] = texcoords[i]; - - if (texcoords_absolute[i][0] && - texture_dimensions.x > 0) - new_data.texcoords[i].x /= texture_dimensions.x; - if (texcoords_absolute[i][1] && - texture_dimensions.y > 0) - new_data.texcoords[i].y /= texture_dimensions.y; - } - - new_data.dimensions.x = Math::AbsoluteValue((new_data.texcoords[1].x * texture_dimensions.x) - (new_data.texcoords[0].x * texture_dimensions.x)); - new_data.dimensions.y = Math::AbsoluteValue((new_data.texcoords[1].y * texture_dimensions.y) - (new_data.texcoords[0].y * texture_dimensions.y)); - - data[render_interface] = new_data; - } -} - -// Get this tile's dimensions. -Vector2f DecoratorTiled::Tile::GetDimensions(Element* element) -{ - RenderInterface* render_interface = element->GetRenderInterface(); - TileDataMap::iterator data_iterator = data.find(render_interface); - if (data_iterator == data.end()) - return Vector2f(0, 0); - - return data_iterator->second.dimensions; -} - -// Generates geometry to render this tile across a surface. -void DecoratorTiled::Tile::GenerateGeometry(std::vector< Vertex >& vertices, std::vector< int >& indices, Element* element, const Vector2f& surface_origin, const Vector2f& surface_dimensions, const Vector2f& tile_dimensions, const Colourb& color_multiplier) const -{ - RenderInterface* render_interface = element->GetRenderInterface(); - TileDataMap::iterator data_iterator = data.find(render_interface); - if (data_iterator == data.end()) - return; - - const TileData& data = data_iterator->second; - - int num_tiles[2]; - Vector2f final_tile_dimensions; - Colourb colour = color_multiplier; - - // Generate the oriented texture coordinates for the tiles. - Vector2f scaled_texcoords[3]; - for (int i = 0; i < 2; i++) - { - scaled_texcoords[i].x = data.texcoords[0].x + oriented_texcoords[orientation][i].x * (data.texcoords[1].x - data.texcoords[0].x); - scaled_texcoords[i].y = data.texcoords[0].y + oriented_texcoords[orientation][i].y * (data.texcoords[1].y - data.texcoords[0].y); - } - scaled_texcoords[2] = scaled_texcoords[1]; - - // Resize the dimensions (if necessary) to fit this tile's repeat mode. - for (int i = 0; i < 2; i++) - { - if (surface_dimensions[i] <= 0) - num_tiles[i] = 0; - else - { - switch (repeat_mode) - { - // If the tile is stretched, we only need one quad. - case STRETCH: - { - num_tiles[i] = 1; - final_tile_dimensions[i] = surface_dimensions[i]; - } - break; - - // If the tile is clamped, we only need one quad if the surface is smaller than the tile, or two if it's - // larger (to take the last stretched pixel). - case CLAMP_STRETCH: - case CLAMP_TRUNCATE: - { - num_tiles[i] = surface_dimensions[i] > tile_dimensions[i] ? 2 : 1; - if (num_tiles[i] == 1) - { - final_tile_dimensions[i] = surface_dimensions[i]; - if (repeat_mode == CLAMP_TRUNCATE) - scaled_texcoords[1][i] -= (scaled_texcoords[1][i] - scaled_texcoords[0][i]) * (1.0f - (final_tile_dimensions[i] / tile_dimensions[i])); - } - else - final_tile_dimensions[i] = surface_dimensions[i] - tile_dimensions[i]; - } - break; - - case REPEAT_STRETCH: - case REPEAT_TRUNCATE: - { - num_tiles[i] = Math::RealToInteger((surface_dimensions[i] + (tile_dimensions[i] - 1)) / tile_dimensions[i]); - num_tiles[i] = Math::Max(0, num_tiles[i]); - - final_tile_dimensions[i] = surface_dimensions[i] - (num_tiles[i] - 1) * tile_dimensions[i]; - if (final_tile_dimensions[i] <= 0) - final_tile_dimensions[i] = tile_dimensions[i]; - - if (repeat_mode == REPEAT_TRUNCATE) - scaled_texcoords[2][i] -= (scaled_texcoords[1][i] - scaled_texcoords[0][i]) * (1.0f - (final_tile_dimensions[i] / tile_dimensions[i])); - } - break; - } - } - } - - // If any of the axes are zero or below, then we have a zero surface area and nothing to render. - if (num_tiles[0] <= 0 || num_tiles[1] <= 0) - return; - - // Resize the vertex and index arrays to fit the new geometry. - int index_offset = (int) vertices.size(); - vertices.resize(vertices.size() + num_tiles[0] * num_tiles[1] * 4); - Vertex* new_vertices = &vertices[0] + index_offset; - - size_t num_indices = indices.size(); - indices.resize(indices.size() + num_tiles[0] * num_tiles[1] * 6); - int* new_indices = &indices[0] + num_indices; - - // Generate the vertices for the tiled surface. - for (int y = 0; y < num_tiles[1]; y++) - { - Vector2f tile_position; - tile_position.y = surface_origin.y + (float) tile_dimensions.y * y; - - Vector2f tile_size; - tile_size.y = (float) (y < num_tiles[1] - 1 ? data.dimensions.y : final_tile_dimensions.y); - - // Squish the texture coordinates in the y if we're clamping and this is the last in a double-tile. - Vector2f tile_texcoords[2]; - if (num_tiles[1] == 2 && - y == 1 && - (repeat_mode == CLAMP_STRETCH || - repeat_mode == CLAMP_TRUNCATE)) - { - tile_texcoords[0].y = scaled_texcoords[1].y; - tile_texcoords[1].y = scaled_texcoords[1].y; - } - else - { - tile_texcoords[0].y = scaled_texcoords[0].y; - // The last tile might have truncated texture coords - if (y == num_tiles[1] - 1) - tile_texcoords[1].y = scaled_texcoords[2].y; - else - tile_texcoords[1].y = scaled_texcoords[1].y; - } - - for (int x = 0; x < num_tiles[0]; x++) - { - // Squish the texture coordinates in the x if we're clamping and this is the last in a double-tile. - if (num_tiles[0] == 2 && - x == 1 && - (repeat_mode == CLAMP_STRETCH || - repeat_mode == CLAMP_TRUNCATE)) - { - tile_texcoords[0].x = scaled_texcoords[1].x; - tile_texcoords[1].x = scaled_texcoords[1].x; - } - else - { - tile_texcoords[0].x = scaled_texcoords[0].x; - // The last tile might have truncated texture coords - if (x == num_tiles[0] - 1) - tile_texcoords[1].x = scaled_texcoords[2].x; - else - tile_texcoords[1].x = scaled_texcoords[1].x; - } - - tile_position.x = surface_origin.x + (float) tile_dimensions.x * x; - tile_size.x = (float) (x < num_tiles[0] - 1 ? tile_dimensions.x : final_tile_dimensions.x); - colour.alpha *= element->GetProperty(OPACITY); - - GeometryUtilities::GenerateQuad(new_vertices, new_indices, tile_position, tile_size, colour, tile_texcoords[0], tile_texcoords[1], index_offset); - new_vertices += 4; - new_indices += 6; - index_offset += 4; - } - } -} - -// Scales a tile dimensions by a fixed value along one axis. -void DecoratorTiled::ScaleTileDimensions(Vector2f& tile_dimensions, float axis_value, int axis) -{ - if (tile_dimensions[axis] != axis_value) - { - tile_dimensions[1 - axis] = tile_dimensions[1 - axis] * (axis_value / tile_dimensions[axis]); - tile_dimensions[axis] = axis_value; - } -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiled.h b/libs/libRocket/Source/Core/DecoratorTiled.h deleted file mode 100644 index c10373ef11f..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiled.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILED_H -#define ROCKETCOREDECORATORTILED_H - -#include "../../Include/Rocket/Core/Decorator.h" -#include "../../Include/Rocket/Core/Vertex.h" - -namespace Rocket { -namespace Core { - -struct Texture; - -/** - Base class for tiled decorators. - - @author Peter Curry - */ - -class DecoratorTiled : public Decorator -{ -public: - DecoratorTiled(); - virtual ~DecoratorTiled(); - - /** - Stores the repetition mode for a tile, for when it is rendered on a surface that is a - different size than itself. - */ - enum TileRepeatMode - { - STRETCH = 0, // Stretches a single tile across the required surface. - CLAMP_STRETCH = 1, // Clamps the tile to the upper left, stretching the tile inwards to fit into the element if it is too small. - CLAMP_TRUNCATE = 2, // Clamps the tile to the upper left, truncating the tile to fit into the element if it is too small. - REPEAT_STRETCH = 3, // Repeats the tile, stretching the final tile inwards. - REPEAT_TRUNCATE = 4, // Repeats the tile, truncating the final tile. - }; - - /** - Stores the orientation of a tile. - */ - enum TileOrientation - { - ROTATE_0_CW = 0, // Rotated zero degrees clockwise. - ROTATE_90_CW = 1, // Rotated 90 degrees clockwise. - ROTATE_180_CW = 2, // Rotated 180 degrees clockwise. - ROTATE_270_CW = 3, // Rotated 270 degrees clockwise. - FLIP_HORIZONTAL = 4, // Flipped horizontally. - FLIP_VERTICAL = 5 // Flipped vertically. - }; - - /** - Structure for storing the different tiles the tiled decorator uses internally over its - surface. - - @author Peter Curry - */ - struct Tile - { - /// Constructs the tile with safe default values. - Tile(); - - /// Calculates the tile's dimensions from the texture and texture coordinates. - void CalculateDimensions(Element* element, const Texture& texture); - /// Get this tile's dimensions. - Vector2f GetDimensions(Element* element); - - /// Generates geometry to render this tile across a surface. - /// @param[out] vertices The array to store the generated vertex data. - /// @param[out] indices The array to store the generated index data. - /// @param[in] element The element hosting the decorator. - /// @param[in] surface_origin The starting point of the first tile to generate. - /// @param[in] surface_dimensions The dimensions of the surface to be tiled. - /// @param[in] tile_dimensions The dimensions to render this tile at. - void GenerateGeometry(std::vector< Vertex >& vertices, std::vector< int >& indices, Element* element, const Vector2f& surface_origin, const Vector2f& surface_dimensions, const Vector2f& tile_dimensions, const Colourb& color_multiplier = Colourb(255, 255, 255)) const; - - struct TileData - { - Vector2f dimensions; - Vector2f texcoords[2]; - }; - - typedef std::map< RenderInterface*, TileData > TileDataMap; - - int texture_index; - Vector2f texcoords[2]; - bool texcoords_absolute[2][2]; - - mutable TileDataMap data; - - TileRepeatMode repeat_mode; - TileOrientation orientation; - }; - - Colourb & GetColorMultiplier() - { - return color_multiplier; - } - -protected: - /// Scales a tile dimensions by a fixed value along one axis. - /// @param tile_dimensions[in, out] The tile dimensions to scale. - /// @param axis_value[in] The fixed value to scale against. - /// @param axis[in] The axis to scale against; either 0 (for x) or 1 (for y). - void ScaleTileDimensions(Vector2f& tile_dimensions, float axis_value, int axis); - - Colourb color_multiplier; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledBox.cpp b/libs/libRocket/Source/Core/DecoratorTiledBox.cpp deleted file mode 100644 index b8b46293a8d..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledBox.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledBox.h" -#include "TextureResource.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Geometry.h" - -namespace Rocket { -namespace Core { - -struct DecoratorTiledBoxData -{ - DecoratorTiledBoxData(Element* host_element) - { - for (int i = 0; i < 9; ++i) - geometry[i] = new Geometry(host_element); - } - - ~DecoratorTiledBoxData() - { - for (int i = 0; i < 9; ++i) - delete geometry[i]; - } - - Geometry* geometry[9]; -}; - -DecoratorTiledBox::DecoratorTiledBox() -{ -} - -DecoratorTiledBox::~DecoratorTiledBox() -{ -} - -// Initialises the tiles for the decorator. -bool DecoratorTiledBox::Initialise(const Tile* _tiles, const String* _texture_names, const String* _rcss_paths) -{ - // Load the textures. - for (int i = 0; i < 9; i++) - { - if (!_texture_names[i].Empty()) - { - tiles[i] = _tiles[i]; - tiles[i].texture_index = LoadTexture(_texture_names[i], _rcss_paths[i]); - if (tiles[i].texture_index < 0) - return false; - } - } - - // If only one side of the left / right edges have been configured, then mirror the tile for the other side. - if (tiles[LEFT_EDGE].texture_index == -1 && tiles[RIGHT_EDGE].texture_index > -1) - { - tiles[LEFT_EDGE] = tiles[RIGHT_EDGE]; - tiles[LEFT_EDGE].orientation = FLIP_HORIZONTAL; - } - else if (tiles[RIGHT_EDGE].texture_index == -1 && tiles[LEFT_EDGE].texture_index > -1) - { - tiles[RIGHT_EDGE] = tiles[LEFT_EDGE]; - tiles[RIGHT_EDGE].orientation = FLIP_HORIZONTAL; - } - else if (tiles[LEFT_EDGE].texture_index == -1 && tiles[RIGHT_EDGE].texture_index == -1) - return false; - - // If only one side of the top / bottom edges have been configured, then mirror the tile for the other side. - if (tiles[TOP_EDGE].texture_index == -1 && tiles[BOTTOM_EDGE].texture_index > -1) - { - tiles[TOP_EDGE] = tiles[BOTTOM_EDGE]; - tiles[TOP_EDGE].orientation = FLIP_VERTICAL; - } - else if (tiles[BOTTOM_EDGE].texture_index == -1 && tiles[TOP_EDGE].texture_index > -1) - { - tiles[BOTTOM_EDGE] = tiles[TOP_EDGE]; - tiles[BOTTOM_EDGE].orientation = FLIP_VERTICAL; - } - else if (tiles[TOP_EDGE].texture_index == -1 && tiles[BOTTOM_EDGE].texture_index == -1) - return false; - - // Check that the centre tile has been specified. - if (tiles[CENTRE].texture_index < 0) - return false; - - return true; -} - -// Called on a decorator to generate any required per-element data for a newly decorated element. -DecoratorDataHandle DecoratorTiledBox::GenerateElementData(Element* element) -{ - // Initialise the tiles for this element. - for (int i = 0; i < 9; i++) - { - if (tiles[i].texture_index >= 0) - tiles[i].CalculateDimensions(element, *GetTexture(tiles[i].texture_index)); - } - - Vector2f padded_size = element->GetBox().GetSize(Box::PADDING); - - // Calculate the size for the top row of tiles. - Vector2f top_left_dimensions = tiles[TOP_LEFT_CORNER].GetDimensions(element); - Vector2f top_dimensions = tiles[TOP_EDGE].GetDimensions(element); - Vector2f top_right_dimensions = tiles[TOP_RIGHT_CORNER].GetDimensions(element); - - // Calculate the size for the bottom row of tiles. - Vector2f bottom_left_dimensions = tiles[BOTTOM_LEFT_CORNER].GetDimensions(element); - Vector2f bottom_dimensions = tiles[BOTTOM_EDGE].GetDimensions(element); - Vector2f bottom_right_dimensions = tiles[BOTTOM_RIGHT_CORNER].GetDimensions(element); - - // The size of the left and right tiles. - Vector2f left_dimensions = tiles[LEFT_EDGE].GetDimensions(element); - Vector2f right_dimensions = tiles[RIGHT_EDGE].GetDimensions(element); - - // Scale the top corners down if appropriate. If they are scaled, then the left and right edges are also scaled - // if they shared a width with their corner. Best solution? Don't know. - if (padded_size.x < top_left_dimensions.x + top_right_dimensions.x) - { - float minimum_width = top_left_dimensions.x + top_right_dimensions.x; - - top_left_dimensions.x = padded_size.x * (top_left_dimensions.x / minimum_width); - if (tiles[TOP_LEFT_CORNER].GetDimensions(element).x == tiles[LEFT_EDGE].GetDimensions(element).x) - left_dimensions.x = top_left_dimensions.x; - - top_right_dimensions.x = padded_size.x * (top_right_dimensions.x / minimum_width); - if (tiles[TOP_RIGHT_CORNER].GetDimensions(element).x == tiles[RIGHT_EDGE].GetDimensions(element).x) - right_dimensions.x = top_right_dimensions.x; - } - - // Scale the bottom corners down if appropriate. If they are scaled, then the left and right edges are also scaled - // if they shared a width with their corner. Best solution? Don't know. - if (padded_size.x < bottom_left_dimensions.x + bottom_right_dimensions.x) - { - float minimum_width = bottom_left_dimensions.x + bottom_right_dimensions.x; - - bottom_left_dimensions.x = padded_size.x * (bottom_left_dimensions.x / minimum_width); - if (tiles[BOTTOM_LEFT_CORNER].GetDimensions(element).x == tiles[LEFT_EDGE].GetDimensions(element).x) - left_dimensions.x = bottom_left_dimensions.x; - - bottom_right_dimensions.x = padded_size.x * (bottom_right_dimensions.x / minimum_width); - if (tiles[BOTTOM_RIGHT_CORNER].GetDimensions(element).x == tiles[RIGHT_EDGE].GetDimensions(element).x) - right_dimensions.x = bottom_right_dimensions.x; - } - - // Scale the left corners down if appropriate. If they are scaled, then the top and bottom edges are also scaled - // if they shared a width with their corner. Best solution? Don't know. - if (padded_size.y < top_left_dimensions.y + bottom_left_dimensions.y) - { - float minimum_height = top_left_dimensions.y + bottom_left_dimensions.y; - - top_left_dimensions.y = padded_size.y * (top_left_dimensions.y / minimum_height); - if (tiles[TOP_LEFT_CORNER].GetDimensions(element).y == tiles[TOP_EDGE].GetDimensions(element).y) - top_dimensions.y = top_left_dimensions.y; - - bottom_left_dimensions.y = padded_size.y * (bottom_left_dimensions.y / minimum_height); - if (tiles[BOTTOM_LEFT_CORNER].GetDimensions(element).y == tiles[BOTTOM_EDGE].GetDimensions(element).y) - bottom_dimensions.y = bottom_left_dimensions.y; - } - - // Scale the right corners down if appropriate. If they are scaled, then the top and bottom edges are also scaled - // if they shared a width with their corner. Best solution? Don't know. - if (padded_size.y < top_right_dimensions.y + bottom_right_dimensions.y) - { - float minimum_height = top_right_dimensions.y + bottom_right_dimensions.y; - - top_right_dimensions.y = padded_size.y * (top_right_dimensions.y / minimum_height); - if (tiles[TOP_RIGHT_CORNER].GetDimensions(element).y == tiles[TOP_EDGE].GetDimensions(element).y) - top_dimensions.y = top_right_dimensions.y; - - bottom_right_dimensions.y = padded_size.y * (bottom_right_dimensions.y / minimum_height); - if (tiles[BOTTOM_RIGHT_CORNER].GetDimensions(element).y == tiles[BOTTOM_EDGE].GetDimensions(element).y) - bottom_dimensions.y = bottom_right_dimensions.y; - } - - DecoratorTiledBoxData* data = new DecoratorTiledBoxData(element); - - // Generate the geometry for the top-left tile. - tiles[TOP_LEFT_CORNER].GenerateGeometry(data->geometry[tiles[TOP_LEFT_CORNER].texture_index]->GetVertices(), - data->geometry[tiles[TOP_LEFT_CORNER].texture_index]->GetIndices(), - element, - Vector2f(0, 0), - top_left_dimensions, - top_left_dimensions, - color_multiplier); - - // Generate the geometry for the top edge tiles. - tiles[TOP_EDGE].GenerateGeometry(data->geometry[tiles[TOP_EDGE].texture_index]->GetVertices(), - data->geometry[tiles[TOP_EDGE].texture_index]->GetIndices(), - element, - Vector2f(top_left_dimensions.x, 0), - Vector2f(padded_size.x - (top_left_dimensions.x + top_right_dimensions.x), top_dimensions.y), - top_dimensions, - color_multiplier); - - // Generate the geometry for the top-right tile. - tiles[TOP_RIGHT_CORNER].GenerateGeometry(data->geometry[tiles[TOP_RIGHT_CORNER].texture_index]->GetVertices(), - data->geometry[tiles[TOP_RIGHT_CORNER].texture_index]->GetIndices(), - element, - Vector2f(padded_size.x - top_right_dimensions.x, 0), - top_right_dimensions, - top_right_dimensions, - color_multiplier); - - // Generate the geometry for the left side. - tiles[LEFT_EDGE].GenerateGeometry(data->geometry[tiles[LEFT_EDGE].texture_index]->GetVertices(), - data->geometry[tiles[LEFT_EDGE].texture_index]->GetIndices(), - element, - Vector2f(0, top_left_dimensions.y), - Vector2f(left_dimensions.x, padded_size.y - (top_left_dimensions.y + bottom_left_dimensions.y)), - left_dimensions, - color_multiplier); - - // Generate the geometry for the right side. - tiles[RIGHT_EDGE].GenerateGeometry(data->geometry[tiles[RIGHT_EDGE].texture_index]->GetVertices(), - data->geometry[tiles[RIGHT_EDGE].texture_index]->GetIndices(), - element, - Vector2f((padded_size.x - right_dimensions.x), top_right_dimensions.y), - Vector2f(right_dimensions.x, padded_size.y - (top_right_dimensions.y + bottom_right_dimensions.y)), - right_dimensions, - color_multiplier); - - // Generate the geometry for the bottom-left tile. - tiles[BOTTOM_LEFT_CORNER].GenerateGeometry(data->geometry[tiles[BOTTOM_LEFT_CORNER].texture_index]->GetVertices(), - data->geometry[tiles[BOTTOM_LEFT_CORNER].texture_index]->GetIndices(), - element, - Vector2f(0, padded_size.y - bottom_left_dimensions.y), - bottom_left_dimensions, - bottom_left_dimensions, - color_multiplier); - - // Generate the geometry for the bottom edge tiles. - tiles[BOTTOM_EDGE].GenerateGeometry(data->geometry[tiles[BOTTOM_EDGE].texture_index]->GetVertices(), - data->geometry[tiles[BOTTOM_EDGE].texture_index]->GetIndices(), - element, - Vector2f(bottom_left_dimensions.x, padded_size.y - bottom_dimensions.y), - Vector2f(padded_size.x - (bottom_left_dimensions.x + bottom_right_dimensions.x), bottom_dimensions.y), - bottom_dimensions, - color_multiplier); - - // Generate the geometry for the bottom-right tile. - tiles[BOTTOM_RIGHT_CORNER].GenerateGeometry(data->geometry[tiles[BOTTOM_RIGHT_CORNER].texture_index]->GetVertices(), - data->geometry[tiles[BOTTOM_RIGHT_CORNER].texture_index]->GetIndices(), - element, - Vector2f(padded_size.x - bottom_right_dimensions.x, padded_size.y - bottom_right_dimensions.y), - bottom_right_dimensions, - bottom_right_dimensions, - color_multiplier); - - // Generate the centre geometry. - if (tiles[CENTRE].texture_index >= 0) - { - Vector2f centre_dimensions = tiles[CENTRE].GetDimensions(element); - Vector2f centre_surface_dimensions(padded_size.x - (left_dimensions.x + right_dimensions.x), - padded_size.y - (top_dimensions.y + bottom_dimensions.y)); - - tiles[CENTRE].GenerateGeometry(data->geometry[tiles[CENTRE].texture_index]->GetVertices(), - data->geometry[tiles[CENTRE].texture_index]->GetIndices(), - element, - Vector2f(left_dimensions.x, top_dimensions.y), - centre_surface_dimensions, - centre_dimensions, - color_multiplier); - } - - // Set the textures on the geometry. - const Texture* texture = NULL; - int texture_index = 0; - while ((texture = GetTexture(texture_index)) != NULL) - data->geometry[texture_index++]->SetTexture(texture); - - return reinterpret_cast(data); -} - -// Called to release element data generated by this decorator. -void DecoratorTiledBox::ReleaseElementData(DecoratorDataHandle element_data) -{ - delete reinterpret_cast< DecoratorTiledBoxData* >(element_data); -} - -// Called to render the decorator on an element. -void DecoratorTiledBox::RenderElement(Element* element, DecoratorDataHandle element_data) -{ - Vector2f translation = element->GetAbsoluteOffset(Box::PADDING); - DecoratorTiledBoxData* data = reinterpret_cast< DecoratorTiledBoxData* >(element_data); - - for (int i = 0; i < 9; i++) - data->geometry[i]->Render(translation); -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledBox.h b/libs/libRocket/Source/Core/DecoratorTiledBox.h deleted file mode 100644 index 07754a8b97a..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledBox.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDBOX_H -#define ROCKETCOREDECORATORTILEDBOX_H - -#include "DecoratorTiled.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledBox : public DecoratorTiled -{ -public: - DecoratorTiledBox(); - virtual ~DecoratorTiledBox(); - - /// Initialises the tiles for the decorator. - /// @param[in] tiles The declaration for all eight tiles. - /// @param[in] texture_names The application-specific path to the texture for the eight tiles. - /// @param[in] rcss_paths The paths to the RCSS files that defined the texture sources. - /// @return True if all the images loaded (or are pending loading) and are of compatible sizes, false otherwise. - bool Initialise(const Tile* tiles, const String* texture_names, const String* rcss_paths); - - /// Called on a decorator to generate any required per-element data for a newly decorated element. - virtual DecoratorDataHandle GenerateElementData(Element* element); - /// Called to release element data generated by this decorator. - virtual void ReleaseElementData(DecoratorDataHandle element_data); - - /// Called to render the decorator on an element. - virtual void RenderElement(Element* element, DecoratorDataHandle element_data); - -private: - enum - { - TOP_LEFT_CORNER = 0, - TOP_RIGHT_CORNER = 1, - BOTTOM_LEFT_CORNER = 2, - BOTTOM_RIGHT_CORNER = 3, - LEFT_EDGE = 4, - RIGHT_EDGE = 5, - TOP_EDGE = 6, - BOTTOM_EDGE = 7, - CENTRE = 8 - }; - - Tile tiles[9]; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledBoxInstancer.cpp b/libs/libRocket/Source/Core/DecoratorTiledBoxInstancer.cpp deleted file mode 100644 index 00bdb45571e..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledBoxInstancer.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledBoxInstancer.h" -#include "DecoratorTiledBox.h" - -namespace Rocket { -namespace Core { - -DecoratorTiledBoxInstancer::DecoratorTiledBoxInstancer() -{ - RegisterTileProperty("top-left-image", false); - RegisterTileProperty("top-right-image", false); - RegisterTileProperty("bottom-left-image", false); - RegisterTileProperty("bottom-right-image", false); - - RegisterTileProperty("left-image", true); - RegisterTileProperty("right-image", true); - RegisterTileProperty("top-image", true); - RegisterTileProperty("bottom-image", true); - - RegisterTileProperty("center-image", true); - - RegisterProperty("color-multiplier", "white").AddParser(COLOR); -} - -DecoratorTiledBoxInstancer::~DecoratorTiledBoxInstancer() -{ -} - -// Instances a box decorator. -Decorator* DecoratorTiledBoxInstancer::InstanceDecorator(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& properties) -{ - ROCKET_UNUSED(name); - - DecoratorTiled::Tile tiles[9]; - String texture_names[9]; - String rcss_paths[9]; - - GetTileProperties(tiles[0], texture_names[0], rcss_paths[0], properties, "top-left-image"); - GetTileProperties(tiles[1], texture_names[1], rcss_paths[1], properties, "top-right-image"); - GetTileProperties(tiles[2], texture_names[2], rcss_paths[2], properties, "bottom-left-image"); - GetTileProperties(tiles[3], texture_names[3], rcss_paths[3], properties, "bottom-right-image"); - GetTileProperties(tiles[4], texture_names[4], rcss_paths[4], properties, "left-image"); - GetTileProperties(tiles[5], texture_names[5], rcss_paths[5], properties, "right-image"); - GetTileProperties(tiles[6], texture_names[6], rcss_paths[6], properties, "top-image"); - GetTileProperties(tiles[7], texture_names[7], rcss_paths[7], properties, "bottom-image"); - GetTileProperties(tiles[8], texture_names[8], rcss_paths[8], properties, "center-image"); - - DecoratorTiledBox* decorator = new DecoratorTiledBox(); - - decorator->GetColorMultiplier() = properties.GetProperty("color-multiplier")->value.Get< Colourb >(); - - if (decorator->Initialise(tiles, texture_names, rcss_paths)) - return decorator; - - decorator->RemoveReference(); - ReleaseDecorator(decorator); - return NULL; -} - -// Releases the given decorator. -void DecoratorTiledBoxInstancer::ReleaseDecorator(Decorator* decorator) -{ - delete decorator; -} - -// Releases the instancer. -void DecoratorTiledBoxInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledBoxInstancer.h b/libs/libRocket/Source/Core/DecoratorTiledBoxInstancer.h deleted file mode 100644 index 85905fbdc15..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledBoxInstancer.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDBOXINSTANCER_H -#define ROCKETCOREDECORATORTILEDBOXINSTANCER_H - -#include "DecoratorTiledInstancer.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledBoxInstancer : public DecoratorTiledInstancer -{ -public: - DecoratorTiledBoxInstancer(); - virtual ~DecoratorTiledBoxInstancer(); - - /// Instances a box decorator. - virtual Decorator* InstanceDecorator(const String& name, const PropertyDictionary& properties); - /// Releases the given decorator. - virtual void ReleaseDecorator(Decorator* decorator); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledHorizontal.cpp b/libs/libRocket/Source/Core/DecoratorTiledHorizontal.cpp deleted file mode 100644 index b4c51602820..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledHorizontal.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledHorizontal.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Geometry.h" -#include "../../Include/Rocket/Core/Texture.h" - -namespace Rocket { -namespace Core { - -struct DecoratorTiledHorizontalData -{ - DecoratorTiledHorizontalData(Element* host_element) - { - for (int i = 0; i < 3; ++i) - geometry[i] = new Geometry(host_element); - } - - ~DecoratorTiledHorizontalData() - { - for (int i = 0; i < 3; ++i) - delete geometry[i]; - } - - Geometry* geometry[3]; -}; - -DecoratorTiledHorizontal::DecoratorTiledHorizontal() -{ -} - -DecoratorTiledHorizontal::~DecoratorTiledHorizontal() -{ -} - -// Initialises the tiles for the decorator. -bool DecoratorTiledHorizontal::Initialise(const Tile* _tiles, const String* _texture_names, const String* _rcss_paths) -{ - // Load the textures. - for (int i = 0; i < 3; i++) - { - if (!_texture_names[i].Empty()) - { - tiles[i] = _tiles[i]; - tiles[i].texture_index = LoadTexture(_texture_names[i], _rcss_paths[i]); - if (tiles[i].texture_index < 0) - return false; - } - else - tiles[i].texture_index = -1; - } - - // If only one side of the decorator has been configured, then mirror the texture for the other side. - if (tiles[LEFT].texture_index == -1 && tiles[RIGHT].texture_index > -1) - { - tiles[LEFT] = tiles[RIGHT]; - tiles[LEFT].orientation = FLIP_HORIZONTAL; - } - else if (tiles[RIGHT].texture_index == -1 && tiles[LEFT].texture_index > -1) - { - tiles[RIGHT] = tiles[LEFT]; - tiles[RIGHT].orientation = FLIP_HORIZONTAL; - } - else if (tiles[LEFT].texture_index == -1 && tiles[RIGHT].texture_index == -1) - return false; - - if (tiles[CENTRE].texture_index == -1) - return false; - - return true; -} - -// Called on a decorator to generate any required per-element data for a newly decorated element. -DecoratorDataHandle DecoratorTiledHorizontal::GenerateElementData(Element* element) -{ - // Initialise the tiles for this element. - for (int i = 0; i < 3; i++) - tiles[i].CalculateDimensions(element, *(GetTexture(tiles[i].texture_index))); - - DecoratorTiledHorizontalData* data = new DecoratorTiledHorizontalData(element); - - Vector2f padded_size = element->GetBox().GetSize(Box::PADDING); - - Vector2f left_dimensions = tiles[LEFT].GetDimensions(element); - Vector2f right_dimensions = tiles[RIGHT].GetDimensions(element); - Vector2f centre_dimensions = tiles[CENTRE].GetDimensions(element); - - // Scale the tile sizes by the height scale. - ScaleTileDimensions(left_dimensions, padded_size.y, 1); - ScaleTileDimensions(right_dimensions, padded_size.y, 1); - ScaleTileDimensions(centre_dimensions, padded_size.y, 1); - - // Shrink the x-sizes on the left and right tiles if necessary. - if (padded_size.x < left_dimensions.x + right_dimensions.x) - { - float minimum_width = left_dimensions.x + right_dimensions.x; - left_dimensions.x = padded_size.x * (left_dimensions.x / minimum_width); - right_dimensions.x = padded_size.x * (right_dimensions.x / minimum_width); - } - - // Generate the geometry for the left tile. - tiles[LEFT].GenerateGeometry(data->geometry[tiles[LEFT].texture_index]->GetVertices(), data->geometry[tiles[LEFT].texture_index]->GetIndices(), element, Vector2f(0, 0), left_dimensions, left_dimensions, color_multiplier); - // Generate the geometry for the centre tiles. - tiles[CENTRE].GenerateGeometry(data->geometry[tiles[CENTRE].texture_index]->GetVertices(), data->geometry[tiles[CENTRE].texture_index]->GetIndices(), element, Vector2f(left_dimensions.x, 0), Vector2f(padded_size.x - (left_dimensions.x + right_dimensions.x), centre_dimensions.y), centre_dimensions, color_multiplier); - // Generate the geometry for the right tile. - tiles[RIGHT].GenerateGeometry(data->geometry[tiles[RIGHT].texture_index]->GetVertices(), data->geometry[tiles[RIGHT].texture_index]->GetIndices(), element, Vector2f(padded_size.x - right_dimensions.x, 0), right_dimensions, right_dimensions, color_multiplier); - - // Set the textures on the geometry. - const Texture* texture = NULL; - int texture_index = 0; - while ((texture = GetTexture(texture_index)) != NULL) - data->geometry[texture_index++]->SetTexture(texture); - - return reinterpret_cast(data); -} - -// Called to release element data generated by this decorator. -void DecoratorTiledHorizontal::ReleaseElementData(DecoratorDataHandle element_data) -{ - delete reinterpret_cast< DecoratorTiledHorizontalData* >(element_data); -} - -// Called to render the decorator on an element. -void DecoratorTiledHorizontal::RenderElement(Element* element, DecoratorDataHandle element_data) -{ - Vector2f translation = element->GetAbsoluteOffset(Box::PADDING); - DecoratorTiledHorizontalData* data = reinterpret_cast< DecoratorTiledHorizontalData* >(element_data); - - for (int i = 0; i < 3; i++) - data->geometry[i]->Render(translation); -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledHorizontal.h b/libs/libRocket/Source/Core/DecoratorTiledHorizontal.h deleted file mode 100644 index 0d1ed916b13..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledHorizontal.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDHORIZONTAL_H -#define ROCKETCOREDECORATORTILEDHORIZONTAL_H - -#include "DecoratorTiled.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledHorizontal : public DecoratorTiled -{ -public: - DecoratorTiledHorizontal(); - virtual ~DecoratorTiledHorizontal(); - - /// Initialises the tiles for the decorator. - /// @param tiles[in] The declaration for all three tiles. - /// @param texture_names[in] The application-specific path to the texture for the three tiles. - /// @param rcss_paths[in] The paths to the RCSS files that defined the texture sources. - /// @return True if all the images loaded (or are pending loading) and are of compatible sizes, false otherwise. - bool Initialise(const Tile* tiles, const String* texture_names, const String* rcss_paths); - - /// Called on a decorator to generate any required per-element data for a newly decorated element. - virtual DecoratorDataHandle GenerateElementData(Element* element); - /// Called to release element data generated by this decorator. - virtual void ReleaseElementData(DecoratorDataHandle element_data); - - /// Called to render the decorator on an element. - virtual void RenderElement(Element* element, DecoratorDataHandle element_data); - -private: - enum - { - LEFT = 0, - RIGHT = 1, - CENTRE = 2 - }; - - Tile tiles[3]; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledHorizontalInstancer.cpp b/libs/libRocket/Source/Core/DecoratorTiledHorizontalInstancer.cpp deleted file mode 100644 index ab3bba8ecad..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledHorizontalInstancer.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledHorizontalInstancer.h" -#include "DecoratorTiledHorizontal.h" - -namespace Rocket { -namespace Core { - -DecoratorTiledHorizontalInstancer::DecoratorTiledHorizontalInstancer() -{ - RegisterTileProperty("left-image", false); - RegisterTileProperty("right-image", false); - RegisterTileProperty("center-image", true); - RegisterProperty("color-multiplier", "white").AddParser(COLOR); -} - -DecoratorTiledHorizontalInstancer::~DecoratorTiledHorizontalInstancer() -{ -} - -// Instances a box decorator. -Decorator* DecoratorTiledHorizontalInstancer::InstanceDecorator(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& properties) -{ - ROCKET_UNUSED(name); - - DecoratorTiled::Tile tiles[3]; - String texture_names[3]; - String rcss_paths[3]; - - GetTileProperties(tiles[0], texture_names[0], rcss_paths[0], properties, "left-image"); - GetTileProperties(tiles[1], texture_names[1], rcss_paths[1], properties, "right-image"); - GetTileProperties(tiles[2], texture_names[2], rcss_paths[2], properties, "center-image"); - - DecoratorTiledHorizontal* decorator = new DecoratorTiledHorizontal(); - - decorator->GetColorMultiplier() = properties.GetProperty("color-multiplier")->value.Get< Colourb >(); - - if (decorator->Initialise(tiles, texture_names, rcss_paths)) - return decorator; - - decorator->RemoveReference(); - ReleaseDecorator(decorator); - return NULL; -} - -// Releases the given decorator. -void DecoratorTiledHorizontalInstancer::ReleaseDecorator(Decorator* decorator) -{ - delete decorator; -} - -// Releases the instancer. -void DecoratorTiledHorizontalInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledHorizontalInstancer.h b/libs/libRocket/Source/Core/DecoratorTiledHorizontalInstancer.h deleted file mode 100644 index 4e69ceb88e3..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledHorizontalInstancer.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDHORIZONTALINSTANCER_H -#define ROCKETCOREDECORATORTILEDHORIZONTALINSTANCER_H - -#include "DecoratorTiledInstancer.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledHorizontalInstancer : public DecoratorTiledInstancer -{ -public: - DecoratorTiledHorizontalInstancer(); - virtual ~DecoratorTiledHorizontalInstancer(); - - /// Instances a horizontal decorator. - virtual Decorator* InstanceDecorator(const String& name, const PropertyDictionary& properties); - /// Releases the given decorator. - virtual void ReleaseDecorator(Decorator* decorator); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledImage.cpp b/libs/libRocket/Source/Core/DecoratorTiledImage.cpp deleted file mode 100644 index 61fc56fc6ea..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledImage.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledImage.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Geometry.h" -#include "../../Include/Rocket/Core/GeometryUtilities.h" - -namespace Rocket { -namespace Core { - -DecoratorTiledImage::DecoratorTiledImage() -{ -} - -DecoratorTiledImage::~DecoratorTiledImage() -{ -} - -// Initialises the tiles for the decorator. -bool DecoratorTiledImage::Initialise(const Tile& _tile, const String& _texture_name, const String& _rcss_path) -{ - // Load the texture. - tile = _tile; - tile.texture_index = LoadTexture(_texture_name, _rcss_path); - if (tile.texture_index < 0) - return false; - - return true; -} - -// Called on a decorator to generate any required per-element data for a newly decorated element. -DecoratorDataHandle DecoratorTiledImage::GenerateElementData(Element* element) -{ - // Calculate the tile's dimensions for this element. - tile.CalculateDimensions(element, *GetTexture(tile.texture_index)); - - Geometry* data = new Geometry(element); - data->SetTexture(GetTexture()); - - // Generate the geometry for the tile. - tile.GenerateGeometry(data->GetVertices(), data->GetIndices(), element, Vector2f(0, 0), element->GetBox().GetSize(Box::PADDING), tile.GetDimensions(element), color_multiplier); - - return reinterpret_cast(data); -} - -// Called to release element data generated by this decorator. -void DecoratorTiledImage::ReleaseElementData(DecoratorDataHandle element_data) -{ - delete reinterpret_cast< Geometry* >(element_data); -} - -// Called to render the decorator on an element. -void DecoratorTiledImage::RenderElement(Element* element, DecoratorDataHandle element_data) -{ - Geometry* data = reinterpret_cast< Geometry* >(element_data); - data->Render(element->GetAbsoluteOffset(Box::PADDING)); -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledImage.h b/libs/libRocket/Source/Core/DecoratorTiledImage.h deleted file mode 100644 index c513d86d936..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledImage.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDIMAGE_H -#define ROCKETCOREDECORATORTILEDIMAGE_H - -#include "DecoratorTiled.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledImage : public DecoratorTiled -{ -public: - DecoratorTiledImage(); - virtual ~DecoratorTiledImage(); - - /// Initialises the tile for the decorator. - /// @param tile[in] The declaration for the tile. - /// @param texture_name[in] The application-specific path to the texture for the tile. - /// @param rcss_path[in] The path to the RCSS file that defined the texture source. - /// @return True if the image loaded (or are pending loading) and are of compatible sizes, false otherwise. - bool Initialise(const Tile& tiles, const String& texture_names, const String& rcss_path); - - /// Called on a decorator to generate any required per-element data for a newly decorated element. - virtual DecoratorDataHandle GenerateElementData(Element* element); - /// Called to release element data generated by this decorator. - virtual void ReleaseElementData(DecoratorDataHandle element_data); - - /// Called to render the decorator on an element. - virtual void RenderElement(Element* element, DecoratorDataHandle element_data); - -private: - Tile tile; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledImageInstancer.cpp b/libs/libRocket/Source/Core/DecoratorTiledImageInstancer.cpp deleted file mode 100644 index 42bac182315..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledImageInstancer.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledImageInstancer.h" -#include "DecoratorTiledImage.h" - -namespace Rocket { -namespace Core { - -DecoratorTiledImageInstancer::DecoratorTiledImageInstancer() -{ - RegisterTileProperty("image", false); - RegisterProperty("color-multiplier", "white").AddParser(COLOR); -} - -DecoratorTiledImageInstancer::~DecoratorTiledImageInstancer() -{ -} - -// Instances a box decorator. -Decorator* DecoratorTiledImageInstancer::InstanceDecorator(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& properties) -{ - ROCKET_UNUSED(name); - - DecoratorTiled::Tile tile; - String texture_name; - String rcss_path; - - GetTileProperties(tile, texture_name, rcss_path, properties, "image"); - - DecoratorTiledImage* decorator = new DecoratorTiledImage(); - - decorator->GetColorMultiplier() = properties.GetProperty("color-multiplier")->value.Get< Colourb >(); - - if (decorator->Initialise(tile, texture_name, rcss_path)) - return decorator; - - decorator->RemoveReference(); - ReleaseDecorator(decorator); - return NULL; -} - -// Releases the given decorator. -void DecoratorTiledImageInstancer::ReleaseDecorator(Decorator* decorator) -{ - delete decorator; -} - -// Releases the instancer. -void DecoratorTiledImageInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledImageInstancer.h b/libs/libRocket/Source/Core/DecoratorTiledImageInstancer.h deleted file mode 100644 index debf6f373b8..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledImageInstancer.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDIMAGEINSTANCER_H -#define ROCKETCOREDECORATORTILEDIMAGEINSTANCER_H - -#include "DecoratorTiledInstancer.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledImageInstancer : public DecoratorTiledInstancer -{ -public: - DecoratorTiledImageInstancer(); - virtual ~DecoratorTiledImageInstancer(); - - /// Instances an image decorator. - virtual Decorator* InstanceDecorator(const String& name, const PropertyDictionary& properties); - /// Releases the given decorator. - virtual void ReleaseDecorator(Decorator* decorator); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledInstancer.cpp b/libs/libRocket/Source/Core/DecoratorTiledInstancer.cpp deleted file mode 100644 index 3aefd10e4d8..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledInstancer.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledInstancer.h" -#include "../../Include/Rocket/Core/PropertyDefinition.h" - -namespace Rocket { -namespace Core { - -DecoratorTiledInstancer::~DecoratorTiledInstancer() -{ -} - -// Adds the property declarations for a tile. -void DecoratorTiledInstancer::RegisterTileProperty(const String& name, bool register_repeat_modes) -{ - RegisterProperty(String (32, "%s-src", name.CString()), "").AddParser("string"); - RegisterProperty(String(32, "%s-s-begin", name.CString()), "0").AddParser("number"); - RegisterProperty(String(32, "%s-s-end", name.CString()), "1").AddParser("number"); - RegisterProperty(String(32, "%s-t-begin", name.CString()), "0").AddParser("number"); - RegisterProperty(String(32, "%s-t-end", name.CString()), "1").AddParser("number"); - RegisterShorthand(String(32, "%s-s", name.CString()), String(64, "%s-s-begin, %s-s-end", name.CString(), name.CString())); - RegisterShorthand(String(32, "%s-t", name.CString()), String(64, "%s-t-begin, %s-t-end", name.CString(), name.CString())); - - if (register_repeat_modes) - { - RegisterProperty(String(32, "%s-repeat", name.CString()), "stretch") - .AddParser("keyword", "stretch, clamp-stretch, clamp-truncate, repeat-stretch, repeat-truncate"); - RegisterShorthand(name, String(256, "%s-src, %s-repeat, %s-s-begin, %s-t-begin, %s-s-end, %s-t-end", name.CString(), name.CString(), name.CString(), name.CString(), name.CString(), name.CString())); - } - else - RegisterShorthand(name, String(256, "%s-src, %s-s-begin, %s-t-begin, %s-s-end, %s-t-end", name.CString(), name.CString(), name.CString(), name.CString(), name.CString())); -} - -// Retrieves all the properties for a tile from the property dictionary. -void DecoratorTiledInstancer::GetTileProperties(DecoratorTiled::Tile& tile, String& texture_name, String& rcss_path, const PropertyDictionary& properties, const String& name) -{ - LoadTexCoord(properties, String(32, "%s-s-begin", name.CString()), tile.texcoords[0].x, tile.texcoords_absolute[0][0]); - LoadTexCoord(properties, String(32, "%s-t-begin", name.CString()), tile.texcoords[0].y, tile.texcoords_absolute[0][1]); - LoadTexCoord(properties, String(32, "%s-s-end", name.CString()), tile.texcoords[1].x, tile.texcoords_absolute[1][0]); - LoadTexCoord(properties, String(32, "%s-t-end", name.CString()), tile.texcoords[1].y, tile.texcoords_absolute[1][1]); - - const Property* repeat_property = properties.GetProperty(String(32, "%s-repeat", name.CString())); - if (repeat_property != NULL) - tile.repeat_mode = (DecoratorTiled::TileRepeatMode) repeat_property->value.Get< int >(); - - const Property* texture_property = properties.GetProperty(String(32, "%s-src", name.CString())); - texture_name = texture_property->Get< String >(); - rcss_path = texture_property->source; -} - -// Loads a single texture coordinate value from the properties. -void DecoratorTiledInstancer::LoadTexCoord(const PropertyDictionary& properties, const String& name, float& tex_coord, bool& tex_coord_absolute) -{ - const Property* property = properties.GetProperty(name); - if (property == NULL) - return; - - tex_coord = property->value.Get< float >(); - if (property->unit == Property::PX) - tex_coord_absolute = true; - else - { - tex_coord_absolute = false; - if (property->unit == Property::PERCENT) - tex_coord *= 0.01f; - } -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledInstancer.h b/libs/libRocket/Source/Core/DecoratorTiledInstancer.h deleted file mode 100644 index 52308dd4fea..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledInstancer.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDINSTANCER_H -#define ROCKETCOREDECORATORTILEDINSTANCER_H - -#include "../../Include/Rocket/Core/DecoratorInstancer.h" -#include "DecoratorTiled.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledInstancer : public DecoratorInstancer -{ -public: - virtual ~DecoratorTiledInstancer(); - -protected: - /// Adds the property declarations for a tile. - /// @param[in] name The name of the tile property. - /// @param[in] register_repeat_modes If true, the tile will have the repeat modes registered. - void RegisterTileProperty(const String& name, bool register_repeat_modes); - /// Retrieves all the properties for a tile from the property dictionary. - /// @param[out] tile The tile structure for storing the tile properties. - /// @param[out] texture_name Holds the name of the texture declared for the tile (if one exists). - /// @param[out] rcss_path The path of the RCSS file that generated the texture path. - /// @param[in] properties The user-defined list of parameters for the decorator. - /// @param[in] name The name of the tile to fetch the properties for. - void GetTileProperties(DecoratorTiled::Tile& tile, String& texture_name, String& rcss_path, const PropertyDictionary& properties, const String& name); - -private: - // Loads a single texture coordinate value from the properties. - void LoadTexCoord(const PropertyDictionary& properties, const String& name, float& tex_coord, bool& tex_coord_absolute); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledVertical.cpp b/libs/libRocket/Source/Core/DecoratorTiledVertical.cpp deleted file mode 100644 index ba5cd09b4e0..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledVertical.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledVertical.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Geometry.h" -#include "../../Include/Rocket/Core/GeometryUtilities.h" -#include "../../Include/Rocket/Core/Texture.h" - -namespace Rocket { -namespace Core { - -struct DecoratorTiledVerticalData -{ - DecoratorTiledVerticalData(Element* host_element) - { - for (int i = 0; i < 3; ++i) - geometry[i] = new Geometry(host_element); - } - - ~DecoratorTiledVerticalData() - { - for (int i = 0; i < 3; ++i) - delete geometry[i]; - } - - Geometry* geometry[3]; -}; - -DecoratorTiledVertical::DecoratorTiledVertical() -{ -} - -DecoratorTiledVertical::~DecoratorTiledVertical() -{ -} - -// Initialises the tiles for the decorator. -bool DecoratorTiledVertical::Initialise(const Tile* _tiles, const String* _texture_names, const String* _rcss_paths) -{ - // Load the textures. - for (int i = 0; i < 3; i++) - { - if (!_texture_names[i].Empty()) - { - tiles[i] = _tiles[i]; - tiles[i].texture_index = LoadTexture(_texture_names[i], _rcss_paths[i]); - if (tiles[i].texture_index < 0) - return false; - } - else - tiles[i].texture_index = -1; - } - - // If only one side of the decorator has been configured, then mirror the texture for the other side. - if (tiles[TOP].texture_index == -1 && tiles[BOTTOM].texture_index > -1) - { - tiles[TOP] = tiles[BOTTOM]; - tiles[TOP].orientation = FLIP_HORIZONTAL; - } - else if (tiles[BOTTOM].texture_index == -1 && tiles[TOP].texture_index > -1) - { - tiles[BOTTOM] = tiles[TOP]; - tiles[BOTTOM].orientation = FLIP_HORIZONTAL; - } - else if (tiles[TOP].texture_index == -1 && tiles[BOTTOM].texture_index == -1) - return false; - - if (tiles[CENTRE].texture_index == -1) - return false; - - return true; -} - -// Called on a decorator to generate any required per-element data for a newly decorated element. -DecoratorDataHandle DecoratorTiledVertical::GenerateElementData(Element* element) -{ - // Initialise the tile for this element. - for (int i = 0; i < 3; i++) - tiles[i].CalculateDimensions(element, *GetTexture(tiles[i].texture_index)); - - DecoratorTiledVerticalData* data = new DecoratorTiledVerticalData(element); - - Vector2f padded_size = element->GetBox().GetSize(Box::PADDING); - - Vector2f top_dimensions = tiles[TOP].GetDimensions(element); - Vector2f bottom_dimensions = tiles[BOTTOM].GetDimensions(element); - Vector2f centre_dimensions = tiles[CENTRE].GetDimensions(element); - - // Scale the tile sizes by the width scale. - ScaleTileDimensions(top_dimensions, padded_size.x, 0); - ScaleTileDimensions(bottom_dimensions, padded_size.x, 0); - ScaleTileDimensions(centre_dimensions, padded_size.x, 0); - - // Shrink the y-sizes on the left and right tiles if necessary. - if (padded_size.y < top_dimensions.y + bottom_dimensions.y) - { - float minimum_height = top_dimensions.y + bottom_dimensions.y; - top_dimensions.y = padded_size.y * (top_dimensions.y / minimum_height); - bottom_dimensions.y = padded_size.y * (bottom_dimensions.y / minimum_height); - } - - // Generate the geometry for the left tile. - tiles[TOP].GenerateGeometry(data->geometry[tiles[TOP].texture_index]->GetVertices(), data->geometry[tiles[TOP].texture_index]->GetIndices(), element, Vector2f(0, 0), top_dimensions, top_dimensions, color_multiplier); - // Generate the geometry for the centre tiles. - tiles[CENTRE].GenerateGeometry(data->geometry[tiles[CENTRE].texture_index]->GetVertices(), data->geometry[tiles[CENTRE].texture_index]->GetIndices(), element, Vector2f(0, top_dimensions.y), Vector2f(centre_dimensions.x, padded_size.y - (top_dimensions.y + bottom_dimensions.y)), centre_dimensions, color_multiplier); - // Generate the geometry for the right tile. - tiles[BOTTOM].GenerateGeometry(data->geometry[tiles[BOTTOM].texture_index]->GetVertices(), data->geometry[tiles[BOTTOM].texture_index]->GetIndices(), element, Vector2f(0, padded_size.y - bottom_dimensions.y), bottom_dimensions, bottom_dimensions, color_multiplier); - - // Set the textures on the geometry. - const Texture* texture = NULL; - int texture_index = 0; - while ((texture = GetTexture(texture_index)) != NULL) - data->geometry[texture_index++]->SetTexture(texture); - - return reinterpret_cast(data); -} - -// Called to release element data generated by this decorator. -void DecoratorTiledVertical::ReleaseElementData(DecoratorDataHandle element_data) -{ - delete reinterpret_cast< DecoratorTiledVerticalData* >(element_data); -} - -// Called to render the decorator on an element. -void DecoratorTiledVertical::RenderElement(Element* element, DecoratorDataHandle element_data) -{ - Vector2f translation = element->GetAbsoluteOffset(Box::PADDING); - DecoratorTiledVerticalData* data = reinterpret_cast< DecoratorTiledVerticalData* >(element_data); - - for (int i = 0; i < 3; i++) - data->geometry[i]->Render(translation); -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledVertical.h b/libs/libRocket/Source/Core/DecoratorTiledVertical.h deleted file mode 100644 index 62c8225bdd4..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledVertical.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDVERTICAL_H -#define ROCKETCOREDECORATORTILEDVERTICAL_H - -#include "DecoratorTiled.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledVertical : public DecoratorTiled -{ -public: - DecoratorTiledVertical(); - virtual ~DecoratorTiledVertical(); - - /// Initialises the tiles for the decorator. - /// @param tiles[in] The declaration for all three tiles. - /// @param texture_names[in] The application-specific path to the texture for the three tiles. - /// @param rcss_paths[in] The paths to the RCSS files that defined the texture sources. - /// @return True if all the images loaded (or are pending loading) and are of compatible sizes, false otherwise. - bool Initialise(const Tile* tiles, const String* texture_names, const String* rcss_paths); - - /// Called on a decorator to generate any required per-element data for a newly decorated element. - virtual DecoratorDataHandle GenerateElementData(Element* element); - /// Called to release element data generated by this decorator. - virtual void ReleaseElementData(DecoratorDataHandle element_data); - - /// Called to render the decorator on an element. - virtual void RenderElement(Element* element, DecoratorDataHandle element_data); - -private: - enum - { - TOP = 0, - BOTTOM = 1, - CENTRE = 2 - }; - - Tile tiles[3]; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/DecoratorTiledVerticalInstancer.cpp b/libs/libRocket/Source/Core/DecoratorTiledVerticalInstancer.cpp deleted file mode 100644 index 01f1c52e2e9..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledVerticalInstancer.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DecoratorTiledVertical.h" -#include "DecoratorTiledVerticalInstancer.h" - -namespace Rocket { -namespace Core { - -DecoratorTiledVerticalInstancer::DecoratorTiledVerticalInstancer() -{ - RegisterTileProperty("top-image", false); - RegisterTileProperty("bottom-image", false); - RegisterTileProperty("center-image", true); - RegisterProperty("color-multiplier", "white").AddParser(COLOR); -} - -DecoratorTiledVerticalInstancer::~DecoratorTiledVerticalInstancer() -{ -} - -// Instances a box decorator. -Decorator* DecoratorTiledVerticalInstancer::InstanceDecorator(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& properties) -{ - ROCKET_UNUSED(name); - - DecoratorTiled::Tile tiles[3]; - String texture_names[3]; - String rcss_paths[3]; - - GetTileProperties(tiles[0], texture_names[0], rcss_paths[0], properties, "top-image"); - GetTileProperties(tiles[1], texture_names[1], rcss_paths[1], properties, "bottom-image"); - GetTileProperties(tiles[2], texture_names[2], rcss_paths[2], properties, "center-image"); - - DecoratorTiledVertical* decorator = new DecoratorTiledVertical(); - - decorator->GetColorMultiplier() = properties.GetProperty("color-multiplier")->value.Get< Colourb >(); - - if (decorator->Initialise(tiles, texture_names, rcss_paths)) - return decorator; - - decorator->RemoveReference(); - ReleaseDecorator(decorator); - return NULL; -} - -// Releases the given decorator. -void DecoratorTiledVerticalInstancer::ReleaseDecorator(Decorator* decorator) -{ - delete decorator; -} - -// Releases the instancer. -void DecoratorTiledVerticalInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/DecoratorTiledVerticalInstancer.h b/libs/libRocket/Source/Core/DecoratorTiledVerticalInstancer.h deleted file mode 100644 index bd154a8711d..00000000000 --- a/libs/libRocket/Source/Core/DecoratorTiledVerticalInstancer.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDECORATORTILEDVERTICALINSTANCER_H -#define ROCKETCOREDECORATORTILEDVERTICALINSTANCER_H - -#include "DecoratorTiledInstancer.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class DecoratorTiledVerticalInstancer : public DecoratorTiledInstancer -{ -public: - DecoratorTiledVerticalInstancer(); - virtual ~DecoratorTiledVerticalInstancer(); - - /// Instances a vertical decorator. - virtual Decorator* InstanceDecorator(const String& name, const PropertyDictionary& properties); - /// Releases the given decorator. - virtual void ReleaseDecorator(Decorator* decorator); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Dictionary.cpp b/libs/libRocket/Source/Core/Dictionary.cpp deleted file mode 100644 index 8038d82187a..00000000000 --- a/libs/libRocket/Source/Core/Dictionary.cpp +++ /dev/null @@ -1,606 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Dictionary.h" - -/* NOTE: This is dictionary implementation is copied from PYTHON - which is well known for its dictionary SPEED. - - It uses an optimised hash table implementation. */ - -/* - There are three kinds of slots in the table: - - 1. Unused. me_key == me_value == NULL - Does not hold an active (key, value) pair now and never did. Unused can - transition to Active upon key insertion. This is the only case in which - me_key is NULL, and is each slot's initial state. - - 2. Active. me_key != NULL and me_key != dummy and me_value != NULL - Holds an active (key, value) pair. Active can transition to Dummy upon - key deletion. This is the only case in which me_value != NULL. - - 3. Dummy. me_key == dummy and me_value == NULL - Previously held an active (key, value) pair, but that was deleted and an - active pair has not yet overwritten the slot. Dummy can transition to - Active upon key insertion. Dummy slots cannot be made Unused again - (cannot have me_key set to NULL), else the probe sequence in case of - collision would have no way to know they were once active. - - Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to - hold a search finger. The me_hash field of Unused or Dummy slots has no - meaning otherwise. - - - To ensure the lookup algorithm terminates, there must be at least one Unused - slot (NULL key) in the table. - The value ma_fill is the number of non-NULL keys (sum of Active and Dummy); - ma_used is the number of non-NULL, non-dummy keys (== the number of non-NULL - values == the number of Active items). - To avoid slowing down lookups on a near-full table, we resize the table when - it's two-thirds full. -*/ - -namespace Rocket { -namespace Core { - - -/* See large comment block below. This must be >= 1. */ -#define PERTURB_SHIFT 5 - -/* switch these defines if you want dumps all dictionary access */ -#define DICTIONARY_DEBUG_CODE(x) -//#define DICTIONARY_DEBUG_CODE(x) x - -/* - Major subtleties ahead: Most hash schemes depend on having a "good" hash - function, in the sense of simulating randomness. Python doesn't: its most - important hash functions (for strings and ints) are very regular in common - cases: - - >>> map(hash, (0, 1, 2, 3)) - [0, 1, 2, 3] - >>> map(hash, ("namea", "nameb", "namec", "named")) - [-1658398457, -1658398460, -1658398459, -1658398462] - >>> - - This isn't necessarily bad! To the contrary, in a table of size 2**i, taking - the low-order i bits as the initial table index is extremely fast, and there - are no collisions at all for dicts indexed by a contiguous range of ints. - The same is approximately true when keys are "consecutive" strings. So this - gives better-than-random behavior in common cases, and that's very desirable. - - OTOH, when collisions occur, the tendency to fill contiguous slices of the - hash table makes a good collision resolution strategy crucial. Taking only - the last i bits of the hash code is also vulnerable: for example, consider - [i << 16 for i in range(20000)] as a set of keys. Since ints are their own - hash codes, and this fits in a dict of size 2**15, the last 15 bits of every - hash code are all 0: they *all* map to the same table index. - - But catering to unusual cases should not slow the usual ones, so we just take - the last i bits anyway. It's up to collision resolution to do the rest. If - we *usually* find the key we're looking for on the first try (and, it turns - out, we usually do -- the table load factor is kept under 2/3, so the odds - are solidly in our favor), then it makes best sense to keep the initial index - computation dirt cheap. - - The first half of collision resolution is to visit table indices via this - recurrence: - - j = ((5*j) + 1) mod 2**i - - For any initial j in range(2**i), repeating that 2**i times generates each - int in range(2**i) exactly once (see any text on random-number generation for - proof). By itself, this doesn't help much: like linear probing (setting - j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed - order. This would be bad, except that's not the only thing we do, and it's - actually *good* in the common cases where hash keys are consecutive. In an - example that's really too small to make this entirely clear, for a table of - size 2**3 the order of indices is: - - 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating] - - If two things come in at index 5, the first place we look after is index 2, - not 6, so if another comes in at index 6 the collision at 5 didn't hurt it. - Linear probing is deadly in this case because there the fixed probe order - is the *same* as the order consecutive keys are likely to arrive. But it's - extremely unlikely hash codes will follow a 5*j+1 recurrence by accident, - and certain that consecutive hash codes do not. - - The other half of the strategy is to get the other bits of the hash code - into play. This is done by initializing a (unsigned) vrbl "perturb" to the - full hash code, and changing the recurrence to: - - j = (5*j) + 1 + perturb; - perturb >>= PERTURB_SHIFT; - use j % 2**i as the next table index; - - Now the probe sequence depends (eventually) on every bit in the hash code, - and the pseudo-scrambling property of recurring on 5*j+1 is more valuable, - because it quickly magnifies small differences in the bits that didn't affect - the initial index. Note that because perturb is unsigned, if the recurrence - is executed often enough perturb eventually becomes and remains 0. At that - point (very rarely reached) the recurrence is on (just) 5*j+1 again, and - that's certain to find an empty slot eventually (since it generates every int - in range(2**i), and we make sure there's always at least one empty slot). - - Selecting a good value for PERTURB_SHIFT is a balancing act. You want it - small so that the high bits of the hash code continue to affect the probe - sequence across iterations; but you want it large so that in really bad cases - the high-order hash bits have an effect on early iterations. 5 was "the - best" in minimizing total collisions across experiments Tim Peters ran (on - both normal and pathological cases), but 4 and 6 weren't significantly worse. - - Historical: Reimer Behrends contributed the idea of using a polynomial-based - approach, using repeated multiplication by x in GF(2**n) where an irreducible - polynomial for each table size was chosen such that x was a primitive root. - Christian Tismer later extended that to use division by x instead, as an - efficient way to get the high bits of the hash code into play. This scheme - also gave excellent collision statistics, but was more expensive: two - if-tests were required inside the loop; computing "the next" index took about - the same number of operations but without as much potential parallelism - (e.g., computing 5*j can go on at the same time as computing 1+perturb in the - above, and then shifting perturb can be done while the table index is being - masked); and the dictobject struct required a member to hold the table's - polynomial. In Tim's experiments the current scheme ran faster, produced - equally good collision statistics, needed less code & used less memory. - */ - -static String dummy_key = String(128, "###DUMMYROCKETDICTKEY%d###", &dummy_key); - -Dictionary::Dictionary() -{ - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS,"Dictionary::New Dict"); ) - ResetToMinimumSize(); -} - -Dictionary::Dictionary(const Dictionary &dict) -{ - ResetToMinimumSize(); - Copy(dict); -} - -Dictionary::~Dictionary() -{ - Clear(); -} - -/* - The basic lookup function used by all operations. - This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4. - Open addressing is preferred over chaining since the link overhead for - chaining would be substantial (100% with typical malloc overhead). - - The initial probe index is computed as hash mod the table size. Subsequent - probe indices are computed as explained earlier. - - All arithmetic on hash should ignore overflow. - - (The details in this version are due to Tim Peters, building on many past - contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and - Christian Tismer). - - This function must never return NULL; failures are indicated by returning - a dictentry* for which the me_value field is NULL. Exceptions are never - reported by this function, and outstanding exceptions are maintained. - */ - -/* - * Hacked up version of lookdict which can assume keys are always strings; - * this assumption allows testing for errors during PyObject_Compare() to - * be dropped; string-string comparisons never raise exceptions. This also - * means we don't need to go through PyObject_Compare(); we can always use - * _PyString_Eq directly. - * - * This is valuable because the general-case error handling in lookdict() is - * expensive, and dicts with pure-string keys are very common. - */ -Dictionary::DictionaryEntry* Dictionary::Retrieve(const String& key, Hash hash) const -{ - register Hash i = 0; - register unsigned int perturb; - register DictionaryEntry *freeslot; - register unsigned int mask = this->mask; - DictionaryEntry *ep0 = table; - register DictionaryEntry *ep; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Retreive %s", key); ) - /* Make sure this function doesn't have to handle non-string keys, - including subclasses of str; e.g., one reason to subclass - strings is to override __eq__, and for speed we don't cater to - that here. */ - - i = hash & mask; - ep = &ep0[i]; - if (ep->key.Empty() || ep->key == key) - return ep; - if (ep->key == dummy_key) - freeslot = ep; - else { - if (ep->hash == hash && ep->key == key) { - return ep; - } - freeslot = NULL; - } - - /* In the loop, me_key == dummy_key is by far (factor of 100s) the - least likely outcome, so test for that last. */ - for (perturb = hash; ; perturb >>= PERTURB_SHIFT) { - i = (i << 2) + i + perturb + 1; - ep = &ep0[i & mask]; - if (ep->key.Empty()) - return freeslot == NULL ? ep : freeslot; - /*if (ep->me_key == key - || (ep->me_hash == hash - && ep->me_key != dummy_key - && _PyString_Eq(ep->me_key, key)))*/ - if (ep->key == key) - return ep; - if (ep->key == dummy_key && freeslot == NULL) - freeslot = ep; - } -} - -/* - Internal routine to insert a new item into the table. - Used both by the internal resize routine and by the public insert routine. - */ -void Dictionary::Insert(const String& key, Hash hash, const Variant& value) -{ - register DictionaryEntry *ep; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Insert %s", key); ); - ep = Retrieve(key, hash); - if (ep->value.GetType() !=Variant::NONE) - { - ep->value = value; - } - else - { - if (ep->key.Empty()) - { - num_full++; - } - else if ( ep->key != dummy_key ) - { - //delete ep->key; - } - - ep->key = key; - ep->hash = hash; - ep->value = value; - num_used++; - } -} - -/* - Restructure the table by allocating a new table and reinserting all - items again. When entries have been deleted, the new table may - actually be smaller than the old one. - */ -bool Dictionary::Reserve(int minused) -{ - int newsize; - DictionaryEntry *oldtable, *newtable, *ep; - int i = 0; - bool is_oldtable_malloced; - DictionaryEntry small_copy[DICTIONARY_MINSIZE]; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Reserve %d", minused); ) - ROCKET_ASSERT(minused >= 0); - - /* Find the smallest table size > minused. */ - newsize = DICTIONARY_MINSIZE; - while(newsize <= minused) { - newsize <<= 1; // double the table size and test again - if(newsize <= 0) { - ROCKET_ASSERT(newsize > 0); - return false; // newsize has overflowed the max size for this platform, abort - } - } - - // If its the same size, ignore the request - if ((unsigned)newsize == mask + 1) - return true; - - /* Get space for a new table. */ - oldtable = table; - ROCKET_ASSERT(oldtable != NULL); - is_oldtable_malloced = oldtable != small_table; - - if (newsize == DICTIONARY_MINSIZE) { - /* A large table is shrinking, or we can't get any smaller. */ - newtable = small_table; - if (newtable == oldtable) { - if (num_full == num_used) { - /* No dummies, so no point doing anything. */ - return true; - } - /* We're not going to resize it, but rebuild the - table anyway to purge old dummy_key entries. - Subtle: This is *necessary* if fill==size, - as lookdict needs at least one virgin slot to - terminate failing searches. If fill < size, it's - merely desirable, as dummies slow searches. */ - ROCKET_ASSERT(num_full > num_used); - memcpy(small_copy, oldtable, sizeof(small_copy)); - oldtable = small_copy; - } - } else { - newtable = new DictionaryEntry[newsize]; - - ROCKET_ASSERT(newtable); - - if (newtable == NULL) { - return false; - } - } - - /* Make the dict empty, using the new table. */ - ROCKET_ASSERT(newtable != oldtable); - table = newtable; - mask = newsize - 1; - //memset(newtable, 0, sizeof(DictionaryEntry) * newsize); - num_used = 0; - i = num_full; - num_full = 0; - - /* Copy the data over; this is refcount-neutral for active entries; - dummy_key entries aren't copied over, of course */ - for (ep = oldtable; i > 0; ep++) { - if (ep->value.GetType() != Variant::NONE) { /* active entry */ - --i; - Insert(ep->key, ep->hash, ep->value); - - //delete[] ep->key; - } - else if (!ep->key.Empty()) { /* dummy_key entry */ - --i; - ROCKET_ASSERT(ep->key == dummy_key); - } -/* else key == value == NULL: nothing to do */ - } - - if (is_oldtable_malloced) - delete[] oldtable; - return true; -} - -Variant* Dictionary::Get(const String& key) const -{ - Hash hash; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Get %s", key); ); - hash = StringUtilities::FNVHash( key.CString() ); - - DictionaryEntry* result = Retrieve(key, hash); - if (!result || result->key.Empty() || result->key == dummy_key) - { - return NULL; - } - - return &result->value; -} - -Variant* Dictionary::operator[](const String& key) const -{ - return Get(key); -} - -/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the -* dictionary if it is merely replacing the value for an existing key. -* This is means that it's safe to loop over a dictionary with -* PyDict_Next() and occasionally replace a value -- but you can't -* insert new keys or remove them. -*/ -void Dictionary::Set(const String& key, const Variant &value) -{ - if (key.Empty()) - { - Log::Message(Log::LT_WARNING, "Unable to set value on dictionary, empty key specified."); - return; - } - - register Hash hash; - register unsigned int n_used; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Set %s", key); ); - hash = StringUtilities::FNVHash( key.CString() ); - - ROCKET_ASSERT(num_full <= mask); /* at least one empty slot */ - n_used = num_used; - - Insert( key, hash, value ); - - /* If we added a key, we can safely resize. Otherwise skip this! - * If fill >= 2/3 size, adjust size. Normally, this doubles the - * size, but it's also possible for the dict to shrink (if ma_fill is - * much larger than ma_used, meaning a lot of dict keys have been - * deleted). - */ - if ((num_used > n_used) && (num_full * 3) >= (mask + 1) * 2) - { - if (!Reserve(num_used * 2)) - { - Log::Message(Log::LT_ALWAYS, "Dictionary::Error resizing dictionary after insert"); - } - } -} - -bool Dictionary::Remove(const String& key) -{ - register Hash hash; - register DictionaryEntry *ep; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Remove %s", key) ); - hash = StringUtilities::FNVHash( key.CString() ); - - ep = Retrieve(key, hash); - - if (ep->value.GetType() == Variant::NONE) - { - return false; - } - - ep->key = dummy_key; - ep->value.Clear(); - num_used--; - - return true; -} - -void Dictionary::Clear() -{ - DictionaryEntry *ep; - bool table_is_malloced; - int n_full; - int i, n; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Clear") ); - n = mask + 1; - i = 0; - - table_is_malloced = table != small_table; - n_full = num_full; - - // Clear things up - for (ep = table; n_full > 0; ++ep) { - - ROCKET_ASSERT(i < n); - ++i; - - if (!ep->key.Empty()) { - --n_full; - ep->key.Clear(); - ep->value.Clear(); - } else { - ROCKET_ASSERT(ep->value.GetType() == Variant::NONE); - } - } - - if (table_is_malloced) - delete [] table; - - ResetToMinimumSize(); -} - -bool Dictionary::IsEmpty() const -{ - return num_used == 0; -} - -int Dictionary::Size() const -{ - return num_used; -} - -// Merges another dictionary into this one. Any existing values stored against similar keys will be updated. -void Dictionary::Merge(const Dictionary& dict) -{ - int index = 0; - String key; - Variant* value; - - while (dict.Iterate(index, key, value)) - { - Set(key, *value); - } -} - - -/* CAUTION: In general, it isn't safe to use PyDict_Next in a loop that -* mutates the dict. One exception: it is safe if the loop merely changes -* the values associated with the keys (but doesn't insert new keys or - * delete keys), via PyDict_SetItem(). -*/ -bool Dictionary::Iterate(int &pos, String& key, Variant* &value) const -{ - register unsigned int i; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Next %d", pos); ) - i = pos; - while (i <= mask && table[i].value.GetType() == Variant::NONE) - i++; - pos = i+1; - if (i > mask) - return false; - - key = table[i].key; - - value = &table[i].value; - - return true; -} - -void Dictionary::operator=(const Dictionary &dict) { - Copy(dict); -} - -void Dictionary::Copy(const Dictionary &dict) { - register unsigned int i; - - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Copy Dict (Size: %d)", dict.num_used); ) - - // Clear our current state - Clear(); - - // Resize our table - Reserve(dict.mask); - - // Copy elements across - for ( i = 0; i < dict.mask + 1; i++ ) - { - table[i].hash = dict.table[i].hash; - table[i].key = dict.table[i].key; - table[i].value = dict.table[i].value; - } - - // Set properties - num_used = dict.num_used; - num_full = dict.num_full; - mask = dict.mask; -} - -void Dictionary::ResetToMinimumSize() -{ - DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::ResetToMinimumSize"); ) - // Reset to small table - for ( size_t i = 0; i < DICTIONARY_MINSIZE; i++ ) - { - small_table[i].hash = 0; - small_table[i].key.Clear(); - small_table[i].value.Clear(); - } - num_used = 0; - num_full = 0; - table = small_table; - mask = DICTIONARY_MINSIZE - 1; -} - -} -} diff --git a/libs/libRocket/Source/Core/DocumentHeader.cpp b/libs/libRocket/Source/Core/DocumentHeader.cpp deleted file mode 100644 index 6d530ef942a..00000000000 --- a/libs/libRocket/Source/Core/DocumentHeader.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "DocumentHeader.h" -#include "XMLParseTools.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -void DocumentHeader::MergeHeader(const DocumentHeader& header) -{ - // Copy the title across if ours is empty - if (title.Empty()) - title = header.title; - // Copy the url across if ours is empty - if (source.Empty()) - source = header.source; - - // Combine internal data - rcss_inline.insert(rcss_inline.end(), header.rcss_inline.begin(), header.rcss_inline.end()); - scripts_inline.insert(scripts_inline.end(), header.scripts_inline.begin(), header.scripts_inline.end()); - - // Combine external data, keeping relative paths - MergePaths(template_resources, header.template_resources, header.source); - MergePaths(rcss_external, header.rcss_external, header.source); - MergePaths(scripts_external, header.scripts_external, header.source); -} - -void DocumentHeader::MergePaths(StringList& target, const StringList& source, const String& source_path) -{ - for (size_t i = 0; i < source.size(); i++) - { - String joined_path; - Rocket::Core::GetSystemInterface()->JoinPath(joined_path, source_path.Replace("|", ":"), source[i].Replace("|", ":")); - - target.push_back(joined_path.Replace(":", "|")); - } -} - -} -} diff --git a/libs/libRocket/Source/Core/DocumentHeader.h b/libs/libRocket/Source/Core/DocumentHeader.h deleted file mode 100644 index 295a51b1629..00000000000 --- a/libs/libRocket/Source/Core/DocumentHeader.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREDOCUMENTHEADER_H -#define ROCKETCOREDOCUMENTHEADER_H - -#include "../../Include/Rocket/Core/String.h" - -namespace Rocket { -namespace Core { - -/** - The document header struct contains the - header details gathered from an XML document parse. - - @author Lloyd Weehuizen - */ - -class DocumentHeader -{ -public: - /// Path and filename this document was loaded from - String source; - /// The title of the document - String title; - /// A list of template resources that can used while parsing the document - StringList template_resources; - - /// Inline RCSS definitions - StringList rcss_inline; - /// External RCSS definitions that should be loaded - StringList rcss_external; - - /// Inline script source - StringList scripts_inline; - /// External scripts that should be loaded - StringList scripts_external; - - /// Merges the specified header with this one - /// @param header Header to merge - void MergeHeader(const DocumentHeader& header); - - /// Merges paths from one string list to another, preserving the base_path - void MergePaths(StringList& target, const StringList& source, const String& base_path); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Element.cpp b/libs/libRocket/Source/Core/Element.cpp deleted file mode 100644 index 6c92ccd33bb..00000000000 --- a/libs/libRocket/Source/Core/Element.cpp +++ /dev/null @@ -1,1974 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Dictionary.h" -#include -#include "ElementBackground.h" -#include "ElementBorder.h" -#include "ElementDefinition.h" -#include "ElementStyle.h" -#include "EventDispatcher.h" -#include "ElementDecoration.h" -#include -#include "LayoutEngine.h" -#include "PluginRegistry.h" -#include "StyleSheetParser.h" -#include "XMLParseTools.h" -#include "../../Include/Rocket/Core/Core.h" - -namespace Rocket { -namespace Core { - -/** - STL function object for sorting elements by z-type (ie, float-types before general types, etc). - @author Peter Curry - */ -class ElementSortZOrder -{ -public: - bool operator()(const std::pair< Element*, float >& lhs, const std::pair< Element*, float >& rhs) - { - return lhs.second < rhs.second; - } -}; - -/** - STL function object for sorting elements by z-index property. - @author Peter Curry - */ -class ElementSortZIndex -{ -public: - bool operator()(const Element* lhs, const Element* rhs) - { - // Check the z-index. - return lhs->GetZIndex() < rhs->GetZIndex(); - } -}; - -/// Constructs a new libRocket element. -Element::Element(const String& _tag) : relative_offset_base(0, 0), relative_offset_position(0, 0), absolute_offset(0, 0), scroll_offset(0, 0), boxes(1), content_offset(0, 0), content_box(0, 0) -{ - tag = _tag.ToLower(); - parent = NULL; - focus = NULL; - instancer = NULL; - owner_document = NULL; - - offset_fixed = false; - offset_parent = NULL; - offset_dirty = true; - - client_area = Box::PADDING; - - num_non_dom_children = 0; - - visible = true; - - z_index = 0; - - local_stacking_context = false; - local_stacking_context_forced = false; - stacking_context_dirty = false; - - font_face_handle = NULL; - - clipping_ignore_depth = 0; - clipping_enabled = false; - clipping_state_dirty = true; - - event_dispatcher = new EventDispatcher(this); - style = new ElementStyle(this); - background = new ElementBackground(this); - border = new ElementBorder(this); - decoration = new ElementDecoration(this); - scroll = new ElementScroll(this); -} - -Element::~Element() -{ - ROCKET_ASSERT(parent == NULL); - - PluginRegistry::NotifyElementDestroy(this); - - // Delete the scroll funtionality before we delete the children! - delete scroll; - - while (!children.empty()) - { - // A simplified version of RemoveChild() for destruction. - Element* child = children.front(); - child->OnChildRemove(child); - - if (num_non_dom_children > 0) - num_non_dom_children--; - - deleted_children.push_back(child); - children.erase(children.begin()); - } - - // Release all deleted children. - ReleaseElements(deleted_children); - - delete decoration; - delete border; - delete background; - delete style; - delete event_dispatcher; - - if (font_face_handle != NULL) - font_face_handle->RemoveReference(); - - if (instancer) - instancer->RemoveReference(); -} - -void Element::Update() -{ - ReleaseElements(deleted_children); - active_children = children; - for (size_t i = 0; i < active_children.size(); i++) - active_children[i]->Update(); - - // Force a definition reload, if necessary. - style->GetDefinition(); - - scroll->Update(); - OnUpdate(); -} - -void Element::Render() -{ - // Rebuild our stacking context if necessary. - if (stacking_context_dirty) - BuildLocalStackingContext(); - - // Render all elements in our local stacking context that have a z-index beneath our local index of 0. - size_t i = 0; - for (; i < stacking_context.size() && stacking_context[i]->z_index < 0; ++i) - stacking_context[i]->Render(); - - // Set up the clipping region for this element. - if (ElementUtilities::SetClippingRegion(this)) - { - background->RenderBackground(); - border->RenderBorder(); - decoration->RenderDecorators(); - - OnRender(); - } - - // Render the rest of the elements in the stacking context. - for (; i < stacking_context.size(); ++i) - stacking_context[i]->Render(); -} - -// Clones this element, returning a new, unparented element. -Element* Element::Clone() const -{ - Element* clone = NULL; - - if (instancer != NULL) - { - clone = instancer->InstanceElement(NULL, GetTagName(), attributes); - if (clone != NULL) - clone->SetInstancer(instancer); - } - else - clone = Factory::InstanceElement(NULL, GetTagName(), GetTagName(), attributes); - - if (clone != NULL) - { - String inner_rml; - GetInnerRML(inner_rml); - - clone->SetInnerRML(inner_rml); - } - - return clone; -} - -// Sets or removes a class on the element. -void Element::SetClass(const String& class_name, bool activate) -{ - style->SetClass(class_name, activate); -} - -// Checks if a class is set on the element. -bool Element::IsClassSet(const String& class_name) const -{ - return style->IsClassSet(class_name); -} - -// Specifies the entire list of classes for this element. This will replace any others specified. -void Element::SetClassNames(const String& class_names) -{ - SetAttribute("class", class_names); -} - -/// Return the active class list -String Element::GetClassNames() const -{ - return style->GetClassNames(); -} - -// Returns the active style sheet for this element. This may be NULL. -StyleSheet* Element::GetStyleSheet() const -{ - return style->GetStyleSheet(); -} - -// Returns the element's definition, updating if necessary. -const ElementDefinition* Element::GetDefinition() -{ - return style->GetDefinition(); -} - -// Fills an String with the full address of this element. -String Element::GetAddress(bool include_pseudo_classes) const -{ - // Add the tag name onto the address. - String address(tag); - - // Add the ID if we have one. - if (!id.Empty()) - { - address += "#"; - address += id; - } - - String classes = style->GetClassNames(); - if (!classes.Empty()) - { - classes = classes.Replace(".", " "); - address += "."; - address += classes; - } - - if (include_pseudo_classes) - { - const PseudoClassList& pseudo_classes = style->GetActivePseudoClasses(); - for (PseudoClassList::const_iterator i = pseudo_classes.begin(); i != pseudo_classes.end(); ++i) - { - address += ":"; - address += (*i); - } - } - - if (parent) - { - address.Append(" < "); - return address + parent->GetAddress(true); - } - else - return address; -} - -// Sets the position of this element, as a two-dimensional offset from another element. -void Element::SetOffset(const Vector2f& offset, Element* _offset_parent, bool _offset_fixed) -{ - _offset_fixed |= GetPosition() == POSITION_FIXED; - - // If our offset has definitely changed, or any of our parenting has, then these are set and - // updated based on our left / right / top / bottom properties. - if (relative_offset_base != offset || - offset_parent != _offset_parent || - offset_fixed != _offset_fixed) - { - relative_offset_base = offset; - offset_fixed = _offset_fixed; - offset_parent = _offset_parent; - UpdateOffset(); - DirtyOffset(); - } - - // Otherwise, our offset is updated in case left / right / top / bottom will have an impact on - // our final position, and our children are dirtied if they do. - else - { - Vector2f& old_base = relative_offset_base; - Vector2f& old_position = relative_offset_position; - - UpdateOffset(); - - if (old_base != relative_offset_base || - old_position != relative_offset_position) - DirtyOffset(); - } -} - -// Returns the position of the top-left corner of one of the areas of this element's primary box. -Vector2f Element::GetRelativeOffset(Box::Area area) -{ - UpdateLayout(); - return relative_offset_base + relative_offset_position + GetBox().GetPosition(area); -} - -// Returns the position of the top-left corner of one of the areas of this element's primary box. -Vector2f Element::GetAbsoluteOffset(Box::Area area) -{ - UpdateLayout(); - if (offset_dirty) - { - offset_dirty = false; - - if (offset_parent != NULL) - absolute_offset = offset_parent->GetAbsoluteOffset(Box::BORDER) + relative_offset_base + relative_offset_position; - else - absolute_offset = relative_offset_base + relative_offset_position; - - // Add any parent scrolling onto our position as well. Could cache this if required. - if (!offset_fixed) - { - Element* scroll_parent = parent; - while (scroll_parent != NULL) - { - absolute_offset -= (scroll_parent->scroll_offset + scroll_parent->content_offset); - if (scroll_parent == offset_parent) - break; - else - scroll_parent = scroll_parent->parent; - } - } - } - - return absolute_offset + GetBox().GetPosition(area); -} - -// Sets an alternate area to use as the client area. -void Element::SetClientArea(Box::Area _client_area) -{ - client_area = _client_area; -} - -// Returns the area the element uses as its client area. -Box::Area Element::GetClientArea() const -{ - return client_area; -} - -// Sets the dimensions of the element's internal content. -void Element::SetContentBox(const Vector2f& _content_offset, const Vector2f& _content_box) -{ - if (content_offset != _content_offset || - content_box != _content_box) - { - // Seems to be jittering a wee bit; might need to be looked at. - scroll_offset.x += (content_offset.x - _content_offset.x); - scroll_offset.y += (content_offset.y - _content_offset.y); - - content_offset = _content_offset; - content_box = _content_box; - - scroll_offset.x = Math::Min(scroll_offset.x, GetScrollWidth() - GetClientWidth()); - scroll_offset.y = Math::Min(scroll_offset.y, GetScrollHeight() - GetClientHeight()); - DirtyOffset(); - } -} - -// Sets the box describing the size of the element. -void Element::SetBox(const Box& box) -{ - if (box != boxes[0] || - boxes.size() > 1) - { - boxes[0] = box; - boxes.resize(1); - - background->DirtyBackground(); - border->DirtyBorder(); - decoration->ReloadDecorators(); - - DispatchEvent(RESIZE, Dictionary()); - } -} - -// Adds a box to the end of the list describing this element's geometry. -void Element::AddBox(const Box& box) -{ - boxes.push_back(box); - DispatchEvent(RESIZE, Dictionary()); - - background->DirtyBackground(); - border->DirtyBorder(); - decoration->ReloadDecorators(); -} - -// Returns one of the boxes describing the size of the element. -const Box& Element::GetBox(int index) -{ - UpdateLayout(); - - if (index < 0) - return boxes[0]; - else if (index >= GetNumBoxes()) - return boxes.back(); - - return boxes[index]; -} - -// Returns the number of boxes making up this element's geometry. -int Element::GetNumBoxes() -{ - UpdateLayout(); - return (int) boxes.size(); -} - -// Returns the baseline of the element, in pixels offset from the bottom of the element's content area. -float Element::GetBaseline() const -{ - return 0; -} - -// Gets the intrinsic dimensions of this element, if it is of a type that has an inherent size. -bool Element::GetIntrinsicDimensions(Vector2f& ROCKET_UNUSED_PARAMETER(dimensions)) -{ - ROCKET_UNUSED(dimensions); - - return false; -} - -// Checks if a given point in screen coordinates lies within the bordered area of this element. -bool Element::IsPointWithinElement(const Vector2f& point) -{ - Vector2f position = GetAbsoluteOffset(Box::BORDER); - - for (int i = 0; i < GetNumBoxes(); ++i) - { - const Box& box = GetBox(i); - - Vector2f box_position = position + box.GetOffset(); - Vector2f box_dimensions = box.GetSize(Box::BORDER); - if (point.x >= box_position.x && - point.x <= (box_position.x + box_dimensions.x) && - point.y >= box_position.y && - point.y <= (box_position.y + box_dimensions.y)) - { - return true; - } - } - - return false; -} - -// Returns the visibility of the element. -bool Element::IsVisible() const -{ - return visible; -} - -// Returns the z-index of the element. -float Element::GetZIndex() const -{ - return z_index; -} - -// Returns the element's font face handle. -FontFaceHandle* Element::GetFontFaceHandle() const -{ - return font_face_handle; -} - -// Sets a local property override on the element. -bool Element::SetProperty(const String& name, const String& value) -{ - return style->SetProperty(name, value); -} - -// Removes a local property override on the element. -void Element::RemoveProperty(const String& name) -{ - style->RemoveProperty(name); -} - -// Sets a local property override on the element to a pre-parsed value. -bool Element::SetProperty(const String& name, const Property& property) -{ - return style->SetProperty(name, property); -} - -// Returns one of this element's properties. -const Property* Element::GetProperty(const String& name) -{ - return style->GetProperty(name); -} - -// Returns one of this element's properties. -const Property* Element::GetLocalProperty(const String& name) -{ - return style->GetLocalProperty(name); -} - -// Resolves one of this element's style. -float Element::ResolveProperty(const String& name, float base_value) -{ - return style->ResolveProperty(name, base_value); -} - -// Resolves one of this element's style. -float Element::ResolveProperty(const Property *property, float base_value) -{ - return style->ResolveProperty(property, base_value); -} - -void Element::GetBorderWidthProperties(const Property **border_top, const Property **border_bottom, const Property **border_left, const Property **bottom_right) -{ - style->GetBorderWidthProperties(border_top, border_bottom, border_left, bottom_right); -} - -void Element::GetMarginProperties(const Property **margin_top, const Property **margin_bottom, const Property **margin_left, const Property **margin_right) -{ - style->GetMarginProperties(margin_top, margin_bottom, margin_left, margin_right); -} - -void Element::GetPaddingProperties(const Property **padding_top, const Property **padding_bottom, const Property **padding_left, const Property **padding_right) -{ - style->GetPaddingProperties(padding_top, padding_bottom, padding_left, padding_right); -} - -void Element::GetDimensionProperties(const Property **width, const Property **height) -{ - style->GetDimensionProperties(width, height); -} - -void Element::GetLocalDimensionProperties(const Property **width, const Property **height) -{ - style->GetLocalDimensionProperties(width, height); -} - -void Element::GetOverflow(int *overflow_x, int *overflow_y) -{ - style->GetOverflow(overflow_x, overflow_y); -} - -int Element::GetPosition() -{ - return style->GetPosition(); -} - -int Element::GetFloat() -{ - return style->GetFloat(); -} - -int Element::GetDisplay() -{ - return style->GetDisplay(); -} - -int Element::GetWhitespace() -{ - return style->GetWhitespace(); -} - -const Property *Element::GetLineHeightProperty() -{ - return style->GetLineHeightProperty(); -} - -int Element::GetTextAlign() -{ - return style->GetTextAlign(); -} - -int Element::GetTextTransform() -{ - return style->GetTextTransform(); -} - -const Property *Element::GetVerticalAlignProperty() -{ - return style->GetVerticalAlignProperty(); -} - -// Iterates over the properties defined on this element. -bool Element::IterateProperties(int& index, PseudoClassList& pseudo_classes, String& name, const Property*& property) const -{ - return style->IterateProperties(index, pseudo_classes, name, property); -} - -// Sets or removes a pseudo-class on the element. -void Element::SetPseudoClass(const String& pseudo_class, bool activate) -{ - style->SetPseudoClass(pseudo_class, activate); -} - -// Checks if a specific pseudo-class has been set on the element. -bool Element::IsPseudoClassSet(const String& pseudo_class) const -{ - return style->IsPseudoClassSet(pseudo_class); -} - -// Checks if a complete set of pseudo-classes are set on the element. -bool Element::ArePseudoClassesSet(const PseudoClassList& pseudo_classes) const -{ - for (PseudoClassList::const_iterator i = pseudo_classes.begin(); i != pseudo_classes.end(); ++i) - { - if (!IsPseudoClassSet(*i)) - return false; - } - - return true; -} - -// Gets a list of the current active pseudo classes -const PseudoClassList& Element::GetActivePseudoClasses() const -{ - return style->GetActivePseudoClasses(); -} - -/// Get the named attribute -Variant* Element::GetAttribute(const String& name) const -{ - return attributes.Get(name); -} - -// Checks if the element has a certain attribute. -bool Element::HasAttribute(const String& name) -{ - return attributes.Get(name) != NULL; -} - -// Removes an attribute from the element -void Element::RemoveAttribute(const String& name) -{ - if (attributes.Remove(name)) - { - AttributeNameList changed_attributes; - changed_attributes.insert(name); - - OnAttributeChange(changed_attributes); - } -} - -// Gets the outer most focus element down the tree from this node -Element* Element::GetFocusLeafNode() -{ - // If there isn't a focus, then we are the leaf. - if (!focus) - { - return this; - } - - // Recurse down the tree until we found the leaf focus element - Element* focus_element = focus; - while (focus_element->focus) - focus_element = focus_element->focus; - - return focus_element; -} - -// Returns the element's context. -Context* Element::GetContext() -{ - ElementDocument* document = GetOwnerDocument(); - if (document != NULL) - return document->GetContext(); - - return NULL; -} - -// Set a group of attributes -void Element::SetAttributes(const ElementAttributes* _attributes) -{ - int index = 0; - String key; - Variant* value; - - AttributeNameList changed_attributes; - - while (_attributes->Iterate(index, key, value)) - { - changed_attributes.insert(key); - attributes.Set(key, *value); - } - - OnAttributeChange(changed_attributes); -} - -// Returns the number of attributes on the element. -int Element::GetNumAttributes() const -{ - return attributes.Size(); -} - -// Iterates over all decorators attached to the element. -bool Element::IterateDecorators(int& index, PseudoClassList& pseudo_classes, String& name, Decorator*& decorator, DecoratorDataHandle& decorator_data) -{ - return decoration->IterateDecorators(index, pseudo_classes, name, decorator, decorator_data); -} - -// Gets the name of the element. -const String& Element::GetTagName() const -{ - return tag; -} - -// Gets the ID of the element. -const String& Element::GetId() const -{ - return id; -} - -// Sets the ID of the element. -void Element::SetId(const String& _id) -{ - SetAttribute("id", _id); -} - -// Gets the horizontal offset from the context's left edge to element's left border edge. -float Element::GetAbsoluteLeft() -{ - return GetAbsoluteOffset(Box::BORDER).x; -} - -// Gets the vertical offset from the context's top edge to element's top border edge. -float Element::GetAbsoluteTop() -{ - return GetAbsoluteOffset(Box::BORDER).y; -} - -// Gets the width of the left border of an element. -float Element::GetClientLeft() -{ - UpdateLayout(); - return GetBox().GetPosition(client_area).x; -} - -// Gets the height of the top border of an element. -float Element::GetClientTop() -{ - UpdateLayout(); - return GetBox().GetPosition(client_area).y; -} - -// Gets the inner width of the element. -float Element::GetClientWidth() -{ - UpdateLayout(); - return GetBox().GetSize(client_area).x - scroll->GetScrollbarSize(ElementScroll::VERTICAL); -} - -// Gets the inner height of the element. -float Element::GetClientHeight() -{ - UpdateLayout(); - return GetBox().GetSize(client_area).y - scroll->GetScrollbarSize(ElementScroll::HORIZONTAL); -} - -// Returns the element from which all offset calculations are currently computed. -Element* Element::GetOffsetParent() -{ - return offset_parent; -} - -// Gets the distance from this element's left border to its offset parent's left border. -float Element::GetOffsetLeft() -{ - UpdateLayout(); - return relative_offset_base.x + relative_offset_position.x; -} - -// Gets the distance from this element's top border to its offset parent's top border. -float Element::GetOffsetTop() -{ - UpdateLayout(); - return relative_offset_base.y + relative_offset_position.y; -} - -// Gets the width of the element, including the client area, padding, borders and scrollbars, but not margins. -float Element::GetOffsetWidth() -{ - UpdateLayout(); - return GetBox().GetSize(Box::BORDER).x; -} - -// Gets the height of the element, including the client area, padding, borders and scrollbars, but not margins. -float Element::GetOffsetHeight() -{ - UpdateLayout(); - return GetBox().GetSize(Box::BORDER).y; -} - -// Gets the left scroll offset of the element. -float Element::GetScrollLeft() -{ - UpdateLayout(); - return scroll_offset.x; -} - -// Sets the left scroll offset of the element. -void Element::SetScrollLeft(float scroll_left) -{ - scroll_offset.x = LayoutEngine::Round(Math::Clamp(scroll_left, 0.0f, GetScrollWidth() - GetClientWidth())); - scroll->UpdateScrollbar(ElementScroll::HORIZONTAL); - DirtyOffset(); - - DispatchEvent("scroll", Dictionary()); -} - -// Gets the top scroll offset of the element. -float Element::GetScrollTop() -{ - UpdateLayout(); - return scroll_offset.y; -} - -// Sets the top scroll offset of the element. -void Element::SetScrollTop(float scroll_top) -{ - scroll_offset.y = LayoutEngine::Round(Math::Clamp(scroll_top, 0.0f, GetScrollHeight() - GetClientHeight())); - scroll->UpdateScrollbar(ElementScroll::VERTICAL); - DirtyOffset(); - - DispatchEvent("scroll", Dictionary()); -} - -// Gets the width of the scrollable content of the element; it includes the element padding but not its margin. -float Element::GetScrollWidth() -{ - return Math::Max(content_box.x, GetClientWidth()); -} - -// Gets the height of the scrollable content of the element; it includes the element padding but not its margin. -float Element::GetScrollHeight() -{ - return Math::Max(content_box.y, GetClientHeight()); -} - -// Gets the object representing the declarations of an element's style attributes. -ElementStyle* Element::GetStyle() -{ - return style; -} - -// Gets the document this element belongs to. -ElementDocument* Element::GetOwnerDocument() -{ - if (parent == NULL) - return NULL; - - if (!owner_document) - { - owner_document = parent->GetOwnerDocument(); - } - - return owner_document; -} - -// Gets this element's parent node. -Element* Element::GetParentNode() const -{ - return parent; -} - -// Gets the element immediately following this one in the tree. -Element* Element::GetNextSibling() const -{ - if (parent == NULL) - return NULL; - - for (size_t i = 0; i < parent->children.size() - (parent->num_non_dom_children + 1); i++) - { - if (parent->children[i] == this) - return parent->children[i + 1]; - } - - return NULL; -} - -// Gets the element immediately preceding this one in the tree. -Element* Element::GetPreviousSibling() const -{ - if (parent == NULL) - return NULL; - - for (size_t i = 1; i < parent->children.size() - parent->num_non_dom_children; i++) - { - if (parent->children[i] == this) - return parent->children[i - 1]; - } - - return NULL; -} - -// Returns the first child of this element. -Element* Element::GetFirstChild() const -{ - if (GetNumChildren() > 0) - return children[0]; - - return NULL; -} - -// Gets the last child of this element. -Element* Element::GetLastChild() const -{ - if (GetNumChildren() > 0) - return *(children.end() - (num_non_dom_children + 1)); - - return NULL; -} - -Element* Element::GetChild(int index) const -{ - if (index < 0 || index >= (int) children.size()) - return NULL; - - return children[index]; -} - -int Element::GetNumChildren(bool include_non_dom_elements) const -{ - return (int) children.size() - (include_non_dom_elements ? 0 : num_non_dom_children); -} - -// Gets the markup and content of the element. -void Element::GetInnerRML(String& content) const -{ - for (int i = 0; i < GetNumChildren(); i++) - { - children[i]->GetRML(content); - } -} - -// Gets the markup and content of the element. -String Element::GetInnerRML() const { - String result; - GetInnerRML(result); - return result; -} - -// Sets the markup and content of the element. All existing children will be replaced. -void Element::SetInnerRML(const String& rml) -{ - // Remove all DOM children. - while ((int) children.size() > num_non_dom_children) - RemoveChild(children.front()); - - Factory::InstanceElementText(this, rml); -} - -// Sets the current element as the focus object. -bool Element::Focus() -{ - // Are we allowed focus? - int focus_property = GetProperty< int >(FOCUS); - if (focus_property == FOCUS_NONE) - return false; - - // Ask our context if we can switch focus. - Context* context = GetContext(); - if (context == NULL) - return false; - - if (!context->OnFocusChange(this)) - return false; - - // Set this as the end of the focus chain. - focus = NULL; - - // Update the focus chain up the hierarchy. - Element* element = this; - while (element->GetParentNode()) - { - element->GetParentNode()->focus = element; - element = element->GetParentNode(); - } - - return true; -} - -// Removes focus from from this element. -void Element::Blur() -{ - if (parent) - { - Context* context = GetContext(); - if (context == NULL) - return; - - if (context->GetFocusElement() == this) - { - parent->Focus(); - } - else if (parent->focus == this) - { - parent->focus = NULL; - } - } -} - -// Fakes a mouse click on this element. -void Element::Click() -{ - Context* context = GetContext(); - if (context == NULL) - return; - - context->GenerateClickEvent(this); -} - -// Adds an event listener -void Element::AddEventListener(const String& event, EventListener* listener, bool in_capture_phase) -{ - event_dispatcher->AttachEvent(event, listener, in_capture_phase); -} - -// Removes an event listener from this element. -void Element::RemoveEventListener(const String& event, EventListener* listener, bool in_capture_phase) -{ - event_dispatcher->DetachEvent(event, listener, in_capture_phase); -} - -// Dispatches the specified event -bool Element::DispatchEvent(const String& event, const Dictionary& parameters, bool interruptible) -{ - return event_dispatcher->DispatchEvent(this, event, parameters, interruptible); -} - -// Scrolls the parent element's contents so that this element is visible. -void Element::ScrollIntoView(bool align_with_top) -{ - Vector2f size(0, 0); - if (!align_with_top && - !boxes.empty()) - { - size.y = boxes.back().GetOffset().y + - boxes.back().GetSize(Box::BORDER).y; - } - - Element* scroll_parent = parent; - while (scroll_parent != NULL) - { - int overflow_x_property = scroll_parent->GetProperty< int >(OVERFLOW_X); - int overflow_y_property = scroll_parent->GetProperty< int >(OVERFLOW_Y); - - if ((overflow_x_property != OVERFLOW_VISIBLE && - scroll_parent->GetScrollWidth() > scroll_parent->GetClientWidth()) || - (overflow_y_property != OVERFLOW_VISIBLE && - scroll_parent->GetScrollHeight() > scroll_parent->GetClientHeight())) - { - Vector2f offset = scroll_parent->GetAbsoluteOffset(Box::BORDER) - GetAbsoluteOffset(Box::BORDER); - Vector2f scroll_offset(scroll_parent->GetScrollLeft(), scroll_parent->GetScrollTop()); - scroll_offset -= offset; - scroll_offset.x += scroll_parent->GetClientLeft(); - scroll_offset.y += scroll_parent->GetClientTop(); - - if (!align_with_top) - scroll_offset.y -= (scroll_parent->GetClientHeight() - size.y); - - if (overflow_x_property != OVERFLOW_VISIBLE) - scroll_parent->SetScrollLeft(scroll_offset.x); - if (overflow_y_property != OVERFLOW_VISIBLE) - scroll_parent->SetScrollTop(scroll_offset.y); - } - - scroll_parent = scroll_parent->GetParentNode(); - } -} - -// Appends a child to this element -void Element::AppendChild(Element* child, bool dom_element) -{ - LockLayout(true); - - child->AddReference(); - child->SetParent(this); - if (dom_element) - children.insert(children.end() - num_non_dom_children, child); - else - { - children.push_back(child); - num_non_dom_children++; - } - - child->GetStyle()->DirtyDefinition(); - child->GetStyle()->DirtyProperties(); - - child->OnChildAdd(child); - DirtyStackingContext(); - DirtyStructure(); - - if (dom_element) - DirtyLayout(); - - LockLayout(false); -} - -// Adds a child to this element, directly after the adjacent element. Inherits -// the dom/non-dom status from the adjacent element. -void Element::InsertBefore(Element* child, Element* adjacent_element) -{ - // Find the position in the list of children of the adjacent element. If - // it's NULL or we can't find it, then we insert it at the end of the dom - // children, as a dom element. - size_t child_index = 0; - bool found_child = false; - if (adjacent_element) - { - for (child_index = 0; child_index < children.size(); child_index++) - { - if (children[child_index] == adjacent_element) - { - found_child = true; - break; - } - } - } - - if (found_child) - { - LockLayout(true); - - child->AddReference(); - child->SetParent(this); - - if ((int) child_index >= GetNumChildren()) - num_non_dom_children++; - else - DirtyLayout(); - - children.insert(children.begin() + child_index, child); - - child->GetStyle()->DirtyDefinition(); - child->GetStyle()->DirtyProperties(); - - child->OnChildAdd(child); - DirtyStackingContext(); - DirtyStructure(); - - LockLayout(false); - } - else - { - AppendChild(child); - } -} - -// Replaces the second node with the first node. -bool Element::ReplaceChild(Element* inserted_element, Element* replaced_element) -{ - inserted_element->AddReference(); - inserted_element->SetParent(this); - - ElementList::iterator insertion_point = children.begin(); - while (insertion_point != children.end() && *insertion_point != replaced_element) - { - ++insertion_point; - } - - if (insertion_point == children.end()) - { - AppendChild(inserted_element); - return false; - } - - LockLayout(true); - - children.insert(insertion_point, inserted_element); - RemoveChild(replaced_element); - - inserted_element->GetStyle()->DirtyDefinition(); - inserted_element->GetStyle()->DirtyProperties(); - inserted_element->OnChildAdd(inserted_element); - - LockLayout(false); - - return true; -} - -// Removes the specified child -bool Element::RemoveChild(Element* child) -{ - size_t child_index = 0; - - for (ElementList::iterator itr = children.begin(); itr != children.end(); ++itr) - { - // Add the element to the delete list - if ((*itr) == child) - { - LockLayout(true); - - // Inform the context of the element's pending removal (if we have a valid context). - Context* context = GetContext(); - if (context) - context->OnElementRemove(child); - - child->OnChildRemove(child); - - if (child_index >= children.size() - num_non_dom_children) - num_non_dom_children--; - - deleted_children.push_back(child); - children.erase(itr); - - // Remove the child element as the focussed child of this element. - if (child == focus) - { - focus = NULL; - - // If this child (or a descendant of this child) is the context's currently - // focussed element, set the focus to us instead. - Context* context = GetContext(); - if (context != NULL) - { - Element* focus_element = context->GetFocusElement(); - while (focus_element != NULL) - { - if (focus_element == child) - { - Focus(); - break; - } - - focus_element = focus_element->GetParentNode(); - } - } - } - - DirtyLayout(); - DirtyStackingContext(); - DirtyStructure(); - - LockLayout(false); - - return true; - } - - child_index++; - } - - return false; -} - -bool Element::HasChildNodes() const -{ - return (int) children.size() > num_non_dom_children; -} - -Element* Element::GetElementById(const String& id) -{ - // Check for special-case tokens. - if (id == "#self") - return this; - else if (id == "#document") - return GetOwnerDocument(); - else if (id == "#parent") - return this->parent; - else - { - Element* search_root = GetOwnerDocument(); - if (search_root == NULL) - search_root = this; - return ElementUtilities::GetElementById(search_root, id); - } -} - -// Get all elements with the given tag. -void Element::GetElementsByTagName(ElementList& elements, const String& tag) -{ - return ElementUtilities::GetElementsByTagName(elements, this, tag); -} - -// Get all elements with the given class set on them. -void Element::GetElementsByClassName(ElementList& elements, const String& class_name) -{ - return ElementUtilities::GetElementsByClassName(elements, this, class_name); -} - -// Access the event dispatcher -EventDispatcher* Element::GetEventDispatcher() const -{ - return event_dispatcher; -} - -// Access the element background. -ElementBackground* Element::GetElementBackground() const -{ - return background; -} - -// Access the element border. -ElementBorder* Element::GetElementBorder() const -{ - return border; -} - -// Access the element decorators -ElementDecoration* Element::GetElementDecoration() const -{ - return decoration; -} - -// Returns the element's scrollbar functionality. -ElementScroll* Element::GetElementScroll() const -{ - return scroll; -} - -int Element::GetClippingIgnoreDepth() -{ - if (clipping_state_dirty) - { - IsClippingEnabled(); - } - - return clipping_ignore_depth; -} - -bool Element::IsClippingEnabled() -{ - if (clipping_state_dirty) - { - // Is clipping enabled for this element, yes unless both overlow properties are set to visible - clipping_enabled = style->GetProperty(OVERFLOW_X)->Get< int >() != OVERFLOW_VISIBLE - || style->GetProperty(OVERFLOW_Y)->Get< int >() != OVERFLOW_VISIBLE; - - // Get the clipping ignore depth from the clip property - clipping_ignore_depth = 0; - const Property* clip_property = GetProperty(CLIP); - if (clip_property->unit == Property::NUMBER) - clipping_ignore_depth = clip_property->Get< int >(); - else if (clip_property->Get< int >() == CLIP_NONE) - clipping_ignore_depth = -1; - - clipping_state_dirty = false; - } - - return clipping_enabled; -} - -// Gets the render interface owned by this element's context. -RenderInterface* Element::GetRenderInterface() -{ - Context* context = GetContext(); - if (context != NULL) - return context->GetRenderInterface(); - - return Rocket::Core::GetRenderInterface(); -} - -void Element::SetInstancer(ElementInstancer* _instancer) -{ - // Only record the first instancer being set as some instancers call other instancers to do their dirty work, in - // which case we don't want to update the lowest level instancer. - if (instancer == NULL) - { - instancer = _instancer; - instancer->AddReference(); - } -} - -// Forces the element to generate a local stacking context, regardless of the value of its z-index property. -void Element::ForceLocalStackingContext() -{ - local_stacking_context_forced = true; - local_stacking_context = true; - - DirtyStackingContext(); -} - -// Called during the update loop after children are rendered. -void Element::OnUpdate() -{ -} - -// Called during render after backgrounds, borders, decorators, but before children, are rendered. -void Element::OnRender() -{ -} - -// Called during a layout operation, when the element is being positioned and sized. -void Element::OnLayout() -{ -} - -// Called when attributes on the element are changed. -void Element::OnAttributeChange(const AttributeNameList& changed_attributes) -{ - if (changed_attributes.find("id") != changed_attributes.end()) - { - id = GetAttribute< String >("id", ""); - style->DirtyDefinition(); - } - - if (changed_attributes.find("class") != changed_attributes.end()) - { - style->SetClassNames(GetAttribute< String >("class", "")); - } - - // Add any inline style declarations. - if (changed_attributes.find("style") != changed_attributes.end()) - { - PropertyDictionary properties; - StyleSheetParser parser; - parser.ParseProperties(properties, GetAttribute< String >("style", "")); - - Rocket::Core::PropertyMap property_map = properties.GetProperties(); - for (Rocket::Core::PropertyMap::iterator i = property_map.begin(); i != property_map.end(); ++i) - { - SetProperty((*i).first, (*i).second); - } - } -} - -// Called when properties on the element are changed. -void Element::OnPropertyChange(const PropertyNameList& changed_properties) -{ - bool all_dirty = StyleSheetSpecification::GetRegisteredProperties() == changed_properties; - - if (!IsLayoutDirty()) - { - if (all_dirty) - { - DirtyLayout(); - } - else - { - // Force a relayout if any of the changed properties require it. - for (PropertyNameList::const_iterator i = changed_properties.begin(); i != changed_properties.end(); ++i) - { - const PropertyDefinition* property_definition = StyleSheetSpecification::GetProperty(*i); - if (property_definition) - { - if (property_definition->IsLayoutForced()) - { - DirtyLayout(); - break; - } - } - } - } - } - - // Update the visibility. - if (all_dirty || changed_properties.find(VISIBILITY) != changed_properties.end() || - changed_properties.find(DISPLAY) != changed_properties.end()) - { - bool new_visibility = GetDisplay() != DISPLAY_NONE && - GetProperty< int >(VISIBILITY) == VISIBILITY_VISIBLE; - - if (visible != new_visibility) - { - visible = new_visibility; - - if (parent != NULL) - parent->DirtyStackingContext(); - } - - if (all_dirty || - changed_properties.find(DISPLAY) != changed_properties.end()) - { - if (parent != NULL) - parent->DirtyStructure(); - } - } - - // Update the position. - if (all_dirty || - changed_properties.find(LEFT) != changed_properties.end() || - changed_properties.find(RIGHT) != changed_properties.end() || - changed_properties.find(TOP) != changed_properties.end() || - changed_properties.find(BOTTOM) != changed_properties.end()) - { - UpdateOffset(); - DirtyOffset(); - } - - // Update the z-index. - if (all_dirty || - changed_properties.find(Z_INDEX) != changed_properties.end()) - { - const Property* z_index_property = GetProperty(Z_INDEX); - - if (z_index_property->unit == Property::KEYWORD && - z_index_property->value.Get< int >() == Z_INDEX_AUTO) - { - if (local_stacking_context && - !local_stacking_context_forced) - { - // We're no longer acting as a stacking context. - local_stacking_context = false; - - stacking_context_dirty = false; - stacking_context.clear(); - } - - // If our old z-index was not zero, then we must dirty our stacking context so we'll be re-indexed. - if (z_index != 0) - { - z_index = 0; - DirtyStackingContext(); - } - } - else - { - float new_z_index; - if (z_index_property->unit == Property::KEYWORD) - { - if (z_index_property->value.Get< int >() == Z_INDEX_TOP) - new_z_index = FLT_MAX; - else - new_z_index = -FLT_MAX; - } - else - new_z_index = z_index_property->value.Get< float >(); - - if (new_z_index != z_index) - { - z_index = new_z_index; - - if (parent != NULL) - parent->DirtyStackingContext(); - } - - if (!local_stacking_context) - { - local_stacking_context = true; - stacking_context_dirty = true; - } - } - } - - // Dirty the background if it's changed. - if (all_dirty - || changed_properties.find(BACKGROUND_COLOR) != changed_properties.end() - || changed_properties.find(OPACITY) != changed_properties.end()) - background->DirtyBackground(); - - // Dirty the border if it's changed. - if (all_dirty || - changed_properties.find(BORDER_TOP_WIDTH) != changed_properties.end() || - changed_properties.find(BORDER_RIGHT_WIDTH) != changed_properties.end() || - changed_properties.find(BORDER_BOTTOM_WIDTH) != changed_properties.end() || - changed_properties.find(BORDER_LEFT_WIDTH) != changed_properties.end() || - changed_properties.find(BORDER_TOP_COLOR) != changed_properties.end() || - changed_properties.find(BORDER_RIGHT_COLOR) != changed_properties.end() || - changed_properties.find(BORDER_BOTTOM_COLOR) != changed_properties.end() || - changed_properties.find(BORDER_LEFT_COLOR) != changed_properties.end()) - border->DirtyBorder(); - - // Fetch a new font face if it has been changed. - if (all_dirty || - changed_properties.find(FONT_FAMILY) != changed_properties.end() || - changed_properties.find(FONT_CHARSET) != changed_properties.end() || - changed_properties.find(FONT_WEIGHT) != changed_properties.end() || - changed_properties.find(FONT_STYLE) != changed_properties.end() || - changed_properties.find(FONT_SIZE) != changed_properties.end()) - { - // Store the old em; if it changes, then we need to dirty all em-relative properties. - int old_em = -1; - if (font_face_handle != NULL) - old_em = font_face_handle->GetLineHeight(); - - // Fetch the new font face. - FontFaceHandle* new_font_face_handle = ElementUtilities::GetFontFaceHandle(this); - - // If this is different from our current font face, then we've got to nuke - // all our characters and tell our parent that we have to be re-laid out. - if (new_font_face_handle != font_face_handle) - { - if (font_face_handle) - font_face_handle->RemoveReference(); - - font_face_handle = new_font_face_handle; - - // Our font face has changed; odds are, so has our em. All of our em-relative values - // have therefore probably changed as well, so we'll need to dirty them. - int new_em = -1; - if (font_face_handle != NULL) - new_em = font_face_handle->GetLineHeight(); - - if (old_em != new_em) - { - style->DirtyEmProperties(); - } - } - else if (new_font_face_handle != NULL) - new_font_face_handle->RemoveReference(); - } - - // Check for clipping state changes - if (all_dirty || - changed_properties.find(CLIP) != changed_properties.end() || - changed_properties.find(OVERFLOW_X) != changed_properties.end() || - changed_properties.find(OVERFLOW_Y) != changed_properties.end()) - { - clipping_state_dirty = true; - } -} - -// Called when a child node has been added somewhere in the hierarchy -void Element::OnChildAdd(Element* child) -{ - if (parent) - parent->OnChildAdd(child); -} - -// Called when a child node has been removed somewhere in the hierarchy -void Element::OnChildRemove(Element* child) -{ - if (parent) - parent->OnChildRemove(child); -} - -// Update the element's layout if required. -void Element::UpdateLayout() -{ - ElementDocument* document = GetOwnerDocument(); - if (document != NULL) - document->UpdateLayout(); -} - -// Forces a re-layout of this element, and any other children required. -void Element::DirtyLayout() -{ - Element* document = GetOwnerDocument(); - if (document != NULL) - document->DirtyLayout(); -} - -/// Increment/Decrement the layout lock -void Element::LockLayout(bool lock) -{ - Element* document = GetOwnerDocument(); - if (document != NULL) - document->LockLayout(lock); -} - -// Forces a re-layout of this element, and any other children required. -bool Element::IsLayoutDirty() -{ - Element* document = GetOwnerDocument(); - if (document != NULL) - return document->IsLayoutDirty(); - return false; -} - -// Forces a reevaluation of applicable font effects. -void Element::DirtyFont() -{ - for (size_t i = 0; i < children.size(); ++i) - children[i]->DirtyFont(); -} - -void Element::OnReferenceDeactivate() -{ - if (instancer) - { - instancer->ReleaseElement(this); - } - else - { - // Hopefully we can just delete ourselves. - //delete this; - Log::Message(Log::LT_WARNING, "Leak detected: element %s not instanced via Rocket Factory. Unable to release.", GetAddress().CString()); - } -} - -void Element::ProcessEvent(Event& event) -{ - if (event == MOUSEDOWN && IsPointWithinElement(Vector2f(event.GetParameter< float >("mouse_x", 0), event.GetParameter< float >("mouse_y", 0))) && - event.GetParameter< int >("button", 0) == 0) - SetPseudoClass("active", true); - - if (event == MOUSESCROLL) - { - int wheel_delta = event.GetParameter< int >("wheel_delta", 0); - if ((wheel_delta < 0 && GetScrollTop() > 0) || - (wheel_delta > 0 && GetScrollHeight() > GetScrollTop() + GetClientHeight())) - { - int overflow_property = GetProperty< int >(OVERFLOW_Y); - if (overflow_property == OVERFLOW_AUTO || - overflow_property == OVERFLOW_SCROLL) - { - SetScrollTop(GetScrollTop() + wheel_delta * ElementUtilities::GetLineHeight(this)); - event.StopPropagation(); - } - } - - return; - } - - if (event.GetTargetElement() == this) - { - if (event == MOUSEOVER) - SetPseudoClass("hover", true); - else if (event == MOUSEOUT) - SetPseudoClass("hover", false); - else if (event == FOCUS) - SetPseudoClass(FOCUS, true); - else if (event == BLUR) - SetPseudoClass(FOCUS, false); - } -} - -void Element::GetRML(String& content) -{ - // First we start the open tag, add the attributes then close the open tag. - // Then comes the children in order, then we add our close tag. - content.Append("<"); - content.Append(tag); - - int index = 0; - String name; - String value; - while (IterateAttributes(index, name, value)) - { - size_t length = name.Length() + value.Length() + 8; - String attribute(length, " %s=\"%s\"", name.CString(), value.CString()); - content.Append(attribute); - } - - if (HasChildNodes()) - { - content.Append(">"); - - GetInnerRML(content); - - content.Append(""); - } - else - { - content.Append(" />"); - } -} - -void Element::SetParent(Element* _parent) -{ - // If there's an old parent, detach from it first. - if (parent && - parent != _parent) - parent->RemoveChild(this); - - // Save our parent - parent = _parent; -} - -void Element::ReleaseDeletedElements() -{ - for (size_t i = 0; i < active_children.size(); i++) - { - active_children[i]->ReleaseDeletedElements(); - } - - ReleaseElements(deleted_children); - active_children = children; -} - -void Element::ReleaseElements(ElementList& released_elements) -{ - // Remove deleted children from this element. - while (!released_elements.empty()) - { - Element* element = released_elements.back(); - released_elements.pop_back(); - - // If this element has been added back into our list, then we remove our previous oustanding reference on it - // and continue. - if (std::find(children.begin(), children.end(), element) != children.end()) - { - element->RemoveReference(); - continue; - } - - // Set the parent to NULL unless it's been reparented already. - if (element->GetParentNode() == this) - element->parent = NULL; - - element->RemoveReference(); - } -} - -void Element::DirtyOffset() -{ - offset_dirty = true; - - // Not strictly true ... ? - for (size_t i = 0; i < children.size(); i++) - children[i]->DirtyOffset(); -} - -void Element::UpdateOffset() -{ - int position_property = GetPosition(); - if (position_property == POSITION_ABSOLUTE || - position_property == POSITION_FIXED) - { - if (offset_parent != NULL) - { - const Box& parent_box = offset_parent->GetBox(); - Vector2f containing_block = parent_box.GetSize(Box::PADDING); - - const Property *left = GetLocalProperty(LEFT); - const Property *right = GetLocalProperty(RIGHT); - // If the element is anchored left, then the position is offset by that resolved value. - if (left != NULL && left->unit != Property::KEYWORD) - relative_offset_base.x = parent_box.GetEdge(Box::BORDER, Box::LEFT) + (ResolveProperty(LEFT, containing_block.x) + GetBox().GetEdge(Box::MARGIN, Box::LEFT)); - // If the element is anchored right, then the position is set first so the element's right-most edge - // (including margins) will render up against the containing box's right-most content edge, and then - // offset by the resolved value. - if (right != NULL && right->unit != Property::KEYWORD) - relative_offset_base.x = containing_block.x + parent_box.GetEdge(Box::BORDER, Box::LEFT) - (ResolveProperty(RIGHT, containing_block.x) + GetBox().GetSize(Box::BORDER).x + GetBox().GetEdge(Box::MARGIN, Box::RIGHT)); - - const Property *top = GetLocalProperty(TOP); - const Property *bottom = GetLocalProperty(BOTTOM); - // If the element is anchored top, then the position is offset by that resolved value. - if (top != NULL && top->unit != Property::KEYWORD) - relative_offset_base.y = parent_box.GetEdge(Box::BORDER, Box::TOP) + (ResolveProperty(TOP, containing_block.y) + GetBox().GetEdge(Box::MARGIN, Box::TOP)); - // If the element is anchored bottom, then the position is set first so the element's right-most edge - // (including margins) will render up against the containing box's right-most content edge, and then - // offset by the resolved value. - else if (bottom != NULL && bottom->unit != Property::KEYWORD) - relative_offset_base.y = containing_block.y + parent_box.GetEdge(Box::BORDER, Box::TOP) - (ResolveProperty(BOTTOM, containing_block.y) + GetBox().GetSize(Box::BORDER).y + GetBox().GetEdge(Box::MARGIN, Box::BOTTOM)); - } - } - else if (position_property == POSITION_RELATIVE) - { - if (offset_parent != NULL) - { - const Box& parent_box = offset_parent->GetBox(); - Vector2f containing_block = parent_box.GetSize(); - - const Property *left = GetLocalProperty(LEFT); - const Property *right = GetLocalProperty(RIGHT); - if (left != NULL && left->unit != Property::KEYWORD) - relative_offset_position.x = ResolveProperty(LEFT, containing_block.x); - else if (right != NULL && right->unit != Property::KEYWORD) - relative_offset_position.x = -1 * ResolveProperty(RIGHT, containing_block.x); - else - relative_offset_position.x = 0; - - const Property *top = GetLocalProperty(TOP); - const Property *bottom = GetLocalProperty(BOTTOM); - if (top != NULL && top->unit != Property::KEYWORD) - relative_offset_position.y = ResolveProperty(TOP, containing_block.y); - else if (bottom != NULL && bottom->unit != Property::KEYWORD) - relative_offset_position.y = -1 * ResolveProperty(BOTTOM, containing_block.y); - else - relative_offset_position.y = 0; - } - } - else - { - relative_offset_position.x = 0; - relative_offset_position.y = 0; - } - - LayoutEngine::Round(relative_offset_base); - LayoutEngine::Round(relative_offset_position); -} - -void Element::BuildLocalStackingContext() -{ - stacking_context_dirty = false; - stacking_context.clear(); - - BuildStackingContext(&stacking_context); - std::stable_sort(stacking_context.begin(), stacking_context.end(), ElementSortZIndex()); -} - -void Element::BuildStackingContext(ElementList* new_stacking_context) -{ - // Build the list of ordered children. Our child list is sorted within the stacking context so stacked elements - // will render in the right order; ie, positioned elements will render on top of inline elements, which will render - // on top of floated elements, which will render on top of block elements. - std::vector< std::pair< Element*, float > > ordered_children; - for (size_t i = 0; i < children.size(); ++i) - { - Element* child = children[i]; - - if (!child->IsVisible()) - continue; - - std::pair< Element*, float > ordered_child; - ordered_child.first = child; - - if (child->GetPosition() != POSITION_STATIC) - ordered_child.second = 3; - else if (child->GetFloat() != FLOAT_NONE) - ordered_child.second = 1; - else if (child->GetDisplay() == DISPLAY_BLOCK) - ordered_child.second = 0; - else - ordered_child.second = 2; - - ordered_children.push_back(ordered_child); - } - - // Sort the list! - std::stable_sort(ordered_children.begin(), ordered_children.end(), ElementSortZOrder()); - - // Add the list of ordered children into the stacking context in order. - for (size_t i = 0; i < ordered_children.size(); ++i) - { - new_stacking_context->push_back(ordered_children[i].first); - - if (!ordered_children[i].first->local_stacking_context) - ordered_children[i].first->BuildStackingContext(new_stacking_context); - } -} - -void Element::DirtyStackingContext() -{ - // The first ancestor of ours that doesn't have an automatic z-index is the ancestor that is establishing our local - // stacking context. - Element* stacking_context_parent = this; - while (stacking_context_parent != NULL && - !stacking_context_parent->local_stacking_context) - stacking_context_parent = stacking_context_parent->GetParentNode(); - - if (stacking_context_parent != NULL) - stacking_context_parent->stacking_context_dirty = true; -} - -void Element::DirtyStructure() -{ - // Clear the cached owner document - owner_document = NULL; - - // Inform all children that the structure is drity - for (size_t i = 0; i < children.size(); ++i) - { - const ElementDefinition* element_definition = children[i]->GetStyle()->GetDefinition(); - if (element_definition != NULL && - element_definition->IsStructurallyVolatile()) - { - children[i]->GetStyle()->DirtyDefinition(); - } - - children[i]->DirtyStructure(); - } -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementBackground.cpp b/libs/libRocket/Source/Core/ElementBackground.cpp deleted file mode 100644 index 651ffeaec84..00000000000 --- a/libs/libRocket/Source/Core/ElementBackground.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementBackground.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/GeometryUtilities.h" -#include "../../Include/Rocket/Core/Property.h" - -namespace Rocket { -namespace Core { - -ElementBackground::ElementBackground(Element* _element) : geometry(_element) -{ - element = _element; - background_dirty = true; -} - -ElementBackground::~ElementBackground() -{ -} - -// Renders the element's background, if it has one. -void ElementBackground::RenderBackground() -{ - if (background_dirty) - { - background_dirty = false; - GenerateBackground(); - } - - geometry.Render(element->GetAbsoluteOffset(Box::PADDING)); -} - -// Marks the background geometry as dirty. -void ElementBackground::DirtyBackground() -{ - background_dirty = true; -} - -// Generates the background geometry for the element. -void ElementBackground::GenerateBackground() -{ - // Fetch the new colour for the background. If the colour is transparent, then we don't render any background. - Colourb colour = element->GetProperty(BACKGROUND_COLOR)->value.Get< Colourb >(); - float alpha = element->GetProperty(OPACITY)->value.Get< float >(); - colour.alpha *= alpha; - if (colour.alpha <= 0) - { - geometry.GetVertices().clear(); - geometry.GetIndices().clear(); - geometry.Release(); - - return; - } - - // Work out how many boxes we need to generate geometry for. - int num_boxes = 0; - - for (int i = 0; i < element->GetNumBoxes(); ++i) - { - const Box& box = element->GetBox(i); - Vector2f size = box.GetSize(Box::PADDING); - if (size.x > 0 && size.y > 0) - num_boxes++; - } - - std::vector< Vertex >& vertices = geometry.GetVertices(); - std::vector< int >& indices = geometry.GetIndices(); - - int index_offset = 0; - vertices.resize(4 * num_boxes); - indices.resize(6 * num_boxes); - - if (num_boxes > 0) - { - Vertex* raw_vertices = &vertices[0]; - int* raw_indices = &indices[0]; - - for (int i = 0; i < element->GetNumBoxes(); ++i) - GenerateBackground(raw_vertices, raw_indices, index_offset, element->GetBox(i), colour); - } - - geometry.Release(); -} - -// Generates the background geometry for a single box. -void ElementBackground::GenerateBackground(Vertex*& vertices, int*& indices, int& index_offset, const Box& box, const Colourb& colour) -{ - Vector2f padded_size = box.GetSize(Box::PADDING); - if (padded_size.x <= 0 || - padded_size.y <= 0) - return; - - GeometryUtilities::GenerateQuad(vertices, indices, box.GetOffset(), padded_size, colour, index_offset); - - vertices += 4; - indices += 6; - index_offset += 4; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementBackground.h b/libs/libRocket/Source/Core/ElementBackground.h deleted file mode 100644 index 73bb50fc7b4..00000000000 --- a/libs/libRocket/Source/Core/ElementBackground.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTBACKGROUND_H -#define ROCKETCOREELEMENTBACKGROUND_H - -#include "../../Include/Rocket/Core/Box.h" -#include "../../Include/Rocket/Core/Geometry.h" - -namespace Rocket { -namespace Core { - -class Element; - -/** - @author Peter Curry - */ - -class ElementBackground -{ -public: - ElementBackground(Element* element); - ~ElementBackground(); - - /// Renders the element's border, if it has one. - void RenderBackground(); - - /// Marks the border geometry as dirty. - void DirtyBackground(); - -private: - // Generates the border geometry for the element. - void GenerateBackground(); - // Generates the border geometry for a single box. - void GenerateBackground(Vertex*& vertices, int*& indices, int& index_offset, const Box& box, const Colourb& colour); - - Element* element; - - // The background geometry. - Geometry geometry; - - bool background_dirty; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementBorder.cpp b/libs/libRocket/Source/Core/ElementBorder.cpp deleted file mode 100644 index c44f95757eb..00000000000 --- a/libs/libRocket/Source/Core/ElementBorder.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementBorder.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Property.h" - -namespace Rocket { -namespace Core { - -ElementBorder::ElementBorder(Element* _element) : geometry(_element) -{ - element = _element; - border_dirty = true; -} - -ElementBorder::~ElementBorder() -{ -} - -// Renders the element's border, if it has one. -void ElementBorder::RenderBorder() -{ - if (border_dirty) - { - border_dirty = false; - GenerateBorder(); - } - - geometry.Render(element->GetAbsoluteOffset(Box::BORDER)); -} - -// Marks the border geometry as dirty. -void ElementBorder::DirtyBorder() -{ - border_dirty = true; -} - -// Generates the border geometry for the element. -void ElementBorder::GenerateBorder() -{ - int num_edges = 0; - - for (int i = 0; i < element->GetNumBoxes(); ++i) - { - const Box& box = element->GetBox(i); - for (int j = 0; j < 4; j++) - { - if (box.GetEdge(Box::BORDER, (Box::Edge) j) > 0) - num_edges++; - } - } - - std::vector< Vertex >& vertices = geometry.GetVertices(); - std::vector< int >& indices = geometry.GetIndices(); - - int index_offset = 0; - vertices.resize(4 * num_edges); - indices.resize(6 * num_edges); - - if (num_edges > 0) - { - Vertex* raw_vertices = &vertices[0]; - int* raw_indices = &indices[0]; - - Colourb border_colours[4]; - border_colours[0] = element->GetProperty(BORDER_TOP_COLOR)->value.Get< Colourb >(); - border_colours[1] = element->GetProperty(BORDER_RIGHT_COLOR)->value.Get< Colourb >(); - border_colours[2] = element->GetProperty(BORDER_BOTTOM_COLOR)->value.Get< Colourb >(); - border_colours[3] = element->GetProperty(BORDER_LEFT_COLOR)->value.Get< Colourb >(); - - for (int i = 0; i < element->GetNumBoxes(); ++i) - GenerateBorder(raw_vertices, raw_indices, index_offset, element->GetBox(i), border_colours); - } - - geometry.Release(); -} - -// Generates the border geometry for a single box. -void ElementBorder::GenerateBorder(Vertex*& vertices, int*& indices, int& index_offset, const Box& box, const Colourb* colours) -{ - // The axis of extrusion for each of the edges. - Vector2f box_extrusions[4] = - { - Vector2f(0, -1 * box.GetEdge(Box::BORDER, Box::TOP)), - Vector2f(box.GetEdge(Box::BORDER, Box::RIGHT), 0), - Vector2f(0, box.GetEdge(Box::BORDER, Box::BOTTOM)), - Vector2f(-1 * box.GetEdge(Box::BORDER, Box::LEFT), 0) - }; - - // The position of each of the corners of the inner border. - Vector2f box_corners[4]; - box_corners[0] = box.GetPosition(Box::PADDING); - box_corners[2] = box_corners[0] + box.GetSize(Box::PADDING); - box_corners[1] = Vector2f(box_corners[2].x, box_corners[0].y); - box_corners[3] = Vector2f(box_corners[0].x, box_corners[2].y); - - for (int i = 0; i < 4; i++) - { - float border_width = box.GetEdge(Box::BORDER, (Box::Edge) i); - if (border_width <= 0) - continue; - - vertices[0].position = box_corners[i]; - vertices[1].position = box_corners[i] + box_extrusions[i] + box_extrusions[i == 0 ? 3 : i - 1]; - vertices[2].position = box_corners[i == 3 ? 0 : i + 1]; - vertices[3].position = vertices[2].position + box_extrusions[i] + box_extrusions[i == 3 ? 0 : i + 1]; - - vertices[0].colour = colours[i]; - vertices[1].colour = colours[i]; - vertices[2].colour = colours[i]; - vertices[3].colour = colours[i]; - - indices[0] = index_offset; - indices[1] = index_offset + 3; - indices[2] = index_offset + 1; - indices[3] = index_offset; - indices[4] = index_offset + 2; - indices[5] = index_offset + 3; - - vertices += 4; - indices += 6; - index_offset += 4; - } -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementBorder.h b/libs/libRocket/Source/Core/ElementBorder.h deleted file mode 100644 index de0fe02f179..00000000000 --- a/libs/libRocket/Source/Core/ElementBorder.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTBORDER_H -#define ROCKETCOREELEMENTBORDER_H - -#include "../../Include/Rocket/Core/Box.h" -#include "../../Include/Rocket/Core/Geometry.h" - -namespace Rocket { -namespace Core { - -class Element; - -/** - @author Peter Curry - */ - -class ElementBorder -{ -public: - ElementBorder(Element* element); - ~ElementBorder(); - - /// Renders the element's border, if it has one. - void RenderBorder(); - - /// Marks the border geometry as dirty. - void DirtyBorder(); - -private: - // Generates the border geometry for the element. - void GenerateBorder(); - // Generates the border geometry for a single box. - void GenerateBorder(Vertex*& vertices, int*& indices, int& index_offset, const Box& box, const Colourb* colours); - - Element* element; - - // The border geometry. - Geometry geometry; - - bool border_dirty; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementDecoration.cpp b/libs/libRocket/Source/Core/ElementDecoration.cpp deleted file mode 100644 index b004993a84e..00000000000 --- a/libs/libRocket/Source/Core/ElementDecoration.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementDecoration.h" -#include "ElementDefinition.h" -#include "../../Include/Rocket/Core/Decorator.h" -#include "../../Include/Rocket/Core/Element.h" - -namespace Rocket { -namespace Core { - -ElementDecoration::ElementDecoration(Element* _element) -{ - element = _element; - active_decorators_dirty = false; -} - -ElementDecoration::~ElementDecoration() -{ - ReleaseDecorators(); -} - -// Releases existing decorators and loads all decorators required by the element's definition. -bool ElementDecoration::ReloadDecorators() -{ - ReleaseDecorators(); - - const ElementDefinition* definition = element->GetDefinition(); - if (definition == NULL) - return true; - - // Generate the decorator sets for pseudo-classes with overrides. - const PseudoClassDecoratorMap& pseudo_class_decorators = definition->GetPseudoClassDecorators(); - for (PseudoClassDecoratorMap::const_iterator i = pseudo_class_decorators.begin(); i != pseudo_class_decorators.end(); ++i) - { - for (DecoratorMap::const_iterator j = (*i).second.begin(); j != (*i).second.end(); ++j) - { - int index = LoadDecorator((*j).second); - - // Add it into the index. If a decorator with the same name already exists for this element, then we add it - // into the list at the right position (sorted by specificity, descending). - PseudoClassDecoratorIndexList* pseudo_class_decorator_index = NULL; - DecoratorIndex::iterator index_iterator = decorator_index.find((*j).first); - if (index_iterator == decorator_index.end()) - pseudo_class_decorator_index = &(*decorator_index.insert(DecoratorIndex::value_type((*j).first, PseudoClassDecoratorIndexList())).first).second; - else - pseudo_class_decorator_index = &(*index_iterator).second; - - // Add the decorator index at the right point to maintain the order of the list. - PseudoClassDecoratorIndexList::iterator k = pseudo_class_decorator_index->begin(); - for (; k != pseudo_class_decorator_index->end(); ++k) - { - if (decorators[(*k).second].decorator->GetSpecificity() < decorators[index].decorator->GetSpecificity()) - break; - } - - pseudo_class_decorator_index->insert(k, PseudoClassDecoratorIndex(PseudoClassList((*i).first.begin(), (*i).first.end()), index)); - } - } - - // Put the decorators for the element's default state at the end of any index lists. - const DecoratorMap& default_decorators = definition->GetDecorators(); - for (DecoratorMap::const_iterator i = default_decorators.begin(); i != default_decorators.end(); ++i) - { - int index = LoadDecorator((*i).second); - - DecoratorIndex::iterator index_iterator = decorator_index.find((*i).first); - if (index_iterator == decorator_index.end()) - decorator_index.insert(DecoratorIndex::value_type((*i).first, PseudoClassDecoratorIndexList(1, PseudoClassDecoratorIndex(PseudoClassList(), index)))); - else - (*index_iterator).second.push_back(PseudoClassDecoratorIndex(PseudoClassList(), index)); - } - - active_decorators_dirty = true; - - return true; -} - -// Loads a single decorator and adds it to the list of loaded decorators for this element. -int ElementDecoration::LoadDecorator(Decorator* decorator) -{ - DecoratorHandle element_decorator; - element_decorator.decorator = decorator; - element_decorator.decorator->AddReference(); - element_decorator.decorator_data = decorator->GenerateElementData(element); - - decorators.push_back(element_decorator); - return (int) (decorators.size() - 1); -} - -// Releases all existing decorators and frees their data. -void ElementDecoration::ReleaseDecorators() -{ - for (size_t i = 0; i < decorators.size(); i++) - { - if (decorators[i].decorator_data) - decorators[i].decorator->ReleaseElementData(decorators[i].decorator_data); - - decorators[i].decorator->RemoveReference(); - } - - decorators.clear(); - active_decorators.clear(); - decorator_index.clear(); -} - -// Updates the list of active decorators (if necessary). -void ElementDecoration::UpdateActiveDecorators() -{ - if (active_decorators_dirty) - { - active_decorators.clear(); - - for (DecoratorIndex::iterator i = decorator_index.begin(); i != decorator_index.end(); ++i) - { - PseudoClassDecoratorIndexList& indices = (*i).second; - for (size_t j = 0; j < indices.size(); ++j) - { - if (element->ArePseudoClassesSet(indices[j].first)) - { - // Insert the new index into the list of active decorators, ordered by z-index. - float z_index = decorators[indices[j].second].decorator->GetZIndex(); - std::vector< int >::iterator insert_iterator = active_decorators.begin(); - while (insert_iterator != active_decorators.end() && - z_index > decorators[(*insert_iterator)].decorator->GetZIndex()) - ++insert_iterator; - - active_decorators.insert(insert_iterator, indices[j].second); - - break; - } - } - } - - active_decorators_dirty = false; - } -} - -void ElementDecoration::RenderDecorators() -{ - UpdateActiveDecorators(); - - // Render the decorators attached to this element in its current state. - for (size_t i = 0; i < active_decorators.size(); i++) - { - DecoratorHandle& decorator = decorators[active_decorators[i]]; - decorator.decorator->RenderElement(element, decorator.decorator_data); - } -} - -void ElementDecoration::DirtyDecorators() -{ - active_decorators_dirty = true; -} - -// Iterates over all active decorators attached to the decoration's element. -bool ElementDecoration::IterateDecorators(int& index, PseudoClassList& pseudo_classes, String& name, Decorator*& decorator, DecoratorDataHandle& decorator_data) const -{ - if (index < 0) - return false; - - size_t count = 0; - - for (DecoratorIndex::const_iterator index_iterator = decorator_index.begin(); index_iterator != decorator_index.end(); ++index_iterator) - { - // This is the list of all pseudo-classes that have a decorator under this name. - const PseudoClassDecoratorIndexList& decorator_index_list = index_iterator->second; - if (count + decorator_index_list.size() <= (size_t) index) - { - count += decorator_index_list.size(); - continue; - } - - // This is the one we're looking for. - name = index_iterator->first; - - int relative_index = index - (int)count; - pseudo_classes = decorator_index_list[relative_index].first; - - const DecoratorHandle& decorator_handle = decorators[decorator_index_list[relative_index].second]; - decorator = decorator_handle.decorator; - decorator_data = decorator_handle.decorator_data; - - index += 1; - return true; - } - - return false; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementDecoration.h b/libs/libRocket/Source/Core/ElementDecoration.h deleted file mode 100644 index 381861ca71d..00000000000 --- a/libs/libRocket/Source/Core/ElementDecoration.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTDECORATION_H -#define ROCKETCOREELEMENTDECORATION_H - -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Core { - -class Decorator; -class Element; - -/** - Manages an elements decorator state - - @author Lloyd Weehuizen - */ - -class ElementDecoration -{ -public: - /// Constructor - /// @param element The element this decorator with acting on - ElementDecoration(Element* element); - ~ElementDecoration(); - - // Releases existing decorators and loads all decorators required by the element's definition. - bool ReloadDecorators(); - - /// Renders all appropriate decorators. - void RenderDecorators(); - - /// Mark decorators as dirty and force them to reset themselves - void DirtyDecorators(); - - /// Iterates over all active decorators attached to the decoration's element. - /// @param[inout] index Index to fetch. This is incremented after the fetch. - /// @param[out] pseudo_classes The pseudo-classes the decorator required to be active before it renders. - /// @param[out] name The name of the decorator at the specified index. - /// @param[out] decorator The decorator at the specified index. - /// @param[out] decorator_data This element's handle to any data is has stored against the decorator. - /// @return True if a decorator was successfully fetched, false if not. - bool IterateDecorators(int& index, PseudoClassList& pseudo_classes, String& name, Decorator*& decorator, DecoratorDataHandle& decorator_data) const; - -private: - // Loads a single decorator and adds it to the list of loaded decorators for this element. - int LoadDecorator(Decorator* decorator); - // Releases all existing decorators and frees their data. - void ReleaseDecorators(); - // Updates the list of active decorators (if necessary) - void UpdateActiveDecorators(); - - struct DecoratorHandle - { - Decorator* decorator; - DecoratorDataHandle decorator_data; - }; - - typedef std::vector< DecoratorHandle > DecoratorList; - typedef std::pair< PseudoClassList, int > PseudoClassDecoratorIndex; - typedef std::vector< PseudoClassDecoratorIndex > PseudoClassDecoratorIndexList; - typedef std::map< String, PseudoClassDecoratorIndexList > DecoratorIndex; - - // The element this decorator belongs to - Element* element; - - // The list of every decorator used by this element in every class. - DecoratorList decorators; - // The list of currently active decorators. - std::vector< int > active_decorators; - bool active_decorators_dirty; - - // For each unique decorator name, this stores (in order of specificity) the name of the pseudo-class that has - // a definition for it, and the index into the list of decorators. - DecoratorIndex decorator_index; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementDefinition.cpp b/libs/libRocket/Source/Core/ElementDefinition.cpp deleted file mode 100644 index 0fc0a6786e4..00000000000 --- a/libs/libRocket/Source/Core/ElementDefinition.cpp +++ /dev/null @@ -1,570 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementDefinition.h" -#include "../../Include/Rocket/Core/Decorator.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/FontDatabase.h" -#include "../../Include/Rocket/Core/Log.h" - -namespace Rocket { -namespace Core { - -ElementDefinition::ElementDefinition() -{ - structurally_volatile = false; -} - -ElementDefinition::~ElementDefinition() -{ - for (DecoratorMap::iterator i = decorators.begin(); i != decorators.end(); ++i) - (*i).second->RemoveReference(); - - for (PseudoClassDecoratorMap::iterator i = pseudo_class_decorators.begin(); i != pseudo_class_decorators.end(); ++i) - { - for (DecoratorMap::iterator j = (*i).second.begin(); j != (*i).second.end(); ++j) - { - if ((*j).second != NULL) - (*j).second->RemoveReference(); - } - } - - for (size_t i = 0; i < font_effects.size(); ++i) - font_effects[i]->RemoveReference(); -} - -// Initialises the element definition from a list of style sheet nodes. -void ElementDefinition::Initialise(const std::vector< const StyleSheetNode* >& style_sheet_nodes, const PseudoClassList& volatile_pseudo_classes, bool _structurally_volatile) -{ - // Set the volatile structure flag. - structurally_volatile = _structurally_volatile; - - // Mark all the volatile pseudo-classes as structurally volatile. - for (PseudoClassList::const_iterator i = volatile_pseudo_classes.begin(); i != volatile_pseudo_classes.end(); ++i) - pseudo_class_volatility[*i] = STRUCTURE_VOLATILE; - - - // Merge the default (non-pseudo-class) properties. - for (size_t i = 0; i < style_sheet_nodes.size(); ++i) - properties.Merge(style_sheet_nodes[i]->GetProperties()); - - - // Merge the pseudo-class properties. - PseudoClassPropertyMap merged_pseudo_class_properties; - for (size_t i = 0; i < style_sheet_nodes.size(); ++i) - { - // Merge all the pseudo-classes. - PseudoClassPropertyMap node_properties; - style_sheet_nodes[i]->GetPseudoClassProperties(node_properties); - for (PseudoClassPropertyMap::iterator j = node_properties.begin(); j != node_properties.end(); ++j) - { - // Merge the property maps into one uber-map; for the decorators. - PseudoClassPropertyMap::iterator k = merged_pseudo_class_properties.find((*j).first); - if (k == merged_pseudo_class_properties.end()) - merged_pseudo_class_properties[(*j).first] = (*j).second; - else - (*k).second.Merge((*j).second); - - // Search through all entries in this dictionary; we'll insert each one into our optimised list of - // pseudo-class properties. - for (PropertyMap::const_iterator k = (*j).second.GetProperties().begin(); k != (*j).second.GetProperties().end(); ++k) - { - const String& property_name = (*k).first; - const Property& property = (*k).second; - - // Skip this property if its specificity is lower than the base property's, as in - // this case it will never be used. - const Property* default_property = properties.GetProperty(property_name); - if (default_property != NULL && - default_property->specificity >= property.specificity) - continue; - - PseudoClassPropertyDictionary::iterator l = pseudo_class_properties.find(property_name); - if (l == pseudo_class_properties.end()) - pseudo_class_properties[property_name] = PseudoClassPropertyList(1, PseudoClassProperty((*j).first, property)); - else - { - // Find the location to insert this entry in the map, based on property priorities. - int index = 0; - while (index < (int) (*l).second.size() && - (*l).second[index].second.specificity > property.specificity) - index++; - - (*l).second.insert((*l).second.begin() + index, PseudoClassProperty((*j).first, property)); - } - } - } - } - - InstanceDecorators(merged_pseudo_class_properties); - InstanceFontEffects(merged_pseudo_class_properties); -} - -// Returns a specific property from the element definition's base properties. -const Property* ElementDefinition::GetProperty(const String& name, const PseudoClassList& pseudo_classes) const -{ - // Find a pseudo-class override for this property. - PseudoClassPropertyDictionary::const_iterator property_iterator = pseudo_class_properties.find(name); - if (property_iterator != pseudo_class_properties.end()) - { - const PseudoClassPropertyList& property_list = (*property_iterator).second; - for (size_t i = 0; i < property_list.size(); ++i) - { - if (!IsPseudoClassRuleApplicable(property_list[i].first, pseudo_classes)) - continue; - - return &property_list[i].second; - } - } - - return properties.GetProperty(name); -} - -// Returns the list of properties this element definition defines for an element with the given set of pseudo-classes. -void ElementDefinition::GetDefinedProperties(PropertyNameList& property_names, const PseudoClassList& pseudo_classes) const -{ - for (PropertyMap::const_iterator i = properties.GetProperties().begin(); i != properties.GetProperties().end(); ++i) - property_names.insert((*i).first); - - for (PseudoClassPropertyDictionary::const_iterator i = pseudo_class_properties.begin(); i != pseudo_class_properties.end(); ++i) - { - // If this property is already in the default dictionary, don't bother checking for it here. - if (property_names.find((*i).first) != property_names.end()) - continue; - - const PseudoClassPropertyList& property_list = (*i).second; - - // Search through all the pseudo-class combinations that have a definition for this property; if the calling - // element matches at least one of them, then add it to the list. - bool property_defined = false; - for (size_t j = 0; j < property_list.size(); ++j) - { - if (IsPseudoClassRuleApplicable(property_list[j].first, pseudo_classes)) - { - property_defined = true; - break; - } - } - - if (property_defined) - property_names.insert((*i).first); - } -} - -// Returns the list of properties this element definition has explicit definitions for involving the given -// pseudo-class. -void ElementDefinition::GetDefinedProperties(PropertyNameList& property_names, const PseudoClassList& pseudo_classes, const String& pseudo_class) const -{ - for (PseudoClassPropertyDictionary::const_iterator i = pseudo_class_properties.begin(); i != pseudo_class_properties.end(); ++i) - { - // If this property has already been found, don't bother checking for it again. - if (property_names.find((*i).first) != property_names.end()) - continue; - - const PseudoClassPropertyList& property_list = (*i).second; - - bool property_defined = false; - for (size_t j = 0; j < property_list.size(); ++j) - { - bool rule_valid = true; - bool found_toggled_pseudo_class = false; - - const StringList& rule_pseudo_classes = property_list[j].first; - for (size_t j = 0; j < rule_pseudo_classes.size(); ++j) - { - if (rule_pseudo_classes[j] == pseudo_class) - { - found_toggled_pseudo_class = true; - continue; - } - - if (pseudo_classes.find(rule_pseudo_classes[j]) == pseudo_classes.end()) - { - rule_valid = false; - break; - } - } - - if (rule_valid && - found_toggled_pseudo_class) - { - property_defined = true; - break; - } - } - - if (property_defined) - property_names.insert((*i).first); - } -} - -// Iterates over the properties in the definition. -bool ElementDefinition::IterateProperties(int& index, const PseudoClassList& pseudo_classes, PseudoClassList& property_pseudo_classes, String& property_name, const Property*& property) const -{ - if (index < properties.GetNumProperties()) - { - PropertyMap::const_iterator i = properties.GetProperties().begin(); - for (int count = 0; count < index; ++count) - ++i; - - property_pseudo_classes.clear(); - property_name = (*i).first; - property = &((*i).second); - ++index; - - return true; - } - - // Not in the base properties; check for pseudo-class overrides. - int property_count = properties.GetNumProperties(); - for (PseudoClassPropertyDictionary::const_iterator i = pseudo_class_properties.begin(); i != pseudo_class_properties.end(); ++i) - { - // Iterate over each pseudo-class set that has a definition for this property; if we find one that matches our - // pseudo-class, increment our index counter and either return that property (if we hit the requested index) or - // continue looking if we're still below it. - for (size_t j = 0; j < (*i).second.size(); ++j) - { - if (IsPseudoClassRuleApplicable((*i).second[j].first, pseudo_classes)) - { - property_count++; - if (property_count > index) - { - // Copy the list of pseudo-classes. - property_pseudo_classes.clear(); - for (size_t k = 0; k < (*i).second[j].first.size(); ++k) - property_pseudo_classes.insert((*i).second[j].first[k]); - - property_name = (*i).first; - property = &((*i).second[j].second); - ++index; - - return true; - } - else - { - break; - } - } - } - } - - return false; -} - -// Returns the list of the element definition's instanced decorators in the default state. -const DecoratorMap& ElementDefinition::GetDecorators() const -{ - return decorators; -} - -// Returns the map of pseudo-class names to overriding instanced decorators. -const PseudoClassDecoratorMap& ElementDefinition::GetPseudoClassDecorators() const -{ - return pseudo_class_decorators; -} - -// Appends this definition's font effects into a provided map of effects. -void ElementDefinition::GetFontEffects(FontEffectMap& applicable_font_effects, const PseudoClassList& pseudo_classes) const -{ - // Check each set of named effects, looking for applicable ones. - for (FontEffectIndex::const_iterator i = font_effect_index.begin(); i != font_effect_index.end(); ++i) - { - // Search through this list, finding the first effect that is valid (depending on - // pseudo-classes). - const PseudoClassFontEffectIndex& index = i->second; - for (size_t j = 0; j < index.size(); ++j) - { - if (IsPseudoClassRuleApplicable(index[j].first, pseudo_classes)) - { - // This is the most specific valid font effect this element has under the name. If - // the map of effects already has an effect with the same name, the effect with the - // highest specificity will prevail. - FontEffect* applicable_effect = font_effects[index[j].second]; - - FontEffectMap::iterator map_iterator = applicable_font_effects.find(i->first); - if (map_iterator == applicable_font_effects.end() || - map_iterator->second->GetSpecificity() < applicable_effect->GetSpecificity()) - applicable_font_effects[i->first] = applicable_effect; - - break; - } - } - } -} - -// Returns the volatility of a pseudo-class. -ElementDefinition::PseudoClassVolatility ElementDefinition::GetPseudoClassVolatility(const String& pseudo_class) const -{ - PseudoClassVolatilityMap::const_iterator i = pseudo_class_volatility.find(pseudo_class); - if (i == pseudo_class_volatility.end()) - return STABLE; - else - return i->second; -} - -// Returns true if this definition is built from nodes using structural selectors. -bool ElementDefinition::IsStructurallyVolatile() const -{ - return structurally_volatile; -} - -// Destroys the definition. -void ElementDefinition::OnReferenceDeactivate() -{ - delete this; -} - -// Finds all propery declarations for a group. -void ElementDefinition::BuildPropertyGroup(PropertyGroupMap& groups, const String& group_type, const PropertyDictionary& element_properties, const PropertyGroupMap* default_properties) -{ - String property_suffix = "-" + group_type; - - for (PropertyMap::const_iterator property_iterator = element_properties.GetProperties().begin(); property_iterator != element_properties.GetProperties().end(); ++property_iterator) - { - const String& property_name = (*property_iterator).first; - if (property_name.Length() > property_suffix.Length() && - strcasecmp(property_name.CString() + (property_name.Length() - property_suffix.Length()), property_suffix.CString()) == 0) - { - // We've found a group declaration! - String group_name = property_name.Substring(0, property_name.Length() - (group_type.Length() + 1)); - String group_class = (*property_iterator).second.value.Get< String >(); - PropertyDictionary* group_properties = NULL; - - // Check if we have an existing definition by this name; if so, we're only overriding the type. - PropertyGroupMap::iterator existing_definition = groups.find(group_name); - if (existing_definition != groups.end()) - { - (*existing_definition).second.first = group_class; - group_properties = &(*existing_definition).second.second; - } - else - { - // Check if we have any default decorator definitions, and if the new decorator has a default. If so, - // we make a copy of the default properties for the new decorator. - if (default_properties != NULL) - { - PropertyGroupMap::const_iterator default_definition = default_properties->find(group_name); - if (default_definition != default_properties->end()) - group_properties = &(*groups.insert(PropertyGroupMap::value_type(group_name, PropertyGroup(group_class, (*default_definition).second.second))).first).second.second; - } - - // If we still haven't got somewhere to put the properties for the new decorator, make a new - // definition. - if (group_properties == NULL) - group_properties = &(*groups.insert(PropertyGroupMap::value_type(group_name, PropertyGroup(group_class, PropertyDictionary()))).first).second.second; - } - - // Now find all of this decorator's properties. - BuildPropertyGroupDictionary(*group_properties, group_type, group_name, element_properties); - } - } - - // Now go through all the default decorator definitions and see if the new property list redefines any properties - // used by them. - if (default_properties != NULL) - { - for (PropertyGroupMap::const_iterator default_definition_iterator = default_properties->begin(); default_definition_iterator != default_properties->end(); ++default_definition_iterator) - { - const String& default_definition_name = (*default_definition_iterator).first; - - // Check the list of new definitions hasn't defined this decorator already; if so, it overrode the - // decorator type and so has inherited all the properties anyway. - if (groups.find(default_definition_name) == groups.end()) - { - // Nope! Make a copy of the decorator's properties and see if the new dictionary overrides any of the - // properties. - PropertyDictionary decorator_properties = (*default_definition_iterator).second.second; - if (BuildPropertyGroupDictionary(decorator_properties, group_type, default_definition_name, element_properties) > 0) - groups[default_definition_name] = PropertyGroup((*default_definition_iterator).second.first, decorator_properties); - } - } - } -} - -// Updates a property dictionary of all properties for a single group. -int ElementDefinition::BuildPropertyGroupDictionary(PropertyDictionary& group_properties, const String& ROCKET_UNUSED_PARAMETER(group_type), const String& group_name, const PropertyDictionary& element_properties) -{ - ROCKET_UNUSED(group_type); - - int num_properties = 0; - - for (PropertyMap::const_iterator property_iterator = element_properties.GetProperties().begin(); property_iterator != element_properties.GetProperties().end(); ++property_iterator) - { - const String& full_property_name = (*property_iterator).first; - if (full_property_name.Length() > group_name.Length() + 1 && - strncasecmp(full_property_name.CString(), group_name.CString(), group_name.Length()) == 0 && - full_property_name[group_name.Length()] == '-') - { - String property_name = full_property_name.Substring(group_name.Length() + 1); -// if (property_name == group_type) -// continue; - - group_properties.SetProperty(property_name, (*property_iterator).second); - num_properties++; - } - } - - return num_properties; -} - -// Builds decorator definitions from the parsed properties and instances decorators as appropriate. -void ElementDefinition::InstanceDecorators(const PseudoClassPropertyMap& merged_pseudo_class_properties) -{ - // Now we have the complete property list, we can compile decorator properties and instance as appropriate. - PropertyGroupMap decorator_definitions; - BuildPropertyGroup(decorator_definitions, "decorator", properties); - for (PropertyGroupMap::iterator i = decorator_definitions.begin(); i != decorator_definitions.end(); ++i) - InstanceDecorator((*i).first, (*i).second.first, (*i).second.second); - - // Now go through all the pseudo-class properties ... - for (PseudoClassPropertyMap::const_iterator pseudo_class_iterator = merged_pseudo_class_properties.begin(); pseudo_class_iterator != merged_pseudo_class_properties.end(); ++pseudo_class_iterator) - { - PropertyGroupMap pseudo_class_decorator_definitions; - BuildPropertyGroup(pseudo_class_decorator_definitions, "decorator", (*pseudo_class_iterator).second, &decorator_definitions); - for (PropertyGroupMap::iterator i = pseudo_class_decorator_definitions.begin(); i != pseudo_class_decorator_definitions.end(); ++i) - InstanceDecorator((*i).first, (*i).second.first, (*i).second.second, (*pseudo_class_iterator).first); - } -} - -// Attempts to instance a decorator into a given list. -bool ElementDefinition::InstanceDecorator(const String& name, const String& type, const PropertyDictionary& properties, const StringList& pseudo_classes) -{ - Decorator* decorator = Factory::InstanceDecorator(type, properties); - if (decorator == NULL) - { - Log::Message(Log::LT_WARNING, "Failed to instance decorator '%s' of type '%s'.", name.CString(), type.CString()); - return false; - } - - if (pseudo_classes.empty()) - { - if (decorator != NULL) - decorators[name] = decorator; - } - else - { - PseudoClassDecoratorMap::iterator i = pseudo_class_decorators.find(pseudo_classes); - if (i == pseudo_class_decorators.end()) - { - DecoratorMap decorators; - decorators[name] = decorator; - - pseudo_class_decorators[pseudo_classes] = decorators; - } - else - (*i).second[name] = decorator; - } - - return true; -} - -// Builds font effect definitions from the parsed properties and instances font effects as appropriate. -void ElementDefinition::InstanceFontEffects(const PseudoClassPropertyMap& merged_pseudo_class_properties) -{ - // Now we have the complete property list, we can compile font-effect properties and instance as appropriate. - PropertyGroupMap font_effect_definitions; - BuildPropertyGroup(font_effect_definitions, "font-effect", properties); - for (PropertyGroupMap::iterator i = font_effect_definitions.begin(); i != font_effect_definitions.end(); ++i) - InstanceFontEffect((*i).first, (*i).second.first, (*i).second.second); - - // Now go through all the pseudo-class properties ... - for (PseudoClassPropertyMap::const_iterator pseudo_class_iterator = merged_pseudo_class_properties.begin(); pseudo_class_iterator != merged_pseudo_class_properties.end(); ++pseudo_class_iterator) - { - PropertyGroupMap pseudo_class_font_effect_definitions; - BuildPropertyGroup(pseudo_class_font_effect_definitions, "font-effect", (*pseudo_class_iterator).second, &font_effect_definitions); - for (PropertyGroupMap::iterator i = pseudo_class_font_effect_definitions.begin(); i != pseudo_class_font_effect_definitions.end(); ++i) - InstanceFontEffect((*i).first, (*i).second.first, (*i).second.second, (*pseudo_class_iterator).first); - } -} - -// Attempts to instance a font effect. -bool ElementDefinition::InstanceFontEffect(const String& name, const String& type, const PropertyDictionary& properties, const StringList& pseudo_classes) -{ - FontEffect* font_effect = FontDatabase::GetFontEffect(type, properties); - if (font_effect == NULL) - { - Log::Message(Log::LT_WARNING, "Failed to instance font effect '%s' of type '%s'.", name.CString(), type.CString()); - return false; - } - - // Push the instanced effect into the list of effects. - int effect_index = (int) font_effects.size(); - font_effects.push_back(font_effect); - - // Get a reference to the index list we're adding this effect to. - PseudoClassFontEffectIndex* index = NULL; - FontEffectIndex::iterator index_iterator = font_effect_index.find(name); - if (index_iterator == font_effect_index.end()) - { - // No others; create a new index for this name. - index = &(font_effect_index.insert(FontEffectIndex::value_type(name, PseudoClassFontEffectIndex())).first->second); - } - else - { - index = &(index_iterator->second); - } - - // Add the new effect into the index. - PseudoClassFontEffectIndex::iterator insert_iterator; - for (insert_iterator = index->begin(); insert_iterator != index->end(); ++insert_iterator) - { - // Keep iterating until we find an effect whose specificity is below the new effect's. The - // new effect will be inserted before it in the list. - if (font_effects[insert_iterator->second]->GetSpecificity() < font_effect->GetSpecificity()) - break; - } - - index->insert(insert_iterator, PseudoClassFontEffectIndex::value_type(pseudo_classes, effect_index)); - - - // Mark the effect's pseudo-classes as volatile. - for (size_t i = 0; i < pseudo_classes.size(); ++i) - { - PseudoClassVolatilityMap::const_iterator j = pseudo_class_volatility.find(pseudo_classes[i]); - if (j == pseudo_class_volatility.end()) - pseudo_class_volatility[pseudo_classes[i]] = FONT_VOLATILE; - } - - - return true; -} - -// Returns true if the pseudo-class requirement of a rule is met by a list of an element's pseudo-classes. -bool ElementDefinition::IsPseudoClassRuleApplicable(const StringList& rule_pseudo_classes, const PseudoClassList& element_pseudo_classes) const -{ - for (StringList::size_type i = 0; i < rule_pseudo_classes.size(); ++i) - { - if (element_pseudo_classes.find(rule_pseudo_classes[i]) == element_pseudo_classes.end()) - return false; - } - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementDefinition.h b/libs/libRocket/Source/Core/ElementDefinition.h deleted file mode 100644 index b4d65a3e992..00000000000 --- a/libs/libRocket/Source/Core/ElementDefinition.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTDEFINITION_H -#define ROCKETCOREELEMENTDEFINITION_H - -#include "../../Include/Rocket/Core/Dictionary.h" -#include "../../Include/Rocket/Core/ReferenceCountable.h" -#include -#include -#include "../../Include/Rocket/Core/FontEffect.h" -#include "StyleSheetNode.h" - -namespace Rocket { -namespace Core { - -class Decorator; -class FontEffect; - -// Defines for the optimised version of the pseudo-class properties (note the difference from the -// PseudoClassPropertyMap defined in StyleSheetNode.h ... bit clumsy). Here the properties are stored as a list -// of definitions against each property name in specificity-order, along with the pseudo-class requirements for each -// one. This makes it much more straight-forward to query at run-time. -typedef std::pair< StringList, Property > PseudoClassProperty; -typedef std::vector< PseudoClassProperty > PseudoClassPropertyList; -typedef std::map< String, PseudoClassPropertyList > PseudoClassPropertyDictionary; - -typedef std::map< String, Decorator* > DecoratorMap; -typedef std::map< StringList, DecoratorMap > PseudoClassDecoratorMap; - -/** - @author Peter Curry - */ - -class ElementDefinition : public ReferenceCountable -{ -public: - enum PseudoClassVolatility - { - STABLE, // pseudo-class has no volatility - FONT_VOLATILE, // pseudo-class may impact on font effects - STRUCTURE_VOLATILE // pseudo-class may impact on definitions of child elements - }; - - ElementDefinition(); - virtual ~ElementDefinition(); - - /// Initialises the element definition from a list of style sheet nodes. - void Initialise(const std::vector< const StyleSheetNode* >& style_sheet_nodes, const PseudoClassList& volatile_pseudo_classes, bool structurally_volatile); - - /// Returns a specific property from the element definition's base properties. - /// @param[in] name The name of the property to return. - /// @param[in] pseudo_classes The pseudo-classes currently active on the calling element. - /// @return The property defined against the give name, or NULL if no such property was found. - const Property* GetProperty(const String& name, const PseudoClassList& pseudo_classes) const; - - /// Returns the list of properties this element definition defines for an element with the given set of - /// pseudo-classes. - /// @param[out] property_names The list to store the defined properties in. - /// @param[in] pseudo_classes The pseudo-classes defined on the querying element. - void GetDefinedProperties(PropertyNameList& property_names, const PseudoClassList& pseudo_classes) const; - /// Returns the list of properties this element definition has explicit definitions for involving the given - /// pseudo-class. - /// @param[out] property_names The list of store the newly defined / undefined properties in. - /// @param[in] pseudo_classes The list of pseudo-classes currently set on the element (post-change). - /// @param[in] pseudo_class The pseudo-class that was just activated or deactivated. - void GetDefinedProperties(PropertyNameList& property_names, const PseudoClassList& pseudo_classes, const String& pseudo_class) const; - - /// Iterates over the properties in the definition. - /// @param[inout] index Index of the property to fetch. This is incremented to the next valid index after the fetch. - /// @param[in] pseudo_classes The pseudo-classes defined on the querying element. - /// @param[out] property_pseudo_classes The pseudo-classes the property is defined by. - /// @param[out] property_name The name of the property at the specified index. - /// @param[out] property The property at the specified index. - /// @return True if a property was successfully fetched. - bool IterateProperties(int& index, const PseudoClassList& pseudo_classes, PseudoClassList& property_pseudo_classes, String& property_name, const Property*& property) const; - - /// Returns the list of the element definition's instanced decorators in the default state. - /// @return The list of instanced decorators. - const DecoratorMap& GetDecorators() const; - /// Returns the map of pseudo-class names to overriding instanced decorators. - /// @return The map of the overriding decorators for each pseudo-class. - const PseudoClassDecoratorMap& GetPseudoClassDecorators() const; - - /// Appends this definition's font effects (appropriately for the given pseudo classes) into a - /// provided map of effects. - /// @param[out] font_effects The outgoing map of font effects. - /// @param[in] pseudo_classes Pseudo-classes active on the querying element. - void GetFontEffects(FontEffectMap& font_effects, const PseudoClassList& pseudo_classes) const; - - /// Returns the volatility of a pseudo-class. - /// @param[in] pseudo_class The name of the pseudo-class to check for volatility. - /// @return The volatility of the pseudo-class. - PseudoClassVolatility GetPseudoClassVolatility(const String& pseudo_class) const; - - /// Returns true if this definition is built from nodes using structural selectors, and therefore is reliant on - /// siblings remaining stable. - /// @return True if this definition is structurally volatile. - bool IsStructurallyVolatile() const; - -protected: - /// Destroys the definition. - void OnReferenceDeactivate(); - -private: - typedef std::pair< String, PropertyDictionary > PropertyGroup; - typedef std::map< String, PropertyGroup > PropertyGroupMap; - - typedef std::vector< std::pair< StringList, int > > PseudoClassFontEffectIndex; - typedef std::map< String, PseudoClassFontEffectIndex > FontEffectIndex; - - typedef std::map< String, PseudoClassVolatility > PseudoClassVolatilityMap; - - // Finds all propery declarations for a group. - void BuildPropertyGroup(PropertyGroupMap& groups, const String& group_type, const PropertyDictionary& element_properties, const PropertyGroupMap* default_properties = NULL); - // Updates a property dictionary of all properties for a single group. - int BuildPropertyGroupDictionary(PropertyDictionary& group_properties, const String& group_type, const String& group_name, const PropertyDictionary& element_properties); - - // Builds decorator definitions from the parsed properties and instances decorators as - // appropriate. - void InstanceDecorators(const PseudoClassPropertyMap& merged_pseudo_class_properties); - // Attempts to instance a decorator. - bool InstanceDecorator(const String& name, const String& type, const PropertyDictionary& properties, const StringList& pseudo_class = StringList()); - - // Builds font effect definitions from the parsed properties and instances font effects as - // appropriate. - void InstanceFontEffects(const PseudoClassPropertyMap& merged_pseudo_class_properties); - // Attempts to instance a font effect. - bool InstanceFontEffect(const String& name, const String& type, const PropertyDictionary& properties, const StringList& pseudo_class = StringList()); - - // Returns true if the pseudo-class requirement of a rule is met by a list of an element's pseudo-classes. - bool IsPseudoClassRuleApplicable(const StringList& rule_pseudo_classes, const PseudoClassList& element_pseudo_classes) const; - - // The attributes for the default state of the element, with no pseudo-classes. - PropertyDictionary properties; - // The overridden attributes for the element's pseudo-classes. - PseudoClassPropertyDictionary pseudo_class_properties; - - // The instanced decorators for this element definition. - DecoratorMap decorators; - // The overridden decorators for the element's pseudo-classes. - PseudoClassDecoratorMap pseudo_class_decorators; - - // The list of every decorator used by this element in every class. - FontEffectList font_effects; - // For each unique decorator name, this stores (in order of specificity) the name of the - // pseudo-class that has a definition for it, and the index into the list of decorators. - FontEffectIndex font_effect_index; - - // The list of volatile pseudo-classes in this definition, and how volatile they are. - PseudoClassVolatilityMap pseudo_class_volatility; - - // True if this definition has the potential to change as sibling elements are added or removed. - bool structurally_volatile; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementDocument.cpp b/libs/libRocket/Source/Core/ElementDocument.cpp deleted file mode 100644 index 81dbf03d59e..00000000000 --- a/libs/libRocket/Source/Core/ElementDocument.cpp +++ /dev/null @@ -1,512 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ElementDocument.h" -#include "../../Include/Rocket/Core/StreamMemory.h" -#include "../../Include/Rocket/Core.h" -#include "DocumentHeader.h" -#include "ElementStyle.h" -#include "EventDispatcher.h" -#include "LayoutEngine.h" -#include "StreamFile.h" -#include "StyleSheetFactory.h" -#include "Template.h" -#include "TemplateCache.h" -#include "XMLParseTools.h" - -namespace Rocket { -namespace Core { - -ElementDocument::ElementDocument(const String& tag) : Element(tag) -{ - style_sheet = NULL; - context = NULL; - - modal = false; - layout_dirty = true; - lock_layout = 0; - - ForceLocalStackingContext(); - - SetProperty(POSITION, "absolute"); -} - -ElementDocument::~ElementDocument() -{ - if (style_sheet != NULL) - style_sheet->RemoveReference(); -} - -void ElementDocument::ProcessHeader(const DocumentHeader* document_header) -{ - // Store the source address that we came from - source_url = document_header->source; - - // Construct a new header and copy the template details across - DocumentHeader header; - header.MergePaths(header.template_resources, document_header->template_resources, document_header->source); - - // Merge in any templates, note a merge may cause more templates to merge - for (size_t i = 0; i < header.template_resources.size(); i++) - { - Template* merge_template = TemplateCache::LoadTemplate(URL(header.template_resources[i]).GetURL()); - - if (merge_template) - header.MergeHeader(*merge_template->GetHeader()); - else - Log::Message(Log::LT_WARNING, "Template %s not found", header.template_resources[i].CString()); - } - - // Merge the document's header last, as it is the most overriding. - header.MergeHeader(*document_header); - - // Set the title to the document title. - title = document_header->title; - - // If a style-sheet (or sheets) has been specified for this element, then we load them and set the combined sheet - // on the element; all of its children will inherit it by default. - StyleSheet* style_sheet = NULL; - if (header.rcss_external.size() > 0) - style_sheet = StyleSheetFactory::GetStyleSheet(header.rcss_external); - - // Combine any inline sheets. - if (header.rcss_inline.size() > 0) - { - for (size_t i = 0;i < header.rcss_inline.size(); i++) - { - StyleSheet* new_sheet = new StyleSheet(); - StreamMemory* stream = new StreamMemory((const byte*) header.rcss_inline[i].CString(), header.rcss_inline[i].Length()); - stream->SetSourceURL(document_header->source); - - if (new_sheet->LoadStyleSheet(stream)) - { - if (style_sheet) - { - StyleSheet* combined_sheet = style_sheet->CombineStyleSheet(new_sheet); - style_sheet->RemoveReference(); - new_sheet->RemoveReference(); - style_sheet = combined_sheet; - } - else - style_sheet = new_sheet; - } - else - new_sheet->RemoveReference(); - - stream->RemoveReference(); - } - } - - // If a style sheet is available, set it on the document and release it. - if (style_sheet) - { - SetStyleSheet(style_sheet); - style_sheet->RemoveReference(); - } - - // Load external scripts. - for (size_t i = 0; i < header.scripts_external.size(); i++) - { - StreamFile* stream = new StreamFile(); - if (stream->Open(header.scripts_external[i])) - LoadScript(stream, header.scripts_external[i]); - - stream->RemoveReference(); - } - - // Load internal scripts. - for (size_t i = 0; i < header.scripts_inline.size(); i++) - { - StreamMemory* stream = new StreamMemory((const byte*) header.scripts_inline[i].CString(), header.scripts_inline[i].Length()); - LoadScript(stream, ""); - stream->RemoveReference(); - } - - // Hide this document. - SetProperty(VISIBILITY, "hidden"); -} - -ElementDocument* ElementDocument::GetOwnerDocument() -{ - return this; -} - -// Returns the document's context. -Context* ElementDocument::GetContext() -{ - return context; -} - -// Sets the document's title. -void ElementDocument::SetTitle(const String& _title) -{ - title = _title; -} - -const String& ElementDocument::GetTitle() const -{ - return title; -} - -const String& ElementDocument::GetSourceURL() const -{ - return source_url; -} - -// Sets the style sheet this document, and all of its children, uses. -void ElementDocument::SetStyleSheet(StyleSheet* _style_sheet) -{ - if (style_sheet == _style_sheet) - return; - - if (style_sheet != NULL) - style_sheet->RemoveReference(); - - style_sheet = _style_sheet; - if (style_sheet != NULL) - { - style_sheet->AddReference(); - style_sheet->BuildNodeIndex(); - } - - GetStyle()->DirtyDefinition(); -} - -// Returns the document's style sheet. -StyleSheet* ElementDocument::GetStyleSheet() const -{ - return style_sheet; -} - -// Brings the document to the front of the document stack. -void ElementDocument::PullToFront() -{ - if (context != NULL) - context->PullDocumentToFront(this); -} - -// Sends the document to the back of the document stack. -void ElementDocument::PushToBack() -{ - if (context != NULL) - context->PushDocumentToBack(this); -} - -void ElementDocument::Show(int focus_flags) -{ - // Store the modal attribute - modal = (focus_flags & MODAL) > 0; - - // Set to visible and switch focus if necessary - SetProperty(VISIBILITY, "visible"); - if (focus_flags & FOCUS || focus_flags & MODAL) - { - // If no element could be focused, focus the window - if (!FocusNextTabElement(this, true)) - { - Focus(); - } - } - - DispatchEvent("show", Dictionary(), false); -} - -void ElementDocument::Hide() -{ - SetProperty(VISIBILITY, "hidden"); - DispatchEvent("hide", Dictionary(), false); -} - -// Close this document -void ElementDocument::Close() -{ - if (context != NULL) - context->UnloadDocument(this); -} - -Element* ElementDocument::CreateElement(const String& name) -{ - return Factory::InstanceElement(NULL, name, name, XMLAttributes()); -} - -// Create a text element. -ElementText* ElementDocument::CreateTextNode(const String& text) -{ - // Create the element. - Element* element = CreateElement("#text"); - if (!element) - { - Log::Message(Log::LT_ERROR, "Failed to create text element, instancer returned NULL."); - return NULL; - } - - // Cast up - ElementText* element_text = dynamic_cast< ElementText* >(element); - if (!element_text) - { - Log::Message(Log::LT_ERROR, "Failed to create text element, instancer didn't return a derivative of ElementText."); - element->RemoveReference(); - return NULL; - } - - // Set the text - element_text->SetText(text); - - return element_text; -} - -// Is the current document modal -bool ElementDocument::IsModal() const -{ - return modal; -} - -// Default load script implementation -void ElementDocument::LoadScript(Stream* ROCKET_UNUSED_PARAMETER(stream), const String& ROCKET_UNUSED_PARAMETER(source_name)) -{ - ROCKET_UNUSED(stream); - ROCKET_UNUSED(source_name); -} - -// Updates the layout if necessary. -void ElementDocument::_UpdateLayout() -{ - lock_layout++; - - Vector2f containing_block(0, 0); - if (GetParentNode() != NULL) - containing_block = GetParentNode()->GetBox().GetSize(); - - LayoutEngine layout_engine; - layout_engine.FormatElement(this, containing_block); - - lock_layout--; - layout_dirty = false; -} - -// Updates the position of the document based on the style properties. -void ElementDocument::UpdatePosition() -{ - // We are only positioned relative to our parent, so if we're not parented we may as well bail now. - if (GetParentNode() == NULL) - return; - - Vector2f position; - // Work out our containing block; relative offsets are calculated against it. - Vector2f containing_block = GetParentNode()->GetBox().GetSize(Box::CONTENT); - - const Property *left = GetLocalProperty(LEFT); - const Property *right = GetLocalProperty(RIGHT); - if (left != NULL && left->unit != Property::KEYWORD) - position.x = ResolveProperty(LEFT, containing_block.x); - else if (right != NULL && right->unit != Property::KEYWORD) - position.x = (containing_block.x - GetBox().GetSize(Box::MARGIN).x) - ResolveProperty(RIGHT, containing_block.x); - else - position.x = GetBox().GetEdge(Box::MARGIN, Box::LEFT); - - const Property *top = GetLocalProperty(TOP); - const Property *bottom = GetLocalProperty(BOTTOM); - if (top != NULL && top->unit != Property::KEYWORD) - position.y = ResolveProperty(TOP, containing_block.y); - else if (bottom != NULL && bottom->unit != Property::KEYWORD) - position.y = (containing_block.y - GetBox().GetSize(Box::MARGIN).y) - ResolveProperty(BOTTOM, containing_block.y); - else - position.y = GetBox().GetEdge(Box::MARGIN, Box::TOP); - - SetOffset(position, NULL); -} - -void ElementDocument::LockLayout(bool lock) -{ - if (lock) - lock_layout++; - else - lock_layout--; - - ROCKET_ASSERT(lock_layout >= 0); -} - -void ElementDocument::DirtyLayout() -{ - layout_dirty = true; -} - -bool ElementDocument::IsLayoutDirty() -{ - return layout_dirty; -} - -// Refreshes the document layout if required. -void ElementDocument::OnUpdate() -{ - UpdateLayout(); -} - -// Repositions the document if necessary. -void ElementDocument::OnPropertyChange(const PropertyNameList& changed_properties) -{ - Element::OnPropertyChange(changed_properties); - - // If the document's font-size has been changed, we need to dirty all rem properties. - if (changed_properties.find(FONT_SIZE) != changed_properties.end()) - GetStyle()->DirtyRemProperties(); - - if (changed_properties.find(TOP) != changed_properties.end() || - changed_properties.find(RIGHT) != changed_properties.end() || - changed_properties.find(BOTTOM) != changed_properties.end() || - changed_properties.find(LEFT) != changed_properties.end()) - UpdatePosition(); -} - -// Processes the 'onpropertychange' event, checking for a change in position or size. -void ElementDocument::ProcessEvent(Event& event) -{ - Element::ProcessEvent(event); - - // Process generic keyboard events for this window in capture phase - if (event.GetPhase() == Event::PHASE_BUBBLE && event == KEYDOWN) - { - int key_identifier = event.GetParameter("key_identifier", Input::KI_UNKNOWN); - - // Process TAB - if (key_identifier == Input::KI_TAB) - { - FocusNextTabElement(event.GetTargetElement(), !event.GetParameter("shift_key", false)); - } - // Process ENTER being pressed on a focusable object (emulate click) - else if (key_identifier == Input::KI_RETURN || - key_identifier == Input::KI_NUMPADENTER) - { - Element* focus_node = GetFocusLeafNode(); - - if (focus_node && focus_node->GetProperty(TAB_INDEX) == TAB_INDEX_AUTO) - { - focus_node->Click(); - } - } - } - else if (event.GetTargetElement() == this) - { - if (event == RESIZE) - UpdatePosition(); - } -} - -// Find the next element to focus, starting at the current element -// -// This algorithm is quite sneaky, I originally thought a depth first search would -// work, but it appears not. What is required is to cut the tree in half along the nodes -// from current_element up the root and then either traverse the tree in a clockwise or -// anticlock wise direction depending if you're searching forward or backward respectively -bool ElementDocument::FocusNextTabElement(Element* current_element, bool forward) -{ - // If we're searching forward, check the immediate children of this node first off - if (forward) - { - for (int i = 0; i < current_element->GetNumChildren(); i++) - if (SearchFocusSubtree(current_element->GetChild(i), forward)) - return true; - } - - // Now walk up the tree, testing either the bottom or top - // of the tree, depending on whether we're going forwards - // or backwards respectively - // - // If we make it all the way up to the document, then - // we search the entire tree (to loop back round) - bool search_enabled = false; - Element* document = current_element->GetOwnerDocument(); - Element* child = current_element; - Element* parent = current_element->GetParentNode(); - while (child != document) - { - for (int i = 0; i < parent->GetNumChildren(); i++) - { - // Calculate index into children - int child_index = i; - if (!forward) - child_index = parent->GetNumChildren() - i - 1; - Element* search_child = parent->GetChild(child_index); - - // Do a search if its enabled - if (search_enabled && SearchFocusSubtree(search_child, forward)) - return true; - - // If we find the child, enable searching - if (search_child == child) - search_enabled = true; - } - - // Advance up the tree - child = parent; - parent = parent->GetParentNode(); - - // If we hit the top, enable searching the entire tree - if (parent == document) - search_enabled = true; - else // otherwise enable searching if we're going backward and disable if we're going forward - search_enabled = false; - } - - return false; -} - -bool ElementDocument::SearchFocusSubtree(Element* element, bool forward) -{ - // Skip disabled elements - if (element->IsPseudoClassSet("disabled")) - { - return false; - } - if (!element->IsVisible()) - { - return false; - } - - // Check if this is the node we're looking for - if (element->GetProperty(TAB_INDEX) == TAB_INDEX_AUTO) - { - element->Focus(); - return true; - } - - // Check all children - for (int i = 0; i < element->GetNumChildren(); i++) - { - int child_index = i; - if (!forward) - child_index = element->GetNumChildren() - i - 1; - if (SearchFocusSubtree(element->GetChild(child_index), forward)) - return true; - } - - return false; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementHandle.cpp b/libs/libRocket/Source/Core/ElementHandle.cpp deleted file mode 100644 index 2795dd91fa3..00000000000 --- a/libs/libRocket/Source/Core/ElementHandle.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementHandle.h" -#include "../../Include/Rocket/Core/ElementDocument.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/Event.h" - -namespace Rocket { -namespace Core { - -ElementHandle::ElementHandle(const String& tag) : Element(tag), drag_start(0, 0) -{ - // Make sure we can be dragged! - SetProperty(DRAG, DRAG); - - move_target = NULL; - size_target = NULL; - initialised = false; -} - -ElementHandle::~ElementHandle() -{ -} - -void ElementHandle::OnAttributeChange(const PropertyNameList& changed_attributes) -{ - Element::OnAttributeChange(changed_attributes); - - // Reset initialised state if the move or size targets have changed. - if (changed_attributes.find("move_target") != changed_attributes.end() || - changed_attributes.find("size_target") != changed_attributes.end()) - { - initialised = false; - move_target = NULL; - size_target = NULL; - } -} - -void ElementHandle::ProcessEvent(Event& event) -{ - Element::ProcessEvent(event); - - if (event.GetTargetElement() == this) - { - // Lazy initialisation. - if (!initialised && GetOwnerDocument()) - { - String move_target_name = GetAttribute("move_target", ""); - if (!move_target_name.Empty()) - move_target = GetElementById(move_target_name); - - String size_target_name = GetAttribute("size_target", ""); - if (!size_target_name.Empty()) - size_target = GetElementById(size_target_name); - - initialised = true; - } - - if (event == DRAGSTART) - { - // Store the drag starting position - drag_start.x = event.GetParameter< int >("mouse_x", 0); - drag_start.y = event.GetParameter< int >("mouse_y", 0); - - // Store current element position and size - if (move_target) - { - move_original_position.x = move_target->GetOffsetLeft(); - move_original_position.y = move_target->GetOffsetTop(); - } - if (size_target) - size_original_size = size_target->GetBox().GetSize(Box::CONTENT); - } - else if (event == DRAG) - { - // Work out the delta - int x = event.GetParameter< int >("mouse_x", 0) - drag_start.x; - int y = event.GetParameter< int >("mouse_y", 0) - drag_start.y; - - // Update the move and size objects - if (move_target) - { - move_target->SetProperty(LEFT, Property(Math::RealToInteger(move_original_position.x + x), Property::PX)); - move_target->SetProperty(TOP, Property(Math::RealToInteger(move_original_position.y + y), Property::PX)); - } - - if (size_target) - { - const Property *margin_top, *margin_bottom, *margin_left, *margin_right; - size_target->GetMarginProperties(&margin_top, &margin_bottom, &margin_left, &margin_right); - - // Check if we have auto-margins; if so, they have to be set to the current margins. - if (margin_top->unit == Property::KEYWORD) - size_target->SetProperty(MARGIN_TOP, Property((float) Math::RealToInteger(size_target->GetBox().GetEdge(Box::MARGIN, Box::TOP)), Property::PX)); - if (margin_right->unit == Property::KEYWORD) - size_target->SetProperty(MARGIN_RIGHT, Property((float) Math::RealToInteger(size_target->GetBox().GetEdge(Box::MARGIN, Box::RIGHT)), Property::PX)); - if (margin_bottom->unit == Property::KEYWORD) - size_target->SetProperty(MARGIN_BOTTOM, Property((float) Math::RealToInteger(size_target->GetBox().GetEdge(Box::MARGIN, Box::BOTTOM)), Property::PX)); - if (margin_left->unit == Property::KEYWORD) - size_target->SetProperty(MARGIN_LEFT, Property((float) Math::RealToInteger(size_target->GetBox().GetEdge(Box::MARGIN, Box::LEFT)), Property::PX)); - - int new_x = Math::RealToInteger(size_original_size.x + x); - int new_y = Math::RealToInteger(size_original_size.y + y); - - size_target->SetProperty(WIDTH, Property(Math::Max< float >((float) new_x, 0), Property::PX)); - size_target->SetProperty(HEIGHT, Property(Math::Max< float >((float) new_y, 0), Property::PX)); - } - - Dictionary parameters; - parameters.Set("handle_x", x); - parameters.Set("handle_y", y); - DispatchEvent("handledrag", parameters); - } - } -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementHandle.h b/libs/libRocket/Source/Core/ElementHandle.h deleted file mode 100644 index 2b0d5cc826b..00000000000 --- a/libs/libRocket/Source/Core/ElementHandle.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTHANDLE_H -#define ROCKETCOREELEMENTHANDLE_H - -#include "../../Include/Rocket/Core/Header.h" -#include "../../Include/Rocket/Core/Element.h" - -namespace Rocket { -namespace Core { - -/** - A derivation of an element for use as a mouse handle. A handle is designed to be instanced and attached as a non- - DOM element to a window-style element, and listened to for movement events which can be responsed to to move or - resize the element as appropriate. - - @author Peter Curry - */ - -class ROCKETCORE_API ElementHandle : public Element -{ -public: - ElementHandle(const String& tag); - virtual ~ElementHandle(); - -protected: - virtual void OnAttributeChange(const AttributeNameList& changed_attributes); - virtual void ProcessEvent(Event& event); - - Vector2i drag_start; - Vector2f move_original_position; - Vector2f size_original_size; - - Element* move_target; - Element* size_target; - - bool initialised; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementImage.cpp b/libs/libRocket/Source/Core/ElementImage.cpp deleted file mode 100644 index 608c9ff7a38..00000000000 --- a/libs/libRocket/Source/Core/ElementImage.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementImage.h" -#include "../../Include/Rocket/Core.h" -#include "TextureDatabase.h" -#include "TextureResource.h" - -namespace Rocket { -namespace Core { - -// Constructs a new ElementImage. -ElementImage::ElementImage(const String& tag) : Element(tag), dimensions(-1, -1), geometry(this) -{ - ResetCoords(); - geometry_dirty = false; - texture_dirty = true; -} - -ElementImage::~ElementImage() -{ -} - -// Sizes the box to the element's inherent size. -bool ElementImage::GetIntrinsicDimensions(Vector2f& _dimensions) -{ - // Check if we need to reload the texture. - if (texture_dirty) - LoadTexture(); - - // Calculate the x dimension. - if (HasAttribute("width")) - dimensions.x = GetAttribute< float >("width", -1); - else if (using_coords) - dimensions.x = (float) (coords[2] - coords[0]); - else - dimensions.x = (float) texture.GetDimensions(GetRenderInterface()).x; - - // Calculate the y dimension. - if (HasAttribute("height")) - dimensions.y = GetAttribute< float >("height", -1); - else if (using_coords) - dimensions.y = (float) (coords[3] - coords[1]); - else - dimensions.y = (float) texture.GetDimensions(GetRenderInterface()).y; - - // Return the calculated dimensions. If this changes the size of the element, it will result in - // a 'resize' event which is caught below and will regenerate the geometry. - _dimensions = dimensions; - return true; -} - -// Renders the element. -void ElementImage::OnRender() -{ - // Regenerate the geometry if required (this will be set if 'coords' changes but does not - // result in a resize). - if (geometry_dirty) - GenerateGeometry(); - - // Render the geometry beginning at this element's content region. - geometry.Render(GetAbsoluteOffset(Rocket::Core::Box::CONTENT)); -} - -// Called when attributes on the element are changed. -void ElementImage::OnAttributeChange(const Rocket::Core::AttributeNameList& changed_attributes) -{ - // Call through to the base element's OnAttributeChange(). - Rocket::Core::Element::OnAttributeChange(changed_attributes); - - float dirty_layout = false; - - // Check for a changed 'src' attribute. If this changes, the old texture handle is released, - // forcing a reload when the layout is regenerated. - if (changed_attributes.find("src") != changed_attributes.end()) - { - texture_dirty = true; - dirty_layout = true; - } - - // Check for a changed 'width' attribute. If this changes, a layout is forced which will - // recalculate the dimensions. - if (changed_attributes.find("width") != changed_attributes.end() || - changed_attributes.find("height") != changed_attributes.end()) - { - dirty_layout = true; - } - - // Check for a change to the 'coords' attribute. If this changes, the coordinates are - // recomputed and a layout forced. - if (changed_attributes.find("coords") != changed_attributes.end()) - { - if (HasAttribute("coords")) - { - StringList coords_list; - StringUtilities::ExpandString(coords_list, GetAttribute< String >("coords", "")); - - if (coords_list.size() != 4) - { - Rocket::Core::Log::Message(Log::LT_WARNING, "Element '%s' has an invalid 'coords' attribute; coords requires 4 values, found %d.", GetAddress().CString(), coords_list.size()); - ResetCoords(); - } - else - { - for (size_t i = 0; i < 4; ++i) - coords[i] = atoi(coords_list[i].CString()); - - // Check for the validity of the coordinates. - if (coords[0] < 0 || coords[2] < coords[0] || - coords[1] < 0 || coords[3] < coords[1]) - { - Rocket::Core::Log::Message(Log::LT_WARNING, "Element '%s' has an invalid 'coords' attribute; invalid coordinate values specified.", GetAddress().CString()); - ResetCoords(); - } - else - { - // We have new, valid coordinates; force the geometry to be regenerated. - geometry_dirty = true; - using_coords = true; - } - } - } - else - ResetCoords(); - - // Coordinates have changes; this will most likely result in a size change, so we need to force a layout. - dirty_layout = true; - } - - if (dirty_layout) - DirtyLayout(); -} - -// called when element properites are changed -void ElementImage::OnPropertyChange(const PropertyNameList& changed_properties) -{ - Rocket::Core::Element::OnPropertyChange(changed_properties); - - // Check if color property has been changed. - if (changed_properties.find(COLOR) != changed_properties.end() ) - { - geometry_dirty = true; - } - - // Check if opacity has been changed - if (changed_properties.find(OPACITY) != changed_properties.end() ) - { - geometry_dirty = true; - } -} - -// Regenerates the element's geometry. -void ElementImage::ProcessEvent(Rocket::Core::Event& event) -{ - Element::ProcessEvent(event); - - if (event.GetTargetElement() == this && - event == RESIZE) - { - GenerateGeometry(); - } -} - -void ElementImage::GenerateGeometry() -{ - // Release the old geometry before specifying the new vertices. - geometry.Release(true); - - std::vector< Rocket::Core::Vertex >& vertices = geometry.GetVertices(); - std::vector< int >& indices = geometry.GetIndices(); - - vertices.resize(4); - indices.resize(6); - - Colourb color = GetProperty(COLOR)->value.Get< Colourb >(); - - float alpha = GetProperty(OPACITY)->value.Get< float >(); - color.alpha *= alpha; - - // Generate the texture coordinates. - Vector2f texcoords[2]; - if (using_coords) - { - Vector2f texture_dimensions((float) texture.GetDimensions(GetRenderInterface()).x, (float) texture.GetDimensions(GetRenderInterface()).y); - if (texture_dimensions.x == 0) - texture_dimensions.x = 1; - if (texture_dimensions.y == 0) - texture_dimensions.y = 1; - - texcoords[0].x = (float) coords[0] / texture_dimensions.x; - texcoords[0].y = (float) coords[1] / texture_dimensions.y; - - texcoords[1].x = (float) coords[2] / texture_dimensions.x; - texcoords[1].y = (float) coords[3] / texture_dimensions.y; - } - else - { - texcoords[0] = Vector2f(0, 0); - texcoords[1] = Vector2f(1, 1); - } - - Rocket::Core::GeometryUtilities::GenerateQuad(&vertices[0], // vertices to write to - &indices[0], // indices to write to - Vector2f(0, 0), // origin of the quad - GetBox().GetSize(Rocket::Core::Box::CONTENT), // size of the quad - color, // colour of the vertices - texcoords[0], // top-left texture coordinate - texcoords[1]); // top-right texture coordinate - - geometry_dirty = false; -} - -bool ElementImage::LoadTexture() -{ - texture_dirty = false; - - // Get the source URL for the image. - String image_source = GetAttribute< String >("src", ""); - if (image_source.Empty()) - return false; - - geometry_dirty = true; - - Rocket::Core::ElementDocument* document = GetOwnerDocument(); - URL source_url(document == NULL ? "" : document->GetSourceURL()); - - if (!texture.Load(image_source, source_url.GetPath())) - { - geometry.SetTexture(NULL); - return false; - } - - // Set the texture onto our geometry object. - geometry.SetTexture(&texture); - return true; -} - -void ElementImage::ResetCoords() -{ - using_coords = false; - - for (int i = 0; i < 4; ++i) - coords[i] = -1; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementImage.h b/libs/libRocket/Source/Core/ElementImage.h deleted file mode 100644 index d8d5eb5b01f..00000000000 --- a/libs/libRocket/Source/Core/ElementImage.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTIMAGE_H -#define ROCKETCOREELEMENTIMAGE_H - -#include "../../Include/Rocket/Core/Header.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Geometry.h" -#include "../../Include/Rocket/Core/Texture.h" - -namespace Rocket { -namespace Core { - -class TextureResource; - -/** - The 'img' element. The image element can have a rectangular sub-region of its source texture - specified with the 'coords' attribute; the element will render this region rather than the - entire image. - - The 'coords' attribute is similar to that of the HTML imagemap. It takes four comma-separated - integer values, specifying the top-left and the bottom right of the region in - pixel-coordinates, in that order. So for example, the attribute "coords" = "0, 10, 100, 210" - will render a 100 x 200 region, beginning at (0, 10) and rendering through to (100, 210). No - clamping to the dimensions of the source image will occur; rendered results in this case will - depend on the texture addressing mode. - - The intrinsic dimensions of the image can now come from three different sources. They are - used in the following order: - - 1) 'width' / 'height' attributes if present - 2) pixel width / height given by the 'coords' attribute - 3) width / height of the source texture - - This has the result of sizing the element to the pixel-size of the rendered image, unless - overridden by the 'width' or 'height' attributes. - - @author Peter Curry - */ - -class ROCKETCORE_API ElementImage : public Element -{ -public: - /// Constructs a new ElementImage. This should not be called directly; use the Factory instead. - /// @param[in] tag The tag the element was declared as in RML. - ElementImage(const String& tag); - virtual ~ElementImage(); - - /// Returns the element's inherent size. - /// @param[out] The element's intrinsic dimensions. - /// @return True. - bool GetIntrinsicDimensions(Vector2f& dimensions); - -protected: - /// Renders the image. - virtual void OnRender(); - - /// Checks for changes to the image's source or dimensions. - /// @param[in] changed_attributes A list of attributes changed on the element. - virtual void OnAttributeChange(const AttributeNameList& changed_attributes); - virtual void OnPropertyChange(const PropertyNameList& changed_properties); - - /// Regenerates the element's geometry on a resize event. - /// @param[in] event The event to process. - virtual void ProcessEvent(Event& event); - -private: - // Generates the element's geometry. - void GenerateGeometry(); - // Loads the element's texture, as specified by the 'src' attribute. - bool LoadTexture(); - // Resets the values of the 'coords' attribute to mark them as unused. - void ResetCoords(); - - // The texture this element is rendering from. - Texture texture; - // True if we need to refetch the texture's source from the element's attributes. - bool texture_dirty; - // The element's computed intrinsic dimensions. If either of these values are set to -1, then - // that dimension has not been computed yet. - Vector2f dimensions; - - // The integer coords extracted from the 'coords' attribute. using_coords will be false if - // these have not been specified or are invalid. - int coords[4]; - bool using_coords; - - // The geometry used to render this element. - Geometry geometry; - bool geometry_dirty; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementInstancer.cpp b/libs/libRocket/Source/Core/ElementInstancer.cpp deleted file mode 100644 index 0162faa39fd..00000000000 --- a/libs/libRocket/Source/Core/ElementInstancer.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ElementInstancer.h" -#include "XMLParseTools.h" - -namespace Rocket { -namespace Core { - -ElementInstancer::~ElementInstancer() -{ -} - -void ElementInstancer::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementReference.cpp b/libs/libRocket/Source/Core/ElementReference.cpp deleted file mode 100644 index 81839fbeb8f..00000000000 --- a/libs/libRocket/Source/Core/ElementReference.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ElementReference.h" -#include "../../Include/Rocket/Core/Element.h" - -namespace Rocket { -namespace Core { - -ElementReference::ElementReference(Element* _element) -{ - element = NULL; - *this = _element; -} - -ElementReference::ElementReference(const ElementReference& copy) -{ - element = NULL; - *this = copy; -} - -ElementReference::~ElementReference() -{ - *this = NULL; -} - -// Returns true if this reference is bound to an element. -ElementReference::operator bool() const -{ - return (element != NULL); -} - -// Assigns a new element for this reference to point to. -ElementReference& ElementReference::operator=(Element* _element) -{ - if (_element != NULL) - _element->AddReference(); - - if (element != NULL) - element->RemoveReference(); - - element = _element; - return *this; -} - -// Assigns a new element for this reference, from another reference. -ElementReference& ElementReference::operator=(const ElementReference& element_reference) -{ - *this = (element_reference.element); - return *this; -} - -// Returns a reference to the underlying element. -Element* ElementReference::operator*() -{ - return element; -} - -// Returns a reference to the underlying element. -Element* ElementReference::operator->() -{ - return element; -} - -// Equality operator for the reference. Used for STL containers. -bool ElementReference::operator==(const ElementReference& rhs) const -{ - return element == rhs.element; -} - -// Equality operator for the reference. -bool ElementReference::operator==(const Element* rhs) const -{ - return element == rhs; -} - -// Less-than operator for the reference. Used for STL containers. -bool ElementReference::operator<(const ElementReference& rhs) const -{ - return element < rhs.element; -} - -// Inequality operator for the reference. -bool ElementReference::operator!=(const ElementReference& rhs) const -{ - return element != rhs.element; -} - -// Inequality operator for the reference. -bool ElementReference::operator!=(const Element* rhs) const -{ - return element != rhs; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementScroll.cpp b/libs/libRocket/Source/Core/ElementScroll.cpp deleted file mode 100644 index bd0338452b8..00000000000 --- a/libs/libRocket/Source/Core/ElementScroll.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ElementScroll.h" -#include "LayoutEngine.h" -#include "WidgetSliderScroll.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/Factory.h" - -namespace Rocket { -namespace Core { - -ElementScroll::ElementScroll(Element* _element) -{ - element = _element; - corner = NULL; -} - -ElementScroll::~ElementScroll() -{ - for (int i = 0; i < 2; i++) - { - if (scrollbars[i].element != NULL) - scrollbars[i].element->RemoveEventListener("scrollchange", this); - } -} - -// Updates the increment / decrement arrows. -void ElementScroll::Update() -{ - for (int i = 0; i < 2; i++) - { - if (scrollbars[i].widget != NULL) - scrollbars[i].widget->Update(); - } -} - -// Enables and sizes one of the scrollbars. -void ElementScroll::EnableScrollbar(Orientation orientation, float element_width) -{ - if (!scrollbars[orientation].enabled) - { - CreateScrollbar(orientation); - scrollbars[orientation].element->SetProperty(VISIBILITY, "visible"); - scrollbars[orientation].enabled = true; - } - - // Determine the size of the scrollbar. - Box box; - LayoutEngine::BuildBox(box, Vector2f(element_width, element_width), scrollbars[orientation].element); - - if (orientation == VERTICAL) - scrollbars[orientation].size = box.GetSize(Box::MARGIN).x; - if (orientation == HORIZONTAL) - { - if (box.GetSize().y < 0) - scrollbars[orientation].size = box.GetCumulativeEdge(Box::CONTENT, Box::LEFT) + - box.GetCumulativeEdge(Box::CONTENT, Box::RIGHT) + - scrollbars[orientation].element->ResolveProperty(HEIGHT, element_width); - else - scrollbars[orientation].size = box.GetSize(Box::MARGIN).y; - } -} - -// Disables and hides one of the scrollbars. -void ElementScroll::DisableScrollbar(Orientation orientation) -{ - if (scrollbars[orientation].enabled) - { - scrollbars[orientation].element->SetProperty(VISIBILITY, "hidden"); - scrollbars[orientation].enabled = false; - } -} - -// Updates the position of the scrollbar. -void ElementScroll::UpdateScrollbar(Orientation orientation) -{ - float bar_position; - float traversable_track; - if (orientation == VERTICAL) - { - bar_position = element->GetScrollTop(); - traversable_track = element->GetScrollHeight() - element->GetClientHeight(); - } - else - { - bar_position = element->GetScrollLeft(); - traversable_track = element->GetScrollWidth() - element->GetClientWidth(); - } - - if (traversable_track <= 0) - bar_position = 0; - else - bar_position /= traversable_track; - - if (scrollbars[orientation].widget != NULL) - { - bar_position = Math::Clamp(bar_position, 0.0f, 1.0f); - - if (scrollbars[orientation].widget->GetBarPosition() != bar_position) - scrollbars[orientation].widget->SetBarPosition(bar_position); - } -} - -// Returns one of the scrollbar elements. -Element* ElementScroll::GetScrollbar(Orientation orientation) -{ - return scrollbars[orientation].element; -} - -// Returns the size, in pixels, of one of the scrollbars; for a vertical scrollbar, this is width, for a horizontal scrollbar, this is height. -float ElementScroll::GetScrollbarSize(Orientation orientation) -{ - if (!scrollbars[orientation].enabled) - return 0; - - return scrollbars[orientation].size; -} - -// Formats the enabled scrollbars based on the current size of the host element. -void ElementScroll::FormatScrollbars() -{ - Vector2f containing_block = element->GetBox().GetSize(Box::PADDING); - - for (int i = 0; i < 2; i++) - { - if (!scrollbars[i].enabled) - continue; - - if (i == VERTICAL) - { - scrollbars[i].widget->SetBarLength(element->GetClientHeight()); - scrollbars[i].widget->SetTrackLength(element->GetScrollHeight()); - - float traversable_track = element->GetScrollHeight() - element->GetClientHeight(); - if (traversable_track > 0) - scrollbars[i].widget->SetBarPosition(element->GetScrollTop() / traversable_track); - else - scrollbars[i].widget->SetBarPosition(0); - } - else - { - scrollbars[i].widget->SetBarLength(element->GetClientWidth()); - scrollbars[i].widget->SetTrackLength(element->GetScrollWidth()); - - float traversable_track = element->GetScrollWidth() - element->GetClientWidth(); - if (traversable_track > 0) - scrollbars[i].widget->SetBarPosition(element->GetScrollLeft() / traversable_track); - else - scrollbars[i].widget->SetBarPosition(0); - } - - float slider_length = containing_block[1 - i]; - float user_scrollbar_margin = scrollbars[i].element->ResolveProperty(SCROLLBAR_MARGIN, slider_length); - float min_scrollbar_margin = GetScrollbarSize(i == VERTICAL ? HORIZONTAL : VERTICAL); - slider_length -= Math::Max(user_scrollbar_margin, min_scrollbar_margin); - - scrollbars[i].widget->FormatElements(containing_block, slider_length); - scrollbars[i].widget->SetLineHeight((float) ElementUtilities::GetLineHeight(element)); - - int variable_axis = i == VERTICAL ? 0 : 1; - Vector2f offset = element->GetBox().GetPosition(Box::PADDING); - offset[variable_axis] += containing_block[variable_axis] - (scrollbars[i].element->GetBox().GetSize(Box::BORDER)[variable_axis] + scrollbars[i].element->GetBox().GetEdge(Box::MARGIN, i == VERTICAL ? Box::RIGHT : Box::BOTTOM)); - // Add the top or left margin (as appropriate) onto the scrollbar's position. - offset[1 - variable_axis] += scrollbars[i].element->GetBox().GetEdge(Box::MARGIN, i == VERTICAL ? Box::TOP : Box::LEFT); - scrollbars[i].element->SetOffset(offset, element, true); - } - - // Format the corner, if it is necessary. - if (scrollbars[0].enabled && - scrollbars[1].enabled) - { - CreateCorner(); - - Box corner_box; - corner_box.SetContent(Vector2f(scrollbars[VERTICAL].size, scrollbars[HORIZONTAL].size)); - corner->SetBox(corner_box); - corner->SetOffset(containing_block - Vector2f(scrollbars[VERTICAL].size, scrollbars[HORIZONTAL].size), element, true); - - corner->SetProperty(VISIBILITY, "visible"); - } - else - { - if (corner != NULL) - corner->SetProperty(VISIBILITY, "hidden"); - } -} - -// Handles the 'onchange' events for the scrollbars. -void ElementScroll::ProcessEvent(Event& event) -{ - if (event == "scrollchange") - { - float value = event.GetParameter< float >("value", 0); - - if (event.GetTargetElement() == scrollbars[VERTICAL].element) - element->SetScrollTop(value * (element->GetScrollHeight() - element->GetClientHeight())); - else - element->SetScrollLeft(value * (element->GetScrollWidth() - element->GetClientWidth())); - } -} - -// Creates one of the scroll component's scrollbar. -bool ElementScroll::CreateScrollbar(Orientation orientation) -{ - if (scrollbars[orientation].element != NULL && - scrollbars[orientation].widget != NULL) - return true; - - scrollbars[orientation].element = Factory::InstanceElement(element, "*", orientation == VERTICAL ? "scrollbarvertical" : "scrollbarhorizontal", XMLAttributes()); - scrollbars[orientation].element->AddEventListener("scrollchange", this); - scrollbars[orientation].element->SetProperty(CLIP, "1"); - - scrollbars[orientation].widget = new WidgetSliderScroll(scrollbars[orientation].element); - scrollbars[orientation].widget->Initialise(orientation == VERTICAL ? WidgetSlider::VERTICAL : WidgetSlider::HORIZONTAL); - - element->AppendChild(scrollbars[orientation].element, false); - scrollbars[orientation].element->RemoveReference(); - - return true; -} - -// Creates the scrollbar corner. -bool ElementScroll::CreateCorner() -{ - if (corner != NULL) - return true; - - corner = Factory::InstanceElement(element, "*", "scrollbarcorner", XMLAttributes()); - element->AppendChild(corner, false); - corner->RemoveReference(); - - return true; -} - -ElementScroll::Scrollbar::Scrollbar() -{ - element = NULL; - widget = NULL; - enabled = false; - size = 0; -} - -ElementScroll::Scrollbar::~Scrollbar() -{ - if (widget != NULL) - delete widget; - - if (element != NULL) - { - if (element->GetParentNode() != NULL) - element->GetParentNode()->RemoveChild(element); - } -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementStyle.cpp b/libs/libRocket/Source/Core/ElementStyle.cpp deleted file mode 100644 index 7c4cb68ba7f..00000000000 --- a/libs/libRocket/Source/Core/ElementStyle.cpp +++ /dev/null @@ -1,803 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementStyle.h" -#include "ElementStyleCache.h" -#include -#include "../../Include/Rocket/Core/ElementDocument.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/PropertyDefinition.h" -#include "../../Include/Rocket/Core/PropertyDictionary.h" -#include "../../Include/Rocket/Core/StyleSheetSpecification.h" -#include "ElementBackground.h" -#include "ElementBorder.h" -#include "ElementDecoration.h" -#include "ElementDefinition.h" -#include - -namespace Rocket { -namespace Core { - -ElementStyle::ElementStyle(Element* _element) -{ - local_properties = NULL; - em_properties = NULL; - definition = NULL; - element = _element; - cache = new ElementStyleCache(this); - - definition_dirty = true; - child_definition_dirty = true; -} - -ElementStyle::~ElementStyle() -{ - if (local_properties != NULL) - delete local_properties; - if (em_properties != NULL) - delete em_properties; - - if (definition != NULL) - definition->RemoveReference(); - - delete cache; -} - -static PropCounter prop_counter; - -PropCounter &ElementStyle::GetPropCounter() -{ - return prop_counter; -} - -// Returns the element's definition, updating if necessary. -const ElementDefinition* ElementStyle::GetDefinition() -{ - if (definition_dirty) - { - UpdateDefinition(); - } - - return definition; -} - -void ElementStyle::UpdateDefinition() -{ - if (definition_dirty) - { - definition_dirty = false; - - ElementDefinition* new_definition = NULL; - - const StyleSheet* style_sheet = GetStyleSheet(); - if (style_sheet != NULL) - { - new_definition = style_sheet->GetElementDefinition(element); - } - - // Switch the property definitions if the definition has changed. - if (new_definition != definition || new_definition == NULL) - { - PropertyNameList properties; - - if (definition != NULL) - { - definition->GetDefinedProperties(properties, pseudo_classes); - definition->RemoveReference(); - } - - definition = new_definition; - - if (definition != NULL) - definition->GetDefinedProperties(properties, pseudo_classes); - - DirtyProperties(properties); - element->GetElementDecoration()->ReloadDecorators(); - } - else if (new_definition != NULL) - { - new_definition->RemoveReference(); - } - } - - if (child_definition_dirty) - { - for (int i = 0; i < element->GetNumChildren(true); i++) - { - element->GetChild(i)->GetStyle()->UpdateDefinition(); - } - - child_definition_dirty = false; - } -} - -// Sets or removes a pseudo-class on the element. -void ElementStyle::SetPseudoClass(const String& pseudo_class, bool activate) -{ - size_t num_pseudo_classes = pseudo_classes.size(); - - if (activate) - pseudo_classes.insert(pseudo_class); - else - pseudo_classes.erase(pseudo_class); - - if (pseudo_classes.size() != num_pseudo_classes) - { - element->GetElementDecoration()->DirtyDecorators(); - - const ElementDefinition* definition = element->GetDefinition(); - if (definition != NULL) - { - PropertyNameList properties; - definition->GetDefinedProperties(properties, pseudo_classes, pseudo_class); - DirtyProperties(properties); - - switch (definition->GetPseudoClassVolatility(pseudo_class)) - { - case ElementDefinition::FONT_VOLATILE: - element->DirtyFont(); - break; - - case ElementDefinition::STRUCTURE_VOLATILE: - DirtyChildDefinitions(); - break; - - default: - break; - } - } - } -} - -// Checks if a specific pseudo-class has been set on the element. -bool ElementStyle::IsPseudoClassSet(const String& pseudo_class) const -{ - return (pseudo_classes.find(pseudo_class) != pseudo_classes.end()); -} - -const PseudoClassList& ElementStyle::GetActivePseudoClasses() const -{ - return pseudo_classes; -} - -// Sets or removes a class on the element. -void ElementStyle::SetClass(const String& class_name, bool activate) -{ - StringList::iterator class_location = std::find(classes.begin(), classes.end(), class_name); - - if (activate) - { - if (class_location == classes.end()) - { - classes.push_back(class_name); - DirtyDefinition(); - } - } - else - { - if (class_location != classes.end()) - { - classes.erase(class_location); - DirtyDefinition(); - } - } -} - -// Checks if a class is set on the element. -bool ElementStyle::IsClassSet(const String& class_name) const -{ - return std::find(classes.begin(), classes.end(), class_name) != classes.end(); -} - -// Specifies the entire list of classes for this element. This will replace any others specified. -void ElementStyle::SetClassNames(const String& class_names) -{ - classes.clear(); - StringUtilities::ExpandString(classes, class_names, ' '); - DirtyDefinition(); -} - -// Returns the list of classes specified for this element. -String ElementStyle::GetClassNames() const -{ - String class_names; - for (size_t i = 0; i < classes.size(); i++) - { - if (i != 0) - { - class_names.Append(" "); - } - class_names.Append(classes[i]); - } - - return class_names; -} - -// Sets a local property override on the element. -bool ElementStyle::SetProperty(const String& name, const String& value) -{ - if (local_properties == NULL) - local_properties = new PropertyDictionary(); - - if (StyleSheetSpecification::ParsePropertyDeclaration(*local_properties, name, value)) - { - DirtyProperty(name); - return true; - } - else - { - Log::Message(Log::LT_WARNING, "Syntax error parsing inline property declaration '%s: %s;'.", name.CString(), value.CString()); - return false; - } -} - -// Sets a local property override on the element to a pre-parsed value. -bool ElementStyle::SetProperty(const String& name, const Property& property) -{ - Property new_property = property; - - new_property.definition = StyleSheetSpecification::GetProperty(name); - if (new_property.definition == NULL) - return false; - - if (local_properties == NULL) - local_properties = new PropertyDictionary(); - - local_properties->SetProperty(name, new_property); - DirtyProperty(name); - - return true; -} - -// Removes a local property override on the element. -void ElementStyle::RemoveProperty(const String& name) -{ - if (local_properties == NULL) - return; - - if (local_properties->GetProperty(name) != NULL) - { - local_properties->RemoveProperty(name); - DirtyProperty(name); - } -} - -// Returns one of this element's properties. -const Property* ElementStyle::GetProperty(const String& name) -{ - if (prop_counter.find(name) == prop_counter.end()) - prop_counter[name] = 0; - prop_counter[name] = prop_counter[name] + 1; - - const Property* local_property = GetLocalProperty(name); - if (local_property != NULL) - return local_property; - - // Fetch the property specification. - const PropertyDefinition* property = StyleSheetSpecification::GetProperty(name); - if (property == NULL) - return NULL; - - // If we can inherit this property, return our parent's property. - if (property->IsInherited()) - { - Element* parent = element->GetParentNode(); - while (parent != NULL) - { - const Property* parent_property = parent->style->GetLocalProperty(name); - if (parent_property) - return parent_property; - - parent = parent->GetParentNode(); - } - } - - // No property available! Return the default value. - return property->GetDefaultValue(); -} - -// Returns one of this element's properties. -const Property* ElementStyle::GetLocalProperty(const String& name) -{ - // Check for overriding local properties. - if (local_properties != NULL) - { - const Property* property = local_properties->GetProperty(name); - if (property != NULL) - return property; - } - - // Check for a property defined in an RCSS rule. - if (definition != NULL) - return definition->GetProperty(name, pseudo_classes); - - return NULL; -} - -// Resolves one of this element's properties. -float ElementStyle::ResolveProperty(const Property* property, float base_value) -{ - if (!property) - { - ROCKET_ERROR; - return 0.0f; - } - - if (property->unit & Property::RELATIVE_UNIT) - { - if (property->unit & Property::PERCENT) - return base_value * property->value.Get< float >() * 0.01f; - else if (property->unit & Property::EM) - return property->value.Get< float >() * ElementUtilities::GetFontSize(element); - else if (property->unit & Property::REM) - return property->value.Get< float >() * ElementUtilities::GetFontSize(element->GetOwnerDocument()); - } - - if (property->unit & Property::NUMBER || property->unit & Property::PX) - { - return property->value.Get< float >(); - } - - // Values based on pixels-per-inch. - if (property->unit & Property::PPI_UNIT) - { - float inch = property->value.Get< float >() * element->GetRenderInterface()->GetPixelsPerInch(); - - if (property->unit & Property::INCH) // inch - return inch; - if (property->unit & Property::CM) // centimeter - return inch * (1.0f / 2.54f); - if (property->unit & Property::MM) // millimeter - return inch * (1.0f / 25.4f); - if (property->unit & Property::PT) // point - return inch * (1.0f / 72.0f); - if (property->unit & Property::PC) // pica - return inch * (1.0f / 6.0f); - } - - // We're not a numeric property; return 0. - return 0.0f; -} - -// Resolves one of this element's properties. -float ElementStyle::ResolveProperty(const String& name, float base_value) -{ - const Property* property = GetProperty(name); - if (!property) - { - ROCKET_ERROR; - return 0.0f; - } - - if (property->unit & Property::RELATIVE_UNIT) - { - // The calculated value of the font-size property is inherited, so we need to check if this - // is an inherited property. If so, then we return our parent's font size instead. - if (name == FONT_SIZE) - { - // If the rem unit is used, the font-size is inherited directly from the document, - // otherwise we use the parent's font size. - if (property->unit & Property::REM) - { - Rocket::Core::ElementDocument* owner_document = element->GetOwnerDocument(); - if (owner_document == NULL) - return 0; - - base_value = element->GetOwnerDocument()->ResolveProperty(FONT_SIZE, 0); - } - else - { - Rocket::Core::Element* parent = element->GetParentNode(); - if (parent == NULL) - return 0; - - if (GetLocalProperty(FONT_SIZE) == NULL) - return parent->ResolveProperty(FONT_SIZE, 0); - - // The base value for font size is always the height of *this* element's parent's font. - base_value = parent->ResolveProperty(FONT_SIZE, 0); - } - } - - if (property->unit & Property::PERCENT) - return base_value * property->value.Get< float >() * 0.01f; - else if (property->unit & Property::EM) - { - // If an em-relative font size is specified, it is expressed relative to the parent's - // font height. - if (name == FONT_SIZE) - return property->value.Get< float >() * base_value; - else - return property->value.Get< float >() * ElementUtilities::GetFontSize(element); - } - else if (property->unit & Property::REM) - { - // If an rem-relative font size is specified, it is expressed relative to the document's - // font height. - if (name == FONT_SIZE) - return property->value.Get< float >() * base_value; - else - return property->value.Get< float >() * ElementUtilities::GetFontSize(element->GetOwnerDocument()); - } - } - - if (property->unit & Property::NUMBER || property->unit & Property::PX) - { - return property->value.Get< float >(); - } - - // Values based on pixels-per-inch. - if (property->unit & Property::PPI_UNIT) - { - float inch = property->value.Get< float >() * element->GetRenderInterface()->GetPixelsPerInch(); - - if (property->unit & Property::INCH) // inch - return inch; - if (property->unit & Property::CM) // centimeter - return inch / 2.54f; - if (property->unit & Property::MM) // millimeter - return inch / 25.4f; - if (property->unit & Property::PT) // point - return inch / 72.0f; - if (property->unit & Property::PC) // pica - return inch / 6.0f; - } - - // We're not a numeric property; return 0. - return 0.0f; -} - -// Iterates over the properties defined on the element. -bool ElementStyle::IterateProperties(int& index, PseudoClassList& property_pseudo_classes, String& name, const Property*& property) -{ - // First check for locally defined properties. - if (local_properties != NULL) - { - if (index < local_properties->GetNumProperties()) - { - PropertyMap::const_iterator i = local_properties->GetProperties().begin(); - for (int count = 0; count < index; ++count) - ++i; - - name = (*i).first; - property = &((*i).second); - property_pseudo_classes.clear(); - ++index; - - return true; - } - } - - const ElementDefinition* definition = GetDefinition(); - if (definition != NULL) - { - int index_offset = 0; - if (local_properties != NULL) - index_offset = local_properties->GetNumProperties(); - - // Offset the index to be relative to the definition before we start indexing. When we do get a property back, - // check that it hasn't been overridden by the element's local properties; if so, continue on to the next one. - index -= index_offset; - while (definition->IterateProperties(index, pseudo_classes, property_pseudo_classes, name, property)) - { - if (local_properties == NULL || - local_properties->GetProperty(name) == NULL) - { - index += index_offset; - return true; - } - } - - return false; - } - - return false; -} - -// Returns the active style sheet for this element. This may be NULL. -StyleSheet* ElementStyle::GetStyleSheet() const -{ - ElementDocument* document = element->GetOwnerDocument(); - if (document != NULL) - return document->GetStyleSheet(); - - return NULL; -} - -void ElementStyle::DirtyDefinition() -{ - definition_dirty = true; - DirtyChildDefinitions(); - - // Dirty the child definition update the element tree - Element* parent = element->GetParentNode(); - while (parent) - { - parent->GetStyle()->child_definition_dirty = true; - parent = parent->GetParentNode(); - } -} - -void ElementStyle::DirtyChildDefinitions() -{ - for (int i = 0; i < element->GetNumChildren(true); i++) - element->GetChild(i)->GetStyle()->DirtyDefinition(); -} - -// Dirties every property. -void ElementStyle::DirtyProperties() -{ - const PropertyNameList &properties = StyleSheetSpecification::GetRegisteredProperties(); - DirtyProperties(properties); -} - -// Dirties em-relative properties. -void ElementStyle::DirtyEmProperties() -{ - const PropertyNameList &properties = StyleSheetSpecification::GetRegisteredProperties(); - - if (!em_properties) - { - // Check if any of these are currently em-relative. If so, dirty them. - em_properties = new PropertyNameList; - for (PropertyNameList::const_iterator list_iterator = properties.begin(); list_iterator != properties.end(); ++list_iterator) - { - // Skip font-size; this is relative to our parent's em, not ours. - if (*list_iterator == FONT_SIZE) - continue; - - // Get this property from this element. If this is em-relative, then add it to the list to - // dirty. - if (element->GetProperty(*list_iterator)->unit == Property::EM) - em_properties->insert(*list_iterator); - } - } - - if (!em_properties->empty()) - DirtyProperties(*em_properties, false); - - // Now dirty all of our descendant's font-size properties that are relative to ems. - int num_children = element->GetNumChildren(true); - for (int i = 0; i < num_children; ++i) - element->GetChild(i)->GetStyle()->DirtyInheritedEmProperties(); -} - -// Dirties font-size on child elements if appropriate. -void ElementStyle::DirtyInheritedEmProperties() -{ - const Property* font_size = element->GetLocalProperty(FONT_SIZE); - if (font_size == NULL) - { - int num_children = element->GetNumChildren(true); - for (int i = 0; i < num_children; ++i) - element->GetChild(i)->GetStyle()->DirtyInheritedEmProperties(); - } - else - { - if (font_size->unit & Property::RELATIVE_UNIT) - DirtyProperty(FONT_SIZE); - } -} - -// Dirties rem properties. -void ElementStyle::DirtyRemProperties() -{ - const PropertyNameList &properties = StyleSheetSpecification::GetRegisteredProperties(); - PropertyNameList rem_properties; - - // Dirty all the properties of this element that use the rem unit. - for (PropertyNameList::const_iterator list_iterator = properties.begin(); list_iterator != properties.end(); ++list_iterator) - { - if (element->GetProperty(*list_iterator)->unit == Property::REM) - rem_properties.insert(*list_iterator); - } - - if (!rem_properties.empty()) - DirtyProperties(rem_properties, false); - - // Now dirty all of our descendant's properties that use the rem unit. - int num_children = element->GetNumChildren(true); - for (int i = 0; i < num_children; ++i) - element->GetChild(i)->GetStyle()->DirtyRemProperties(); -} - -// Sets a single property as dirty. -void ElementStyle::DirtyProperty(const String& property) -{ - PropertyNameList properties; - properties.insert(String(property)); - - DirtyProperties(properties); -} - -// Sets a list of properties as dirty. -void ElementStyle::DirtyProperties(const PropertyNameList& properties, bool clear_em_properties) -{ - if (properties.empty()) - return; - - bool all_inherited_dirty = - StyleSheetSpecification::GetRegisteredProperties() == properties || - StyleSheetSpecification::GetRegisteredInheritedProperties() == properties; - - if (all_inherited_dirty) - { - const PropertyNameList &all_inherited_properties = StyleSheetSpecification::GetRegisteredInheritedProperties(); - for (int i = 0; i < element->GetNumChildren(true); i++) - element->GetChild(i)->GetStyle()->DirtyInheritedProperties(all_inherited_properties); - - // Clear all cached properties. - cache->Clear(); - } - else - { - PropertyNameList inherited_properties; - - for (PropertyNameList::const_iterator i = properties.begin(); i != properties.end(); ++i) - { - // If this property is an inherited property, then push it into the list to be passed onto our children. - const PropertyDefinition* property = StyleSheetSpecification::GetProperty(*i); - if (property != NULL && - property->IsInherited()) - inherited_properties.insert(*i); - } - - // Pass the list of those properties that are inherited onto our children. - if (!inherited_properties.empty()) - { - for (int i = 0; i < element->GetNumChildren(true); i++) - element->GetChild(i)->GetStyle()->DirtyInheritedProperties(inherited_properties); - } - - // Clear cached properties. - cache->Clear(); - } - - // clear the list of EM-properties, we will refill it in DirtyEmProperties - if (clear_em_properties && em_properties != NULL) - { - delete em_properties; - em_properties = NULL; - } - - // And send the event. - element->OnPropertyChange(properties); -} - -// Sets a list of our potentially inherited properties as dirtied by an ancestor. -void ElementStyle::DirtyInheritedProperties(const PropertyNameList& properties) -{ - bool clear_em_properties = em_properties != NULL; - - PropertyNameList inherited_properties; - for (PropertyNameList::const_iterator i = properties.begin(); i != properties.end(); ++i) - { - const Property *property = GetLocalProperty((*i)); - if (property == NULL) - { - inherited_properties.insert(*i); - if (!clear_em_properties && em_properties != NULL && em_properties->find((*i)) != em_properties->end()) { - clear_em_properties = true; - } - } - } - - if (inherited_properties.empty()) - return; - - // clear the list of EM-properties, we will refill it in DirtyEmProperties - if (clear_em_properties && em_properties != NULL) - { - delete em_properties; - em_properties = NULL; - } - - // Clear cached inherited properties. - cache->ClearInherited(); - - // Pass the list of those properties that this element doesn't override onto our children. - for (int i = 0; i < element->GetNumChildren(true); i++) - element->GetChild(i)->GetStyle()->DirtyInheritedProperties(inherited_properties); - - element->OnPropertyChange(properties); -} - -void ElementStyle::GetBorderWidthProperties(const Property **border_top_width, const Property **border_bottom_width, const Property **border_left_width, const Property **bottom_right_width) -{ - cache->GetBorderWidthProperties(border_top_width, border_bottom_width, border_left_width, bottom_right_width); -} - -void ElementStyle::GetMarginProperties(const Property **margin_top, const Property **margin_bottom, const Property **margin_left, const Property **margin_right) -{ - cache->GetMarginProperties(margin_top, margin_bottom, margin_left, margin_right); -} - -void ElementStyle::GetPaddingProperties(const Property **padding_top, const Property **padding_bottom, const Property **padding_left, const Property **padding_right) -{ - cache->GetPaddingProperties(padding_top, padding_bottom, padding_left, padding_right); -} - -void ElementStyle::GetDimensionProperties(const Property **width, const Property **height) -{ - cache->GetDimensionProperties(width, height); -} - -void ElementStyle::GetLocalDimensionProperties(const Property **width, const Property **height) -{ - cache->GetLocalDimensionProperties(width, height); -} - -void ElementStyle::GetOverflow(int *overflow_x, int *overflow_y) -{ - cache->GetOverflow(overflow_x, overflow_y); -} - -int ElementStyle::GetPosition() -{ - return cache->GetPosition(); -} - -int ElementStyle::GetFloat() -{ - return cache->GetFloat(); -} - -int ElementStyle::GetDisplay() -{ - return cache->GetDisplay(); -} - -int ElementStyle::GetWhitespace() -{ - return cache->GetWhitespace(); -} - -const Property *ElementStyle::GetLineHeightProperty() -{ - return cache->GetLineHeightProperty(); -} - -int ElementStyle::GetTextAlign() -{ - return cache->GetTextAlign(); -} - -int ElementStyle::GetTextTransform() -{ - return cache->GetTextTransform(); -} - -const Property *ElementStyle::GetVerticalAlignProperty() -{ - return cache->GetVerticalAlignProperty(); -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementStyle.h b/libs/libRocket/Source/Core/ElementStyle.h deleted file mode 100644 index f0c2bfada87..00000000000 --- a/libs/libRocket/Source/Core/ElementStyle.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTSTYLE_H -#define ROCKETCOREELEMENTSTYLE_H - -#include "ElementDefinition.h" -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Core { - -class ElementStyleCache; - -typedef std::map PropCounter; - -/** - Manages an element's style and property information. - @author Lloyd Weehuizen - */ - -class ElementStyle -{ -public: - /// Constructor - /// @param[in] element The element this structure belongs to. - ElementStyle(Element* element); - ~ElementStyle(); - - /// Returns the element's definition, updating if necessary. - const ElementDefinition* GetDefinition(); - - /// Update this definition if required - void UpdateDefinition(); - - /// Sets or removes a pseudo-class on the element. - /// @param[in] pseudo_class The pseudo class to activate or deactivate. - /// @param[in] activate True if the pseudo-class is to be activated, false to be deactivated. - void SetPseudoClass(const String& pseudo_class, bool activate); - /// Checks if a specific pseudo-class has been set on the element. - /// @param[in] pseudo_class The name of the pseudo-class to check for. - /// @return True if the pseudo-class is set on the element, false if not. - bool IsPseudoClassSet(const String& pseudo_class) const; - /// Gets a list of the current active pseudo classes - const PseudoClassList& GetActivePseudoClasses() const; - - /// Sets or removes a class on the element. - /// @param[in] class_name The name of the class to add or remove from the class list. - /// @param[in] activate True if the class is to be added, false to be removed. - void SetClass(const String& class_name, bool activate); - /// Checks if a class is set on the element. - /// @param[in] class_name The name of the class to check for. - /// @return True if the class is set on the element, false otherwise. - bool IsClassSet(const String& class_name) const; - /// Specifies the entire list of classes for this element. This will replace any others specified. - /// @param[in] class_names The list of class names to set on the style, separated by spaces. - void SetClassNames(const String& class_names); - /// Return the active class list. - /// @return A string containing all the classes on the element, separated by spaces. - String GetClassNames() const; - - /// Sets a local property override on the element. - /// @param[in] name The name of the new property. - /// @param[in] property The new property to set. - bool SetProperty(const String& name, const String& value); - /// Sets a local property override on the element to a pre-parsed value. - /// @param[in] name The name of the new property. - /// @param[in] property The parsed property to set. - bool SetProperty(const String& name, const Property& property); - /// Removes a local property override on the element; its value will revert to that defined in - /// the style sheet. - /// @param[in] name The name of the local property definition to remove. - void RemoveProperty(const String& name); - /// Returns one of this element's properties. If this element is not defined this property, or a parent cannot - /// be found that we can inherit the property from, the default value will be returned. - /// @param[in] name The name of the property to fetch the value for. - /// @return The value of this property for this element, or NULL if no property exists with the given name. - const Property* GetProperty(const String& name); - /// Returns one of this element's properties. If this element is not defined this property, NULL will be - /// returned. - /// @param[in] name The name of the property to fetch the value for. - /// @return The value of this property for this element, or NULL if this property has not been explicitly defined for this element. - const Property* GetLocalProperty(const String& name); - /// Resolves one of this element's properties. If the value is a number or px, this is returned. If it's a - /// percentage then it is resolved based on the second argument (the base value). - /// @param[in] property Property to resolve the value for. - /// @param[in] base_value The value that is scaled by the percentage value, if it is a percentage. - /// @return The value of this property for this element. - float ResolveProperty(const Property *property, float base_value); - /// Resolves one of this element's properties. If the value is a number or px, this is returned. If it's a - /// percentage then it is resolved based on the second argument (the base value). - /// @param[in] name The name of the property to resolve the value for. - /// @param[in] base_value The value that is scaled by the percentage value, if it is a percentage. - /// @return The value of this property for this element. - float ResolveProperty(const String& name, float base_value); - - /// Iterates over the properties defined on the element. - /// @param[inout] index Index of the property to fetch. This is incremented to the next valid index after the fetch. Indices are not necessarily incremental. - /// @param[out] pseudo_classes The pseudo-classes the property is defined by. - /// @param[out] name The name of the property at the specified index. - /// @param[out] property The property at the specified index. - /// @return True if a property was successfully fetched. - bool IterateProperties(int& index, PseudoClassList& pseudo_classes, String& name, const Property*& property); - - /// Returns the active style sheet for this element. This may be NULL. - StyleSheet* GetStyleSheet() const; - - /// Mark definition and all children dirty - void DirtyDefinition(); - /// Dirty all child definitions - void DirtyChildDefinitions(); - - // Dirties every property. - void DirtyProperties(); - // Dirties em-relative properties. - void DirtyEmProperties(); - // Dirties font-size on child elements if appropriate. - void DirtyInheritedEmProperties(); - // Dirties rem properties. - void DirtyRemProperties(); - - /// Returns 'border-width' properties from element's style or local cache. - void GetBorderWidthProperties(const Property **border_top_width, const Property **border_bottom_width, const Property **border_left_width, const Property **border_right_width); - /// Returns 'margin' properties from element's style or local cache. - void GetMarginProperties(const Property **margin_top, const Property **margin_bottom, const Property **margin_left, const Property **margin_right); - /// Returns 'padding' properties from element's style or local cache. - void GetPaddingProperties(const Property **padding_top, const Property **padding_bottom, const Property **padding_left, const Property **padding_right); - /// Returns 'width' and 'height' properties from element's style or local cache. - void GetDimensionProperties(const Property **width, const Property **height); - /// Returns local 'width' and 'height' properties from element's style or local cache, - /// ignoring default values. - void GetLocalDimensionProperties(const Property **width, const Property **height); - /// Returns 'overflow' properties' values from element's style or local cache. - void GetOverflow(int *overflow_x, int *overflow_y); - /// Returns 'position' property value from element's style or local cache. - int GetPosition(); - /// Returns 'float' property value from element's style or local cache. - int GetFloat(); - /// Returns 'display' property value from element's style or local cache. - int GetDisplay(); - /// Returns 'white-space' property value from element's style or local cache. - int GetWhitespace(); - - /// Returns 'line-height' property value from element's style or local cache. - const Property *GetLineHeightProperty(); - /// Returns 'text-align' property value from element's style or local cache. - int GetTextAlign(); - /// Returns 'text-transform' property value from element's style or local cache. - int GetTextTransform(); - /// Returns 'vertical-align' property value from element's style or local cache. - const Property *GetVerticalAlignProperty(); - - static PropCounter &GetPropCounter(); - -private: - // Sets a single property as dirty. - void DirtyProperty(const String& property); - // Sets a list of properties as dirty. - void DirtyProperties(const PropertyNameList& properties, bool clear_em_properties = true); - // Sets a list of our potentially inherited properties as dirtied by an ancestor. - void DirtyInheritedProperties(const PropertyNameList& properties); - - // Element these properties belong to - Element* element; - - // The list of classes applicable to this object. - StringList classes; - // This element's current pseudo-classes. - PseudoClassList pseudo_classes; - - // Any properties that have been overridden in this element. - PropertyDictionary* local_properties; - // All properties (including inherited) that are EM-relative. - PropertyNameList* em_properties; - // The definition of this element; if this is NULL one will be fetched from the element's style. - ElementDefinition* definition; - // Set if a new element definition should be fetched from the style. - bool definition_dirty; - // Set if a child element has a dirty style definition - bool child_definition_dirty; - // cached non-inherited properties - ElementStyleCache *cache; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementStyleCache.cpp b/libs/libRocket/Source/Core/ElementStyleCache.cpp deleted file mode 100644 index 755c79eaabb..00000000000 --- a/libs/libRocket/Source/Core/ElementStyleCache.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementStyle.h" -#include "ElementStyleCache.h" - -namespace Rocket { -namespace Core { - -ElementStyleCache::ElementStyleCache(ElementStyle *style) : style(style), - border_top_width(NULL), border_bottom_width(NULL), border_left_width(NULL), border_right_width(NULL), - margin_top(NULL), margin_bottom(NULL), margin_left(NULL), margin_right(NULL), - padding_top(NULL), padding_bottom(NULL), padding_left(NULL), padding_right(NULL), - width(NULL), height(NULL), - local_width(NULL), local_height(NULL), have_local_width(false), have_local_height(false), - overflow_x(-1), overflow_y(-1), - position(-1), float_(-1), display(-1), whitespace(-1), - line_height(NULL), text_align(-1), text_transform(-1), vertical_align(NULL) -{ -} - -void ElementStyleCache::Clear() -{ - ClearBorder(); - ClearMargin(); - ClearPadding(); - ClearDimensions(); - ClearOverflow(); - ClearPosition(); - ClearFloat(); - ClearDisplay(); - ClearWhitespace(); -} - -void ElementStyleCache::ClearInherited() -{ - ClearLineHeight(); - ClearTextAlign(); - ClearTextTransform(); - ClearVerticalAlign(); -} - -void ElementStyleCache::ClearBorder() -{ - border_top_width = border_bottom_width = border_left_width = border_right_width = NULL; -} - -void ElementStyleCache::ClearMargin() -{ - margin_top = margin_bottom = margin_left = margin_right = NULL; -} - -void ElementStyleCache::ClearPadding() -{ - padding_top = padding_bottom = padding_left = padding_right = NULL; -} - -void ElementStyleCache::ClearDimensions() -{ - width = height = NULL; - have_local_width = have_local_height = false; -} - -void ElementStyleCache::ClearOverflow() -{ - overflow_x = overflow_y = -1; -} - -void ElementStyleCache::ClearPosition() -{ - position = -1; -} - -void ElementStyleCache::ClearFloat() -{ - float_ = -1; -} - -void ElementStyleCache::ClearDisplay() -{ - display = -1; -} - -void ElementStyleCache::ClearWhitespace() -{ - whitespace = -1; -} - -void ElementStyleCache::ClearLineHeight() -{ - line_height = NULL; -} - -void ElementStyleCache::ClearTextAlign() -{ - text_align = -1; -} - -void ElementStyleCache::ClearTextTransform() -{ - text_transform = -1; -} - -void ElementStyleCache::ClearVerticalAlign() -{ - vertical_align = NULL; -} - -void ElementStyleCache::GetBorderWidthProperties(const Property **o_border_top_width, const Property **o_border_bottom_width, const Property **o_border_left_width, const Property **o_border_right_width) -{ - if (o_border_top_width) - { - if (!border_top_width) - border_top_width = style->GetProperty(BORDER_TOP_WIDTH); - *o_border_top_width = border_top_width; - } - - if (o_border_bottom_width) - { - if (!border_bottom_width) - border_bottom_width = style->GetProperty(BORDER_BOTTOM_WIDTH); - *o_border_bottom_width = border_bottom_width; - } - - if (o_border_left_width) - { - if (!border_left_width) - border_left_width = style->GetProperty(BORDER_LEFT_WIDTH); - *o_border_left_width = border_left_width; - } - - if (o_border_right_width) - { - if (!border_right_width) - border_right_width = style->GetProperty(BORDER_RIGHT_WIDTH); - *o_border_right_width = border_right_width; - } -} - -void ElementStyleCache::GetMarginProperties(const Property **o_margin_top, const Property **o_margin_bottom, const Property **o_margin_left, const Property **o_margin_right) -{ - if (o_margin_top) - { - if (!margin_top) - margin_top = style->GetProperty(MARGIN_TOP); - *o_margin_top = margin_top; - } - - if (o_margin_bottom) - { - if (!margin_bottom) - margin_bottom = style->GetProperty(MARGIN_BOTTOM); - *o_margin_bottom = margin_bottom; - } - - if (o_margin_left) - { - if (!margin_left) - margin_left = style->GetProperty(MARGIN_LEFT); - *o_margin_left = margin_left; - } - - if (o_margin_right) - { - if (!margin_right) - margin_right = style->GetProperty(MARGIN_RIGHT); - *o_margin_right = margin_right; - } -} - -void ElementStyleCache::GetPaddingProperties(const Property **o_padding_top, const Property **o_padding_bottom, const Property **o_padding_left, const Property **o_padding_right) -{ - if (o_padding_top) - { - if (!padding_top) - padding_top = style->GetProperty(PADDING_TOP); - *o_padding_top = padding_top; - } - - if (o_padding_bottom) - { - if (!padding_bottom) - padding_bottom = style->GetProperty(PADDING_BOTTOM); - *o_padding_bottom = padding_bottom; - } - - if (o_padding_left) - { - if (!padding_left) - padding_left = style->GetProperty(PADDING_LEFT); - *o_padding_left = padding_left; - } - - if (o_padding_right) - { - if (!padding_right) - padding_right = style->GetProperty(PADDING_RIGHT); - *o_padding_right = padding_right; - } -} - -void ElementStyleCache::GetDimensionProperties(const Property **o_width, const Property **o_height) -{ - if (o_width) - { - if (!width) - width = style->GetProperty(WIDTH); - *o_width = width; - } - - if (o_height) - { - if (!height) - height = style->GetProperty(HEIGHT); - *o_height = height; - } -} - -void ElementStyleCache::GetLocalDimensionProperties(const Property **o_width, const Property **o_height) -{ - if (o_width) - { - if (!have_local_width) - { - have_local_width = true; - local_width = style->GetLocalProperty(WIDTH); - } - *o_width = local_width; - } - - if (o_height) - { - if (!have_local_height) - { - have_local_height = true; - local_height = style->GetLocalProperty(HEIGHT); - } - *o_height = local_height; - } -} - -void ElementStyleCache::GetOverflow(int *o_overflow_x, int *o_overflow_y) -{ - if (o_overflow_x) - { - if (overflow_x < 0) - overflow_x = style->GetProperty(OVERFLOW_X)->Get< int >(); - *o_overflow_x = overflow_x; - } - - if (o_overflow_y) - { - if (overflow_y < 0) - overflow_y = style->GetProperty(OVERFLOW_Y)->Get< int >(); - *o_overflow_y = overflow_y; - } -} - -int ElementStyleCache::GetPosition() -{ - if (position < 0) - position = style->GetProperty(POSITION)->Get< int >(); - return position; -} - -int ElementStyleCache::GetFloat() -{ - if (float_ < 0) - float_ = style->GetProperty(FLOAT)->Get< int >(); - return float_; -} - -int ElementStyleCache::GetDisplay() -{ - if (display < 0) - display = style->GetProperty(DISPLAY)->Get< int >(); - return display; -} - -int ElementStyleCache::GetWhitespace() -{ - if (whitespace < 0) - whitespace = style->GetProperty(WHITE_SPACE)->Get< int >(); - return whitespace; -} - -const Property *ElementStyleCache::GetLineHeightProperty() -{ - if (!line_height) - line_height = style->GetProperty(LINE_HEIGHT); - return line_height; -} - -int ElementStyleCache::GetTextAlign() -{ - if (text_align < 0) - text_align = style->GetProperty(TEXT_ALIGN)->Get< int >(); - return text_align; -} - -int ElementStyleCache::GetTextTransform() -{ - if (text_transform < 0) - text_transform = style->GetProperty(TEXT_TRANSFORM)->Get< int >(); - return text_transform; -} - -const Property *ElementStyleCache::GetVerticalAlignProperty() -{ - if (!vertical_align) - vertical_align = style->GetProperty(VERTICAL_ALIGN); - return vertical_align; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementStyleCache.h b/libs/libRocket/Source/Core/ElementStyleCache.h deleted file mode 100644 index 3653ed23ba4..00000000000 --- a/libs/libRocket/Source/Core/ElementStyleCache.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTSTYLECACHE_H -#define ROCKETCOREELEMENTSTYLECACHE_H - -#include "ElementDefinition.h" -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Core { - -class ElementStyle; - -/** - Manages caching of layout-important properties and provides - O(1) access to them (note that for invalidated cache, the access - time is still O(log(N)) as per standard std::map). - @author Victor Luchits - */ - -class ElementStyleCache -{ -public: - ElementStyleCache(ElementStyle *style); - - /// Invalidation function for all non-inherited properties - void Clear(); - - /// Invalidation function for all inherited properties - void ClearInherited(); - - /// Invalidation functions for individual and grouped non-inherited properties - void ClearBorder(); - void ClearMargin(); - void ClearPadding(); - void ClearDimensions(); - void ClearPosition(); - void ClearFloat(); - void ClearDisplay(); - void ClearWhitespace(); - void ClearOverflow(); - - /// Invalidation functions for individual and grouped inherited properties - void ClearLineHeight(); - void ClearTextAlign(); - void ClearTextTransform(); - void ClearVerticalAlign(); - - /// Returns 'border-width' properties from element's style or local cache. - void GetBorderWidthProperties(const Property **border_top_width, const Property **border_bottom_width, const Property **border_left_width, const Property **border_right_width); - /// Returns 'margin' properties from element's style or local cache. - void GetMarginProperties(const Property **margin_top, const Property **margin_bottom, const Property **margin_left, const Property **margin_right); - /// Returns 'padding' properties from element's style or local cache. - void GetPaddingProperties(const Property **padding_top, const Property **padding_bottom, const Property **padding_left, const Property **padding_right); - /// Returns 'width' and 'height' properties from element's style or local cache. - void GetDimensionProperties(const Property **width, const Property **height); - /// Returns local 'width' and 'height' properties from element's style or local cache, - /// ignoring default values. - void GetLocalDimensionProperties(const Property **width, const Property **height); - /// Returns 'overflow' properties' values from element's style or local cache. - void GetOverflow(int *overflow_x, int *overflow_y); - /// Returns 'position' property value from element's style or local cache. - int GetPosition(); - /// Returns 'float' property value from element's style or local cache. - int GetFloat(); - /// Returns 'display' property value from element's style or local cache. - int GetDisplay(); - /// Returns 'white-space' property value from element's style or local cache. - int GetWhitespace(); - - /// Returns 'line-height' property value from element's style or local cache. - const Property *GetLineHeightProperty(); - /// Returns 'text-align' property value from element's style or local cache. - int GetTextAlign(); - /// Returns 'text-transform' property value from element's style or local cache. - int GetTextTransform(); - /// Returns 'vertical-align' property value from element's style or local cache. - const Property *GetVerticalAlignProperty(); - -private: - /// Element style that owns this cache instance. - ElementStyle *style; - - /// Cached properties. - const Property *border_top_width, *border_bottom_width, *border_left_width, *border_right_width; - const Property *margin_top, *margin_bottom, *margin_left, *margin_right; - const Property *padding_top, *padding_bottom, *padding_left, *padding_right; - const Property *width, *height; - const Property *local_width, *local_height; - bool have_local_width, have_local_height; - int overflow_x, overflow_y; - int position; - int float_; - int display; - int whitespace; - const Property *line_height; - int text_align; - int text_transform; - const Property *vertical_align; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementText.cpp b/libs/libRocket/Source/Core/ElementText.cpp deleted file mode 100644 index 085c6c4dd15..00000000000 --- a/libs/libRocket/Source/Core/ElementText.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ElementText.h" - -namespace Rocket { -namespace Core { - -ElementText::ElementText(const String& tag) : Element(tag) -{ -} - -ElementText::~ElementText() -{ -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementTextDefault.cpp b/libs/libRocket/Source/Core/ElementTextDefault.cpp deleted file mode 100644 index 64af79af7c4..00000000000 --- a/libs/libRocket/Source/Core/ElementTextDefault.cpp +++ /dev/null @@ -1,607 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementTextDefault.h" -#include "ElementDefinition.h" -#include "ElementStyle.h" -#include -#include -#include -#include -#include -#include -#include - -namespace Rocket { -namespace Core { - -static bool BuildToken(WString& token, const word*& token_begin, const word* string_end, bool first_token, bool collapse_white_space, bool break_at_endline, int text_transformation); -static bool LastToken(const word* token_begin, const word* string_end, bool collapse_white_space, bool break_at_endline); - -ElementTextDefault::ElementTextDefault(const String& tag) : ElementText(tag), colour(255, 255, 255), real_colour(255, 255, 255), decoration(this) -{ - dirty_layout_on_change = true; - - generated_decoration = TEXT_DECORATION_NONE; - decoration_property = TEXT_DECORATION_NONE; - - geometry_dirty = true; - - font_configuration = -1; - font_dirty = true; -} - -ElementTextDefault::~ElementTextDefault() -{ -} - -void ElementTextDefault::SetText(const WString& _text) -{ - if (text != _text) - { - text = _text; - - if (dirty_layout_on_change) - DirtyLayout(); - } -} - -const WString& ElementTextDefault::GetText() const -{ - return text; -} - -void ElementTextDefault::OnRender() -{ - FontFaceHandle* font_face_handle = GetFontFaceHandle(); - if (!font_face_handle) - return; - - - // If our font configuration has potentially changed, update it and force a geometry - // generation if necessary. - if (font_dirty && - UpdateFontConfiguration()) - { - geometry_dirty = true; - } - - // Regenerate the geometry if the colour or font configuration has altered. - if (geometry_dirty) - GenerateGeometry(font_face_handle); - - Vector2f translation = GetAbsoluteOffset(); - - bool render = true; - Vector2i clip_origin; - Vector2i clip_dimensions; - if (GetContext()->GetActiveClipRegion(clip_origin, clip_dimensions)) - { - float clip_top = (float)clip_origin.y; - float clip_left = (float)clip_origin.x; - float clip_right = (float)(clip_origin.x + clip_dimensions.x); - float clip_bottom = (float)(clip_origin.y + clip_dimensions.y); - float line_height = (float)GetFontFaceHandle()->GetLineHeight(); - - render = false; - for (size_t i = 0; i < lines.size(); ++i) - { - const Line& line = lines[i]; - float x = translation.x + line.position.x; - float y = translation.y + line.position.y; - - bool render_line = !(x > clip_right); - render_line = render_line && !(x + line.width < clip_left); - - render_line = render_line && !(y - line_height > clip_bottom); - render_line = render_line && !(y < clip_top); - - if (render_line) - { - render = true; - break; - } - } - } - - if (render) - { - for (size_t i = 0; i < geometry.size(); ++i) - geometry[i].Render(translation); - } - - if (decoration_property != TEXT_DECORATION_NONE) - decoration.Render(translation); -} - -// Generates a token of text from this element, returning only the width. -bool ElementTextDefault::GenerateToken(float& token_width, int line_begin) -{ - // Bail if we don't have a valid font face. - FontFaceHandle* font_face_handle = GetFontFaceHandle(); - if (font_face_handle == NULL || - line_begin >= (int) text.Length()) - return 0; - - // Determine how we are processing white-space while formatting the text. - int white_space_property = GetWhitespace(); - bool collapse_white_space = white_space_property == WHITE_SPACE_NORMAL || - white_space_property == WHITE_SPACE_NOWRAP || - white_space_property == WHITE_SPACE_PRE_LINE; - bool break_at_endline = white_space_property == WHITE_SPACE_PRE || - white_space_property == WHITE_SPACE_PRE_WRAP || - white_space_property == WHITE_SPACE_PRE_LINE; - - const word* token_begin = text.CString() + line_begin; - WString token; - - BuildToken(token, token_begin, text.CString() + text.Length(), true, collapse_white_space, break_at_endline, GetTextTransform()); - token_width = (float) font_face_handle->GetStringWidth(token, 0); - - return LastToken(token_begin, text.CString() + text.Length(), collapse_white_space, break_at_endline); -} - -// Generates a line of text rendered from this element -bool ElementTextDefault::GenerateLine(WString& line, int& line_length, float& line_width, int line_begin, float maximum_line_width, float right_spacing_width, bool trim_whitespace_prefix) -{ - FontFaceHandle* font_face_handle = GetFontFaceHandle(); - - // Initialise the output variables. - line.Clear(); - line_length = 0; - line_width = 0; - - // Bail if we don't have a valid font face. - if (font_face_handle == NULL) - return true; - - // Determine how we are processing white-space while formatting the text. - int white_space_property = GetWhitespace(); - bool collapse_white_space = white_space_property == WHITE_SPACE_NORMAL || - white_space_property == WHITE_SPACE_NOWRAP || - white_space_property == WHITE_SPACE_PRE_LINE; - bool break_at_line = maximum_line_width >= 0 && - (white_space_property == WHITE_SPACE_NORMAL || - white_space_property == WHITE_SPACE_PRE_WRAP || - white_space_property == WHITE_SPACE_PRE_LINE); - bool break_at_endline = white_space_property == WHITE_SPACE_PRE || - white_space_property == WHITE_SPACE_PRE_WRAP || - white_space_property == WHITE_SPACE_PRE_LINE; - - // Determine what (if any) text transformation we are putting the characters through. - int text_transform_property = GetTextTransform(); - - // Starting at the line_begin character, we generate sections of the text (we'll call them tokens) depending on the - // white-space parsing parameters. Each section is then appended to the line if it can fit. If not, or if an - // endline is found (and we're processing them), then the line is ended. kthxbai! - - const word* token_begin = text.CString() + line_begin; - const word* string_end = text.CString() + text.Length(); - while (token_begin != string_end) - { - WString token; - const word* next_token_begin = token_begin; - - // Generate the next token and determine its pixel-length. - bool break_line = BuildToken(token, next_token_begin, string_end, line.Empty() && trim_whitespace_prefix, collapse_white_space, break_at_endline, text_transform_property); - int token_width = font_face_handle->GetStringWidth(token, line.Empty() ? 0 : line[line.Length() - 1]); - - // If we're breaking to fit a line box, check if the token can fit on the line before we add it. - if (break_at_line) - { - if (!line.Empty() && - (line_width + token_width > maximum_line_width || - LastToken(next_token_begin, string_end, collapse_white_space, break_at_endline) && (line_width + token_width > maximum_line_width - right_spacing_width))) - { - return false; - } - } - - // The token can fit on the end of the line, so add it onto the end and increment our width and length - // counters. - line += token; - line_length += (int)(next_token_begin - token_begin); - line_width += token_width; - - // Break out of the loop if an endline was forced. - if (break_line) - return false; - - // Set the beginning of the next token. - token_begin = next_token_begin; - } - - return true; -} - -// Clears all lines of generated text and prepares the element for generating new lines. -void ElementTextDefault::ClearLines() -{ - // Clear the rendering information. - for (size_t i = 0; i < geometry.size(); ++i) - geometry[i].Release(true); - - lines.clear(); - decoration.Release(true); -} - -// Adds a new line into the text element. -void ElementTextDefault::AddLine(const Vector2f& line_position, const WString& line) -{ - FontFaceHandle* font_face_handle = GetFontFaceHandle(); - - if (font_face_handle == NULL) - return; - - if (font_dirty) - UpdateFontConfiguration(); - - Vector2f baseline_position = line_position + Vector2f(0.0f, (float) font_face_handle->GetLineHeight() - font_face_handle->GetBaseline()); - lines.push_back(Line(line, baseline_position)); - - GenerateGeometry(font_face_handle, lines.back()); - geometry_dirty = false; - - if (decoration_property != TEXT_DECORATION_NONE) - GenerateDecoration(font_face_handle, lines.back()); -} - -// Prevents the element from dirtying its document's layout when its text is changed. -void ElementTextDefault::SuppressAutoLayout() -{ - dirty_layout_on_change = false; -} - -void ElementTextDefault::OnPropertyChange(const PropertyNameList& changed_properties) -{ - Element::OnPropertyChange(changed_properties); - - bool colour_changed = false; - bool font_face_changed = false; - - if (changed_properties.find(COLOR) != changed_properties.end()) - { - // Fetch our (potentially) new colour. - Colourb new_colour = GetProperty(COLOR)->value.Get< Colourb >(); - colour_changed = colour != new_colour; - if (colour_changed) - { - colour = new_colour; - float alpha = GetProperty(OPACITY); - real_colour = colour = new_colour; - colour.alpha *= alpha; - } - } - - if (changed_properties.find(OPACITY) != changed_properties.end()) - { - float opacity = GetProperty(OPACITY); - colour_changed = (colour.alpha != (real_colour.alpha * opacity)); - if (colour_changed) - { - colour = real_colour; - colour.alpha *= opacity; - } - } - - if (changed_properties.find(FONT_FAMILY) != changed_properties.end() || - changed_properties.find(FONT_CHARSET) != changed_properties.end() || - changed_properties.find(FONT_WEIGHT) != changed_properties.end() || - changed_properties.find(FONT_STYLE) != changed_properties.end() || - changed_properties.find(FONT_SIZE) != changed_properties.end()) - { - font_face_changed = true; - - geometry.clear(); - font_dirty = true; - } - - if (changed_properties.find(TEXT_DECORATION) != changed_properties.end()) - { - decoration_property = GetProperty< int >(TEXT_DECORATION); - if (decoration_property != TEXT_DECORATION_NONE) - { - if (decoration_property != generated_decoration) - { - decoration.Release(true); - - FontFaceHandle* font_face_handle = GetFontFaceHandle(); - if (font_face_handle != NULL) - { - for (size_t i = 0; i < lines.size(); ++i) - GenerateDecoration(font_face_handle, lines[i]); - } - - generated_decoration = decoration_property; - } - } - } - - if (font_face_changed) - { - // We have to let our document know we need to be regenerated. - if (dirty_layout_on_change) - DirtyLayout(); - } - else if (colour_changed) - { - // Force the geometry to be regenerated. - geometry_dirty = true; - - // Re-colour the decoration geometry. - std::vector< Vertex >& vertices = decoration.GetVertices(); - for (size_t i = 0; i < vertices.size(); ++i) - vertices[i].colour = colour; - - decoration.Release(); - } -} - -// Returns the RML of this element -void ElementTextDefault::GetRML(String& content) -{ - text.ToUTF8(content, true); -} - -// Forces a reevaluation of applicable font effects. -void ElementTextDefault::DirtyFont() -{ - font_dirty = true; -} - -// Updates the configuration this element uses for its font. -bool ElementTextDefault::UpdateFontConfiguration() -{ - if (GetFontFaceHandle() == NULL) - return false; - - font_dirty = false; - - // Build up a list of all applicable font effects set by our parent nodes. - FontEffectMap font_effects; - Element* element = GetParentNode(); - while (element != NULL) - { - const ElementDefinition* element_definition = element->GetDefinition(); - if (element_definition != NULL) - element_definition->GetFontEffects(font_effects, element->GetStyle()->GetActivePseudoClasses()); - - element = element->GetParentNode(); - } - - // Request a font layer configuration to match this set of effects. If this is different from - // our old configuration, then return true to indicate we'll need to regenerate geometry. - int new_configuration = GetFontFaceHandle()->GenerateLayerConfiguration(font_effects); - if (new_configuration != font_configuration) - { - font_configuration = new_configuration; - return true; - } - - return false; -} - -// Clears and regenerates all of the text's geometry. -void ElementTextDefault::GenerateGeometry(FontFaceHandle* font_face_handle) -{ - // Release the old geometry ... - for (size_t i = 0; i < geometry.size(); ++i) - geometry[i].Release(true); - - /// ... and generate it all again! - for (size_t i = 0; i < lines.size(); ++i) - GenerateGeometry(font_face_handle, lines[i]); - - geometry_dirty = false; -} - -void ElementTextDefault::GenerateGeometry(FontFaceHandle* font_face_handle, Line& line) -{ - line.width = font_face_handle->GenerateString(geometry, line.text, line.position, colour, font_configuration); - for (size_t i = 0; i < geometry.size(); ++i) - geometry[i].SetHostElement(this); -} - -// Generates any geometry necessary for rendering a line decoration (underline, strike-through, etc). -void ElementTextDefault::GenerateDecoration(FontFaceHandle* font_face_handle, const Line& line) -{ - Font::Line line_height; - if (decoration_property == TEXT_DECORATION_OVERLINE) - line_height = Font::OVERLINE; - else if (decoration_property == TEXT_DECORATION_LINE_THROUGH) - line_height = Font::STRIKE_THROUGH; - else - line_height = Font::UNDERLINE; - - font_face_handle->GenerateLine(&decoration, line.position, line.width, line_height, colour); -} - -static bool BuildToken(WString& token, const word*& token_begin, const word* string_end, bool first_token, bool collapse_white_space, bool break_at_endline, int text_transformation) -{ - ROCKET_ASSERT(token_begin != string_end); - - // Check what the first character of the token is; all we need to know is if it is white-space or not. - bool parsing_white_space = StringUtilities::IsWhitespace(*token_begin); - - // Loop through the string from the token's beginning until we find an end to the token. This can occur in various - // places, depending on the white-space processing; - // - at the end of a section of non-white-space characters, - // - at the end of a section of white-space characters, if we're not collapsing white-space, - // - at an endline token, if we're breaking on endlines. - while (token_begin != string_end) - { - bool force_non_whitespace = false; - word character = *token_begin; - - const word* escape_begin = token_begin; - - // Check for an ampersand; if we find one, we've got an HTML escaped character. - if (character == '&') - { - // Find the terminating ';'. - while (token_begin != string_end && - *token_begin != ';') - ++token_begin; - - // If we couldn't find the ';', print the token like normal text. - if (token_begin == string_end) - { - token_begin = escape_begin; - } - // We could find a ';', parse the escape code. If the escape code is recognised, set the parsed character - // to the appropriate one. If it is a non-breaking space, prevent it being picked up as whitespace. If it - // is not recognised, print the token like normal text. - else - { - WString ucs2_escape_code(escape_begin + 1, token_begin); - String escape_code; - ucs2_escape_code.ToUTF8(escape_code); - - if (ucs2_escape_code == "lt") - character = '<'; - else if (ucs2_escape_code == "gt") - character = '>'; - else if (ucs2_escape_code == "amp") - character = '&'; - else if (ucs2_escape_code == "quot") - character = '"'; - else if (ucs2_escape_code == "nbsp") - { - character = ' '; - force_non_whitespace = true; - } - else if (WString(ucs2_escape_code.Substring(0, 2)) == "#x" - && sscanf(escape_code.Substring(2).CString(), "%hx", &character) == 1) - { - // pass through - } - else - token_begin = escape_begin; - } - } - - // Check for an endline token; if we're breaking on endlines and we find one, then return true to indicate a - // forced break. - if (break_at_endline && - character == '\n') - { - token += '\n'; - token_begin++; - return true; - } - - // If we've transitioned from white-space characters to non-white-space characters, or vice-versa, then check - // if should terminate the token; if we're not collapsing white-space, then yes (as sections of white-space are - // non-breaking), otherwise only if we've transitioned from characters to white-space. - bool white_space = !force_non_whitespace && StringUtilities::IsWhitespace(character); - if (white_space != parsing_white_space) - { - if (!collapse_white_space) - { - // Restore pointer to the beginning of the escaped token, if we processed an escape code. - token_begin = escape_begin; - return false; - } - - // We're collapsing white-space; we only tokenise words, not white-space, so we're only done tokenising - // once we've begun parsing non-white-space and then found white-space. - if (!parsing_white_space) - { - // However, if we are the last non-whitespace character in the string, and there are trailing - // whitespace characters after this token, then we need to append a single space to the end of this - // token. - if (token_begin != string_end && - LastToken(token_begin, string_end, collapse_white_space, break_at_endline)) - token += ' '; - - return false; - } - - // We've transitioned from white-space to non-white-space, so we append a single white-space character. - if (!first_token) - token += ' '; - - parsing_white_space = false; - } - - // If the current character is white-space, we'll append a space character to the token if we're not collapsing - // sections of white-space. - if (white_space) - { - if (!collapse_white_space) - token += ' '; - } - else - { - if (text_transformation == TEXT_TRANSFORM_UPPERCASE) - { - if (character >= 'a' && character <= 'z') - character += (Rocket::Core::word)('A' - 'a'); - } - else if (text_transformation == TEXT_TRANSFORM_LOWERCASE) - { - if (character >= 'A' && character <= 'Z') - character -= (Rocket::Core::word)('A' - 'a'); - } - - token += character; - } - - ++token_begin; - } - - return false; -} - -static bool LastToken(const word* token_begin, const word* string_end, bool collapse_white_space, bool break_at_endline) -{ - bool last_token = (token_begin == string_end); - if (collapse_white_space && - !last_token) - { - last_token = true; - const word* character = token_begin; - - while (character != string_end) - { - if (!StringUtilities::IsWhitespace(*character) || - (break_at_endline && *character == '\n')) - { - last_token = false; - break; - } - - character++; - } - } - - return last_token; -} - -} -} diff --git a/libs/libRocket/Source/Core/ElementTextDefault.h b/libs/libRocket/Source/Core/ElementTextDefault.h deleted file mode 100644 index 12829d5651b..00000000000 --- a/libs/libRocket/Source/Core/ElementTextDefault.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREELEMENTTEXTDEFAULT_H -#define ROCKETCOREELEMENTTEXTDEFAULT_H - -#include "../../Include/Rocket/Core/Header.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/Geometry.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class ROCKETCORE_API ElementTextDefault : public ElementText -{ -public: - ElementTextDefault(const String& tag); - virtual ~ElementTextDefault(); - - virtual void SetText(const WString& text); - virtual const WString& GetText() const; - - virtual void OnRender(); - - /// Generates a token of text from this element, returning only the width. - /// @param[out] token_width The window (in pixels) of the token. - /// @param[in] token_begin The first character to be included in the token. - /// @return True if the token is the end of the element's text, false if not. - virtual bool GenerateToken(float& token_width, int token_begin); - /// Generates a line of text rendered from this element - /// @param[out] line The characters making up the line, with white-space characters collapsed and endlines processed appropriately. - /// @param[out] line_length The number of characters from the source string consumed making up this string; this may very well be different from line.size()! - /// @param[out] line_width The width (in pixels) of the generated line. - /// @param[in] line_begin The first character to be rendered in the line. - /// @param[in] maximum_line_width The width (in pixels) of space allowed for the line, or -1 for unlimited space. - /// @param[in] right_spacing_width The width (in pixels) of the spacing (consisting of margins, padding, etc) that must be remaining on the right of the line if the last of the text is rendered onto this line. - /// @param[in] trim_whitespace_prefix If we're collapsing whitespace, whether or remove all prefixing whitespace or collapse it down to a single space. - /// @return True if the line reached the end of the element's text, false if not. - virtual bool GenerateLine(WString& line, int& line_length, float& line_width, int line_begin, float maximum_line_width, float right_spacing_width, bool trim_whitespace_prefix); - - /// Clears all lines of generated text and prepares the element for generating new lines. - virtual void ClearLines(); - /// Adds a new line into the text element. - /// @param[in] line_position The position of this line, as an offset from the first line. - /// @param[in] line The contents of the line.. - virtual void AddLine(const Vector2f& line_position, const WString& line); - - /// Prevents the element from dirtying its document's layout when its text is changed. - virtual void SuppressAutoLayout(); - -protected: - virtual void OnPropertyChange(const PropertyNameList& properties); - - /// Returns the RML of this element - /// @param content[out] The raw text. - virtual void GetRML(String& content); - - /// Forces a reevaluation of applicable font effects. - virtual void DirtyFont(); - -private: - // Updates the configuration this element uses for its font, depending on which font effects - // are active. - bool UpdateFontConfiguration(); - - // Used to store the position and length of each line we have geometry for. - struct Line - { - Line(const WString& text, const Vector2f& position) : text(text), position(position) - { - width = 0; - } - - WString text; - Vector2f position; - int width; - }; - - // Clears and regenerates all of the text's geometry. - void GenerateGeometry(FontFaceHandle* font_face_handle); - // Generates the geometry for a single line of text. - void GenerateGeometry(FontFaceHandle* font_face_handle, Line& line); - // Generates any geometry necessary for rendering a line decoration (underline, strike-through, etc). - void GenerateDecoration(FontFaceHandle* font_face_handle, const Line& line); - - WString text; - - typedef std::vector< Line > LineList; - LineList lines; - - bool dirty_layout_on_change; - - GeometryList geometry; - bool geometry_dirty; - - Colourb colour; - Colourb real_colour; - - // The decoration geometry we've generated for this string. - Geometry decoration; - // What the decoration type is that we have generated. - int generated_decoration; - // What the element's actual text-decoration property is; this may be different from the generated decoration - // if it is set to none; this means we can keep generated decoration and simply toggle it on or off as long as - // it isn't being changed. - int decoration_property; - - int font_configuration; - bool font_dirty; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/ElementUtilities.cpp b/libs/libRocket/Source/Core/ElementUtilities.cpp deleted file mode 100644 index aee36826a1a..00000000000 --- a/libs/libRocket/Source/Core/ElementUtilities.cpp +++ /dev/null @@ -1,417 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include -#include -#include "LayoutEngine.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -// Builds and sets the box for an element. -static void SetBox(Element* element); -// Positions an element relative to an offset parent. -static void SetElementOffset(Element* element, const Vector2f& offset); - -Element* ElementUtilities::GetElementById(Element* root_element, const String& id) -{ - // Breadth first search on elements for the corresponding id - typedef std::queue SearchQueue; - SearchQueue search_queue; - search_queue.push(root_element); - - while (!search_queue.empty()) - { - Element* element = search_queue.front(); - search_queue.pop(); - - if (element->GetId() == id) - { - return element; - } - - // Add all children to search - for (int i = 0; i < element->GetNumChildren(); i++) - search_queue.push(element->GetChild(i)); - } - - return NULL; -} - -void ElementUtilities::GetElementsByTagName(ElementList& elements, Element* root_element, const String& tag) -{ - // Breadth first search on elements for the corresponding id - typedef std::queue< Element* > SearchQueue; - SearchQueue search_queue; - for (int i = 0; i < root_element->GetNumChildren(); ++i) - search_queue.push(root_element->GetChild(i)); - - while (!search_queue.empty()) - { - Element* element = search_queue.front(); - search_queue.pop(); - - if (element->GetTagName() == tag) - elements.push_back(element); - - // Add all children to search. - for (int i = 0; i < element->GetNumChildren(); i++) - search_queue.push(element->GetChild(i)); - } -} - -void ElementUtilities::GetElementsByClassName(ElementList& elements, Element* root_element, const String& class_name) -{ - // Breadth first search on elements for the corresponding id - typedef std::queue< Element* > SearchQueue; - SearchQueue search_queue; - for (int i = 0; i < root_element->GetNumChildren(); ++i) - search_queue.push(root_element->GetChild(i)); - - while (!search_queue.empty()) - { - Element* element = search_queue.front(); - search_queue.pop(); - - if (element->IsClassSet(class_name)) - elements.push_back(element); - - // Add all children to search. - for (int i = 0; i < element->GetNumChildren(); i++) - search_queue.push(element->GetChild(i)); - } -} - -// Returns the element's font face. -FontFaceHandle* ElementUtilities::GetFontFaceHandle(Element* element) -{ - // Fetch the new font face. - String font_family = element->GetProperty(FONT_FAMILY)->value.Get< String >(); - String font_charset = element->GetProperty(FONT_CHARSET)->value.Get< String >(); - Font::Style font_style = (Font::Style) element->GetProperty(FONT_STYLE)->value.Get< int >(); - Font::Weight font_weight = (Font::Weight) element->GetProperty(FONT_WEIGHT)->value.Get< int >(); - int font_size = Math::RealToInteger(element->ResolveProperty(FONT_SIZE, 0)); - - FontFaceHandle* font = FontDatabase::GetFontFaceHandle(font_family, font_charset, font_style, font_weight, font_size); - return font; -} - -// Returns an element's font size, if it has a font defined. -int ElementUtilities::GetFontSize(Element* element) -{ - FontFaceHandle* font_face_handle = element->GetFontFaceHandle(); - if (font_face_handle == NULL) - return 0; - - return font_face_handle->GetSize(); -} - -// Returns an element's line height, if it has a font defined. -int ElementUtilities::GetLineHeight(Element* element) -{ - FontFaceHandle* font_face_handle = element->GetFontFaceHandle(); - if (font_face_handle == NULL) - return 0; - - int line_height = font_face_handle->GetLineHeight(); - float inch = element->GetRenderInterface()->GetPixelsPerInch(); - const Property* line_height_property = element->GetLineHeightProperty(); - - switch (line_height_property->unit) - { - ROCKET_UNUSED_SWITCH_ENUM(Property::UNKNOWN); - ROCKET_UNUSED_SWITCH_ENUM(Property::KEYWORD); - ROCKET_UNUSED_SWITCH_ENUM(Property::STRING); - ROCKET_UNUSED_SWITCH_ENUM(Property::COLOUR); - ROCKET_UNUSED_SWITCH_ENUM(Property::ABSOLUTE_UNIT); - ROCKET_UNUSED_SWITCH_ENUM(Property::PPI_UNIT); - ROCKET_UNUSED_SWITCH_ENUM(Property::RELATIVE_UNIT); - case Property::NUMBER: - case Property::EM: - // If the property is a straight number or an em measurement, then it scales the line height. - return Math::Round(line_height_property->value.Get< float >() * line_height); - case Property::PERCENT: - // If the property is a percentage, then it scales the line height. - return Math::Round(line_height_property->value.Get< float >() * line_height * 0.01f); - case Property::PX: - // A px measurement. - return Math::Round(line_height_property->value.Get< float >()); - case Property::INCH: - // Values based on pixels-per-inch. - return Math::Round(line_height_property->value.Get< float >() * inch); - case Property::CM: - return Math::Round(line_height_property->value.Get< float >() * inch * (1.0f / 2.54f)); - case Property::MM: - return Math::Round(line_height_property->value.Get< float >() * inch * (1.0f / 25.4f)); - case Property::PT: - return Math::Round(line_height_property->value.Get< float >() * inch * (1.0f / 72.0f)); - case Property::PC: - return Math::Round(line_height_property->value.Get< float >() * inch * (1.0f / 6.0f)); - } - - return 0; -} - -// Returns the width of a string rendered within the context of the given element. -int ElementUtilities::GetStringWidth(Element* element, const WString& string) -{ - FontFaceHandle* font_face_handle = element->GetFontFaceHandle(); - if (font_face_handle == NULL) - return 0; - - return font_face_handle->GetStringWidth(string); -} - -void ElementUtilities::BindEventAttributes(Element* element) -{ - int index = 0; - String name; - String value; - - // Check for and instance the on* events - while(element->IterateAttributes(index, name, value)) - { - if (name.Substring(0, 2) == "on") - { - EventListener* listener = Factory::InstanceEventListener(value, element); - if (listener) - element->AddEventListener(&name[2], listener, false); - } - } -} - -// Generates the clipping region for an element. -bool ElementUtilities::GetClippingRegion(Vector2i& clip_origin, Vector2i& clip_dimensions, Element* element) -{ - clip_origin = Vector2i(-1, -1); - clip_dimensions = Vector2i(-1, -1); - - int num_ignored_clips = element->GetClippingIgnoreDepth(); - if (num_ignored_clips < 0) - return false; - - // Search through the element's ancestors, finding all elements that clip their overflow and have overflow to clip. - // For each that we find, we combine their clipping region with the existing clipping region, and so build up a - // complete clipping region for the element. - Element* clipping_element = element->GetParentNode(); - - while (clipping_element != NULL) - { - // Merge the existing clip region with the current clip region if we aren't ignoring clip regions. - if (num_ignored_clips == 0 && clipping_element->IsClippingEnabled()) - { - // Ignore nodes that don't clip. - if (clipping_element->GetClientWidth() < clipping_element->GetScrollWidth() - || clipping_element->GetClientHeight() < clipping_element->GetScrollHeight()) - { - Vector2f element_origin_f = clipping_element->GetAbsoluteOffset(Box::CONTENT); - Vector2f element_dimensions_f = clipping_element->GetBox().GetSize(Box::CONTENT); - - Vector2i element_origin(Math::RealToInteger(element_origin_f.x), Math::RealToInteger(element_origin_f.y)); - Vector2i element_dimensions(Math::RealToInteger(element_dimensions_f.x), Math::RealToInteger(element_dimensions_f.y)); - - if (clip_origin == Vector2i(-1, -1) && clip_dimensions == Vector2i(-1, -1)) - { - clip_origin = element_origin; - clip_dimensions = element_dimensions; - } - else - { - Vector2i top_left(Math::Max(clip_origin.x, element_origin.x), - Math::Max(clip_origin.y, element_origin.y)); - - Vector2i bottom_right(Math::Min(clip_origin.x + clip_dimensions.x, element_origin.x + element_dimensions.x), - Math::Min(clip_origin.y + clip_dimensions.y, element_origin.y + element_dimensions.y)); - - clip_origin = top_left; - clip_dimensions.x = Math::Max(0, bottom_right.x - top_left.x); - clip_dimensions.y = Math::Max(0, bottom_right.y - top_left.y); - } - } - } - - // If this region is meant to clip and we're skipping regions, update the counter. - if (num_ignored_clips > 0) - { - if (clipping_element->IsClippingEnabled()) - num_ignored_clips--; - } - - // Determine how many clip regions this ancestor ignores, and inherit the value. If this region ignores all - // clipping regions, then we do too. - int clipping_element_ignore_clips = clipping_element->GetClippingIgnoreDepth(); - if (clipping_element_ignore_clips < 0) - break; - - num_ignored_clips = Math::Max(num_ignored_clips, clipping_element_ignore_clips); - - // Climb the tree to this region's parent. - clipping_element = clipping_element->GetParentNode(); - } - - return clip_dimensions.x >= 0 && clip_dimensions.y >= 0; -} - -// Sets the clipping region from an element and its ancestors. -bool ElementUtilities::SetClippingRegion(Element* element, Context* context) -{ - Rocket::Core::RenderInterface* render_interface = NULL; - if (element) - { - render_interface = element->GetRenderInterface(); - if (!context) - context = element->GetContext(); - } - else if (context) - { - render_interface = context->GetRenderInterface(); - if (!render_interface) - render_interface = GetRenderInterface(); - } - - if (!render_interface || !context) - return false; - - Vector2i clip_origin, clip_dimensions; - bool clip = element && GetClippingRegion(clip_origin, clip_dimensions, element); - - Vector2i current_origin; - Vector2i current_dimensions; - bool current_clip = context->GetActiveClipRegion(current_origin, current_dimensions); - if (current_clip != clip || (clip && (clip_origin != current_origin || clip_dimensions != current_dimensions))) - { - context->SetActiveClipRegion(clip_origin, clip_dimensions); - ApplyActiveClipRegion(context, render_interface); - } - - return true; -} - -void ElementUtilities::ApplyActiveClipRegion(Context* context, RenderInterface* render_interface) -{ - if (render_interface == NULL) - return; - - Vector2i origin; - Vector2i dimensions; - bool clip_enabled = context->GetActiveClipRegion(origin, dimensions); - - render_interface->EnableScissorRegion(clip_enabled); - if (clip_enabled) - { - render_interface->SetScissorRegion(origin.x, origin.y, dimensions.x, dimensions.y); - } -} - -// Formats the contents of an element. -bool ElementUtilities::FormatElement(Element* element, const Vector2f& containing_block) -{ - LayoutEngine layout_engine; - return layout_engine.FormatElement(element, containing_block); -} - -// Generates the box for an element. -void ElementUtilities::BuildBox(Box& box, const Vector2f& containing_block, Element* element, bool inline_element) -{ - LayoutEngine::BuildBox(box, containing_block, element, inline_element); -} - -// Sizes and positions an element within its parent. -bool ElementUtilities::PositionElement(Element* element, const Vector2f& offset) -{ - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - SetBox(element); - SetElementOffset(element, offset); - - return true; -} - -// Sizes an element, and positions it within its parent offset from the borders of its content area. -bool ElementUtilities::PositionElement(Element* element, const Vector2f& offset, PositionAnchor anchor) -{ - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - SetBox(element); - - Vector2f containing_block = element->GetParentNode()->GetBox().GetSize(Box::CONTENT); - Vector2f element_block = element->GetBox().GetSize(Box::MARGIN); - - Vector2f resolved_offset = offset; - - if (anchor & RIGHT) - resolved_offset.x = containing_block.x - (element_block.x + offset.x); - - if (anchor & BOTTOM) - resolved_offset.y = containing_block.y - (element_block.y + offset.y); - - SetElementOffset(element, resolved_offset); - - return true; -} - -// Builds and sets the box for an element. -static void SetBox(Element* element) -{ - Element* parent = element->GetParentNode(); - ROCKET_ASSERT(parent != NULL); - - Vector2f containing_block = parent->GetBox().GetSize(); - containing_block.x -= parent->GetElementScroll()->GetScrollbarSize(ElementScroll::VERTICAL); - containing_block.y -= parent->GetElementScroll()->GetScrollbarSize(ElementScroll::HORIZONTAL); - - Box box; - LayoutEngine::BuildBox(box, containing_block, element); - - const Property *local_height; - element->GetLocalDimensionProperties(NULL, &local_height); - if (local_height == NULL) - box.SetContent(Vector2f(box.GetSize().x, containing_block.y)); - - element->SetBox(box); -} - -// Positions an element relative to an offset parent. -static void SetElementOffset(Element* element, const Vector2f& offset) -{ - Vector2f relative_offset = element->GetParentNode()->GetBox().GetPosition(Box::CONTENT); - relative_offset += offset; - relative_offset.x += element->GetBox().GetEdge(Box::MARGIN, Box::LEFT); - relative_offset.y += element->GetBox().GetEdge(Box::MARGIN, Box::TOP); - - element->SetOffset(relative_offset, element->GetParentNode()); -} - -} -} diff --git a/libs/libRocket/Source/Core/Event.cpp b/libs/libRocket/Source/Core/Event.cpp deleted file mode 100644 index 16f7099c436..00000000000 --- a/libs/libRocket/Source/Core/Event.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/EventInstancer.h" - -namespace Rocket { -namespace Core { - -Event::Event() -{ - phase = PHASE_UNKNOWN; - interruped = false; - interruptible = false; - current_element = NULL; - target_element = NULL; -} - -Event::Event(Element* _target_element, const String& _type, const Dictionary& _parameters, bool _interruptible) : type(_type), parameters(_parameters), target_element(_target_element), interruptible(_interruptible) -{ - phase = PHASE_UNKNOWN; - interruped = false; - current_element = NULL; -} - -Event::~Event() -{ -} - -void Event::SetCurrentElement(Element* element) -{ - current_element = element; -} - -Element* Event::GetCurrentElement() const -{ - return current_element; -} - -Element* Event::GetTargetElement() const -{ - return target_element; -} - -const String& Event::GetType() const -{ - return type; -} - -bool Event::operator==(const String& _type) const -{ - return type == _type; -} - -void Event::SetPhase(EventPhase _phase) -{ - phase = _phase; -} - -Event::EventPhase Event::GetPhase() const -{ - return phase; -} - -bool Event::IsPropagating() const -{ - return !interruped; -} - -void Event::StopPropagation() -{ - // Set interruped to true if we can be interruped - if (interruptible) - { - interruped = true; - } -} - -const Dictionary* Event::GetParameters() const -{ - return ¶meters; -} - -void Event::OnReferenceDeactivate() -{ - instancer->ReleaseEvent(this); -} - -} -} diff --git a/libs/libRocket/Source/Core/EventDispatcher.cpp b/libs/libRocket/Source/Core/EventDispatcher.cpp deleted file mode 100644 index 45fa5a4742d..00000000000 --- a/libs/libRocket/Source/Core/EventDispatcher.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "EventDispatcher.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/EventListener.h" -#include "../../Include/Rocket/Core/Factory.h" - -namespace Rocket { -namespace Core { - -EventDispatcher::EventDispatcher(Element* _element) -{ - element = _element; -} - -EventDispatcher::~EventDispatcher() -{ - // Detach from all event dispatchers - for (Events::iterator event_itr = events.begin(); event_itr != events.end(); ++event_itr) - { - for (Listeners::iterator listener_itr = (*event_itr).second.begin(); listener_itr != (*event_itr).second.end(); ++listener_itr) - { - (*listener_itr).listener->OnDetach(element); - } - } -} - -void EventDispatcher::AttachEvent(const String& type, EventListener* listener, bool in_capture_phase) -{ - // Look up the event - Events::iterator event_itr = events.find(type); - - // Ensure the event is in the event list - if (event_itr == events.end()) - { - event_itr = events.insert(std::pair< String, Listeners >(type, Listeners())).first; - } - - // Add the action to the events - (*event_itr).second.push_back(Listener(listener, in_capture_phase)); - - listener->OnAttach(element); -} - -void EventDispatcher::DetachEvent(const String& type, EventListener* listener, bool in_capture_phase) -{ - // Look up the event - Events::iterator event_itr = events.find(type); - - // Bail if we can't find the event - if (event_itr == events.end()) - { - return; - } - - // Find the relevant listener and erase it - Listeners::iterator listener_itr = (*event_itr).second.begin(); - while (listener_itr != (*event_itr).second.end()) - { - if ((*listener_itr).listener == listener && (*listener_itr).in_capture_phase == in_capture_phase) - { - listener_itr = (*event_itr).second.erase(listener_itr); - listener->OnDetach(element); - } - else - ++listener_itr; - } -} - -// Detaches all events from this dispatcher and all child dispatchers. -void EventDispatcher::DetachAllEvents() -{ - for (Events::iterator event_iterator = events.begin(); event_iterator != events.end(); ++event_iterator) - { - Listeners& listeners = event_iterator->second; - for (size_t i = 0; i < listeners.size(); ++i) - listeners[i].listener->OnDetach(element); - } - - events.clear(); - - for (int i = 0; i < element->GetNumChildren(true); ++i) - element->GetChild(i)->GetEventDispatcher()->DetachAllEvents(); -} - -bool EventDispatcher::DispatchEvent(Element* target_element, const String& name, const Dictionary& parameters, bool interruptible) -{ - //Event event(target_element, name, parameters, interruptible); - Event* event = Factory::InstanceEvent(target_element, name, parameters, interruptible); - if (event == NULL) - return false; - - // Build the element traversal from the tree - typedef std::vector Elements; - Elements elements; - - Element* walk_element = target_element->GetParentNode(); - while (walk_element) - { - elements.push_back(walk_element); - walk_element = walk_element->GetParentNode(); - } - - event->SetPhase(Event::PHASE_CAPTURE); - // Capture phase - root, to target (only events that have registered as capture events) - // Note: We walk elements in REVERSE as they're placed in the list from the elements parent to the root - for (int i = (int)elements.size() - 1; i >= 0 && event->IsPropagating(); i--) - { - EventDispatcher* dispatcher = elements[i]->GetEventDispatcher(); - event->SetCurrentElement(elements[i]); - dispatcher->TriggerEvents(event); - } - - // Target phase - direct at the target - if (event->IsPropagating()) - { - event->SetPhase(Event::PHASE_TARGET); - event->SetCurrentElement(target_element); - TriggerEvents(event); - } - - if (event->IsPropagating()) - { - event->SetPhase(Event::PHASE_BUBBLE); - // Bubble phase - target to root (normal event bindings) - for (size_t i = 0; i < elements.size() && event->IsPropagating(); i++) - { - EventDispatcher* dispatcher = elements[i]->GetEventDispatcher(); - event->SetCurrentElement(elements[i]); - dispatcher->TriggerEvents(event); - } - } - - bool propagating = event->IsPropagating(); - event->RemoveReference(); - return propagating; -} - -void EventDispatcher::TriggerEvents(Event* event) -{ - // Look up the event - Events::iterator itr = events.find(event->GetType()); - - if (itr != events.end()) - { - // Dispatch all actions - Listeners& listeners = (*itr).second; - if (event->GetPhase() == Event::PHASE_TARGET) - { - // Fire all listeners waiting for bubble events before we send the event to the target itself. - for (size_t i = 0; i < listeners.size() && event->IsPropagating(); i++) - { - if (!listeners[i].in_capture_phase) - { - listeners[i].listener->ProcessEvent(*event); - } - } - - // Send the event to the target element itself. - if (event->IsPropagating()) - element->ProcessEvent(*event); - - // Fire all listeners waiting for capture events. - for (size_t i = 0; i < listeners.size() && event->IsPropagating(); i++) - { - if (listeners[i].in_capture_phase) - listeners[i].listener->ProcessEvent(*event); - } - - return; - } - else - { - bool in_capture_phase = event->GetPhase() == Event::PHASE_CAPTURE; - - for (size_t i = 0; i < listeners.size() && event->IsPropagating(); i++) - { - // If we're in the correct phase, fire the event - if (listeners[i].in_capture_phase == in_capture_phase) - listeners[i].listener->ProcessEvent(*event); - } - } - } - - if (event->GetPhase() != Event::PHASE_CAPTURE) - { - // Send the event to the target element. - element->ProcessEvent(*event); - } -} - -} -} diff --git a/libs/libRocket/Source/Core/EventDispatcher.h b/libs/libRocket/Source/Core/EventDispatcher.h deleted file mode 100644 index a18149eff36..00000000000 --- a/libs/libRocket/Source/Core/EventDispatcher.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREEVENTDISPATCHER_H -#define ROCKETCOREEVENTDISPATCHER_H - -#include "../../Include/Rocket/Core/String.h" -#include "../../Include/Rocket/Core/Event.h" -#include - -namespace Rocket { -namespace Core { - -class Element; -class EventListener; - -/** - The Event Dispatcher manages a list of event listeners (based on URL) and triggers the events via EventHandlers - whenever requested. - - @author Lloyd Weehuizen -*/ - -class EventDispatcher -{ -public: - /// Constructor - /// @param element Element this dispatcher acts on - EventDispatcher(Element* element); - - // Destructor - ~EventDispatcher(); - - /// Attaches a new listener to the specified event name - /// @param[in] type Type of the event to attach to - /// @param[in] event_listener The event listener to be notified when the event fires - /// @param[in] in_capture_phase Should the listener be notified in the capture phase - void AttachEvent(const String& type, EventListener* event_listener, bool in_capture_phase); - - /// Detaches a listener from the specified event name - /// @param[in] type Type of the event to attach to - /// @para[in]m event_listener The event listener to be notified when the event fires - /// @param[in] in_capture_phase Should the listener be notified in the capture phase - void DetachEvent(const String& type, EventListener* listener, bool in_capture_phase); - - /// Detaches all events from this dispatcher and all child dispatchers. - void DetachAllEvents(); - - /// Dispatches the specified event with element as the target - /// @param[in] target_element The target element of the event - /// @param[in] name The name of the event - /// @param[in] parameters The event parameters - /// @param[in] interruptible Can the event propagation be stopped - /// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was. - bool DispatchEvent(Element* element, const String& name, const Dictionary& parameters, bool interruptible); - -private: - Element* element; - - struct Listener - { - Listener(EventListener* _listener, bool _in_capture_phase) : listener(_listener), in_capture_phase(_in_capture_phase) {} - EventListener* listener; - bool in_capture_phase; - }; - typedef std::vector< Listener > Listeners; - typedef std::map< String, Listeners > Events; - Events events; - - void TriggerEvents(Event* event); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/EventInstancer.cpp b/libs/libRocket/Source/Core/EventInstancer.cpp deleted file mode 100644 index 5a8643d5583..00000000000 --- a/libs/libRocket/Source/Core/EventInstancer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/EventInstancer.h" - -namespace Rocket { -namespace Core { - -EventInstancer::~EventInstancer() -{ -} - -void EventInstancer::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/EventInstancerDefault.cpp b/libs/libRocket/Source/Core/EventInstancerDefault.cpp deleted file mode 100644 index 4bd324feb9b..00000000000 --- a/libs/libRocket/Source/Core/EventInstancerDefault.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "EventInstancerDefault.h" -#include "../../Include/Rocket/Core/Event.h" - -namespace Rocket { -namespace Core { - -EventInstancerDefault::EventInstancerDefault() -{ -} - -EventInstancerDefault::~EventInstancerDefault() -{ -} - -Event* EventInstancerDefault::InstanceEvent(Element* target, const String& name, const Dictionary& parameters, bool interruptible) -{ - return new Event(target, name, parameters, interruptible); -} - -// Releases an event instanced by this instancer. -void EventInstancerDefault::ReleaseEvent(Event* event) -{ - delete event; -} - -void EventInstancerDefault::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/EventInstancerDefault.h b/libs/libRocket/Source/Core/EventInstancerDefault.h deleted file mode 100644 index a1f2d9185e7..00000000000 --- a/libs/libRocket/Source/Core/EventInstancerDefault.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREEVENTINSTANCERDEFAULT_H -#define ROCKETCOREEVENTINSTANCERDEFAULT_H - -#include "../../Include/Rocket/Core/EventInstancer.h" - -namespace Rocket { -namespace Core { - -/** - Default instancer for instancing events. - - @author Lloyd Weehuizen - */ - -class EventInstancerDefault : public EventInstancer -{ -public: - EventInstancerDefault(); - virtual ~EventInstancerDefault(); - - /// Instance and event object - /// @param[in] target Target element of this event. - /// @param[in] name Name of this event. - /// @param[in] parameters Additional parameters for this event. - /// @param[in] interruptible If the event propagation can be stopped. - virtual Event* InstanceEvent(Element* target, const String& name, const Dictionary& parameters, bool interruptible); - - /// Releases an event instanced by this instancer. - /// @param[in] event The event to release. - virtual void ReleaseEvent(Event* event); - - /// Releases this event instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/EventIterators.h b/libs/libRocket/Source/Core/EventIterators.h deleted file mode 100644 index dd29e40d716..00000000000 --- a/libs/libRocket/Source/Core/EventIterators.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREEVENTITERATORS_H -#define ROCKETCOREEVENTITERATORS_H - -#include "../../Include/Rocket/Core/ElementReference.h" -#include "../../Include/Rocket/Core/Element.h" - -namespace Rocket { -namespace Core { - -/** - An STL unary functor for dispatching an event to a Element. - - @author Peter Curry - */ - -class RKTEventFunctor -{ -public: - RKTEventFunctor(const String& event, const Dictionary& parameters, bool interruptible) - { - this->event = event; - this->parameters = ¶meters; - this->interruptible = interruptible; - } - - void operator()(ElementReference& element) - { - element->DispatchEvent(event, *parameters, interruptible); - } - -private: - String event; - const Dictionary* parameters; - bool interruptible; -}; - -/** - An STL unary functor for setting or clearing a pseudo-class on a Element. - - @author Pete - */ - -class PseudoClassFunctor -{ - public: - PseudoClassFunctor(const String& pseudo_class, bool set) : pseudo_class(pseudo_class) - { - this->set = set; - } - - void operator()(ElementReference& element) - { - element->SetPseudoClass(pseudo_class, set); - } - - private: - String pseudo_class; - bool set; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/EventListenerInstancer.cpp b/libs/libRocket/Source/Core/EventListenerInstancer.cpp deleted file mode 100644 index 9da3bc8abc7..00000000000 --- a/libs/libRocket/Source/Core/EventListenerInstancer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/EventListenerInstancer.h" - -namespace Rocket { -namespace Core { - -EventListenerInstancer::~EventListenerInstancer() -{ -} - -void EventListenerInstancer::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/Factory.cpp b/libs/libRocket/Source/Core/Factory.cpp deleted file mode 100644 index 547a1ae39e2..00000000000 --- a/libs/libRocket/Source/Core/Factory.cpp +++ /dev/null @@ -1,585 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core.h" -#include "../../Include/Rocket/Core/StreamMemory.h" -#include "ContextInstancerDefault.h" -#include "DecoratorNoneInstancer.h" -#include "DecoratorTiledBoxInstancer.h" -#include "DecoratorTiledHorizontalInstancer.h" -#include "DecoratorTiledImageInstancer.h" -#include "DecoratorTiledVerticalInstancer.h" -#include "ElementHandle.h" -#include "ElementImage.h" -#include "ElementTextDefault.h" -#include "EventInstancerDefault.h" -#include "FontEffectNoneInstancer.h" -#include "FontEffectOutlineInstancer.h" -#include "FontEffectShadowInstancer.h" -#include "PluginRegistry.h" -#include "PropertyParserColour.h" -#include "StreamFile.h" -#include "StyleSheetFactory.h" -#include "TemplateCache.h" -#include "XMLNodeHandlerBody.h" -#include "XMLNodeHandlerDefault.h" -#include "XMLNodeHandlerHead.h" -#include "XMLNodeHandlerTemplate.h" -#include "XMLParseTools.h" - -namespace Rocket { -namespace Core { - -// Element instancers. -typedef std::map< String, ElementInstancer* > ElementInstancerMap; -static ElementInstancerMap element_instancers; - -// Decorator instancers. -typedef std::map< String, DecoratorInstancer* > DecoratorInstancerMap; -static DecoratorInstancerMap decorator_instancers; - -// Font effect instancers. -typedef std::map< String, FontEffectInstancer* > FontEffectInstancerMap; -static FontEffectInstancerMap font_effect_instancers; - -// The context instancer. -static ContextInstancer* context_instancer = NULL; - -// The event instancer -static EventInstancer* event_instancer = NULL; - -// Event listener instancer. -static EventListenerInstancer* event_listener_instancer = NULL; - -Factory::Factory() -{ -} - -Factory::~Factory() -{ -} - -bool Factory::Initialise() -{ - // Bind the default context instancer. - if (context_instancer == NULL) - context_instancer = new ContextInstancerDefault(); - - // Bind default event instancer - if (event_instancer == NULL) - event_instancer = new EventInstancerDefault(); - - // No default event listener instancer - if (event_listener_instancer == NULL) - event_listener_instancer = NULL; - - // Bind the default element instancers - RegisterElementInstancer("*", new ElementInstancerGeneric< Element >())->RemoveReference(); - RegisterElementInstancer("img", new ElementInstancerGeneric< ElementImage >())->RemoveReference(); - RegisterElementInstancer("#text", new ElementInstancerGeneric< ElementTextDefault >())->RemoveReference(); - RegisterElementInstancer("handle", new ElementInstancerGeneric< ElementHandle >())->RemoveReference(); - RegisterElementInstancer("body", new ElementInstancerGeneric< ElementDocument >())->RemoveReference(); - - // Bind the default decorator instancers - RegisterDecoratorInstancer("tiled-horizontal", new DecoratorTiledHorizontalInstancer())->RemoveReference(); - RegisterDecoratorInstancer("tiled-vertical", new DecoratorTiledVerticalInstancer())->RemoveReference(); - RegisterDecoratorInstancer("tiled-box", new DecoratorTiledBoxInstancer())->RemoveReference(); - RegisterDecoratorInstancer("image", new DecoratorTiledImageInstancer())->RemoveReference(); - RegisterDecoratorInstancer("none", new DecoratorNoneInstancer())->RemoveReference(); - - RegisterFontEffectInstancer("shadow", new FontEffectShadowInstancer())->RemoveReference(); - RegisterFontEffectInstancer("outline", new FontEffectOutlineInstancer())->RemoveReference(); - RegisterFontEffectInstancer("none", new FontEffectNoneInstancer())->RemoveReference(); - - // Register the core XML node handlers. - XMLParser::RegisterNodeHandler("", new XMLNodeHandlerDefault())->RemoveReference(); - XMLParser::RegisterNodeHandler("body", new XMLNodeHandlerBody())->RemoveReference(); - XMLParser::RegisterNodeHandler("head", new XMLNodeHandlerHead())->RemoveReference(); - XMLParser::RegisterNodeHandler("template", new XMLNodeHandlerTemplate())->RemoveReference(); - - return true; -} - -void Factory::Shutdown() -{ - for (ElementInstancerMap::iterator i = element_instancers.begin(); i != element_instancers.end(); ++i) - (*i).second->RemoveReference(); - element_instancers.clear(); - - for (DecoratorInstancerMap::iterator i = decorator_instancers.begin(); i != decorator_instancers.end(); ++i) - (*i).second->RemoveReference(); - decorator_instancers.clear(); - - for (FontEffectInstancerMap::iterator i = font_effect_instancers.begin(); i != font_effect_instancers.end(); ++i) - (*i).second->RemoveReference(); - font_effect_instancers.clear(); - - if (context_instancer) - context_instancer->RemoveReference(); - context_instancer = NULL; - - if (event_listener_instancer) - event_listener_instancer->RemoveReference(); - event_listener_instancer = NULL; - - if (event_instancer) - event_instancer->RemoveReference(); - event_instancer = NULL; - - XMLParser::ReleaseHandlers(); -} - -// Registers the instancer to use when instancing contexts. -ContextInstancer* Factory::RegisterContextInstancer(ContextInstancer* instancer) -{ - instancer->AddReference(); - if (context_instancer != NULL) - context_instancer->RemoveReference(); - - context_instancer = instancer; - return instancer; -} - -// Instances a new context. -Context* Factory::InstanceContext(const String& name) -{ - Context* new_context = context_instancer->InstanceContext(name); - if (new_context != NULL) - new_context->SetInstancer(context_instancer); - - return new_context; -} - -ElementInstancer* Factory::RegisterElementInstancer(const String& name, ElementInstancer* instancer) -{ - String lower_case_name = name.ToLower(); - instancer->AddReference(); - - // Check if an instancer for this tag is already defined, if so release it - ElementInstancerMap::iterator itr = element_instancers.find(lower_case_name); - if (itr != element_instancers.end()) - { - (*itr).second->RemoveReference(); - } - - element_instancers[lower_case_name] = instancer; - return instancer; -} - -// Looks up the instancer for the given element -ElementInstancer* Factory::GetElementInstancer(const String& tag) -{ - ElementInstancerMap::iterator instancer_iterator = element_instancers.find(tag); - if (instancer_iterator == element_instancers.end()) - { - instancer_iterator = element_instancers.find("*"); - if (instancer_iterator == element_instancers.end()) - return NULL; - } - - return (*instancer_iterator).second; -} - -// Instances a single element. -Element* Factory::InstanceElement(Element* parent, const String& instancer_name, const String& tag, const XMLAttributes& attributes) -{ - ElementInstancer* instancer = GetElementInstancer(instancer_name); - - if (instancer) - { - Element* element = instancer->InstanceElement(parent, tag, attributes); - - // Process the generic attributes and bind any events - if (element) - { - element->SetInstancer(instancer); - element->SetAttributes(&attributes); - ElementUtilities::BindEventAttributes(element); - - PluginRegistry::NotifyElementCreate(element); - } - - return element; - } - - return NULL; -} - -// Instances a single text element containing a string. -bool Factory::InstanceElementText(Element* parent, const String& text) -{ - SystemInterface* system_interface = GetSystemInterface(); - - // Do any necessary translation. If any substitutions were made then new XML may have been introduced, so we'll - // have to run the data through the XML parser again. - String translated_data; - if (system_interface != NULL && - (system_interface->TranslateString(translated_data, text) > 0 || - translated_data.Find("<") != String::npos)) - { - StreamMemory* stream = new StreamMemory(translated_data.Length() + 32); - stream->Write("", 6); - stream->Write(translated_data); - stream->Write("", 7); - stream->Seek(0, SEEK_SET); - - InstanceElementStream(parent, stream); - stream->RemoveReference(); - } - else - { - // Check if this text node contains only white-space; if so, we don't want to construct it. - bool only_white_space = true; - for (size_t i = 0; i < translated_data.Length(); ++i) - { - if (!StringUtilities::IsWhitespace(translated_data[i])) - { - only_white_space = false; - break; - } - } - - if (only_white_space) - return true; - - // Attempt to instance the element. - XMLAttributes attributes; - Element* element = Factory::InstanceElement(parent, "#text", "#text", attributes); - if (!element) - { - Log::Message(Log::LT_ERROR, "Failed to instance text element '%s', instancer returned NULL.", translated_data.CString()); - return false; - } - - // Assign the element its text value. - ElementText* text_element = dynamic_cast< ElementText* >(element); - if (text_element == NULL) - { - Log::Message(Log::LT_ERROR, "Failed to instance text element '%s'. Found type '%s', was expecting a derivative of ElementText.", translated_data.CString(), typeid(element).name()); - element->RemoveReference(); - return false; - } - - text_element->SetText(translated_data); - - // Add to active node. - parent->AppendChild(element); - element->RemoveReference(); - } - - return true; -} - -// Instances a element tree based on the stream -bool Factory::InstanceElementStream(Element* parent, Stream* stream) -{ - XMLParser parser(parent); - parser.Parse(stream); - return true; -} - -// Instances a element tree based on the stream -ElementDocument* Factory::InstanceDocumentStream(Rocket::Core::Context* context, Stream* stream) -{ - Element* element = Factory::InstanceElement(NULL, "body", "body", XMLAttributes()); - if (!element) - { - Log::Message(Log::LT_ERROR, "Failed to instance document, instancer returned NULL."); - return NULL; - } - - ElementDocument* document = dynamic_cast< ElementDocument* >(element); - if (!document) - { - Log::Message(Log::LT_ERROR, "Failed to instance document element. Found type '%s', was expecting derivative of ElementDocument.", typeid(element).name()); - return NULL; - } - - document->lock_layout = true; - document->context = context; - - XMLParser parser(element); - parser.Parse(stream); - - document->lock_layout = false; - - return document; -} - -// Registers an instancer that will be used to instance decorators. -DecoratorInstancer* Factory::RegisterDecoratorInstancer(const String& name, DecoratorInstancer* instancer) -{ - String lower_case_name = name.ToLower(); - instancer->AddReference(); - - // Check if an instancer for this tag is already defined. If so, release it. - DecoratorInstancerMap::iterator iterator = decorator_instancers.find(lower_case_name); - if (iterator != decorator_instancers.end()) - (*iterator).second->RemoveReference(); - - decorator_instancers[lower_case_name] = instancer; - return instancer; -} - -// Attempts to instance a decorator from an instancer registered with the factory. -Decorator* Factory::InstanceDecorator(const String& name, const PropertyDictionary& properties) -{ - float z_index = 0; - int specificity = -1; - - DecoratorInstancerMap::iterator iterator = decorator_instancers.find(name); - if (iterator == decorator_instancers.end()) - return NULL; - - // Turn the generic, un-parsed properties we've got into a properly parsed dictionary. - const PropertySpecification& property_specification = (*iterator).second->GetPropertySpecification(); - - PropertyDictionary parsed_properties; - for (PropertyMap::const_iterator i = properties.GetProperties().begin(); i != properties.GetProperties().end(); ++i) - { - specificity = Math::Max(specificity, (*i).second.specificity); - - // Check for the 'z-index' property; we don't want to send this through. - if ((*i).first == Z_INDEX) - z_index = (*i).second.value.Get< float >(); - else - property_specification.ParsePropertyDeclaration(parsed_properties, (*i).first, (*i).second.value.Get< String >(), (*i).second.source, (*i).second.source_line_number); - } - - // Set the property defaults for all unset properties. - property_specification.SetPropertyDefaults(parsed_properties); - - Decorator* decorator = (*iterator).second->InstanceDecorator(name, parsed_properties); - if (decorator == NULL) - return NULL; - - decorator->SetZIndex(z_index); - decorator->SetSpecificity(specificity); - decorator->instancer = (*iterator).second; - return decorator; -} - -// Registers an instancer that will be used to instance font effects. -FontEffectInstancer* Factory::RegisterFontEffectInstancer(const String& name, FontEffectInstancer* instancer) -{ - String lower_case_name = name.ToLower(); - instancer->AddReference(); - - // Check if an instancer for this tag is already defined. If so, release it. - FontEffectInstancerMap::iterator iterator = font_effect_instancers.find(lower_case_name); - if (iterator != font_effect_instancers.end()) - (*iterator).second->RemoveReference(); - - font_effect_instancers[lower_case_name] = instancer; - return instancer; -} - -// Attempts to instance a font effect from an instancer registered with the factory. -FontEffect* Factory::InstanceFontEffect(const String& name, const PropertyDictionary& properties) -{ - bool set_colour = false; - Colourb colour(255, 255, 255); - - bool set_z_index = false; - float z_index = 0; - - int specificity = -1; - - FontEffectInstancerMap::iterator iterator = font_effect_instancers.find(name); - if (iterator == font_effect_instancers.end()) - return NULL; - - FontEffectInstancer* instancer = iterator->second; - - // Turn the generic, un-parsed properties we've got into a properly parsed dictionary. - const PropertySpecification& property_specification = (*iterator).second->GetPropertySpecification(); - - PropertyDictionary parsed_properties; - for (PropertyMap::const_iterator i = properties.GetProperties().begin(); i != properties.GetProperties().end(); ++i) - { - specificity = Math::Max(specificity, i->second.specificity); - - // Check for the 'z-index' property; we don't want to send this through. - if (i->first == Z_INDEX) - { - set_z_index = true; - z_index = i->second.value.Get< float >(); - } - else if (i->first == COLOR) - { - static PropertyParserColour colour_parser; - - Property colour_property; - if (colour_parser.ParseValue(colour_property, i->second.value.Get< String >(), ParameterMap())) - { - colour = colour_property.value.Get< Colourb >(); - set_colour = true; - } - } - else - { - property_specification.ParsePropertyDeclaration(parsed_properties, (*i).first, (*i).second.value.Get< String >(), (*i).second.source, (*i).second.source_line_number); - } - } - - // Set the property defaults for all unset properties. - property_specification.SetPropertyDefaults(parsed_properties); - - // Compile an ordered list of the values of the properties used to generate the effect's - // textures and geometry. - typedef std::list< std::pair< String, String > > GenerationPropertyList; - GenerationPropertyList generation_properties; - for (PropertyMap::const_iterator i = parsed_properties.GetProperties().begin(); i != parsed_properties.GetProperties().end(); ++i) - { - if (instancer->volatile_properties.find(i->first) != instancer->volatile_properties.end()) - { - GenerationPropertyList::iterator j = generation_properties.begin(); - while (j != generation_properties.end() && - j->first < i->first) - ++j; - - generation_properties.insert(j, GenerationPropertyList::value_type(i->first, i->second.value.Get< String >())); - } - } - - String generation_key; - for (GenerationPropertyList::iterator i = generation_properties.begin(); i != generation_properties.end(); ++i) - { - generation_key += i->second; - generation_key += ";"; - } - - // Now we can actually instance the effect! - FontEffect* font_effect = (*iterator).second->InstanceFontEffect(name, parsed_properties); - if (font_effect == NULL) - return NULL; - - font_effect->name = name; - font_effect->generation_key = generation_key; - - if (set_z_index) - font_effect->SetZIndex(z_index); - - if (set_colour) - font_effect->SetColour(colour); - - font_effect->SetSpecificity(specificity); - font_effect->instancer = (*iterator).second; - return font_effect; -} - -// Creates a style sheet containing the passed in styles. -StyleSheet* Factory::InstanceStyleSheetString(const String& string) -{ - StreamMemory* memory_stream = new StreamMemory((const byte*) string.CString(), string.Length()); - StyleSheet* style_sheet = InstanceStyleSheetStream(memory_stream); - memory_stream->RemoveReference(); - return style_sheet; -} - -// Creates a style sheet from a file. -StyleSheet* Factory::InstanceStyleSheetFile(const String& file_name) -{ - StreamFile* file_stream = new StreamFile(); - file_stream->Open(file_name); - StyleSheet* style_sheet = InstanceStyleSheetStream(file_stream); - file_stream->RemoveReference(); - return style_sheet; -} - -// Creates a style sheet from an Stream. -StyleSheet* Factory::InstanceStyleSheetStream(Stream* stream) -{ - StyleSheet* style_sheet = new StyleSheet(); - if (style_sheet->LoadStyleSheet(stream)) - { - return style_sheet; - } - - style_sheet->RemoveReference(); - return NULL; -} - -// Clears the style sheet cache. This will force style sheets to be reloaded. -void Factory::ClearStyleSheetCache() -{ - StyleSheetFactory::ClearStyleSheetCache(); -} - -/// Clears the template cache. This will force templates to be reloaded. -void Factory::ClearTemplateCache() -{ - TemplateCache::Clear(); -} - -// Registers an instancer for all RKTEvents -EventInstancer* Factory::RegisterEventInstancer(EventInstancer* instancer) -{ - instancer->AddReference(); - - if (event_instancer) - event_instancer->RemoveReference(); - - event_instancer = instancer; - return instancer; -} - -// Instance an event object. -Event* Factory::InstanceEvent(Element* target, const String& name, const Dictionary& parameters, bool interruptible) -{ - Event* event = event_instancer->InstanceEvent(target, name, parameters, interruptible); - if (event != NULL) - event->instancer = event_instancer; - - return event; -} - -// Register an instancer for all event listeners -EventListenerInstancer* Factory::RegisterEventListenerInstancer(EventListenerInstancer* instancer) -{ - instancer->AddReference(); - - if (event_listener_instancer) - event_listener_instancer->RemoveReference(); - - event_listener_instancer = instancer; - return instancer; -} - -// Instance an event listener with the given string -EventListener* Factory::InstanceEventListener(const String& value, Element* element) -{ - // If we have an event listener instancer, use it - if (event_listener_instancer) - return event_listener_instancer->InstanceEventListener(value, element); - - return NULL; -} - -} -} diff --git a/libs/libRocket/Source/Core/FileInterface.cpp b/libs/libRocket/Source/Core/FileInterface.cpp deleted file mode 100644 index be47d12cb04..00000000000 --- a/libs/libRocket/Source/Core/FileInterface.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/FileInterface.h" - -namespace Rocket { -namespace Core { - -FileInterface::FileInterface() : ReferenceCountable(0) -{ -} - -FileInterface::~FileInterface() -{ -} - -// Returns the length of the file. -size_t FileInterface::Length(FileHandle file) -{ - size_t current_position = Tell(file); - Seek( file, 0, SEEK_END); - size_t length = Tell( file); - Seek( file, (long)current_position, SEEK_SET); - return length; -} - -// Called when this file interface is released. -void FileInterface::Release() -{ -} - -void FileInterface::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/FileInterfaceDefault.cpp b/libs/libRocket/Source/Core/FileInterfaceDefault.cpp deleted file mode 100644 index 8abbedd68ac..00000000000 --- a/libs/libRocket/Source/Core/FileInterfaceDefault.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FileInterfaceDefault.h" - -#ifndef ROCKET_NO_FILE_INTERFACE_DEFAULT - -namespace Rocket { -namespace Core { - -FileInterfaceDefault::~FileInterfaceDefault() -{ -} - -// Opens a file. -FileHandle FileInterfaceDefault::Open(const String& path) -{ - return (FileHandle)fopen(path.CString(), "rb"); -} - -// Closes a previously opened file. -void FileInterfaceDefault::Close(FileHandle file) -{ - fclose((FILE*) file); -} - -// Reads data from a previously opened file. -size_t FileInterfaceDefault::Read(void* buffer, size_t size, FileHandle file) -{ - return fread(buffer, 1, size, (FILE*) file); -} - -// Seeks to a point in a previously opened file. -bool FileInterfaceDefault::Seek(FileHandle file, long offset, int origin) -{ - return fseek((FILE*) file, offset, origin) == 0; -} - -// Returns the current position of the file pointer. -size_t FileInterfaceDefault::Tell(FileHandle file) -{ - return ftell((FILE*) file); -} - -} -} - -#endif /*ROCKET_NO_FILE_INTERFACE_DEFAULT*/ diff --git a/libs/libRocket/Source/Core/FileInterfaceDefault.h b/libs/libRocket/Source/Core/FileInterfaceDefault.h deleted file mode 100644 index 296d5e78405..00000000000 --- a/libs/libRocket/Source/Core/FileInterfaceDefault.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFILEINTERFACEDEFAULT_H -#define ROCKETCOREFILEINTERFACEDEFAULT_H - -#include "../../Include/Rocket/Core/FileInterface.h" - -#ifndef ROCKET_NO_FILE_INTERFACE_DEFAULT - -namespace Rocket { -namespace Core { - -/** - Implementation of the Rocket file interface using the Standard C file functions. - - @author Peter Curry - */ - -class FileInterfaceDefault : public FileInterface -{ -public: - virtual ~FileInterfaceDefault(); - - /// Opens a file. - /// @param path The path of the file to open. - /// @return A valid file handle, or NULL on failure - virtual FileHandle Open(const String& path); - /// Closes a previously opened file. - /// @param file The file handle previously opened through Open(). - virtual void Close(FileHandle file); - - /// Reads data from a previously opened file. - /// @param buffer The buffer to be read into. - /// @param size The number of bytes to read into the buffer. - /// @param file The handle of the file. - /// @return The total number of bytes read into the buffer. - virtual size_t Read(void* buffer, size_t size, FileHandle file); - /// Seeks to a point in a previously opened file. - /// @param file The handle of the file to seek. - /// @param offset The number of bytes to seek. - /// @param origin One of either SEEK_SET (seek from the beginning of the file), SEEK_END (seek from the end of the file) or SEEK_CUR (seek from the current file position). - /// @return True if the operation completed successfully, false otherwise. - virtual bool Seek(FileHandle file, long offset, int origin); - /// Returns the current position of the file pointer. - /// @param file The handle of the file to be queried. - /// @return The number of bytes from the origin of the file. - virtual size_t Tell(FileHandle file); -}; - -} -} - -#endif /*ROCKET_NO_FILE_INTERFACE_DEFAULT*/ - -#endif diff --git a/libs/libRocket/Source/Core/FontDatabase.cpp b/libs/libRocket/Source/Core/FontDatabase.cpp deleted file mode 100644 index 0fe0a4cd1a2..00000000000 --- a/libs/libRocket/Source/Core/FontDatabase.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/FontDatabase.h" -#include "FontFamily.h" -#include "../../Include/Rocket/Core.h" -#include -#include FT_FREETYPE_H - -namespace Rocket { -namespace Core { - -FontDatabase* FontDatabase::instance = NULL; - -typedef std::map< String, FontEffect* > FontEffectCache; -FontEffectCache font_effect_cache; - -static FT_Library ft_library = NULL; - -FontDatabase::FontDatabase() -{ - ROCKET_ASSERT(instance == NULL); - instance = this; - backup_face = NULL; -} - -FontDatabase::~FontDatabase() -{ - ROCKET_ASSERT(instance == this); - instance = NULL; -} - -bool FontDatabase::Initialise() -{ - if (instance == NULL) - { - new FontDatabase(); - - FT_Error result = FT_Init_FreeType(&ft_library); - if (result != 0) - { - Log::Message(Log::LT_ERROR, "Failed to initialise FreeType, error %d.", result); - Shutdown(); - return false; - } - } - - return true; -} - -void FontDatabase::Shutdown() -{ - if (instance != NULL) - { - for (FontFamilyMap::iterator i = instance->font_families.begin(); i != instance->font_families.end(); ++i) - delete (*i).second; - - if (ft_library != NULL) - { - FT_Done_FreeType(ft_library); - ft_library = NULL; - } - - delete instance; - } -} - -// Loads a new font face. -bool FontDatabase::LoadFontFace(const String& file_name) -{ - FT_Face ft_face = (FT_Face) instance->LoadFace(file_name); - if (ft_face == NULL) - { - Log::Message(Log::LT_ERROR, "Failed to load font face from %s.", file_name.CString()); - return false; - } - - Font::Style style = ft_face->style_flags & FT_STYLE_FLAG_ITALIC ? Font::STYLE_ITALIC : Font::STYLE_NORMAL; - Font::Weight weight = ft_face->style_flags & FT_STYLE_FLAG_BOLD ? Font::WEIGHT_BOLD : Font::WEIGHT_NORMAL; - - if (instance->AddFace(ft_face, ft_face->family_name, style, weight, true)) - { - Log::Message(Log::LT_INFO, "Loaded font face %s %s (from %s).", ft_face->family_name, ft_face->style_name, file_name.CString()); - return true; - } - else - { - Log::Message(Log::LT_ERROR, "Failed to load font face %s %s (from %s).", ft_face->family_name, ft_face->style_name, file_name.CString()); - return false; - } -} - -// Adds a new font face to the database, ignoring any family, style and weight information stored in the face itself. -bool FontDatabase::LoadFontFace(const String& file_name, const String& family, Font::Style style, Font::Weight weight) -{ - FT_Face ft_face = (FT_Face) instance->LoadFace(file_name); - if (ft_face == NULL) - { - Log::Message(Log::LT_ERROR, "Failed to load font face from %s.", file_name.CString()); - return false; - } - - if (instance->AddFace(ft_face, family, style, weight, true)) - { - Log::Message(Log::LT_INFO, "Loaded font face %s %s (from %s).", ft_face->family_name, ft_face->style_name, file_name.CString()); - return true; - } - else - { - Log::Message(Log::LT_ERROR, "Failed to load font face %s %s (from %s).", ft_face->family_name, ft_face->style_name, file_name.CString()); - return false; - } -} - -// Adds a new font face to the database, loading from memory. -bool FontDatabase::LoadFontFace(const byte* data, int data_length) -{ - FT_Face ft_face = (FT_Face) instance->LoadFace(data, data_length, "memory", false); - if (ft_face == NULL) - { - Log::Message(Log::LT_ERROR, "Failed to load font face from byte stream."); - return false; - } - - Font::Style style = ft_face->style_flags & FT_STYLE_FLAG_ITALIC ? Font::STYLE_ITALIC : Font::STYLE_NORMAL; - Font::Weight weight = ft_face->style_flags & FT_STYLE_FLAG_BOLD ? Font::WEIGHT_BOLD : Font::WEIGHT_NORMAL; - - if (instance->AddFace(ft_face, ft_face->family_name, style, weight, false)) - { - Log::Message(Log::LT_INFO, "Loaded font face %s %s (from byte stream).", ft_face->family_name, ft_face->style_name); - return true; - } - else - { - Log::Message(Log::LT_ERROR, "Failed to load font face %s %s (from byte stream).", ft_face->family_name, ft_face->style_name); - return false; - } -} - -// Adds a new font face to the database, loading from memory, ignoring any family, style and weight information stored in the face itself. -bool FontDatabase::LoadFontFace(const byte* data, int data_length, const String& family, Font::Style style, Font::Weight weight) -{ - FT_Face ft_face = (FT_Face) instance->LoadFace(data, data_length, "memory", false); - if (ft_face == NULL) - { - Log::Message(Log::LT_ERROR, "Failed to load font face from byte stream."); - return false; - } - - if (instance->AddFace(ft_face, family, style, weight, false)) - { - Log::Message(Log::LT_INFO, "Loaded font face %s %s (from byte stream).", ft_face->family_name, ft_face->style_name); - return true; - } - else - { - Log::Message(Log::LT_ERROR, "Failed to load font face %s %s (from byte stream).", ft_face->family_name, ft_face->style_name); - return false; - } -} - -// Returns a handle to a font face that can be used to position and render text. -FontFaceHandle* FontDatabase::GetFontFaceHandle(const String& family, const String& charset, Font::Style style, Font::Weight weight, int size) -{ - FontFamilyMap::iterator iterator = instance->font_families.find(family); - if (iterator == instance->font_families.end()) - return NULL; - - return (*iterator).second->GetFaceHandle(charset, style, weight, size); -} - -// Returns a font effect, either a newly-instanced effect from the factory or an identical shared -// effect. -FontEffect* FontDatabase::GetFontEffect(const String& name, const PropertyDictionary& properties) -{ - // The caching here should be moved into the Factory for optimal behaviour. This system has a - // few shortfalls: - // * ignores default properties - // * could be shared with decorators as well - - // Generate a key so we can distinguish unique property sets quickly. - typedef std::list< std::pair< String, String > > PropertyList; - PropertyList sorted_properties; - for (PropertyMap::const_iterator property_iterator = properties.GetProperties().begin(); property_iterator != properties.GetProperties().end(); ++property_iterator) - { - // Skip the font-effect declaration. - if (property_iterator->first == "font-effect") - continue; - - PropertyList::iterator insert = sorted_properties.begin(); - while (insert != sorted_properties.end() && - insert->first < property_iterator->first) - ++insert; - - sorted_properties.insert(insert, PropertyList::value_type(property_iterator->first, property_iterator->second.Get< String >())); - } - - // Generate the font effect's key from the properties. - String key = name + ";"; - for (PropertyList::iterator i = sorted_properties.begin(); i != sorted_properties.end(); ++i) - key += i->first + ":" + i->second + ";"; - - // Check if we have a previously instanced effect. - FontEffectCache::iterator i = font_effect_cache.find(key); - if (i != font_effect_cache.end()) - { - FontEffect* effect = i->second; - effect->AddReference(); - - return effect; - } - - FontEffect* font_effect = Factory::InstanceFontEffect(name, properties); - if (font_effect == NULL) - return NULL; - - font_effect_cache[key] = font_effect; - return font_effect; -} - -// Removes a font effect from the font database's cache. -void FontDatabase::ReleaseFontEffect(const FontEffect* effect) -{ - for (FontEffectCache::iterator i = font_effect_cache.begin(); i != font_effect_cache.end(); ++i) - { - if (i->second == effect) - { - font_effect_cache.erase(i); - return; - } - } -} - -// Adds a loaded face to the appropriate font family. -bool FontDatabase::AddFace(void* face, const String& family, Font::Style style, Font::Weight weight, bool release_stream) -{ - FontFamily* font_family = NULL; - FontFamilyMap::iterator iterator = instance->font_families.find(family); - if (iterator != instance->font_families.end()) - font_family = (*iterator).second; - else - { - font_family = new FontFamily(family); - instance->font_families[family] = font_family; - } - - return font_family->AddFace((FT_Face) face, style, weight, release_stream); -} - -// Loads a FreeType face. -void* FontDatabase::LoadFace(const String& file_name) -{ - FileInterface* file_interface = GetFileInterface(); - FileHandle handle = file_interface->Open(file_name); - - if (!handle) - { - return NULL; - } - - size_t length = file_interface->Length(handle); - - FT_Byte* buffer = new FT_Byte[length]; - file_interface->Read(buffer, length, handle); - file_interface->Close(handle); - - return LoadFace(buffer, (int)length, file_name, true); -} - -// Loads a FreeType face from memory. -void* FontDatabase::LoadFace(const byte* data, int data_length, const String& source, bool local_data) -{ - FT_Face face = NULL; - int error = FT_New_Memory_Face(ft_library, (const FT_Byte*) data, data_length, 0, &face); - if (error != 0) - { - Log::Message(Log::LT_ERROR, "FreeType error %d while loading face from %s.", error, source.CString()); - if (local_data) - delete[] data; - - return NULL; - } - - // Initialise the character mapping on the face. - if (face->charmap == NULL) - { - FT_Select_Charmap(face, FT_ENCODING_APPLE_ROMAN); - if (face->charmap == NULL) - { - Log::Message(Log::LT_ERROR, "Font face (from %s) does not contain a Unicode or Apple Roman character map.", source.CString()); - FT_Done_Face(face); - if (local_data) - delete[] data; - - return NULL; - } - } - - return face; -} - -// Sets backup face -void FontDatabase::SetBackupFace(const String& path) -{ - instance->backup_face = instance->LoadFace(path); -} - -// Gets backup face -void* FontDatabase::GetBackupFace(void) -{ - return instance->backup_face; -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffect.cpp b/libs/libRocket/Source/Core/FontEffect.cpp deleted file mode 100644 index 566a052f917..00000000000 --- a/libs/libRocket/Source/Core/FontEffect.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/FontEffect.h" -#include "../../Include/Rocket/Core/FontDatabase.h" -#include "../../Include/Rocket/Core/FontEffectInstancer.h" - -namespace Rocket { -namespace Core { - -FontEffect::FontEffect() : colour(255, 255, 255) -{ - instancer = NULL; - z_index = 0; - specificity = -1; -} - -FontEffect::~FontEffect() -{ -} - -// Returns the name of the effect; this is the type that instanced the effect. -const String& FontEffect::GetName() const -{ - return name; -} - -// Asks the font effect if it requires, and will generate, its own unique texture. -bool FontEffect::HasUniqueTexture() const -{ - return false; -} - -// Gets the effect to resize and reposition a glyph's bitmap. -bool FontEffect::GetGlyphMetrics(Vector2i& ROCKET_UNUSED_PARAMETER(origin), Vector2i& ROCKET_UNUSED_PARAMETER(dimensions), const FontGlyph& ROCKET_UNUSED_PARAMETER(glyph)) const -{ - ROCKET_UNUSED(origin); - ROCKET_UNUSED(dimensions); - ROCKET_UNUSED(glyph); - - return false; -} - -// Requests the effect to generate the texture data for a single glyph's bitmap. -void FontEffect::GenerateGlyphTexture(byte* ROCKET_UNUSED_PARAMETER(destination_data), const Vector2i& ROCKET_UNUSED_PARAMETER(destination_dimensions), int ROCKET_UNUSED_PARAMETER(destination_stride), const FontGlyph& ROCKET_UNUSED_PARAMETER(glyph)) const -{ - ROCKET_UNUSED(destination_data); - ROCKET_UNUSED(destination_dimensions); - ROCKET_UNUSED(destination_stride); - ROCKET_UNUSED(glyph); -} - -// Sets the colour of the effect's geometry. -void FontEffect::SetColour(const Colourb& _colour) -{ - colour = _colour; -} - -// Returns the effect's colour. -const Colourb& FontEffect::GetColour() const -{ - return colour; -} - -// Sets the z-index of the font effect. -void FontEffect::SetZIndex(float _z_index) -{ - z_index = _z_index; -} - -// Returns the font effect's z-index. -float FontEffect::GetZIndex() const -{ - return z_index; -} - -// Sets the specificity of the font effect. -void FontEffect::SetSpecificity(int _specificity) -{ - specificity = _specificity; -} - -// Returns the specificity of the font effect. -int FontEffect::GetSpecificity() const -{ - return specificity; -} - -// Returns the font effect's geometry / texture generation key. -const String& FontEffect::GetGenerationKey() const -{ - return generation_key; -} - -// Releases the decorator through its instancer. -void FontEffect::OnReferenceDeactivate() -{ - FontDatabase::ReleaseFontEffect(this); - - if (instancer != NULL) - instancer->ReleaseFontEffect(this); -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectInstancer.cpp b/libs/libRocket/Source/Core/FontEffectInstancer.cpp deleted file mode 100644 index 1847dcfc804..00000000000 --- a/libs/libRocket/Source/Core/FontEffectInstancer.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/FontEffectInstancer.h" - -namespace Rocket { -namespace Core { - -FontEffectInstancer::FontEffectInstancer() -{ -} - -FontEffectInstancer::~FontEffectInstancer() -{ -} - -// Returns the property specification associated with the instancer. -const PropertySpecification& FontEffectInstancer::GetPropertySpecification() const -{ - return properties; -} - -// Registers a property for the font effect. -PropertyDefinition& FontEffectInstancer::RegisterProperty(const String& property_name, const String& default_value, bool affects_generation) -{ - if (affects_generation) - volatile_properties.insert(property_name.ToLower()); - - return properties.RegisterProperty(property_name, default_value, false, false); -} - -// Registers a shorthand property definition. -bool FontEffectInstancer::RegisterShorthand(const String& shorthand_name, const String& property_names, PropertySpecification::ShorthandType type) -{ - return properties.RegisterShorthand(shorthand_name, property_names, type); -} - -// Releases the instancer. -void FontEffectInstancer::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectNone.cpp b/libs/libRocket/Source/Core/FontEffectNone.cpp deleted file mode 100644 index 7882efa7850..00000000000 --- a/libs/libRocket/Source/Core/FontEffectNone.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontEffectNone.h" - -namespace Rocket { -namespace Core { - -FontEffectNone::FontEffectNone() -{ -} - -FontEffectNone::~FontEffectNone() -{ -} - -// Resizes and repositions the glyph to fit the outline. -bool FontEffectNone::GetGlyphSize(Vector2i& ROCKET_UNUSED_PARAMETER(origin), Vector2i& ROCKET_UNUSED_PARAMETER(dimensions), const FontGlyph& ROCKET_UNUSED_PARAMETER(glyph)) const -{ - ROCKET_UNUSED(origin); - ROCKET_UNUSED(dimensions); - ROCKET_UNUSED(glyph); - - return false; -} - -// Expands the original glyph texture for the outline. -void FontEffectNone::GenerateGlyphTexture(byte* ROCKET_UNUSED_PARAMETER(destination_data), const Vector2i& ROCKET_UNUSED_PARAMETER(destination_dimensions), int ROCKET_UNUSED_PARAMETER(destination_stride), const FontGlyph& ROCKET_UNUSED_PARAMETER(glyph)) const -{ - ROCKET_UNUSED(destination_data); - ROCKET_UNUSED(destination_dimensions); - ROCKET_UNUSED(destination_stride); - ROCKET_UNUSED(glyph); -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectNone.h b/libs/libRocket/Source/Core/FontEffectNone.h deleted file mode 100644 index 9c62c4ab48a..00000000000 --- a/libs/libRocket/Source/Core/FontEffectNone.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTEFFECTNONE_H -#define ROCKETCOREFONTEFFECTNONE_H - -#include "../../Include/Rocket/Core/FontEffect.h" - -namespace Rocket { -namespace Core { - -/** - A concrete dummy font effect for no effect. - - @author Peter Curry - */ - -class FontEffectNone : public FontEffect -{ -public: - FontEffectNone(); - virtual ~FontEffectNone(); - - /// Returns false. - /// @return False. - virtual bool GetGlyphSize(Vector2i& origin, Vector2i& dimensions, const FontGlyph& glyph) const; - - /// Ignores all calls. - virtual void GenerateGlyphTexture(byte* destination_data, const Vector2i& destination_dimensions, int destination_stride, const FontGlyph& glyph) const; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontEffectNoneInstancer.cpp b/libs/libRocket/Source/Core/FontEffectNoneInstancer.cpp deleted file mode 100644 index 101b4f46a44..00000000000 --- a/libs/libRocket/Source/Core/FontEffectNoneInstancer.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontEffectNoneInstancer.h" -#include "FontEffectNone.h" - -namespace Rocket { -namespace Core { - -FontEffectNoneInstancer::FontEffectNoneInstancer() -{ -} - -FontEffectNoneInstancer::~FontEffectNoneInstancer() -{ -} - -// Instances an outline font effect. -FontEffect* FontEffectNoneInstancer::InstanceFontEffect(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& ROCKET_UNUSED_PARAMETER(properties)) -{ - ROCKET_UNUSED(name); - ROCKET_UNUSED(properties); - - FontEffectNone* none_effect = new FontEffectNone(); - return none_effect; -} - -// Releases the given font effect. -void FontEffectNoneInstancer::ReleaseFontEffect(FontEffect* font_effect) -{ - delete font_effect; -} - -// Releases the instancer. -void FontEffectNoneInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectNoneInstancer.h b/libs/libRocket/Source/Core/FontEffectNoneInstancer.h deleted file mode 100644 index 25ad6bdd438..00000000000 --- a/libs/libRocket/Source/Core/FontEffectNoneInstancer.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTEFFECTNONEINSTANCER_H -#define ROCKETCOREFONTEFFECTNONEINSTANCER_H - -#include "../../Include/Rocket/Core/FontEffectInstancer.h" - -namespace Rocket { -namespace Core { - -/** - A concrete font effect instancer for the none effect. - - @author Peter Curry - */ - -class FontEffectNoneInstancer : public FontEffectInstancer -{ -public: - FontEffectNoneInstancer(); - virtual ~FontEffectNoneInstancer(); - - /// Instances a none font effect. - /// @param[in] name The type of font effect desired. - /// @param[in] properties All RCSS properties associated with the none effect. - /// @return The font effect if it was instanced successfully, NULL if an error occured. - virtual FontEffect* InstanceFontEffect(const String& name, const PropertyDictionary& properties); - /// Releases the none effect. - /// @param[in] font_effect Font effect to release. - virtual void ReleaseFontEffect(FontEffect* font_effect); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontEffectOutline.cpp b/libs/libRocket/Source/Core/FontEffectOutline.cpp deleted file mode 100644 index c113ba269f5..00000000000 --- a/libs/libRocket/Source/Core/FontEffectOutline.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontEffectOutline.h" - -namespace Rocket { -namespace Core { - -FontEffectOutline::FontEffectOutline() -{ - width = 0; - - // Default the z-index of an outline effect to be behind the main layer. - SetZIndex(-1); -} - -FontEffectOutline::~FontEffectOutline() -{ -} - -// Returns true. -bool FontEffectOutline::HasUniqueTexture() const -{ - return true; -} - -// Initialise the outline effect. -bool FontEffectOutline::Initialise(int _width) -{ - if (_width <= 0) - return false; - - width = _width; - - filter.Initialise(width, ConvolutionFilter::DILATION); - for (int x = -width; x <= width; ++x) - { - for (int y = -width; y <= width; ++y) - { - float weight = 1; - - float distance = Math::SquareRoot(float(x * x + y * y)); - if (distance > width) - { - weight = (width + 1) - distance; - weight = Math::Max(weight, 0.0f); - } - - filter[x + width][y + width] = weight; - } - } - - return true; -} - -// Resizes and repositions the glyph to fit the outline. -bool FontEffectOutline::GetGlyphMetrics(Vector2i& origin, Vector2i& dimensions, const FontGlyph& ROCKET_UNUSED_PARAMETER(glyph)) const -{ - ROCKET_UNUSED(glyph); - - if (dimensions.x * dimensions.y > 0) - { - origin.x -= width; - origin.y -= width; - - dimensions.x += width; - dimensions.y += width; - - return true; - } - - return false; -} - -// Expands the original glyph texture for the outline. -void FontEffectOutline::GenerateGlyphTexture(byte* destination_data, const Vector2i& destination_dimensions, int destination_stride, const FontGlyph& glyph) const -{ - filter.Run(destination_data, destination_dimensions, destination_stride, glyph.bitmap_data, glyph.bitmap_dimensions, Vector2i(width, width)); -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectOutline.h b/libs/libRocket/Source/Core/FontEffectOutline.h deleted file mode 100644 index 8c4586cf858..00000000000 --- a/libs/libRocket/Source/Core/FontEffectOutline.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTEFFECTOUTLINE_H -#define ROCKETCOREFONTEFFECTOUTLINE_H - -#include "../../Include/Rocket/Core/ConvolutionFilter.h" -#include "../../Include/Rocket/Core/FontEffect.h" - -namespace Rocket { -namespace Core { - -class ConvolutionFilter; - -/** - A concrete font effect for rendering outlines around text. - - @author Peter Curry - */ - -class FontEffectOutline : public FontEffect -{ -public: - FontEffectOutline(); - virtual ~FontEffectOutline(); - - /// Initialise the outline effect. - /// @param[in] width The width of the effect. This must be greater than zero. - /// @return True if the effect initialised successfully, false if not. - bool Initialise(int width); - - /// Returns true. - /// @return True. - virtual bool HasUniqueTexture() const; - - /// Resizes and repositions the glyph to fit the outline. - /// @param[out] origin The desired origin of the effect's glyph bitmap, as a pixel offset from its original origin. This defaults to (0, 0). - /// @param[out] dimensions The desired dimensions of the effect's glyph bitmap, in pixels. This defaults to the dimensions of the glyph's original bitmap. - /// @param[in] glyph The glyph the effect is being asked to size. - /// @return False if the effect is not providing support for the glyph, true otherwise. - virtual bool GetGlyphMetrics(Vector2i& origin, Vector2i& dimensions, const FontGlyph& glyph) const; - - /// Expands the original glyph texture for the outline. - /// @param[out] destination_data The top-left corner of the glyph's 32-bit, RGBA-ordered, destination texture. Note that they glyph shares its texture with other glyphs. - /// @param[in] destination_dimensions The dimensions of the glyph's area on its texture. - /// @param[in] destination_stride The stride of the glyph's texture. - /// @param[in] glyph The glyph the effect is being asked to generate an effect texture for. - virtual void GenerateGlyphTexture(byte* destination_data, const Vector2i& destination_dimensions, int destination_stride, const FontGlyph& glyph) const; - -private: - int width; - ConvolutionFilter filter; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontEffectOutlineInstancer.cpp b/libs/libRocket/Source/Core/FontEffectOutlineInstancer.cpp deleted file mode 100644 index 0637afcd73d..00000000000 --- a/libs/libRocket/Source/Core/FontEffectOutlineInstancer.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontEffectOutlineInstancer.h" -#include "FontEffectOutline.h" - -namespace Rocket { -namespace Core { - -FontEffectOutlineInstancer::FontEffectOutlineInstancer() -{ - RegisterProperty("width", "1", true) - .AddParser("number"); -} - -FontEffectOutlineInstancer::~FontEffectOutlineInstancer() -{ -} - -// Instances an outline font effect. -FontEffect* FontEffectOutlineInstancer::InstanceFontEffect(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& properties) -{ - ROCKET_UNUSED(name); - - float width = properties.GetProperty("width")->Get< float >(); - - FontEffectOutline* font_effect = new FontEffectOutline(); - if (font_effect->Initialise(Math::RealToInteger(width))) - return font_effect; - - font_effect->RemoveReference(); - ReleaseFontEffect(font_effect); - return NULL; -} - -// Releases the given font effect. -void FontEffectOutlineInstancer::ReleaseFontEffect(FontEffect* font_effect) -{ - delete font_effect; -} - -// Releases the instancer. -void FontEffectOutlineInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectOutlineInstancer.h b/libs/libRocket/Source/Core/FontEffectOutlineInstancer.h deleted file mode 100644 index 0ac4cac07c4..00000000000 --- a/libs/libRocket/Source/Core/FontEffectOutlineInstancer.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTEFFECTOUTLINEINSTANCER_H -#define ROCKETCOREFONTEFFECTOUTLINEINSTANCER_H - -#include "../../Include/Rocket/Core/FontEffectInstancer.h" - -namespace Rocket { -namespace Core { - -/** - A concrete font effect instancer for the outline effect. - - @author Peter Curry - */ - -class FontEffectOutlineInstancer : public FontEffectInstancer -{ -public: - FontEffectOutlineInstancer(); - virtual ~FontEffectOutlineInstancer(); - - /// Instances an outline font effect. - /// @param[in] name The type of font effect desired. - /// @param[in] properties All RCSS properties associated with the outline effect. - /// @return The font effect if it was instanced successfully, NULL if an error occured. - virtual FontEffect* InstanceFontEffect(const String& name, const PropertyDictionary& properties); - /// Releases the outline effect. - /// @param[in] font_effect Font effect to release. - virtual void ReleaseFontEffect(FontEffect* font_effect); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontEffectShadow.cpp b/libs/libRocket/Source/Core/FontEffectShadow.cpp deleted file mode 100644 index d69773fa26b..00000000000 --- a/libs/libRocket/Source/Core/FontEffectShadow.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontEffectShadow.h" - -namespace Rocket { -namespace Core { - -FontEffectShadow::FontEffectShadow() : offset(0, 0) -{ - // Default the z-index of a shadow effect to be behind the main layer. - SetZIndex(-1); -} - -FontEffectShadow::~FontEffectShadow() -{ -} - -// Initialise the shadow effect. -bool FontEffectShadow::Initialise(const Vector2i& _offset) -{ - offset = _offset; - return true; -} - -// Returns true. -bool FontEffectShadow::HasUniqueTexture() const -{ - return false; -} - -// Resizes and repositions the glyph to fit the outline. -bool FontEffectShadow::GetGlyphMetrics(Vector2i& origin, Vector2i& ROCKET_UNUSED_PARAMETER(dimensions), const FontGlyph& ROCKET_UNUSED_PARAMETER(glyph)) const -{ - ROCKET_UNUSED(dimensions); - ROCKET_UNUSED(glyph); - - origin += offset; - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectShadow.h b/libs/libRocket/Source/Core/FontEffectShadow.h deleted file mode 100644 index 30af9a9e2bb..00000000000 --- a/libs/libRocket/Source/Core/FontEffectShadow.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTEFFECTSHADOW_H -#define ROCKETCOREFONTEFFECTSHADOW_H - -#include "../../Include/Rocket/Core/FontEffect.h" - -namespace Rocket { -namespace Core { - -/** - A concrete font effect for rendering text shadows. - - @author Peter Curry - */ - -class FontEffectShadow : public FontEffect -{ -public: - FontEffectShadow(); - virtual ~FontEffectShadow(); - - /// Initialise the shadow effect. - /// @param[in] offset The offset, in pixels, of the shadow from the original text. - /// @return True if the effect initialised successfully, false if not. - bool Initialise(const Vector2i& offset); - - /// Returns false. - /// @return False. - virtual bool HasUniqueTexture() const; - - /// Repositions the glyph by the offset. - /// @param[out] origin The desired origin of the effect's glyph bitmap, as a pixel offset from its original origin. This defaults to (0, 0). - /// @param[out] dimensions The desired dimensions of the effect's glyph bitmap, in pixels. This defaults to the dimensions of the glyph's original bitmap. - /// @param[in] glyph The glyph the effect is being asked to size. - /// @return False if the effect is not providing support for the glyph, true otherwise. - virtual bool GetGlyphMetrics(Vector2i& origin, Vector2i& dimensions, const FontGlyph& glyph) const; - -private: - Vector2i offset; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontEffectShadowInstancer.cpp b/libs/libRocket/Source/Core/FontEffectShadowInstancer.cpp deleted file mode 100644 index e0ca0ac5739..00000000000 --- a/libs/libRocket/Source/Core/FontEffectShadowInstancer.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontEffectShadowInstancer.h" -#include "FontEffectShadow.h" - -namespace Rocket { -namespace Core { - -FontEffectShadowInstancer::FontEffectShadowInstancer() -{ - RegisterProperty("offset-x", "0", true) - .AddParser("number"); - RegisterProperty("offset-y", "0", true) - .AddParser("number"); - RegisterShorthand("offset", "offset-x, offset-y"); -} - -FontEffectShadowInstancer::~FontEffectShadowInstancer() -{ -} - -// Instances an outline font effect. -FontEffect* FontEffectShadowInstancer::InstanceFontEffect(const String& ROCKET_UNUSED_PARAMETER(name), const PropertyDictionary& properties) -{ - ROCKET_UNUSED(name); - - Vector2i offset; - offset.x = Math::RealToInteger(properties.GetProperty("offset-x")->Get< float >()); - offset.y = Math::RealToInteger(properties.GetProperty("offset-y")->Get< float >()); - - FontEffectShadow* font_effect = new FontEffectShadow(); - if (font_effect->Initialise(offset)) - return font_effect; - - font_effect->RemoveReference(); - ReleaseFontEffect(font_effect); - return NULL; -} - -// Releases the given font effect. -void FontEffectShadowInstancer::ReleaseFontEffect(FontEffect* font_effect) -{ - delete font_effect; -} - -// Releases the instancer. -void FontEffectShadowInstancer::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/FontEffectShadowInstancer.h b/libs/libRocket/Source/Core/FontEffectShadowInstancer.h deleted file mode 100644 index b1cd79cb1f4..00000000000 --- a/libs/libRocket/Source/Core/FontEffectShadowInstancer.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFontEffectShadowInstancer_H -#define ROCKETCOREFontEffectShadowInstancer_H - -#include "../../Include/Rocket/Core/FontEffectInstancer.h" - -namespace Rocket { -namespace Core { - -/** - A concrete font effect instancer for the shadow effect. - - @author Peter Curry - */ - -class FontEffectShadowInstancer : public FontEffectInstancer -{ -public: - FontEffectShadowInstancer(); - virtual ~FontEffectShadowInstancer(); - - /// Instances an outline font effect. - /// @param[in] name The type of font effect desired. - /// @param[in] properties All RCSS properties associated with the outline effect. - /// @return The font effect if it was instanced successfully, NULL if an error occured. - virtual FontEffect* InstanceFontEffect(const String& name, const PropertyDictionary& properties); - /// Releases the outline effect. - /// @param[in] font_effect Font effect to release. - virtual void ReleaseFontEffect(FontEffect* font_effect); - - /// Releases the instancer. - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontFace.cpp b/libs/libRocket/Source/Core/FontFace.cpp deleted file mode 100644 index 5827ef3dd87..00000000000 --- a/libs/libRocket/Source/Core/FontFace.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontFace.h" -#include -#include - -namespace Rocket { -namespace Core { - -FontFace::FontFace(FT_Face _face, Font::Style _style, Font::Weight _weight, bool _release_stream) -{ - face = _face; - style = _style; - weight = _weight; - - release_stream = _release_stream; -} - -FontFace::~FontFace() -{ - for (HandleMap::iterator iterator = handles.begin(); iterator != handles.end(); ++iterator) - { - iterator->second->RemoveReference(); - } - - ReleaseFace(); -} - -// Returns the style of the font face. -Font::Style FontFace::GetStyle() const -{ - return style; -} - -// Returns the weight of the font face. -Font::Weight FontFace::GetWeight() const -{ - return weight; -} - -// Returns a handle for positioning and rendering this face at the given size. -FontFaceHandle* FontFace::GetHandle(const String& _raw_charset, int size) -{ - UnicodeRangeList charset; - - HandleMap::iterator iterator = handles.find(size); - if (iterator != handles.end()) - { - iterator->second->AddReference(); - return iterator->second; - - } - - // See if this face has been released. - if (face == NULL) - { - Log::Message(Log::LT_WARNING, "Font face has been released, unable to generate new handle."); - return NULL; - } - - // Construct and initialise the new handle. - FontFaceHandle* handle = new FontFaceHandle(); - if (!handle->Initialise(face, _raw_charset, size)) - { - handle->RemoveReference(); - return NULL; - } - - // Save the handle, and add a reference for the callee. The initial reference will be removed when the font face - // releases it. - handles[size] = handle; - - handle->AddReference(); - - return handle; -} - -// Releases the face's FreeType face structure. -void FontFace::ReleaseFace() -{ - if (face != NULL) - { - FT_Byte* face_memory = face->stream->base; - FT_Done_Face(face); - - if (release_stream) - delete[] face_memory; - - face = NULL; - } -} - -} -} diff --git a/libs/libRocket/Source/Core/FontFace.h b/libs/libRocket/Source/Core/FontFace.h deleted file mode 100644 index 6d464d58d55..00000000000 --- a/libs/libRocket/Source/Core/FontFace.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTFACE_H -#define ROCKETCOREFONTFACE_H - -#include "../../Include/Rocket/Core/Font.h" -#include -#include FT_FREETYPE_H - -namespace Rocket { -namespace Core { - -class FontFaceHandle; - -/** - @author Peter Curry - */ - -class FontFace -{ -public: - FontFace(FT_Face face, Font::Style style, Font::Weight weight, bool release_stream); - ~FontFace(); - - /// Returns the style of the font face. - /// @return The font face's style. - Font::Style GetStyle() const; - /// Returns the weight of the font face. - /// @return The font face's weight. - Font::Weight GetWeight() const; - - /// Returns a handle for positioning and rendering this face at the given size. - /// @param[in] charset The set of characters in the handle, as a comma-separated list of unicode ranges. - /// @param[in] size The size of the desired handle, in points. - /// @return The shared font handle. - FontFaceHandle* GetHandle(const String& charset, int size); - - /// Releases the face's FreeType face structure. This will mean handles for new sizes cannot be constructed, - /// but existing ones can still be fetched. - void ReleaseFace(); - -private: - FT_Face face; - Font::Style style; - Font::Weight weight; - - bool release_stream; - - typedef std::map< int, FontFaceHandle* > HandleMap; - HandleMap handles; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontFaceHandle.cpp b/libs/libRocket/Source/Core/FontFaceHandle.cpp deleted file mode 100644 index a61c79d9266..00000000000 --- a/libs/libRocket/Source/Core/FontFaceHandle.cpp +++ /dev/null @@ -1,692 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include -#include -#include "../../Include/Rocket/Core.h" -#include "FontFaceLayer.h" -#include "TextureLayout.h" - -namespace Rocket { -namespace Core { - -class FontEffectSort -{ -public: - bool operator()(const FontEffect* lhs, const FontEffect* rhs) - { - return lhs->GetZIndex() < rhs->GetZIndex(); - } -}; - -FontFaceHandle::FontFaceHandle() -{ - size = 0; - average_advance = 0; - x_height = 0; - line_height = 0; - baseline = 0; - - underline_position = 0; - underline_thickness = 0; - - ft_size = NULL; - backup_size = NULL; - - base_layer = NULL; - - memset(&fonts_generated, 0, sizeof(fonts_generated)); -} - -FontFaceHandle::~FontFaceHandle() -{ - if (ft_size) - FT_Done_Size(ft_size); - if (backup_size) - FT_Done_Size(backup_size); - - for (FontGlyphMap::iterator i = glyphs.begin(); i != glyphs.end(); ++i) - delete[] i->second.bitmap_data; - - for (FontLayerMap::iterator i = layers.begin(); i != layers.end(); ++i) - delete i->second; -} - -// Initialises the handle so it is able to render text. -bool FontFaceHandle::Initialise(FT_Face ft_face, const String& _charset, int _size) -{ - size = _size; - - raw_charset = _charset; - if (!UnicodeRange::BuildList(charset, raw_charset)) - { - Log::Message(Log::LT_ERROR, "Invalid font charset '%s'.", raw_charset.CString()); - return false; - } - - FT_Face backup_face = (FT_Face)FontDatabase::GetBackupFace(); - - // Set the character size on the font face. - FT_New_Size(ft_face, &ft_size); - FT_Activate_Size(ft_size); - FT_Error error = FT_Set_Char_Size(ft_face, 0, size << 6, 0, 0); - if (error != 0) - { - Log::Message(Log::LT_ERROR, "Unable to set the character size '%d' on the font face '%s %s'.", size, ft_face->family_name, ft_face->style_name); - return false; - } - - if (backup_face) - { - FT_New_Size(backup_face, &backup_size); - FT_Activate_Size(backup_size); - FT_Error error = FT_Set_Char_Size(backup_face, 0, size << 6, 0, 0); - if (error != 0) - { - Log::Message(Log::LT_ERROR, "Unable to set the character size '%d' on the font face '%s %s'.", size, backup_face->family_name, backup_face->style_name); - return false; - } - } - - // Construct the list of the characters specified by the charset. - for (size_t i = 0; i < charset.size(); ++i) - BuildGlyphMap(charset[i]); - - // Generate the metrics for the handle. - GenerateMetrics(); - - // Generate the default layer and layer configuration. - base_layer = GenerateLayer(NULL); - layer_configurations.push_back(LayerConfiguration()); - layer_configurations.back().push_back(base_layer); - - - return true; -} - -// Returns the point size of this font face. -int FontFaceHandle::GetSize() const -{ - return size; -} - -// Returns the average advance of all glyphs in this font face. -int FontFaceHandle::GetCharacterWidth() const -{ - return average_advance; -} - -// Returns the pixel height of a lower-case x in this font face. -int FontFaceHandle::GetXHeight() const -{ - return x_height; -} - -// Returns the default height between this font face's baselines. -int FontFaceHandle::GetLineHeight() const -{ - return line_height; -} - -// Returns the font's baseline. -int FontFaceHandle::GetBaseline() const -{ - return baseline; -} - -// Returns the font's glyphs. -const FontGlyphMap& FontFaceHandle::GetGlyphs() const -{ - return glyphs; -} - -// Returns the width a string will take up if rendered with this handle. -int FontFaceHandle::GetStringWidth(const WString& string, word prior_character) -{ - int width = 0; - bool update = false; - - for (size_t i = 0; i < string.Length(); i++) - { - word character_code = string[i]; - - FontGlyphMap::const_iterator iterator = glyphs.find(character_code); - if (iterator == glyphs.end()) - { - word chunk = Math::RoundDown((float)character_code / 256); - - if (!(fonts_generated[ chunk / 8 ] & (1 << (chunk % 8)))) - { - UnicodeRange range(chunk * 256, (chunk * 256) + 255); - fonts_generated[ chunk / 8 ] |= (1 << (chunk % 8)); - if (BuildGlyphMap(range)) - { - update = true; - } - } - - iterator = glyphs.find(character_code); - if (iterator == glyphs.end()) - continue; - } - - // Adjust the cursor for the kerning between this character and the previous one. - if (prior_character != 0) - width += GetKerning(prior_character, string[i]); - // Adjust the cursor for this character's advance. - width += iterator->second.advance; - - prior_character = character_code; - } - - if ( update ) - { - GenerateMetrics(); - - base_layer->AddNewGlyphs(); - - int num = 0; - for (size_t j = 0; j < layer_configurations.size(); ++j) - { - for (size_t k = 0; k < layer_configurations[j].size(); ++k) - { - FontFaceLayer *layer = layer_configurations[j][k]; - const FontFaceLayer *base_layer_ = layer->GetBaseLayer(); - - if (base_layer_ != NULL) - layer->MergeFromBase(); - else - layer->AddNewGlyphs(); - - num++; - } - } - } - - - return width; -} - -// Generates, if required, the layer configuration for a given array of font effects. -int FontFaceHandle::GenerateLayerConfiguration(FontEffectMap& font_effects) -{ - if (font_effects.empty()) - return 0; - - // Prepare a list of effects, sorted by z-index. - FontEffectList sorted_effects; - for (FontEffectMap::const_iterator i = font_effects.begin(); i != font_effects.end(); ++i) - sorted_effects.push_back(i->second); - - std::sort(sorted_effects.begin(), sorted_effects.end(), FontEffectSort()); - - // Check each existing configuration for a match with this arrangement of effects. - int configuration_index = 1; - for (; configuration_index < (int) layer_configurations.size(); ++configuration_index) - { - const LayerConfiguration& configuration = layer_configurations[configuration_index]; - - // Check the size is correct. For a math, there should be one layer in the configuration - // plus an extra for the base layer. - if (configuration.size() != sorted_effects.size() + 1) - continue; - - // Check through each layer, checking it was created by the same effect as the one we're - // checking. - size_t effect_index = 0; - for (size_t i = 0; i < configuration.size(); ++i) - { - // Skip the base layer ... - if (configuration[i]->GetFontEffect() == NULL) - continue; - - // If the ith layer's effect doesn't match the equivalent effect, then this - // configuration can't match. - if (configuration[i]->GetFontEffect() != sorted_effects[effect_index]) - break; - - // Check the next one ... - ++effect_index; - } - - if (effect_index == sorted_effects.size()) - return configuration_index; - } - - // No match, so we have to generate a new layer configuration. - layer_configurations.push_back(LayerConfiguration()); - LayerConfiguration& layer_configuration = layer_configurations.back(); - - bool added_base_layer = false; - - for (size_t i = 0; i < sorted_effects.size(); ++i) - { - if (!added_base_layer && - sorted_effects[i]->GetZIndex() >= 0) - { - layer_configuration.push_back(base_layer); - added_base_layer = true; - } - - layer_configuration.push_back(GenerateLayer(sorted_effects[i])); - } - - // Add the base layer now if we still haven't added it. - if (!added_base_layer) - layer_configuration.push_back(base_layer); - - return (int) (layer_configurations.size() - 1); -} - -// Generates the texture data for a layer (for the texture database). -bool FontFaceHandle::GenerateLayerTexture( const byte *&texture_data, Vector2i &texture_dimensions, int &texture_samples, FontEffect *layer_id, int layout_id, int texture_id ) -{ - FontLayerMap::iterator layer_iterator = layers.find(layer_id); - if (layer_iterator == layers.end()) - return false; - - return layer_iterator->second->GenerateTexture(texture_data, texture_dimensions, texture_samples, layout_id, texture_id ); -} - -// Generates the geometry required to render a single line of text. -int FontFaceHandle::GenerateString(GeometryList& geometry, const WString& string, const Vector2f& position, const Colourb& colour, int layer_configuration_index) const -{ - int geometry_index = 0; - int line_width = 0; - - ROCKET_ASSERT(layer_configuration_index >= 0); - ROCKET_ASSERT(layer_configuration_index < (int) layer_configurations.size()); - - // Fetch the requested configuration and generate the geometry for each one. - const LayerConfiguration& layer_configuration = layer_configurations[layer_configuration_index]; - for (size_t i = 0; i < layer_configuration.size(); ++i) - { - FontFaceLayer* layer = layer_configuration[i]; - - Colourb layer_colour; - if (layer == base_layer) - layer_colour = colour; - else - layer_colour = layer->GetColour(); - - // Resize the geometry list if required. - if ((int) geometry.size() < geometry_index + layer->GetNumTextures()) - geometry.resize(geometry_index + layer->GetNumTextures()); - - // Bind the textures to the geometries. - for (int i = 0; i < layer->GetNumTextures(); ++i) - geometry[geometry_index + i].SetTexture(layer->GetTexture(i)); - - line_width = 0; - word prior_character = 0; - - const word* string_iterator = string.CString(); - const word* string_end = string.CString() + string.Length(); - - for (; string_iterator != string_end; string_iterator++) - { - FontGlyphMap::const_iterator iterator = glyphs.find(*string_iterator); - if (iterator == glyphs.end()) - continue; - - // Adjust the cursor for the kerning between this character and the previous one. - if (prior_character != 0) - line_width += GetKerning(prior_character, *string_iterator); - - layer->GenerateGeometry(&geometry[geometry_index], *string_iterator, Vector2f(position.x + line_width, position.y), layer_colour); - - line_width += iterator->second.advance; - prior_character = *string_iterator; - } - - geometry_index += layer->GetNumTextures(); - } - - // Cull any excess geometry from a previous generation. - geometry.resize(geometry_index); - - return line_width; -} - -// Generates the geometry required to render a line above, below or through a line of text. -void FontFaceHandle::GenerateLine(Geometry* geometry, const Vector2f& position, int width, Font::Line height, const Colourb& colour) const -{ - std::vector< Vertex >& line_vertices = geometry->GetVertices(); - std::vector< int >& line_indices = geometry->GetIndices(); - - float offset; - switch (height) - { - case Font::UNDERLINE: offset = -underline_position; break; - case Font::OVERLINE: // where to place? offset = -line_height - underline_position; break; - case Font::STRIKE_THROUGH: // where to place? offset = -line_height * 0.5f; break; - default: return; - } - - line_vertices.resize(line_vertices.size() + 4); - line_indices.resize(line_indices.size() + 6); - GeometryUtilities::GenerateQuad(&line_vertices[0] + (line_vertices.size() - 4), &line_indices[0] + (line_indices.size() - 6), Vector2f(position.x, position.y + offset), Vector2f((float) width, underline_thickness), colour, (int)line_vertices.size() - 4); -} - -// Returns the font face's raw charset (the charset range as a string). -const String& FontFaceHandle::GetRawCharset() const -{ - return raw_charset; -} - -// Returns the font face's charset. -const UnicodeRangeList& FontFaceHandle::GetCharset() const -{ - return charset; -} - -// Destroys the handle. -void FontFaceHandle::OnReferenceDeactivate() -{ - delete this; -} - -void FontFaceHandle::GenerateMetrics() -{ - FT_Face ft_face = ft_size->face; - - FT_Activate_Size(ft_size); - - line_height = ft_face->size->metrics.height >> 6; - baseline = line_height - (ft_face->size->metrics.ascender >> 6); - - underline_position = FT_MulFix(ft_face->underline_position, ft_face->size->metrics.y_scale) / float(1 << 6); - underline_thickness = FT_MulFix(ft_face->underline_thickness, ft_face->size->metrics.y_scale) / float(1 << 6); - underline_thickness = Math::Max(underline_thickness, 1.0f); - - average_advance = 0; - for (FontGlyphMap::iterator i = glyphs.begin(); i != glyphs.end(); ++i) - average_advance += i->second.advance; - - // Bring the total advance down to the average advance, but scaled up 10%, just to be on the safe side. - average_advance = Math::RealToInteger((float) average_advance / (glyphs.size() * 0.9f)); - - // Determine the x-height of this font face. - word x = (word) 'x'; - int index = FT_Get_Char_Index(ft_face, x); - if (FT_Load_Glyph(ft_face, index, 0) == 0) - x_height = ft_face->glyph->metrics.height >> 6; - else - x_height = 0; -} - -bool FontFaceHandle::BuildGlyphMap(const UnicodeRange& unicode_range) -{ - FT_Face ft_face, backup_face; - - ft_face = ft_size->face; - backup_face = NULL; - - FT_Activate_Size(ft_size); - - if (backup_size) - { - backup_face = backup_size->face; - FT_Activate_Size(backup_size); - } - - bool success = false; - for (size_t character_code = (Math::Max< unsigned int >(unicode_range.min_codepoint, 32)); character_code <= unicode_range.max_codepoint; ++character_code) - { - if (glyphs.find(character_code) != glyphs.end()) - continue; - - int index = FT_Get_Char_Index(ft_face, character_code); - if (index != 0) - { - FT_Error error = FT_Load_Glyph(ft_face, index, 0); - if (error != 0) - { - Log::Message(Log::LT_WARNING, "Unable to load glyph for character '%u' on the font face '%s %s'; error code: %d.", character_code, ft_face->family_name, ft_face->style_name, error); - continue; - } - - error = FT_Render_Glyph(ft_face->glyph, FT_RENDER_MODE_NORMAL); - if (error != 0) - { - Log::Message(Log::LT_WARNING, "Unable to render glyph for character '%u' on the font face '%s %s'; error code: %d.", character_code, ft_face->family_name, ft_face->style_name, error); - continue; - } - - if (!success) - success = true; - - FontGlyph glyph; - glyph.character = character_code; - BuildGlyph(glyph, ft_face->glyph); - glyphs[character_code] = glyph; - } - else if ( backup_face && ( index = FT_Get_Char_Index(backup_face, character_code) ) ) - { - FT_Error error = FT_Load_Glyph(backup_face, index, 0); - if (error != 0) - { - Log::Message(Log::LT_WARNING, "Unable to load glyph for character '%u' on the font face '%s %s'; error code: %d.", character_code, backup_face->family_name, backup_face->style_name, error); - continue; - } - - error = FT_Render_Glyph(backup_face->glyph, FT_RENDER_MODE_NORMAL); - if (error != 0) - { - Log::Message(Log::LT_WARNING, "Unable to render glyph for character '%u' on the font face '%s %s'; error code: %d.", character_code, backup_face->family_name, backup_face->style_name, error); - continue; - } - - if (!success) - success = true; - - FontGlyph glyph; - glyph.character = character_code; - BuildGlyph(glyph, backup_face->glyph); - glyphs[character_code] = glyph; - } - } - - return success; -} - -void FontFaceHandle::BuildGlyph(FontGlyph& glyph, FT_GlyphSlot ft_glyph) -{ - // Set the glyph's dimensions. - glyph.dimensions.x = ft_glyph->metrics.width >> 6; - glyph.dimensions.y = ft_glyph->metrics.height >> 6; - - // Set the glyph's bearing. - glyph.bearing.x = ft_glyph->metrics.horiBearingX >> 6; - glyph.bearing.y = ft_glyph->metrics.horiBearingY >> 6; - - // Set the glyph's advance. - glyph.advance = ft_glyph->metrics.horiAdvance >> 6; - - // Set the glyph's bitmap dimensions. - glyph.bitmap_dimensions.x = ft_glyph->bitmap.width; - glyph.bitmap_dimensions.y = ft_glyph->bitmap.rows; - - // Copy the glyph's bitmap data from the FreeType glyph handle to our glyph handle. - if (glyph.bitmap_dimensions.x * glyph.bitmap_dimensions.y != 0) - { - // Check the pixel mode is supported. - if (ft_glyph->bitmap.pixel_mode != FT_PIXEL_MODE_MONO && - ft_glyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY) - { - glyph.bitmap_data = NULL; - Log::Message(Log::LT_WARNING, "Unable to render glyph on the font face '%s %s'; unsupported pixel mode (%d).", ft_glyph->face->family_name, ft_glyph->face->style_name, ft_glyph->bitmap.pixel_mode); - } - else - { - glyph.bitmap_data = new byte[glyph.bitmap_dimensions.x * glyph.bitmap_dimensions.y]; - - byte* source_bitmap = ft_glyph->bitmap.buffer; - byte* destination_bitmap = glyph.bitmap_data; - - // Copy the bitmap data into the newly-allocated space on our glyph. - switch (ft_glyph->bitmap.pixel_mode) - { - // Unpack 1-bit data into 8-bit. - case FT_PIXEL_MODE_MONO: - { - for (int i = 0; i < glyph.bitmap_dimensions.y; ++i) - { - int mask = 0x80; - byte* source_byte = source_bitmap; - for (int j = 0; j < glyph.bitmap_dimensions.x; ++j) - { - if ((*source_byte & mask) == mask) - destination_bitmap[j] = 255; - else - destination_bitmap[j] = 0; - - mask >>= 1; - if (mask <= 0) - { - mask = 0x80; - ++source_byte; - } - } - - destination_bitmap += glyph.bitmap_dimensions.x; - source_bitmap += ft_glyph->bitmap.pitch; - } - } - break; - - // Directly copy 8-bit data. - case FT_PIXEL_MODE_GRAY: - { - for (int i = 0; i < glyph.bitmap_dimensions.y; ++i) - { - memcpy(destination_bitmap, source_bitmap, glyph.bitmap_dimensions.x); - destination_bitmap += glyph.bitmap_dimensions.x; - source_bitmap += ft_glyph->bitmap.pitch; - } - } - break; - } - } - } - else - glyph.bitmap_data = NULL; -} - -int FontFaceHandle::GetKerning(word lhs, word rhs) const -{ - FT_Vector ft_kerning; - FT_Size ft_size = this->ft_size; - FT_Face ft_face = ft_size->face; - - int lindex = FT_Get_Char_Index(ft_face, lhs); - int rindex = FT_Get_Char_Index(ft_face, rhs); - if (lindex == 0 && rindex == 0) - { - if (!backup_size) - return 0; - - ft_size = this->backup_size; - ft_face = ft_size->face; - - if (!FT_HAS_KERNING(ft_face)) - return 0; - - lindex = FT_Get_Char_Index(ft_face, lhs); - rindex = FT_Get_Char_Index(ft_face, rhs); - } - else - { - if (!FT_HAS_KERNING(ft_face)) - return 0; - } - - if (lindex == 0 || rindex == 0) - return 0; - - FT_Activate_Size(ft_size); - - FT_Error ft_error = FT_Get_Kerning(ft_face, - lindex, rindex, - FT_KERNING_DEFAULT, &ft_kerning); - - if (ft_error != 0) - return 0; - - int kerning = ft_kerning.x >> 6; - return kerning; -} - -// Generates (or shares) a layer derived from a font effect. -FontFaceLayer* FontFaceHandle::GenerateLayer(FontEffect* font_effect) -{ - // See if this effect has been instanced before, as part of a different configuration. - FontLayerMap::iterator i = layers.find(font_effect); - if (i != layers.end()) - return i->second; - - FontFaceLayer* layer = new FontFaceLayer(); - layers[font_effect] = layer; - - if (font_effect == NULL) - { - layer->Initialise(this); - } - else - { - // Determine which, if any, layer the new layer should copy its geometry and textures from. - FontFaceLayer* clone = NULL; - bool deep_clone = true; - String generation_key; - - if (!font_effect->HasUniqueTexture()) - { - clone = base_layer; - deep_clone = false; - } - else - { - generation_key = font_effect->GetName() + ";" + font_effect->GetGenerationKey(); - FontLayerCache::iterator cache_iterator = layer_cache.find(generation_key); - if (cache_iterator != layer_cache.end()) - clone = cache_iterator->second; - } - - // Create a new layer. - layer->Initialise(this, font_effect, clone, deep_clone); - - // Cache the layer in the layer cache if it generated its own textures (ie, didn't clone). - if (clone == NULL) - layer_cache[generation_key] = layer; - } - - return layer; -} - -} -} diff --git a/libs/libRocket/Source/Core/FontFaceLayer.cpp b/libs/libRocket/Source/Core/FontFaceLayer.cpp deleted file mode 100644 index 3c27fbaa660..00000000000 --- a/libs/libRocket/Source/Core/FontFaceLayer.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontFaceLayer.h" -#include -#include - -namespace Rocket { -namespace Core { - -FontFaceLayer::FontFaceLayer() : colour(255, 255, 255) -{ - handle = NULL; - effect = NULL; - base = NULL; - deep_copy = 0; -} - -FontFaceLayer::~FontFaceLayer() -{ - if (effect != NULL) - effect->RemoveReference(); -} - -// Generates the character and texture data for the layer. -bool FontFaceLayer::Initialise(const FontFaceHandle* _handle, FontEffect* _effect, const FontFaceLayer* clone, bool deep_clone) -{ - handle = _handle; - effect = _effect; - base = clone; - deep_copy = deep_clone; - - if (effect != NULL) - { - effect->AddReference(); - colour = effect->GetColour(); - } - - // Clone the geometry and textures from the clone layer. - if (clone != NULL) - { - // Copy the cloned layer's characters. - MergeFromBase(); - } - else - { - return AddNewGlyphs(); - } - - - return true; -} - -void FontFaceLayer::MergeFromBase() -{ - characters = base->characters; - - const FontGlyphMap& glyphs = handle->GetGlyphs(); - - // Copy (and reference) the cloned layer's textures. - for (size_t i = textures.size(); i < base->textures.size(); ++i) - textures.push_back(base->textures[i]); - - // Request the effect (if we have one) adjust the origins as appropriate. - if (!deep_copy && - effect != NULL) - { - for (FontGlyphMap::const_iterator i = glyphs.begin(); i != glyphs.end(); ++i) - { - const FontGlyph& glyph = i->second; - - CharacterMap::iterator character_iterator = characters.find(i->first); - if (character_iterator == characters.end()) - continue; - - Character& character = character_iterator->second; - - Vector2i glyph_origin(Math::RealToInteger(character.origin.x), Math::RealToInteger(character.origin.y)); - Vector2i glyph_dimensions(Math::RealToInteger(character.dimensions.x), Math::RealToInteger(character.dimensions.y)); - - if (effect->GetGlyphMetrics(glyph_origin, glyph_dimensions, glyph)) - { - character.origin.x = (float) glyph_origin.x; - character.origin.y = (float) glyph_origin.y; - } - else - characters.erase(character_iterator); - } - } -} - -bool FontFaceLayer::AddNewGlyphs() -{ - const FontGlyphMap& glyphs = handle->GetGlyphs(); - texture_layouts.push_back(std::move(std::unique_ptr(new TextureLayout()))); - TextureLayout& texture_layout = *texture_layouts.back(); - // Initialise the texture layout for the glyphs. - for (FontGlyphMap::const_iterator i = glyphs.begin(); i != glyphs.end(); ++i) - { - if (characters.find(i->first) != characters.end()) - continue; - - const FontGlyph& glyph = i->second; - - Vector2i glyph_origin(0, 0); - Vector2i glyph_dimensions = glyph.bitmap_dimensions; - - // Adjust glyph origin / dimensions for the font effect. - if (effect != NULL) - { - if (!effect->GetGlyphMetrics(glyph_origin, glyph_dimensions, glyph)) - continue; - } - - Character character; - character.origin = Vector2f((float) (glyph_origin.x + glyph.bearing.x), (float) (glyph_origin.y - glyph.bearing.y)); - character.dimensions = Vector2f((float) glyph_dimensions.x - glyph_origin.x, (float) glyph_dimensions.y - glyph_origin.y); - characters[i->first] = character; - - // Add the character's dimensions into the texture layout engine. - texture_layout.AddRectangle(i->first, glyph_dimensions - glyph_origin); - } - - // Generate the texture layout; this will position the glyph rectangles efficiently and - // allocate the texture data ready for writing. -#ifdef ROCKET_8BPP_FONTS - if (!texture_layout.GenerateLayout(1024, 1)) -#else - if (!texture_layout.GenerateLayout(1024, 4)) -#endif - return false; - - // Iterate over each rectangle in the layout, copying the glyph data into the rectangle as - // appropriate and generating geometry. - for (int i = 0; i < texture_layout.GetNumRectangles(); ++i) - { - TextureLayoutRectangle& rectangle = texture_layout.GetRectangle(i); - const TextureLayoutTexture& texture = texture_layout.GetTexture(rectangle.GetTextureIndex()); - Character& character = characters[(word) rectangle.GetId()]; - - // Set the character's texture index. - character.texture_index = textures.size() + rectangle.GetTextureIndex(); - character.local_texture_index = rectangle.GetTextureIndex(); - - // Generate the character's texture coordinates. - character.texcoords[0].x = float(rectangle.GetPosition().x) / float(texture.GetDimensions().x); - character.texcoords[0].y = float(rectangle.GetPosition().y) / float(texture.GetDimensions().y); - character.texcoords[1].x = float(rectangle.GetPosition().x + rectangle.GetDimensions().x) / float(texture.GetDimensions().x); - character.texcoords[1].y = float(rectangle.GetPosition().y + rectangle.GetDimensions().y) / float(texture.GetDimensions().y); - } - - - // Generate the textures. - for (int i = 0; i < texture_layout.GetNumTextures(); ++i) - { - std::shared_ptr texture(new Texture()); - if (!texture->Load(String(64, "?font::%p/%p/%d/%d", handle, effect, texture_layouts.size() - 1, i))) - return false; - - textures.push_back(texture); - } - - return true; -} - - -// Generates the texture data for a layer (for the texture database). -bool FontFaceLayer::GenerateTexture(const byte*& texture_data, Vector2i& texture_dimensions, int &texture_samples, int layout_id, int texture_id) -{ - TextureLayout& texture_layout = *texture_layouts[layout_id]; - if (texture_id < 0 || - texture_id > texture_layout.GetNumTextures()) - return false; - - const FontGlyphMap& glyphs = handle->GetGlyphs(); - - // Generate the texture data. - texture_data = texture_layout.GetTexture(texture_id).AllocateTexture(); - texture_dimensions = texture_layout.GetTexture(texture_id).GetDimensions(); -#ifdef ROCKET_8BPP_FONTS - texture_samples = 1; -#else - texture_samples = 4; -#endif - - for (int i = 0; i < texture_layout.GetNumRectangles(); ++i) - { - TextureLayoutRectangle& rectangle = texture_layout.GetRectangle(i); - Character& character = characters[(word) rectangle.GetId()]; - - if (character.local_texture_index != texture_id) - continue; - - const FontGlyph& glyph = glyphs.find((word) rectangle.GetId())->second; - - if (effect == NULL) - { - // Copy the glyph's bitmap data into its allocated texture. - if (glyph.bitmap_data != NULL) - { - byte* destination = rectangle.GetTextureData(); - byte* source = glyph.bitmap_data; - - for (int j = 0; j < glyph.bitmap_dimensions.y; ++j) - { -#ifdef ROCKET_8BPP_FONTS - memcpy(destination, source, glyph.bitmap_dimensions.x); -#else - for (int k = 0; k < glyph.bitmap_dimensions.x; ++k) - destination[k * 4 + 3] = source[k]; -#endif - destination += rectangle.GetTextureStride(); - source += glyph.bitmap_dimensions.x; - } - } - } - else - { - effect->GenerateGlyphTexture(rectangle.GetTextureData(), Vector2i(Math::RealToInteger(character.dimensions.x), Math::RealToInteger(character.dimensions.y)), rectangle.GetTextureStride(), glyph); - } - } - - return true; -} - -// Returns the effect used to generate the layer. -const FontEffect* FontFaceLayer::GetFontEffect() const -{ - return effect; -} - -// Returns on the layer's textures. -const Texture* FontFaceLayer::GetTexture(int index) -{ - ROCKET_ASSERT(index >= 0); - ROCKET_ASSERT(index < GetNumTextures()); - - return textures[index].get(); -} - -// Returns the number of textures employed by this layer. -int FontFaceLayer::GetNumTextures() const -{ - return (int) textures.size(); -} - -// Returns the layer's colour. -const Colourb& FontFaceLayer::GetColour() const -{ - return colour; -} - -} -} diff --git a/libs/libRocket/Source/Core/FontFaceLayer.h b/libs/libRocket/Source/Core/FontFaceLayer.h deleted file mode 100644 index be7f5599609..00000000000 --- a/libs/libRocket/Source/Core/FontFaceLayer.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTFACELAYER_H -#define ROCKETCOREFONTFACELAYER_H - -#include "../../Include/Rocket/Core/FontGlyph.h" -#include "../../Include/Rocket/Core/Geometry.h" -#include "../../Include/Rocket/Core/GeometryUtilities.h" -#include "../../Include/Rocket/Core/String.h" -#include "../../Include/Rocket/Core/Texture.h" -#include "TextureLayout.h" -#include - -namespace Rocket { -namespace Core { - -class FontEffect; -class FontFaceHandle; - -/** - A textured layer stored as part of a font face handle. Each handle will have at least a base - layer for the standard font. Further layers can be added to allow to rendering of text effects. - - @author Peter Curry - */ - -class FontFaceLayer -{ -public: - FontFaceLayer(); - ~FontFaceLayer(); - - /// Generates the character and texture data for the layer. - /// @param[in] handle The handle generating this layer. - /// @param[in] effect The effect to initialise the layer with. - /// @param[in] clone The layer to optionally clone geometry and texture data from. - /// @param[in] deep_clone If true, the clones geometry will be completely cloned and the effect will have no option to affect even the glyph origins. - /// @return True if the layer was generated successfully, false if not. - bool Initialise(const FontFaceHandle* handle, FontEffect* effect = NULL, const FontFaceLayer* clone = NULL, bool deep_clone = false); - - /// Generates the texture data for a layer (for the texture database). - /// @param[out] texture_data The pointer to be set to the generated texture data. - /// @param[out] texture_dimensions The dimensions of the texture. - /// @param[out] texture_samples Pixel size of the texture, in bytes. - /// @param[in] glyphs The glyphs required by the font face handle. - /// @param[in] texture_id The index of the texture within the layer to generate. - bool GenerateTexture(const byte *&texture_data, Vector2i &texture_dimensions, int &texture_samples, int layout_id, int texture_id); - - /// Generates the geometry required to render a single character. - /// @param[out] geometry An array of geometries this layer will write to. It must be at least as big as the number of textures in this layer. - /// @param[in] character_code The character to generate geometry for. - /// @param[in] position The position of the baseline. - /// @param[in] colour The colour of the string. - inline void GenerateGeometry(Geometry* geometry, const word character_code, const Vector2f& position, const Colourb& colour) const - { - CharacterMap::const_iterator iterator = characters.find(character_code); - if (iterator == characters.end()) - return; - - const Character& character = (*iterator).second; - - // Generate the geometry for the character. - std::vector< Vertex >& character_vertices = geometry[character.texture_index].GetVertices(); - std::vector< int >& character_indices = geometry[character.texture_index].GetIndices(); - - character_vertices.resize(character_vertices.size() + 4); - character_indices.resize(character_indices.size() + 6); - GeometryUtilities::GenerateQuad(&character_vertices[0] + (character_vertices.size() - 4), &character_indices[0] + (character_indices.size() - 6), Vector2f(position.x + character.origin.x, position.y + character.origin.y), character.dimensions, colour, character.texcoords[0], character.texcoords[1], (int)character_vertices.size() - 4); - } - - /// Returns the effect used to generate the layer. - /// @return The layer's effect. - const FontEffect* GetFontEffect() const; - - /// Returns on the layer's textures. - /// @param[in] index The index of the desired texture. - /// @return The requested texture. - const Texture* GetTexture(int index); - /// Returns the number of textures employed by this layer. - /// @return The number of used textures. - int GetNumTextures() const; - - /// Returns the layer's colour. - /// @return The layer's colour. - const Colourb& GetColour() const; - bool AddNewGlyphs(); - void MergeFromBase(void); - const FontFaceLayer *GetBaseLayer(void) const { return base; } - -private: - struct Character - { - // The offset, in pixels, of the baseline from the start of this character's geometry. - Vector2f origin; - // The width and height, in pixels, of this character's geometry. - Vector2f dimensions; - // The texture coordinates for the character's geometry. - Vector2f texcoords[2]; - - // The texture this character renders from. - int texture_index; - int local_texture_index; - }; - - typedef std::unordered_map< word, Character > CharacterMap; - typedef std::vector< std::shared_ptr > TextureList; - - const FontFaceHandle* handle; - FontEffect* effect; - const FontFaceLayer* base; - bool deep_copy; - - std::vector< std::unique_ptr > texture_layouts; - - CharacterMap characters; - TextureList textures; - Colourb colour; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/FontFamily.cpp b/libs/libRocket/Source/Core/FontFamily.cpp deleted file mode 100644 index 240e5263c09..00000000000 --- a/libs/libRocket/Source/Core/FontFamily.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "FontFamily.h" -#include "FontFace.h" - -namespace Rocket { -namespace Core { - -FontFamily::FontFamily(const String& name) : name(name) -{ -} - -FontFamily::~FontFamily() -{ - for (size_t i = 0; i < font_faces.size(); ++i) - delete font_faces[i]; -} - -// Adds a new face to the family. -bool FontFamily::AddFace(FT_Face ft_face, Font::Style style, Font::Weight weight, bool release_stream) -{ - FontFace* face = new FontFace(ft_face, style, weight, release_stream); - font_faces.push_back(face); - - return true; -} - -// Returns a handle to the most appropriate font in the family, at the correct size. -FontFaceHandle* FontFamily::GetFaceHandle(const String& charset, Font::Style style, Font::Weight weight, int size) -{ - // Search for a face of the same style, and match the weight as closely as we can. - FontFace* matching_face = NULL; - for (size_t i = 0; i < font_faces.size(); i++) - { - // If we've found a face matching the style, then ... great! We'll match it regardless of the weight. However, - // if it's a perfect match, then we'll stop looking altogether. - if (font_faces[i]->GetStyle() == style) - { - matching_face = font_faces[i]; - - if (font_faces[i]->GetWeight() == weight) - break; - } - } - - if (matching_face == NULL) - return NULL; - - return matching_face->GetHandle(charset, size); -} - -} -} diff --git a/libs/libRocket/Source/Core/FontFamily.h b/libs/libRocket/Source/Core/FontFamily.h deleted file mode 100644 index 6051a04b228..00000000000 --- a/libs/libRocket/Source/Core/FontFamily.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREFONTFAMILY_H -#define ROCKETCOREFONTFAMILY_H - -#include "../../Include/Rocket/Core/Font.h" -#include -#include FT_FREETYPE_H - -namespace Rocket { -namespace Core { - -class FontFace; -class FontFaceHandle; - -/** - @author Peter Curry - */ - -class FontFamily -{ -public: - FontFamily(const String& name); - ~FontFamily(); - - /// Adds a new face to the family. - /// @param[in] ft_face The previously loaded FreeType face. - /// @param[in] style The style of the new face. - /// @param[in] weight The weight of the new face. - /// @param[in] release_stream True if the application must free the face's memory stream. - /// @return True if the face was loaded successfully, false otherwise. - bool AddFace(FT_Face ft_face, Font::Style style, Font::Weight weight, bool release_stream); - - /// Returns a handle to the most appropriate font in the family, at the correct size. - /// @param[in] charset The set of characters in the handle, as a comma-separated list of unicode ranges. - /// @param[in] style The style of the desired handle. - /// @param[in] weight The weight of the desired handle. - /// @param[in] size The size of desired handle, in points. - /// @return A valid handle if a matching (or closely matching) font face was found, NULL otherwise. - FontFaceHandle* GetFaceHandle(const String& charset, Font::Style style, Font::Weight weight, int size); - -private: - String name; - - typedef std::vector< FontFace* > FontFaceList; - FontFaceList font_faces; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Geometry.cpp b/libs/libRocket/Source/Core/Geometry.cpp deleted file mode 100644 index cc3f43b7a60..00000000000 --- a/libs/libRocket/Source/Core/Geometry.cpp +++ /dev/null @@ -1,207 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Geometry.h" -#include "../../Include/Rocket/Core.h" -#include "GeometryDatabase.h" - -namespace Rocket { -namespace Core { - -static bool read_texel_offset = false; -static Vector2f texel_offset; - -Geometry::Geometry(Element* _host_element) -{ - host_element = _host_element; - host_context = NULL; - - GeometryDatabase::AddGeometry(this); - - texture = NULL; - - fixed_texcoords = false; - compile_attempted = false; - compiled_geometry = 0; -} - -Geometry::Geometry(Context* _host_context) -{ - host_element = NULL; - host_context = _host_context; - - GeometryDatabase::AddGeometry(this); - - texture = NULL; - - fixed_texcoords = false; - compile_attempted = false; - compiled_geometry = 0; -} - -Geometry::~Geometry() -{ - GeometryDatabase::RemoveGeometry(this); - - Release(); -} - -// Set the host element for this geometry; this should be passed in the constructor if possible. -void Geometry::SetHostElement(Element* _host_element) -{ - if (host_element == _host_element) - return; - - if (host_element != NULL) - { - Release(); - host_context = NULL; - } - - host_element = _host_element; -} - -void Geometry::Render(const Vector2f& translation) -{ - RenderInterface* render_interface = GetRenderInterface(); - if (render_interface == NULL) - return; - - // Render our compiled geometry if possible. - if (compiled_geometry) - { - render_interface->RenderCompiledGeometry(compiled_geometry, translation); - } - // Otherwise, if we actually have geometry, try to compile it if we haven't already done so, otherwise render it in - // immediate mode. - else - { - if (vertices.empty() || - indices.empty()) - return; - - if (!compile_attempted) - { - if (!fixed_texcoords) - { - fixed_texcoords = true; - - if (!read_texel_offset) - { - read_texel_offset = true; - texel_offset.x = render_interface->GetHorizontalTexelOffset(); - texel_offset.y = render_interface->GetVerticalTexelOffset(); - } - - // Add a half-texel offset if required. - if (texel_offset.x != 0 || - texel_offset.y != 0) - { - for (size_t i = 0; i < vertices.size(); ++i) - vertices[i].position += texel_offset; - } - } - - compile_attempted = true; - compiled_geometry = render_interface->CompileGeometry(&vertices[0], (int) vertices.size(), &indices[0], (int) indices.size(), texture != NULL ? texture->GetHandle(GetRenderInterface()) : 0); - - // If we managed to compile the geometry, we can clear the local copy of vertices and indices and - // immediately render the compiled version. - if (compiled_geometry) - { - render_interface->RenderCompiledGeometry(compiled_geometry, translation); - return; - } - } - - // Either we've attempted to compile before (and failed), or the compile we just attempted failed; either way, - // render the uncompiled version. - render_interface->RenderGeometry(&vertices[0], (int) vertices.size(), &indices[0], (int) indices.size(), texture != NULL ? texture->GetHandle(GetRenderInterface()) : 0, translation); - } -} - -// Returns the geometry's vertices. If these are written to, Release() should be called to force a recompile. -std::vector< Vertex >& Geometry::GetVertices() -{ - return vertices; -} - -// Returns the geometry's indices. If these are written to, Release() should be called to force a recompile. -std::vector< int >& Geometry::GetIndices() -{ - return indices; -} - -// Gets the geometry's texture. -const Texture* Geometry::GetTexture() const -{ - return texture; -} - -// Sets the geometry's texture. -void Geometry::SetTexture(const Texture* _texture) -{ - texture = _texture; - Release(); -} - -void Geometry::Release(bool clear_buffers) -{ - if (compiled_geometry) - { - GetRenderInterface()->ReleaseCompiledGeometry(compiled_geometry); - compiled_geometry = 0; - } - - compile_attempted = false; - - if (clear_buffers) - { - vertices.clear(); - indices.clear(); - fixed_texcoords = false; - } -} - -// Returns the host context's render interface. -RenderInterface* Geometry::GetRenderInterface() -{ - if (host_context == NULL) - { - if (host_element != NULL) - host_context = host_element->GetContext(); - } - - if (host_context == NULL) - return Rocket::Core::GetRenderInterface(); - else - return host_context->GetRenderInterface(); -} - -} -} diff --git a/libs/libRocket/Source/Core/GeometryDatabase.cpp b/libs/libRocket/Source/Core/GeometryDatabase.cpp deleted file mode 100644 index 3be049d6583..00000000000 --- a/libs/libRocket/Source/Core/GeometryDatabase.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "GeometryDatabase.h" -#include "../../Include/Rocket/Core/Geometry.h" - -namespace Rocket { -namespace Core { - -typedef std::set< Geometry* > GeometrySet; -GeometrySet geometries; - -// Adds a geometry to the database. -void GeometryDatabase::AddGeometry(Geometry* geometry) -{ - geometries.insert(geometry); -} - -// Removes a geometry from the database. -void GeometryDatabase::RemoveGeometry(Geometry* geometry) -{ - geometries.erase(geometry); -} - -// Releases all compiled geometries. -void GeometryDatabase::ReleaseGeometries() -{ - for (GeometrySet::iterator i = geometries.begin(); i != geometries.end(); ++i) - (*i)->Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/GeometryDatabase.h b/libs/libRocket/Source/Core/GeometryDatabase.h deleted file mode 100644 index 580ef6cf335..00000000000 --- a/libs/libRocket/Source/Core/GeometryDatabase.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREGEOMETRYDATABASE_H -#define ROCKETCOREGEOMETRYDATABASE_H - -namespace Rocket { -namespace Core { - -class Geometry; - -/** - Stores a list of all active geometries. - - @author Peter Curry - */ - -class GeometryDatabase -{ -public: - /// Adds a geometry to the database. - /// @param[in] geometry The geometry to add. - static void AddGeometry(Geometry* geometry); - /// Removes a geometry from the database. - /// @param[in] geometry The geometry to remove. - static void RemoveGeometry(Geometry* geometry); - - /// Releases all compiled geometries. - static void ReleaseGeometries(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/GeometryUtilities.cpp b/libs/libRocket/Source/Core/GeometryUtilities.cpp deleted file mode 100644 index a2d949de80a..00000000000 --- a/libs/libRocket/Source/Core/GeometryUtilities.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/GeometryUtilities.h" - -namespace Rocket { -namespace Core { - -GeometryUtilities::GeometryUtilities() -{ -} - -GeometryUtilities::~GeometryUtilities() -{ -} - -// Generates a quad from a position, size and colour. -void GeometryUtilities::GenerateQuad(Vertex* vertices, int* indices, const Vector2f& origin, const Vector2f& dimensions, const Colourb& colour, int index_offset) -{ - GenerateQuad(vertices, indices, origin, dimensions, colour, Vector2f(0, 0), Vector2f(1, 1), index_offset); -} - -// Generates a quad from a position, size, colour and texture coordinates. -void GeometryUtilities::GenerateQuad(Vertex* vertices, int* indices, const Vector2f& origin, const Vector2f& dimensions, const Colourb& colour, const Vector2f& top_left_texcoord, const Vector2f& bottom_right_texcoord, int index_offset) -{ - vertices[0].position = origin; - vertices[0].colour = colour; - vertices[0].tex_coord = top_left_texcoord; - - vertices[1].position = Vector2f(origin.x + dimensions.x, origin.y); - vertices[1].colour = colour; - vertices[1].tex_coord = Vector2f(bottom_right_texcoord.x, top_left_texcoord.y); - - vertices[2].position = origin + dimensions; - vertices[2].colour = colour; - vertices[2].tex_coord = bottom_right_texcoord; - - vertices[3].position = Vector2f(origin.x, origin.y + dimensions.y); - vertices[3].colour = colour; - vertices[3].tex_coord = Vector2f(top_left_texcoord.x, bottom_right_texcoord.y); - - indices[0] = index_offset + 0; - indices[1] = index_offset + 3; - indices[2] = index_offset + 1; - - indices[3] = index_offset + 1; - indices[4] = index_offset + 3; - indices[5] = index_offset + 2; -} - -} -} diff --git a/libs/libRocket/Source/Core/LayoutBlockBox.cpp b/libs/libRocket/Source/Core/LayoutBlockBox.cpp deleted file mode 100644 index 69c20c55b58..00000000000 --- a/libs/libRocket/Source/Core/LayoutBlockBox.cpp +++ /dev/null @@ -1,640 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LayoutBlockBox.h" -#include "LayoutBlockBoxSpace.h" -#include "LayoutEngine.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/ElementScroll.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -// Creates a new block box for rendering a block element. -LayoutBlockBox::LayoutBlockBox(LayoutEngine* _layout_engine, LayoutBlockBox* _parent, Element* _element) : position(0, 0) -{ - space = new LayoutBlockBoxSpace(this); - - layout_engine = _layout_engine; - parent = _parent; - - context = BLOCK; - element = _element; - interrupted_chain = NULL; - - box_cursor = 0; - vertical_overflow = false; - - // Get our offset root from our parent, if it has one; otherwise, our element is the offset parent. - if (parent != NULL && - parent->offset_root->GetElement() != NULL) - offset_root = parent->offset_root; - else - offset_root = this; - - // Determine the offset parent for this element. - LayoutBlockBox* self_offset_parent; - if (parent != NULL && - parent->offset_parent->GetElement() != NULL) - self_offset_parent = parent->offset_parent; - else - self_offset_parent = this; - - // Determine the offset parent for our children. - if (parent != NULL && - parent->offset_parent->GetElement() != NULL && - (element == NULL || element->GetPosition() == POSITION_STATIC)) - offset_parent = parent->offset_parent; - else - offset_parent = this; - - // Build the box for our element, and position it if we can. - if (parent != NULL) - { - space->ImportSpace(*parent->space); - - // Build our box if possible; if not, it will have to be set up manually. - layout_engine->BuildBox(box, min_height, max_height, parent, element); - - // Position ourselves within our containing block (if we have a valid offset parent). - if (parent->GetElement() != NULL) - { - if (self_offset_parent != this) - { - // Get the next position within our offset parent's containing block. - parent->PositionBlockBox(position, box, element->GetProperty< int >(CLEAR)); - element->SetOffset(position - (self_offset_parent->GetPosition() - offset_root->GetPosition()), self_offset_parent->GetElement()); - } - else - element->SetOffset(position, NULL); - } - } - - if (element != NULL) - { - wrap_content = element->GetWhitespace() != WHITE_SPACE_NOWRAP; - - // Determine if this element should have scrollbars or not, and create them if so. - element->GetOverflow(&overflow_x_property, &overflow_y_property); - - if (overflow_x_property == OVERFLOW_SCROLL) - element->GetElementScroll()->EnableScrollbar(ElementScroll::HORIZONTAL, box.GetSize(Box::PADDING).x); - else - element->GetElementScroll()->DisableScrollbar(ElementScroll::HORIZONTAL); - - if (overflow_y_property == OVERFLOW_SCROLL) - element->GetElementScroll()->EnableScrollbar(ElementScroll::VERTICAL, box.GetSize(Box::PADDING).x); - else - element->GetElementScroll()->DisableScrollbar(ElementScroll::VERTICAL); - } - else - { - wrap_content = true; - overflow_x_property = OVERFLOW_VISIBLE; - overflow_y_property = OVERFLOW_VISIBLE; - } -} - -// Creates a new block box in an inline context. -LayoutBlockBox::LayoutBlockBox(LayoutEngine* _layout_engine, LayoutBlockBox* _parent) : position(-1, -1) -{ - layout_engine = _layout_engine; - parent = _parent; - offset_parent = parent->offset_parent; - offset_root = parent->offset_root; - - space = _parent->space; - - context = INLINE; - line_boxes.push_back(new LayoutLineBox(this)); - wrap_content = parent->wrap_content; - - element = NULL; - interrupted_chain = NULL; - - box_cursor = 0; - vertical_overflow = false; - - layout_engine->BuildBox(box, min_height, max_height, parent, NULL); - parent->PositionBlockBox(position, box, 0); - box.SetContent(Vector2f(box.GetSize(Box::CONTENT).x, -1)); - - // Reset the min and max heights; they're not valid for inline block boxes. - min_height = 0; - max_height = FLT_MAX; -} - -// Releases the block box. -LayoutBlockBox::~LayoutBlockBox() -{ - for (size_t i = 0; i < block_boxes.size(); i++) - delete block_boxes[i]; - - for (size_t i = 0; i < line_boxes.size(); i++) - delete line_boxes[i]; - - if (context == BLOCK) - delete space; -} - -// Closes the box. -LayoutBlockBox::CloseResult LayoutBlockBox::Close() -{ - // If the last child of this block box is an inline box, then we haven't closed it; close it now! - if (context == BLOCK) - { - CloseResult result = CloseInlineBlockBox(); - if (result != OK) - return LAYOUT_SELF; - } - // Otherwise, we're an inline context box; so close our last line, which will still be open. - else - { - line_boxes.back()->Close(); - - // Expand our content area if any line boxes had to push themselves out. - Vector2f content_area = box.GetSize(); - for (size_t i = 0; i < line_boxes.size(); i++) - content_area.x = Math::Max(content_area.x, line_boxes[i]->GetDimensions().x); - - box.SetContent(content_area); - } - - // Set this box's height, if necessary. - if (box.GetSize(Box::CONTENT).y < 0) - { - Vector2f content_area = box.GetSize(); - content_area.y = Math::Clamp(box_cursor, min_height, max_height); - - if (element != NULL) - content_area.y = Math::Max(content_area.y, space->GetDimensions().y); - - box.SetContent(content_area); - } - - // Set the computed box on the element. - if (element != NULL) - { - if (context == BLOCK) - { - // Calculate the dimensions of the box's *internal* content; this is the tightest-fitting box around all of the - // internal elements, plus this element's padding. - Vector2f content_box(0, 0); - - for (size_t i = 0; i < block_boxes.size(); i++) - content_box.x = Math::Max(content_box.x, block_boxes[i]->GetBox().GetSize(Box::MARGIN).x); - - // Check how big our floated area is. - Vector2f space_box = space->GetDimensions(); - content_box.x = Math::Max(content_box.x, space_box.x); - - // If our content is larger than our window, then we can either extend our box, if we're set to not wrap - // our inline content, or enable the horizontal scrollbar, if we're set to auto-scrollbars. If we're set to - // always use scrollbars, then the horiontal scrollbar will already have been enabled in the constructor. - if (content_box.x > box.GetSize().x) - { - if (!wrap_content) - box.SetContent(Vector2f(content_box.x, box.GetSize().y)); - else if (overflow_x_property == OVERFLOW_AUTO) - { - element->GetElementScroll()->EnableScrollbar(ElementScroll::HORIZONTAL, box.GetSize(Box::PADDING).x); - - if (!CatchVerticalOverflow()) - return LAYOUT_SELF; - } - } - - content_box.x += (box.GetEdge(Box::PADDING, Box::LEFT) + box.GetEdge(Box::PADDING, Box::RIGHT)); - - content_box.y = box_cursor; - content_box.y = Math::Max(content_box.y, space_box.y); - if (!CatchVerticalOverflow(content_box.y)) - return LAYOUT_SELF; - - content_box.y += (box.GetEdge(Box::PADDING, Box::TOP) + box.GetEdge(Box::PADDING, Box::BOTTOM)); - - element->SetBox(box); - element->SetContentBox(space->GetOffset(), content_box); - - // Format any scrollbars which were enabled on this element. - element->GetElementScroll()->FormatScrollbars(); - } - else - element->SetBox(box); - } - - // Increment the parent's cursor. - if (parent != NULL) - { - // If this close fails, it means this block box has caused our parent block box to generate an automatic - // vertical scrollbar. - if (!parent->CloseBlockBox(this)) - return LAYOUT_PARENT; - } - - // If we represent a positioned element, then we can now (as we've been sized) act as the containing block for all - // the absolutely-positioned elements of our descendants. - if (context == BLOCK && - element != NULL) - { - if (element->GetPosition() != POSITION_STATIC) - CloseAbsoluteElements(); - } - - return OK; -} - -// Called by a closing block box child. -bool LayoutBlockBox::CloseBlockBox(LayoutBlockBox* child) -{ - ROCKET_ASSERT(context == BLOCK); - box_cursor = (child->GetPosition().y - child->box.GetEdge(Box::MARGIN, Box::TOP) - (box.GetPosition().y + position.y)) + child->GetBox().GetSize(Box::MARGIN).y; - - return CatchVerticalOverflow(); -} - -// Called by a closing line box child. -LayoutInlineBox* LayoutBlockBox::CloseLineBox(LayoutLineBox* child, LayoutInlineBox* overflow, LayoutInlineBox* overflow_chain) -{ - ROCKET_ASSERT(context == INLINE); - if (child->GetDimensions().x > 0) - box_cursor = (child->GetPosition().y - (box.GetPosition().y + position.y)) + child->GetDimensions().y; - - // If we have any pending floating elements for our parent, then this would be an ideal time to position them. - if (!float_elements.empty()) - { - for (size_t i = 0; i < float_elements.size(); ++i) - parent->PositionFloat(float_elements[i], box_cursor); - - float_elements.clear(); - } - - // Add a new line box. - line_boxes.push_back(new LayoutLineBox(this)); - - if (overflow_chain != NULL) - line_boxes.back()->AddChainedBox(overflow_chain); - - if (overflow != NULL) - return line_boxes.back()->AddBox(overflow); - - return NULL; -} - -// Adds a new block element to this block box. -LayoutBlockBox* LayoutBlockBox::AddBlockElement(Element* element) -{ - ROCKET_ASSERT(context == BLOCK); - - // Check if our most previous block box is rendering in an inline context. - if (!block_boxes.empty() && - block_boxes.back()->context == INLINE) - { - LayoutBlockBox* inline_block_box = block_boxes.back(); - LayoutInlineBox* open_inline_box = inline_block_box->line_boxes.back()->GetOpenInlineBox(); - if (open_inline_box != NULL) - { - // There's an open inline box chain, which means this block element is parented to it. The chain needs to - // be positioned (if it hasn't already), closed and duplicated after this block box closes. Also, this - // block needs to be aware of its parentage, so it can correctly compute its relative position. First of - // all, we need to close the inline box; this will position the last line if necessary, but it will also - // create a new line in the inline block box; we want this line to be in an inline box after our block - // element. - if (inline_block_box->Close() != OK) - return NULL; - - interrupted_chain = open_inline_box; - } - else - { - // There are no open inline boxes, so this inline box just needs to be closed. - if (CloseInlineBlockBox() != OK) - return NULL; - } - } - - block_boxes.push_back(new LayoutBlockBox(layout_engine, this, element)); - return block_boxes.back(); -} - -// Adds a new inline element to this inline box. -LayoutInlineBox* LayoutBlockBox::AddInlineElement(Element* element, const Box& box) -{ - if (context == BLOCK) - { - LayoutInlineBox* inline_box; - - // If we have an open child rendering in an inline context, we can add this element into it. - if (!block_boxes.empty() && - block_boxes.back()->context == INLINE) - inline_box = block_boxes.back()->AddInlineElement(element, box); - - // No dice! Ah well, nothing for it but to open a new inline context block box. - else - { - block_boxes.push_back(new LayoutBlockBox(layout_engine, this)); - - if (interrupted_chain != NULL) - { - block_boxes.back()->line_boxes.back()->AddChainedBox(interrupted_chain); - interrupted_chain = NULL; - } - - inline_box = block_boxes.back()->AddInlineElement(element, box); - } - - return inline_box; - } - else - { - // We're an inline context box, so we'll add this new inline element into our line boxes. - return line_boxes.back()->AddElement(element, box); - } -} - -// Adds a line-break to this block box. -void LayoutBlockBox::AddBreak() -{ - int line_height = ElementUtilities::GetLineHeight(element); - - // Check for an inline box as our last child; if so, we can simply end its line and bail. - if (!block_boxes.empty()) - { - LayoutBlockBox* block_box = block_boxes.back(); - if (block_box->context == INLINE) - { - LayoutLineBox* last_line = block_box->line_boxes.back(); - if (last_line->GetDimensions().y < 0) - block_box->box_cursor += line_height; - else - last_line->Close(); - - return; - } - } - - // No inline box as our last child; no problem, just increment the cursor by the line height of this element. - box_cursor += line_height; -} - -// Adds an element to this block box to be handled as a floating element. -bool LayoutBlockBox::AddFloatElement(Element* element) -{ - // If we have an open inline block box, then we have to position the box a little differently. - if (!block_boxes.empty() && - block_boxes.back()->context == INLINE) - block_boxes.back()->float_elements.push_back(element); - - // Nope ... just place it! - else - PositionFloat(element); - - return true; -} - -// Adds an element to this block box to be handled as an absolutely-positioned element. -void LayoutBlockBox::AddAbsoluteElement(Element* element) -{ - ROCKET_ASSERT(context == BLOCK); - - AbsoluteElement absolute_element; - absolute_element.element = element; - - PositionBox(absolute_element.position, 0); - - // If we have an open inline-context block box as our last child, then the absolute element must appear after it, - // but not actually close the box. - if (!block_boxes.empty() - && block_boxes.back()->context == INLINE) - { - LayoutBlockBox* inline_context_box = block_boxes.back(); - float last_line_height = inline_context_box->line_boxes.back()->GetDimensions().y; - - absolute_element.position.y += (inline_context_box->box_cursor + Math::Max(0.0f, last_line_height)); - } - - // Find the positioned parent for this element. - LayoutBlockBox* absolute_parent = this; - while (absolute_parent != absolute_parent->offset_parent) - absolute_parent = absolute_parent->parent; - - absolute_parent->absolute_elements.push_back(absolute_element); -} - -// Lays out, sizes, and positions all absolute elements in this block relative to the containing block. -void LayoutBlockBox::CloseAbsoluteElements() -{ - if (!absolute_elements.empty()) - { - // The size of the containing box, including the padding. This is used to resolve relative offsets. - Vector2f containing_block = GetBox().GetSize(Box::PADDING); - - for (size_t i = 0; i < absolute_elements.size(); i++) - { - Element* absolute_element = absolute_elements[i].element; - Vector2f absolute_position = absolute_elements[i].position; - absolute_position -= position - offset_root->GetPosition(); - - // Lay out the element. - LayoutEngine layout_engine; - layout_engine.FormatElement(absolute_element, containing_block); - - // Now that the element's box has been built, we can offset the position we determined was appropriate for - // it by the element's margin. This is necessary because the coordinate system for the box begins at the - // border, not the margin. - absolute_position.x += absolute_element->GetBox().GetEdge(Box::MARGIN, Box::LEFT); - absolute_position.y += absolute_element->GetBox().GetEdge(Box::MARGIN, Box::TOP); - - // Set the offset of the element; the element itself will take care of any RCSS-defined positional offsets. - absolute_element->SetOffset(absolute_position, element); - } - - absolute_elements.clear(); - } -} - -// Returns the offset from the top-left corner of this box that the next child box will be positioned at. -void LayoutBlockBox::PositionBox(Vector2f& box_position, float top_margin, int clear_property) const -{ - // If our element is establishing a new offset hierarchy, then any children of ours don't inherit our offset. - box_position = GetPosition(); - box_position += box.GetPosition(); - box_position.y += box_cursor; - - float clear_margin = space->ClearBoxes(box_position.y + top_margin, clear_property) - (box_position.y + top_margin); - if (clear_margin > 0) - box_position.y += clear_margin; - else - { - // Check for a collapsing vertical margin. - if (!block_boxes.empty() && - block_boxes.back()->context == BLOCK) - { - float bottom_margin = block_boxes.back()->GetBox().GetEdge(Box::MARGIN, Box::BOTTOM); - box_position.y -= Math::Min(top_margin, bottom_margin); - } - } -} - -// Returns the offset from the top-left corner of this box's offset element the next child block box, of the given -// dimensions, will be positioned at. This will include the margins on the new block box. -void LayoutBlockBox::PositionBlockBox(Vector2f& box_position, const Box& box, int clear_property) const -{ - PositionBox(box_position, box.GetEdge(Box::MARGIN, Box::TOP), clear_property); - box_position.x += box.GetEdge(Box::MARGIN, Box::LEFT); - box_position.y += box.GetEdge(Box::MARGIN, Box::TOP); - - LayoutEngine::Round(box_position); -} - -// Returns the offset from the top-left corner of this box for the next line. -void LayoutBlockBox::PositionLineBox(Vector2f& box_position, float& box_width, bool& _wrap_content, const Vector2f& dimensions) const -{ - Vector2f cursor; - PositionBox(cursor); - - space->PositionBox(box_position, box_width, cursor.y, dimensions); - - // Also, probably shouldn't check for widths when positioning the box? - _wrap_content = wrap_content; -} - -// Returns the block box's element. -Element* LayoutBlockBox::GetElement() const -{ - return element; -} - -// Returns the block box's parent. -LayoutBlockBox* LayoutBlockBox::GetParent() const -{ - return parent; -} - -// Returns the position of the block box, relative to its parent's content area. -const Vector2f& LayoutBlockBox::GetPosition() const -{ - return position; -} - -// Returns the element against which all positions of boxes in the hierarchy are calculated relative to. -LayoutBlockBox* LayoutBlockBox::GetOffsetParent() const -{ - return offset_parent; -} - -// Returns the block box against which all positions of boxes in the hierarchy are calculated relative to. -LayoutBlockBox* LayoutBlockBox::GetOffsetRoot() const -{ - return offset_root; -} - -// Returns the block box's dimension box. -Box& LayoutBlockBox::GetBox() -{ - return box; -} - -// Returns the block box's dimension box. -const Box& LayoutBlockBox::GetBox() const -{ - return box; -} - -void* LayoutBlockBox::operator new(size_t size) -{ - void* memory = LayoutEngine::AllocateLayoutChunk(size); - return memory; -} - -void LayoutBlockBox::operator delete(void* chunk) -{ - LayoutEngine::DeallocateLayoutChunk(chunk); -} - -// Closes our last block box, if it is an open inline block box. -LayoutBlockBox::CloseResult LayoutBlockBox::CloseInlineBlockBox() -{ - if (!block_boxes.empty() && - block_boxes.back()->context == INLINE) - return block_boxes.back()->Close(); - - return OK; -} - -// Positions a floating element within this block box. -void LayoutBlockBox::PositionFloat(Element* element, float offset) -{ - Vector2f box_position; - PositionBox(box_position); - - space->PositionBox(box_position.y + offset, element); -} - -// Checks if we have a new vertical overflow on an auto-scrolling element. -bool LayoutBlockBox::CatchVerticalOverflow(float cursor) -{ - if (cursor == -1) - cursor = box_cursor; - - float box_height = box.GetSize().y; - if (box_height < 0) - box_height = max_height; - - // If we're auto-scrolling and our height is fixed, we have to check if this box has exceeded our client height. - if (!vertical_overflow && - box_height >= 0 && - overflow_y_property == OVERFLOW_AUTO) - { - if (cursor > box_height - element->GetElementScroll()->GetScrollbarSize(ElementScroll::HORIZONTAL)) - { - vertical_overflow = true; - element->GetElementScroll()->EnableScrollbar(ElementScroll::VERTICAL, box.GetSize(Box::PADDING).x); - - for (size_t i = 0; i < block_boxes.size(); i++) - delete block_boxes[i]; - block_boxes.clear(); - - delete space; - space = new LayoutBlockBoxSpace(this); - - box_cursor = 0; - interrupted_chain = NULL; - - return false; - } - } - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/LayoutBlockBox.h b/libs/libRocket/Source/Core/LayoutBlockBox.h deleted file mode 100644 index d3450a5820a..00000000000 --- a/libs/libRocket/Source/Core/LayoutBlockBox.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELAYOUTBLOCKBOX_H -#define ROCKETCORELAYOUTBLOCKBOX_H - -#include "LayoutLineBox.h" -#include "../../Include/Rocket/Core/Box.h" -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Core { - -class LayoutBlockBoxSpace; -class LayoutEngine; - -/** - @author Peter Curry - */ - -class LayoutBlockBox -{ -public: - enum FormattingContext - { - BLOCK, - INLINE - }; - - enum CloseResult - { - OK, - LAYOUT_SELF, - LAYOUT_PARENT - }; - - /// Creates a new block box for rendering a block element. - /// @param layout_engine[in] The layout engine that created this block box. - /// @param parent[in] The parent of this block box. This will be NULL for the root element. - /// @param element[in] The element this block box is laying out. - LayoutBlockBox(LayoutEngine* layout_engine, LayoutBlockBox* parent, Element* element); - /// Creates a new block box in an inline context. - /// @param layout_engine[in] The layout engine that created this block box. - /// @param parent[in] The parent of this block box. - LayoutBlockBox(LayoutEngine* layout_engine, LayoutBlockBox* parent); - /// Releases the block box. - ~LayoutBlockBox(); - - /// Closes the box. This will determine the element's height (if it was unspecified). - /// @return The result of the close; this may request a reformat of this element or our parent. - CloseResult Close(); - - /// Called by a closing block box child. Increments the cursor. - /// @param child[in] The closing child block box. - /// @return False if the block box caused an automatic vertical scrollbar to appear, forcing an entire reformat of the block box. - bool CloseBlockBox(LayoutBlockBox* child); - /// Called by a closing line box child. Increments the cursor, and creates a new line box to fit the overflow - /// (if any). - /// @param child[in] The closing child line box. - /// @param overflow[in] The overflow from the closing line box. May be NULL if there was no overflow. - /// @param overflow_chain[in] The end of the chained hierarchy to be spilled over to the new line, as the parent to the overflow box (if one exists). - /// @return If the line box had overflow, this will be the last inline box created by the overflow. - LayoutInlineBox* CloseLineBox(LayoutLineBox* child, LayoutInlineBox* overflow, LayoutInlineBox* overflow_chain); - - /// Adds a new block element to this block-context box. - /// @param element[in] The new block element. - /// @param placed[in] True if the element is to be placed, false otherwise. - /// @return The block box representing the element. Once the element's children have been positioned, Close() must be called on it. - LayoutBlockBox* AddBlockElement(Element* element); - /// Adds a new inline element to this inline-context box. - /// @param element[in] The new inline element. - /// @param box[in] The box defining the element's bounds. - /// @return The inline box representing the element. Once the element's children have been positioned, Close() must be called on it. - LayoutInlineBox* AddInlineElement(Element* element, const Box& box); - /// Adds a line-break to this block box. - void AddBreak(); - - /// Adds an element to this block box to be handled as a floating element. - bool AddFloatElement(Element* element); - - /// Adds an element to this block box to be handled as an absolutely-positioned element. This element will be - /// laid out, sized and positioned appropriately once this box is finished. This should only be called on boxes - /// rendering in a block-context. - /// @param element[in] The element to be positioned absolutely within this block box. - void AddAbsoluteElement(Element* element); - /// Formats, sizes, and positions all absolute elements in this block. - void CloseAbsoluteElements(); - - /// Returns the offset from the top-left corner of this box's offset element the next child box will be - /// positioned at. - /// @param[out] box_position The box cursor position. - /// @param[in] top_margin The top margin of the box. This will be collapsed as appropriate against other block boxes. - /// @param[in] clear_property The value of the underlying element's clear property. - void PositionBox(Vector2f& box_position, float top_margin = 0, int clear_property = 0) const; - /// Returns the offset from the top-left corner of this box's offset element the next child block box, of the - /// given dimensions, will be positioned at. This will include the margins on the new block box. - /// @param[out] box_position The block box cursor position. - /// @param[in] box The dimensions of the new box. - /// @param[in] clear_property The value of the underlying element's clear property. - void PositionBlockBox(Vector2f& box_position, const Box& box, int clear_property) const; - /// Returns the offset from the top-left corner of this box for the next line. - /// @param box_position[out] The line box position. - /// @param box_width[out] The available width for the line box. - /// @param wrap_content[out] Set to true if the line box should grow to fit inline boxes, false if it should wrap them. - /// @param dimensions[in] The minimum dimensions of the line. - void PositionLineBox(Vector2f& box_position, float& box_width, bool& wrap_content, const Vector2f& dimensions) const; - - /// Returns the block box's element. - /// @return The block box's element. - Element* GetElement() const; - - /// Returns the block box's parent. - /// @return The block box's parent. - LayoutBlockBox* GetParent() const; - - /// Returns the position of the block box, relative to its parent's content area. - /// @return The relative position of the block box. - const Vector2f& GetPosition() const; - - /// Returns the block box against which all positions of boxes in the hierarchy are set relative to. - /// @return This box's offset parent. - LayoutBlockBox* GetOffsetParent() const; - /// Returns the block box against which all positions of boxes in the hierarchy are calculated relative to. - /// @return This box's offset root. - LayoutBlockBox* GetOffsetRoot() const; - - /// Returns the block box's dimension box. - /// @return The block box's dimension box. - Box& GetBox(); - /// Returns the block box's dimension box. - /// @return The block box's dimension box. - const Box& GetBox() const; - - void* operator new(size_t size); - void operator delete(void* chunk); - -private: - struct AbsoluteElement - { - Element* element; - Vector2f position; - }; - - // Closes our last block box, if it is an open inline block box. - CloseResult CloseInlineBlockBox(); - - // Positions a floating element within this block box. - void PositionFloat(Element* element, float offset = 0); - - // Checks if we have a new vertical overflow on an auto-scrolling element. If so, our vertical scrollbar will - // be enabled and our block boxes will be destroyed. All content will need to re-formatted. Returns true if no - // overflow occured, false if it did. - bool CatchVerticalOverflow(float cursor = -1); - - typedef std::vector< AbsoluteElement > AbsoluteElementList; - typedef std::vector< LayoutBlockBox* > BlockBoxList; - typedef std::vector< LayoutLineBox* > LineBoxList; - - // The object managing our space, as occupied by floating elements of this box and our ancestors. - LayoutBlockBoxSpace* space; - - // The box's layout engine. - LayoutEngine* layout_engine; - // The element this box represents. This will be NULL for boxes rendering in an inline context. - Element* element; - - // The element we'll be computing our offset relative to during layout. - LayoutBlockBox* offset_root; - // The element this block box's children are to be offset from. - LayoutBlockBox* offset_parent; - - // The box's block parent. This will be NULL for the root of the box tree. - LayoutBlockBox* parent; - - // The context of the box's context; either block or inline. - FormattingContext context; - - // The block box's position. - Vector2f position; - // The block box's size. - Box box; - float min_height; - float max_height; - // Used by inline contexts only; set to true if the block box's line boxes should stretch to fit their inline content instead of wrapping. - bool wrap_content; - - // The vertical position of the next block box to be added to this box, relative to the top of this box. - float box_cursor; - - // Used by block contexts only; stores the list of block boxes under this box. - BlockBoxList block_boxes; - // Used by block contexts only; stores any elements that are to be absolutely positioned within this block box. - AbsoluteElementList absolute_elements; - // Used by block contexts only; stores an inline element hierarchy that was interrupted by a child block box. - // The hierarchy will be resumed in an inline-context box once the intervening block box is completed. - LayoutInlineBox* interrupted_chain; - // Used by block contexts only; stores the value of the overflow property for the element. - int overflow_x_property; - int overflow_y_property; - // Used by block contexts only; if true, we've enabled our vertical scrollbar. - bool vertical_overflow; - - // Used by inline contexts only; stores the list of line boxes flowing inline content. - LineBoxList line_boxes; - // Used by inline contexts only; stores any floating elements that are waiting for a line break to be positioned. - ElementList float_elements; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/LayoutBlockBoxSpace.cpp b/libs/libRocket/Source/Core/LayoutBlockBoxSpace.cpp deleted file mode 100644 index a1473e85d15..00000000000 --- a/libs/libRocket/Source/Core/LayoutBlockBoxSpace.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LayoutBlockBoxSpace.h" -#include "LayoutBlockBox.h" -#include "LayoutEngine.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/ElementScroll.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -LayoutBlockBoxSpace::LayoutBlockBoxSpace(LayoutBlockBox* _parent) : offset(0, 0), dimensions(0, 0) -{ - parent = _parent; -} - -LayoutBlockBoxSpace::~LayoutBlockBoxSpace() -{ -} - -// Imports boxes from another block into this space. -void LayoutBlockBoxSpace::ImportSpace(const LayoutBlockBoxSpace& space) -{ - // Copy all the boxes from the parent into this space. Could do some optimisation here! - for (int i = 0; i < NUM_ANCHOR_EDGES; ++i) - { - for (size_t j = 0; j < space.boxes[i].size(); ++j) - boxes[i].push_back(space.boxes[i][j]); - } -} - -// Generates the position for a box of a given size within a containing block box. -void LayoutBlockBoxSpace::PositionBox(Vector2f& box_position, float& box_width, float cursor, const Vector2f& dimensions) const -{ - box_width = PositionBox(box_position, cursor, dimensions); -} - -// Generates and sets the position for a floating box of a given size within our block box. -float LayoutBlockBoxSpace::PositionBox(float cursor, Element* element) -{ - Vector2f element_size = element->GetBox().GetSize(Box::MARGIN); - int float_property = element->GetFloat(); - - // Shift the cursor down (if necessary) so it isn't placed any higher than a previously-floated box. - for (int i = 0; i < NUM_ANCHOR_EDGES; ++i) - { - if (!boxes[i].empty()) - cursor = Math::Max(cursor, boxes[i].back().offset.y); - } - - // Shift the cursor down past to clear boxes, if necessary. - cursor = ClearBoxes(cursor, element->GetProperty< int >(CLEAR)); - - // Find a place to put this box. - Vector2f element_offset; - PositionBox(element_offset, cursor, element_size, float_property); - - // It's been placed, so we can now add it to our list of floating boxes. - boxes[float_property == FLOAT_LEFT ? LEFT : RIGHT].push_back(SpaceBox(element_offset, element_size)); - - // Set our offset and dimensions (if necessary) so they enclose the new box. - Vector2f normalised_offset = element_offset - (parent->GetPosition() + parent->GetBox().GetPosition()); - offset.x = Math::Min(offset.x, normalised_offset.x); - offset.y = Math::Min(offset.y, normalised_offset.y); - dimensions.x = Math::Max(dimensions.x, normalised_offset.x + element_size.x); - dimensions.y = Math::Max(dimensions.y, normalised_offset.y + element_size.y); - - // Shift the offset into the correct space relative to the element's offset parent. - element_offset += Vector2f(element->GetBox().GetEdge(Box::MARGIN, Box::LEFT), element->GetBox().GetEdge(Box::MARGIN, Box::TOP)); - element->SetOffset(element_offset - parent->GetOffsetParent()->GetPosition(), parent->GetOffsetParent()->GetElement()); - - return element_offset.y + element_size.y; -} - -// Determines the appropriate vertical position for an object that is choosing to clear floating elements to the left -// or right (or both). -float LayoutBlockBoxSpace::ClearBoxes(float cursor, int clear_property) -{ - // Clear left boxes. - if (clear_property == CLEAR_LEFT || - clear_property == CLEAR_BOTH) - { - for (size_t i = 0; i < boxes[LEFT].size(); ++i) - cursor = Math::Max(cursor, boxes[LEFT][i].offset.y + boxes[LEFT][i].dimensions.y); - } - - // Clear right boxes. - if (clear_property == CLEAR_RIGHT || - clear_property == CLEAR_BOTH) - { - for (size_t i = 0; i < boxes[RIGHT].size(); ++i) - cursor = Math::Max(cursor, boxes[RIGHT][i].offset.y + boxes[RIGHT][i].dimensions.y); - } - - return cursor; -} - -// Generates the position for an arbitrary box within our space layout, floated against either the left or right edge. -float LayoutBlockBoxSpace::PositionBox(Vector2f& box_position, float cursor, const Vector2f& dimensions, int float_property) const -{ - float parent_scrollbar_width = parent->GetElement()->GetElementScroll()->GetScrollbarSize(ElementScroll::VERTICAL); - float parent_origin = parent->GetPosition().x + parent->GetBox().GetPosition(Box::CONTENT).x; - float parent_edge = parent->GetBox().GetSize().x + parent_origin - parent_scrollbar_width; - - AnchorEdge box_edge = float_property == FLOAT_RIGHT ? RIGHT : LEFT; - - box_position.y = cursor; - box_position.x = box_edge == LEFT ? 0 : (parent->GetBox().GetSize().x - dimensions.x) - parent_scrollbar_width; - box_position.x += parent_origin; - - float next_cursor = FLT_MAX; - - // First up; we iterate through all boxes that share our edge, pushing ourself to the side of them if we intersect - // them. We record the height of the lowest box that gets in our way; in the event we can't be positioned at this - // height, we'll reposition ourselves at that height for the next iteration. - for (size_t i = 0; i < boxes[box_edge].size(); ++i) - { - const SpaceBox& fixed_box = boxes[box_edge][i]; - - // If the fixed box's bottom edge is above our top edge, then we can safely skip it. - if (fixed_box.offset.y + fixed_box.dimensions.y <= box_position.y) - continue; - - // If the fixed box's top edge is below our bottom edge, then we can safely skip it. - if (fixed_box.offset.y >= box_position.y + dimensions.y) - continue; - - // We're intersecting this box vertically, so the box is pushed to the side if necessary. - bool collision = false; - if (box_edge == LEFT) - { - float right_edge = fixed_box.offset.x + fixed_box.dimensions.x; - collision = box_position.x < right_edge; - if (collision) - box_position.x = right_edge; - } - else - { - collision = box_position.x + dimensions.x > fixed_box.offset.x; - if (collision) - box_position.x = fixed_box.offset.x - dimensions.x; - } - - // If there was a collision, then we *might* want to remember the height of this box if it is the earliest- - // terminating box we've collided with so far. - if (collision) - { - next_cursor = Math::Min(next_cursor, fixed_box.offset.y + fixed_box.dimensions.y); - - // Were we pushed out of our containing box? If so, try again at the next cursor position. - float normalised_position = box_position.x - parent_origin; - if (normalised_position < 0 || - normalised_position + dimensions.x > parent->GetBox().GetSize().x) - return PositionBox(box_position, next_cursor + 0.01f, dimensions, float_property); - } - } - - // Second; we go through all of the boxes on the other edge, checking for horizontal collisions and determining the - // maximum width the box can stretch to, if it is placed at this location. - float maximum_box_width = box_edge == LEFT ? parent_edge - box_position.x : box_position.x + dimensions.x; - - for (size_t i = 0; i < boxes[1 - box_edge].size(); ++i) - { - const SpaceBox& fixed_box = boxes[1 - box_edge][i]; - - // If the fixed box's bottom edge is above our top edge, then we can safely skip it. - if (fixed_box.offset.y + fixed_box.dimensions.y <= box_position.y) - continue; - - // If the fixed box's top edge is below our bottom edge, then we can safely skip it. - if (fixed_box.offset.y >= box_position.y + dimensions.y) - continue; - - // We intersect this box vertically, so check if it intersects horizontally. - bool collision = false; - if (box_edge == LEFT) - { - maximum_box_width = Math::Min(maximum_box_width, fixed_box.offset.x - box_position.x); - collision = box_position.x + dimensions.x > fixed_box.offset.x; - } - else - { - maximum_box_width = Math::Min(maximum_box_width, (box_position.x + dimensions.x) - (fixed_box.offset.x + fixed_box.dimensions.x)); - collision = box_position.x < fixed_box.offset.x + fixed_box.dimensions.x; - } - - // If we collided with this box ... d'oh! We'll try again lower down the page, at the highest bottom-edge of - // any of the boxes we've been pushed around by so far. - if (collision) - { - next_cursor = Math::Min(next_cursor, fixed_box.offset.y + fixed_box.dimensions.y); - return PositionBox(box_position, next_cursor + 0.01f, dimensions, float_property); - } - } - - // Third; we go through all of the boxes (on both sides), checking for vertical collisions. - for (int i = 0; i < 2; ++i) - { - for (size_t j = 0; j < boxes[i].size(); ++j) - { - const SpaceBox& fixed_box = boxes[i][j]; - - // If the fixed box's bottom edge is above our top edge, then we can safely skip it. - if (fixed_box.offset.y + fixed_box.dimensions.y <= box_position.y) - continue; - - // If the fixed box's top edge is below our bottom edge, then we can safely skip it. - if (fixed_box.offset.y >= box_position.y + dimensions.y) - continue; - - // We collide vertically; if we also collide horizontally, then we have to try again further down the - // layout. If the fixed box's left edge is to right of our right edge, then we can safely skip it. - if (fixed_box.offset.x >= box_position.x + dimensions.x) - continue; - - // If the fixed box's right edge is to the left of our left edge, then we can safely skip it. - if (fixed_box.offset.x + fixed_box.dimensions.x <= box_position.x) - continue; - - // D'oh! We hit this box. Ah well; we'll try again lower down the page, at the highest bottom-edge of any - // of the boxes we've been pushed around by so far. - next_cursor = Math::Min(next_cursor, fixed_box.offset.y + fixed_box.dimensions.y); - return PositionBox(box_position, next_cursor + 0.01f, dimensions, float_property); - } - } - - // Looks like we've found a winner! - return maximum_box_width; -} - -// Returns the top-left offset of the boxes within the space. -const Vector2f& LayoutBlockBoxSpace::GetOffset() const -{ - return offset; -} - -// Returns the dimensions of the boxes within the space. -Vector2f LayoutBlockBoxSpace::GetDimensions() const -{ - return dimensions - offset; -} - -void* LayoutBlockBoxSpace::operator new(size_t size) -{ - return LayoutEngine::AllocateLayoutChunk(size); -} - -void LayoutBlockBoxSpace::operator delete(void* chunk) -{ - LayoutEngine::DeallocateLayoutChunk(chunk); -} - -LayoutBlockBoxSpace::SpaceBox::SpaceBox() : offset(0, 0), dimensions(0, 0) -{ -} - -LayoutBlockBoxSpace::SpaceBox::SpaceBox(const Vector2f& offset, const Vector2f& dimensions) : offset(offset), dimensions(dimensions) -{ -} - -} -} diff --git a/libs/libRocket/Source/Core/LayoutBlockBoxSpace.h b/libs/libRocket/Source/Core/LayoutBlockBoxSpace.h deleted file mode 100644 index 804e2b9c754..00000000000 --- a/libs/libRocket/Source/Core/LayoutBlockBoxSpace.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELAYOUTBLOCKBOXSPACE_H -#define ROCKETCORELAYOUTBLOCKBOXSPACE_H - -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -class Element; -class LayoutBlockBox; - -/** - Each block box has a space object for managing the space occupied by its floating elements, and those of its - ancestors as relevant. - - @author Peter Curry - */ - -class LayoutBlockBoxSpace -{ -public: - LayoutBlockBoxSpace(LayoutBlockBox* parent); - ~LayoutBlockBoxSpace(); - - /// Imports boxes from another block into this space. - /// @param[in] space The space to import boxes from. - void ImportSpace(const LayoutBlockBoxSpace& space); - - /// Generates the position for a box of a given size within our block box. - /// @param[out] box_position The generated position for the box. - /// @param[out] box_width The available width for the box. - /// @param[in] cursor The ideal vertical position for the box. - /// @param[in] dimensions The minimum available space required for the box. - void PositionBox(Vector2f& box_position, float& box_width, float cursor, const Vector2f& dimensions) const; - - /// Generates and sets the position for a floating box of a given size within our block box. The element's box - /// is then added into our list of floating boxes. - /// @param[in] cursor The ideal vertical position for the box. - /// @param[in] element The element to position. - /// @return The offset of the bottom outer edge of the element. - float PositionBox(float cursor, Element* element); - - /// Determines the appropriate vertical position for an object that is choosing to clear floating elements to - /// the left or right (or both). - /// @param[in] cursor The ideal vertical position. - /// @param[in] clear_property The value of the clear property of the clearing object. - /// @return The appropriate vertical position for the clearing object. - float ClearBoxes(float cursor, int clear_property); - - /// Returns the top-left corner of the boxes within the space. - /// @return The space's offset. - const Vector2f& GetOffset() const; - /// Returns the dimensions of the boxes within the space. - /// @return The space's dimensions. - Vector2f GetDimensions() const; - - void* operator new(size_t size); - void operator delete(void* chunk); - -private: - enum AnchorEdge - { - LEFT = 0, - RIGHT = 1, - NUM_ANCHOR_EDGES = 2 - }; - - /// Generates the position for an arbitrary box within our space layout, floated against either the left or - /// right edge. - /// @param box_position[out] The generated position for the box. - /// @param cursor[in] The ideal vertical position for the box. - /// @param dimensions[in] The size of the box to place. - /// @return The maximum width at the box position. - float PositionBox(Vector2f& box_position, float cursor, const Vector2f& dimensions, int float_property = FLOAT_NONE) const; - - struct SpaceBox - { - SpaceBox(); - SpaceBox(const Vector2f& offset, const Vector2f& dimensions); - - Vector2f offset; - Vector2f dimensions; - }; - - typedef std::vector< SpaceBox > SpaceBoxList; - - // Our block-box parent. - LayoutBlockBox* parent; - - // The boxes floating in our space. - SpaceBoxList boxes[NUM_ANCHOR_EDGES]; - - // The offset and dimensions of the boxes added specifically into this space. - Vector2f offset; - Vector2f dimensions; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/LayoutEngine.cpp b/libs/libRocket/Source/Core/LayoutEngine.cpp deleted file mode 100644 index 2ccfb573457..00000000000 --- a/libs/libRocket/Source/Core/LayoutEngine.cpp +++ /dev/null @@ -1,683 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LayoutEngine.h" -#include "../../Include/Rocket/Core/Math.h" -#include "Pool.h" -#include "LayoutBlockBoxSpace.h" -#include "LayoutInlineBoxText.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/ElementScroll.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/Types.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" -#include - -namespace Rocket { -namespace Core { - -#define MAX(a, b) (a > b ? a : b) - -struct LayoutChunk -{ - LayoutChunk() - { - memset(buffer, 0, size); - } - - static const unsigned int size = MAX(sizeof(LayoutBlockBox), MAX(sizeof(LayoutInlineBox), MAX(sizeof(LayoutInlineBoxText), MAX(sizeof(LayoutLineBox), sizeof(LayoutBlockBoxSpace))))); - char buffer[size]; -}; - -static Pool< LayoutChunk > layout_chunk_pool(200, true); - -LayoutEngine::LayoutEngine() -{ - block_box = NULL; - block_context_box = NULL; -} - -LayoutEngine::~LayoutEngine() -{ -} - -// Formats the contents for a root-level element (usually a document or floating element). -bool LayoutEngine::FormatElement(Element* element, const Vector2f& containing_block) -{ - block_box = new LayoutBlockBox(this, NULL, NULL); - block_box->GetBox().SetContent(containing_block); - - block_context_box = block_box->AddBlockElement(element); - - for (int i = 0; i < element->GetNumChildren(); i++) - { - if (!FormatElement(element->GetChild(i))) - i = -1; - } - - block_context_box->Close(); - block_context_box->CloseAbsoluteElements(); - - element->OnLayout(); - - delete block_box; - return true; -} - -// Generates the box for an element. -void LayoutEngine::BuildBox(Box& box, const Vector2f& containing_block, Element* element, bool inline_element) -{ - if (element == NULL) - { - box.SetContent(containing_block); - return; - } - - // Calculate the padding area. - const Property *padding_top, *padding_bottom, *padding_left, *padding_right; - element->GetPaddingProperties (&padding_top, &padding_bottom, &padding_left, &padding_right); - - float padding = element->ResolveProperty(padding_top, containing_block.x); - box.SetEdge(Box::PADDING, Box::TOP, Math::Max(0.0f, padding)); - padding = element->ResolveProperty(padding_right, containing_block.x); - box.SetEdge(Box::PADDING, Box::RIGHT, Math::Max(0.0f, padding)); - padding = element->ResolveProperty(padding_bottom, containing_block.x); - box.SetEdge(Box::PADDING, Box::BOTTOM, Math::Max(0.0f, padding)); - padding = element->ResolveProperty(padding_left, containing_block.x); - box.SetEdge(Box::PADDING, Box::LEFT, Math::Max(0.0f, padding)); - - // Calculate the border area. - const Property *border_top_width, *border_bottom_width, *border_left_width, *border_right_width; - element->GetBorderWidthProperties (&border_top_width, &border_bottom_width, &border_left_width, &border_right_width); - - float border = element->ResolveProperty(border_top_width, containing_block.x); - box.SetEdge(Box::BORDER, Box::TOP, Math::Max(0.0f, border)); - border = element->ResolveProperty(border_right_width, containing_block.x); - box.SetEdge(Box::BORDER, Box::RIGHT, Math::Max(0.0f, border)); - border = element->ResolveProperty(border_bottom_width, containing_block.x); - box.SetEdge(Box::BORDER, Box::BOTTOM, Math::Max(0.0f, border)); - border = element->ResolveProperty(border_left_width, containing_block.x); - box.SetEdge(Box::BORDER, Box::LEFT, Math::Max(0.0f, border)); - - // Calculate the size of the content area. - Vector2f content_area(-1, -1); - bool replaced_element = false; - - // If the element has intrinsic dimensions, then we use those as the basis for the content area and only adjust - // them if a non-auto style has been applied to them. - if (element->GetIntrinsicDimensions(content_area)) - { - replaced_element = true; - - Vector2f original_content_area = content_area; - - // The element has resized itself, so we only resize it if a RCSS width or height was set explicitly. A value of - // 'auto' (or 'auto-fit', ie, both keywords) means keep (or adjust) the intrinsic dimensions. - bool auto_width = false, auto_height = false; - const Property* width_property, *height_property; - - element->GetDimensionProperties(&width_property, &height_property); - - if (width_property->unit != Property::KEYWORD) - content_area.x = element->ResolveProperty(width_property, containing_block.x); - else - auto_width = true; - - if (height_property->unit != Property::KEYWORD) - content_area.y = element->ResolveProperty(height_property, containing_block.y); - else - auto_height = true; - - // If one of the dimensions is 'auto' then we need to scale it such that the original ratio is preserved. - if (auto_width && !auto_height) - content_area.x = (content_area.y / original_content_area.y) * original_content_area.x; - else if (auto_height && !auto_width) - content_area.y = (content_area.x / original_content_area.x) * original_content_area.y; - - // Reduce the width and height to make up for borders and padding. - content_area.x -= (box.GetEdge(Box::BORDER, Box::LEFT) + - box.GetEdge(Box::PADDING, Box::LEFT) + - box.GetEdge(Box::BORDER, Box::RIGHT) + - box.GetEdge(Box::PADDING, Box::RIGHT)); - content_area.y -= (box.GetEdge(Box::BORDER, Box::TOP) + - box.GetEdge(Box::PADDING, Box::TOP) + - box.GetEdge(Box::BORDER, Box::BOTTOM) + - box.GetEdge(Box::PADDING, Box::BOTTOM)); - - content_area.x = Math::Max(content_area.x, 0.0f); - content_area.y = Math::Max(content_area.y, 0.0f); - } - - // If the element is inline, then its calculations are much more straightforward (no worrying about auto margins - // and dimensions, etc). All we do is calculate the margins, set the content area and bail. - if (inline_element) - { - if (replaced_element) - { - content_area.x = ClampWidth(content_area.x, element, containing_block.x); - content_area.y = ClampWidth(content_area.y, element, containing_block.y); - } - - // If the element was not replaced, then we leave its dimension as unsized (-1, -1) and ignore the width and - // height properties. - box.SetContent(content_area); - - // Evaluate the margins. Any declared as 'auto' will resolve to 0. - const Property *margin_top, *margin_bottom, *margin_left, *margin_right; - element->GetMarginProperties(&margin_top, &margin_bottom, &margin_left, &margin_right); - - box.SetEdge(Box::MARGIN, Box::TOP, element->ResolveProperty(margin_top, containing_block.x)); - box.SetEdge(Box::MARGIN, Box::RIGHT, element->ResolveProperty(margin_right, containing_block.x)); - box.SetEdge(Box::MARGIN, Box::BOTTOM, element->ResolveProperty(margin_bottom, containing_block.x)); - box.SetEdge(Box::MARGIN, Box::LEFT, element->ResolveProperty(margin_left, containing_block.x)); - } - - // The element is block, so we need to run the box through the ringer to potentially evaluate auto margins and - // dimensions. - else - { - box.SetContent(content_area); - BuildBoxWidth(box, element, containing_block.x); - BuildBoxHeight(box, element, containing_block.y); - } -} - -// Generates the box for an element placed in a block box. -void LayoutEngine::BuildBox(Box& box, float& min_height, float& max_height, LayoutBlockBox* containing_box, Element* element, bool inline_element) -{ - Vector2f containing_block = GetContainingBlock(containing_box); - BuildBox(box, containing_block, element, inline_element); - - float box_height = box.GetSize().y; - if (box_height < 0) - { - if (element->GetLocalProperty(MIN_HEIGHT) != NULL) - min_height = element->ResolveProperty(MIN_HEIGHT, containing_block.y); - else - min_height = 0; - - if (element->GetLocalProperty(MAX_HEIGHT) != NULL) - max_height = element->ResolveProperty(MAX_HEIGHT, containing_block.y); - else - max_height = FLT_MAX; - } - else - { - min_height = box_height; - max_height = box_height; - } -} - -// Clamps the width of an element based from its min-width and max-width properties. -float LayoutEngine::ClampWidth(float width, Element* element, float containing_block_width) -{ - float min_width, max_width; - - if (element->GetLocalProperty(MIN_WIDTH) != NULL) - min_width = element->ResolveProperty(MIN_WIDTH, containing_block_width); - else - min_width = 0; - - if (element->GetLocalProperty(MAX_WIDTH) != NULL) - max_width = element->ResolveProperty(MAX_WIDTH, containing_block_width); - else - max_width = FLT_MAX; - - return Math::Clamp(width, min_width, max_width); -} - -// Clamps the height of an element based from its min-height and max-height properties. -float LayoutEngine::ClampHeight(float height, Element* element, float containing_block_height) -{ - float min_height, max_height; - - if (element->GetLocalProperty(MIN_HEIGHT) != NULL) - min_height = element->ResolveProperty(MIN_HEIGHT, containing_block_height); - else - min_height = 0; - - if (element->GetLocalProperty(MAX_HEIGHT) != NULL) - max_height = element->ResolveProperty(MAX_HEIGHT, containing_block_height); - else - max_height = FLT_MAX; - - return Math::Clamp(height, min_height, max_height); -} - -// Rounds a vector of two floating-point values to integral values. -Vector2f& LayoutEngine::Round(Vector2f& value) -{ - value.x = Round(value.x); - value.y = Round(value.y); - - return value; -} - -// Rounds a floating-point value to an integral value. -float LayoutEngine::Round(float value) -{ -#if defined(_MSC_VER) && _MSC_VER < 1800 - // Before Visual Studio 2013, roundf did not exist - return value >= 0.0f ? floorf(value + 0.5f) : ceilf(value - 0.5f); -#else - return roundf(value); -#endif -} - -void* LayoutEngine::AllocateLayoutChunk(size_t ROCKET_UNUSED_ASSERT_PARAMETER(size)) -{ - ROCKET_UNUSED_ASSERT(size); - - ROCKET_ASSERT(size <= LayoutChunk::size); - - return layout_chunk_pool.AllocateObject(); -} - -void LayoutEngine::DeallocateLayoutChunk(void* chunk) -{ - layout_chunk_pool.DeallocateObject((LayoutChunk*) chunk); -} - -// Positions a single element and its children within this layout. -bool LayoutEngine::FormatElement(Element* element) -{ - // Check if we have to do any special formatting for any elements that don't fit into the standard layout scheme. - if (FormatElementSpecial(element)) - return true; - - // Fetch the display property, and don't lay this element out if it is set to a display type of none. - int display_property = element->GetDisplay(); - if (display_property == DISPLAY_NONE) - return true; - - // Check for an absolute position; if this has been set, then we remove it from the flow and add it to the current - // block box to be laid out and positioned once the block has been closed and sized. - int position_property = element->GetPosition(); - if (position_property == POSITION_ABSOLUTE || - position_property == POSITION_FIXED) - { - // Display the element as a block element. - block_context_box->AddAbsoluteElement(element); - return true; - } - - // If the element is floating, we remove it from the flow. - int float_property = element->GetFloat(); - if (float_property != FLOAT_NONE) - { - // Format the element as a block element. - LayoutEngine layout_engine; - layout_engine.FormatElement(element, GetContainingBlock(block_context_box)); - - return block_context_box->AddFloatElement(element); - } - - // The element is nothing exceptional, so we treat it as a normal block, inline or replaced element. - switch (display_property) - { - case DISPLAY_BLOCK: return FormatElementBlock(element); break; - case DISPLAY_INLINE: return FormatElementInline(element); break; - case DISPLAY_INLINE_BLOCK: FormatElementReplaced(element); break; - default: ROCKET_ERROR; - } - - return true; -} - -// Formats and positions an element as a block element. -bool LayoutEngine::FormatElementBlock(Element* element) -{ - LayoutBlockBox* new_block_context_box = block_context_box->AddBlockElement(element); - if (new_block_context_box == NULL) - return false; - - block_context_box = new_block_context_box; - - // Format the element's children. - for (int i = 0; i < element->GetNumChildren(); i++) - { - if (!FormatElement(element->GetChild(i))) - i = -1; - } - - // Close the block box, and check the return code; we may have overflowed either this element or our parent. - new_block_context_box = block_context_box->GetParent(); - switch (block_context_box->Close()) - { - // We need to reformat ourself; format all of our children again and close the box. No need to check for error - // codes, as we already have our vertical slider bar. - case LayoutBlockBox::LAYOUT_SELF: - { - for (int i = 0; i < element->GetNumChildren(); i++) - FormatElement(element->GetChild(i)); - - if (block_context_box->Close() == LayoutBlockBox::OK) - { - element->OnLayout(); - break; - } - } - - // We caused our parent to add a vertical scrollbar; bail out! - case LayoutBlockBox::LAYOUT_PARENT: - { - block_context_box = new_block_context_box; - return false; - } - break; - - default: - element->OnLayout(); - } - - block_context_box = new_block_context_box; - return true; -} - -// Formats and positions an element as an inline element. -bool LayoutEngine::FormatElementInline(Element* element) -{ - Box box; - float min_height, max_height; - BuildBox(box, min_height, max_height, block_context_box, element, true); - LayoutInlineBox* inline_box = block_context_box->AddInlineElement(element, box); - - // Format the element's children. - for (int i = 0; i < element->GetNumChildren(); i++) - { - if (!FormatElement(element->GetChild(i))) - return false; - } - - inline_box->Close(); -// element->OnLayout(); - - return true; -} - -// Positions an element as a sized inline element, formatting its internal hierarchy as a block element. -void LayoutEngine::FormatElementReplaced(Element* element) -{ - // Format the element separately as a block element, then position it inside our own layout as an inline element. - LayoutEngine layout_engine; - layout_engine.FormatElement(element, GetContainingBlock(block_context_box)); - - block_context_box->AddInlineElement(element, element->GetBox())->Close(); -} - -// Executes any special formatting for special elements. -bool LayoutEngine::FormatElementSpecial(Element* element) -{ - static String br("br"); - - // Check for a
tag. - if (element->GetTagName() == br) - { - block_context_box->AddBreak(); - element->OnLayout(); - return true; - } - - return false; -} - -// Returns the fully-resolved, fixed-width and -height containing block from a block box. -Vector2f LayoutEngine::GetContainingBlock(const LayoutBlockBox* containing_box) -{ - Vector2f containing_block; - - containing_block.x = containing_box->GetBox().GetSize(Box::CONTENT).x; - if (containing_box->GetElement() != NULL) - containing_block.x -= containing_box->GetElement()->GetElementScroll()->GetScrollbarSize(ElementScroll::VERTICAL); - - while ((containing_block.y = containing_box->GetBox().GetSize(Box::CONTENT).y) < 0) - { - containing_box = containing_box->GetParent(); - if (containing_box == NULL) - { - ROCKET_ERROR; - containing_block.y = 0; - } - } - if (containing_box != NULL && - containing_box->GetElement() != NULL) - containing_block.y -= containing_box->GetElement()->GetElementScroll()->GetScrollbarSize(ElementScroll::HORIZONTAL); - - containing_block.x = Math::Max(0.0f, containing_block.x); - containing_block.y = Math::Max(0.0f, containing_block.y); - - return containing_block; -} - -// Builds the block-specific width and horizontal margins of a Box. -void LayoutEngine::BuildBoxWidth(Box& box, Element* element, float containing_block_width) -{ - Vector2f content_area = box.GetSize(); - - // Determine if the element has an automatic width, and if not calculate it. - bool width_auto; - if (content_area.x >= 0) - width_auto = false; - else - { - const Property* width_property; - element->GetDimensionProperties(&width_property, NULL); - if (width_property->unit == Property::KEYWORD) - { - width_auto = true; - } - else - { - width_auto = false; - content_area.x = element->ResolveProperty(width_property, containing_block_width); - } - } - - // Determine if the element has automatic margins. - bool margins_auto[2]; - int num_auto_margins = 0; - - const Property *margin_left, *margin_right; - element->GetMarginProperties(NULL, NULL, &margin_left, &margin_right); - - for (int i = 0; i < 2; ++i) - { - const Property* margin_property = i == 0 ? margin_left : margin_right; - if (margin_property != NULL && - margin_property->unit == Property::KEYWORD) - { - margins_auto[i] = true; - num_auto_margins++; - } - else - { - margins_auto[i] = false; - box.SetEdge(Box::MARGIN, i == 0 ? Box::LEFT : Box::RIGHT, element->ResolveProperty(margin_property, containing_block_width)); - } - } - - // If the width is set to auto, then any margins also set to auto are resolved to 0 and the width is set to the - // whatever if left of the containing block. - if (width_auto) - { - if (margins_auto[0]) - box.SetEdge(Box::MARGIN, Box::LEFT, 0); - if (margins_auto[1]) - box.SetEdge(Box::MARGIN, Box::RIGHT, 0); - - content_area.x = containing_block_width - (box.GetCumulativeEdge(Box::CONTENT, Box::LEFT) + - box.GetCumulativeEdge(Box::CONTENT, Box::RIGHT)); - content_area.x = Math::Max(0.0f, content_area.x); - } - // Otherwise, the margins that are set to auto will pick up the remaining width of the containing block. - else if (num_auto_margins > 0) - { - float margin = (containing_block_width - (box.GetCumulativeEdge(Box::CONTENT, Box::LEFT) + - box.GetCumulativeEdge(Box::CONTENT, Box::RIGHT) + - content_area.x)) / num_auto_margins; - - if (margins_auto[0]) - box.SetEdge(Box::MARGIN, Box::LEFT, margin); - if (margins_auto[1]) - box.SetEdge(Box::MARGIN, Box::RIGHT, margin); - } - - // Clamp the calculated width; if the width is changed by the clamp, then the margins need to be recalculated if - // they were set to auto. - float clamped_width = ClampWidth(content_area.x, element, containing_block_width); - if (clamped_width != content_area.x) - { - content_area.x = clamped_width; - box.SetContent(content_area); - - if (num_auto_margins > 0) - { - // Reset the automatic margins. - if (margins_auto[0]) - box.SetEdge(Box::MARGIN, Box::LEFT, 0); - if (margins_auto[1]) - box.SetEdge(Box::MARGIN, Box::RIGHT, 0); - - BuildBoxWidth(box, element, containing_block_width); - } - } - else - box.SetContent(content_area); -} - -// Builds the block-specific height and vertical margins of a Box. -void LayoutEngine::BuildBoxHeight(Box& box, Element* element, float containing_block_height) -{ - Vector2f content_area = box.GetSize(); - - // Determine if the element has an automatic height, and if not calculate it. - bool height_auto; - if (content_area.y >= 0) - height_auto = false; - else - { - const Property* height_property; - element->GetDimensionProperties(NULL, &height_property); - if (height_property == NULL) - { - height_auto = false; - } - else if (height_property->unit == Property::KEYWORD) - { - height_auto = true; - } - else - { - height_auto = false; - content_area.y = element->ResolveProperty(height_property, containing_block_height); - } - } - - // Determine if the element has automatic margins. - bool margins_auto[2]; - int num_auto_margins = 0; - - const Property *margin_top, *margin_bottom; - element->GetMarginProperties(&margin_top, &margin_bottom, NULL, NULL); - - for (int i = 0; i < 2; ++i) - { - const Property* margin_property = i == 0 ? margin_top : margin_bottom; - if (margin_property != NULL && - margin_property->unit == Property::KEYWORD) - { - margins_auto[i] = true; - num_auto_margins++; - } - else - { - margins_auto[i] = false; - box.SetEdge(Box::MARGIN, i == 0 ? Box::TOP : Box::BOTTOM, element->ResolveProperty(margin_property, containing_block_height)); - } - } - - // If the height is set to auto, then any margins also set to auto are resolved to 0 and the height is set to -1. - if (height_auto) - { - if (margins_auto[0]) - box.SetEdge(Box::MARGIN, Box::TOP, 0); - if (margins_auto[1]) - box.SetEdge(Box::MARGIN, Box::BOTTOM, 0); - - content_area.y = -1; - } - // Otherwise, the margins that are set to auto will pick up the remaining width of the containing block. - else if (num_auto_margins > 0) - { - float margin; - if (content_area.y >= 0) - { - margin = (containing_block_height - (box.GetCumulativeEdge(Box::CONTENT, Box::TOP) + - box.GetCumulativeEdge(Box::CONTENT, Box::BOTTOM) + - content_area.y)) / num_auto_margins; - } - else - margin = 0; - - if (margins_auto[0]) - box.SetEdge(Box::MARGIN, Box::TOP, margin); - if (margins_auto[1]) - box.SetEdge(Box::MARGIN, Box::BOTTOM, margin); - } - - if (content_area.y >= 0) - { - // Clamp the calculated height; if the height is changed by the clamp, then the margins need to be recalculated if - // they were set to auto. - float clamped_height = ClampHeight(content_area.y, element, containing_block_height); - if (clamped_height != content_area.y) - { - content_area.y = clamped_height; - box.SetContent(content_area); - - if (num_auto_margins > 0) - { - // Reset the automatic margins. - if (margins_auto[0]) - box.SetEdge(Box::MARGIN, Box::TOP, 0); - if (margins_auto[1]) - box.SetEdge(Box::MARGIN, Box::BOTTOM, 0); - - BuildBoxHeight(box, element, containing_block_height); - } - - return; - } - } - - box.SetContent(content_area); -} - -} -} diff --git a/libs/libRocket/Source/Core/LayoutEngine.h b/libs/libRocket/Source/Core/LayoutEngine.h deleted file mode 100644 index c8892b708e2..00000000000 --- a/libs/libRocket/Source/Core/LayoutEngine.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELAYOUTENGINE_H -#define ROCKETCORELAYOUTENGINE_H - -#include "LayoutBlockBox.h" - -namespace Rocket { -namespace Core { - -class Box; - -/** - @author Robert Curry - */ - -class LayoutEngine -{ -public: - /// Constructs a new layout engine. - LayoutEngine(); - ~LayoutEngine(); - - /// Formats the contents for a root-level element (usually a document, floating or replaced element). - /// @param element[in] The element to lay out. - /// @param containing_block[in] The size of the containing block. - bool FormatElement(Element* element, const Vector2f& containing_block); - - /// Generates the box for an element. - /// @param[out] box The box to be built. - /// @param[in] containing_block The dimensions of the content area of the block containing the element. - /// @param[in] element The element to build the box for. - /// @param[in] inline_element True if the element is placed in an inline context, false if not. - static void BuildBox(Box& box, const Vector2f& containing_block, Element* element, bool inline_element = false); - /// Generates the box for an element placed in a block box. - /// @param[out] box The box to be built. - /// @param[out] min_height The minimum height of the element's box. - /// @param[out] max_height The maximum height of the element's box. - /// @param[in] containing_box The block box containing the element. - /// @param[in] element The element to build the box for. - /// @param[in] inline_element True if the element is placed in an inline context, false if not. - static void BuildBox(Box& box, float& min_height, float& max_height, LayoutBlockBox* containing_box, Element* element, bool inline_element = false); - - /// Clamps the width of an element based from its min-width and max-width properties. - /// @param[in] width The width to clamp. - /// @param[in] element The element to read the properties from. - /// @param[in] containing_block_width The width of the element's containing block. - /// @return The clamped width. - static float ClampWidth(float width, Element* element, float containing_block_width); - /// Clamps the height of an element based from its min-height and max-height properties. - /// @param[in] height The height to clamp. - /// @param[in] element The element to read the properties from. - /// @param[in] containing_block_height The height of the element's containing block. - /// @return The clamped height. - static float ClampHeight(float height, Element* element, float containing_block_height); - - /// Rounds a vector of two floating-point values to integral values. - /// @param[inout] value The vector to round. - /// @return The rounded vector. - static Vector2f& Round(Vector2f& value); - /// Rounds a floating-point value to an integral value. - /// @param[in] value The value to round. - /// @return The rounded value. - static float Round(float value); - - static void* AllocateLayoutChunk(size_t size); - static void DeallocateLayoutChunk(void* chunk); - -private: - /// Positions a single element and its children within this layout. - /// @param[in] element The element to lay out. - bool FormatElement(Element* element); - - /// Formats and positions an element as a block element. - /// @param[in] element The block element. - bool FormatElementBlock(Element* element); - /// Formats and positions an element as an inline element. - /// @param[in] element The inline element. - bool FormatElementInline(Element* element); - /// Positions an element as a sized inline element, formatting its internal hierarchy as a block element. - /// @param[in] element The replaced element. - void FormatElementReplaced(Element* element); - /// Executes any special formatting for special elements. - /// @param[in] element The element to parse. - /// @return True if the element was parsed as a special element, false otherwise. - bool FormatElementSpecial(Element* element); - - /// Returns the fully-resolved, fixed-width and -height containing block from a block box. - /// @param[in] containing_box The leaf box. - /// @return The dimensions of the content area, using the latest fixed dimensions for width and height in the hierarchy. - static Vector2f GetContainingBlock(const LayoutBlockBox* containing_box); - - /// Builds the block-specific width and horizontal margins of a Box. - /// @param[in,out] box The box to generate. The padding and borders must be set on the box already. If the content area is sized, then it will be used instead of the width property. - /// @param[in] element The element the box is being generated for. - /// @param[in] containing_block_width The width of the containing block. - static void BuildBoxWidth(Box& box, Element* element, float containing_block_width); - /// Builds the block-specific height and vertical margins of a Box. - /// @param[in,out] box The box to generate. The padding and borders must be set on the box already. If the content area is sized, then it will be used instead of the height property. - /// @param[in] element The element the box is being generated for. - /// @param[in] containing_block_height The height of the containing block. - static void BuildBoxHeight(Box& box, Element* element, float containing_block_height); - - // The root block box, representing the document. - LayoutBlockBox* block_box; - - // The open block box containing displaying in a block-context. - LayoutBlockBox* block_context_box; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/LayoutInlineBox.cpp b/libs/libRocket/Source/Core/LayoutInlineBox.cpp deleted file mode 100644 index 92018f9c858..00000000000 --- a/libs/libRocket/Source/Core/LayoutInlineBox.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LayoutInlineBox.h" -#include -#include "LayoutBlockBox.h" -#include "LayoutEngine.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -// Constructs a new inline box for an element. -LayoutInlineBox::LayoutInlineBox(Element* _element, const Box& _box) : position(0, 0), box(_box) -{ - line = NULL; - - parent = NULL; - element = _element; - - width = 0; - - // If this box has intrinsic dimensions, then we set our height to the total height of the element; otherwise, it - // is zero height. - if (box.GetSize().y > 0) - { - height = box.GetSize(Box::MARGIN).y; - baseline = element->GetBaseline() + box.GetCumulativeEdge(Box::CONTENT, Box::BOTTOM); - } - else - { - FontFaceHandle* font_face = element->GetFontFaceHandle(); - if (font_face != NULL) - { - height = (float) ElementUtilities::GetLineHeight(element); - baseline = (height - font_face->GetLineHeight()) * 0.5f + font_face->GetBaseline(); - } - else - { - height = 0; - baseline = 0; - } - } - - const Property* property = element->GetVerticalAlignProperty(); - if (property->unit == Property::KEYWORD) - vertical_align_property = property->value.Get< int >(); - else - vertical_align_property = -1; - - chained = false; - chain = NULL; -} - -// Constructs a new inline box for a split box. -LayoutInlineBox::LayoutInlineBox(LayoutInlineBox* _chain) : position(0, 0), box(_chain->GetBox()) -{ - line = NULL; - - parent = NULL; - element = _chain->element; - - width = 0; - height = _chain->height; - baseline = _chain->baseline; - vertical_align_property = _chain->vertical_align_property; - - _chain->chain = this; - chain = NULL; - chained = true; - - // As we're a split box, our left side is cleared and content set back to (-1, -1). - box.SetEdge(Box::PADDING, Box::LEFT, 0); - box.SetEdge(Box::BORDER, Box::LEFT, 0); - box.SetEdge(Box::MARGIN, Box::LEFT, 0); - box.SetContent(Vector2f(-1, -1)); -} - -LayoutInlineBox::~LayoutInlineBox() -{ -} - -// Sets the inline box's line. -void LayoutInlineBox::SetLine(LayoutLineBox* _line) -{ - line = _line; -} - -// Sets the inline box's parent. -void LayoutInlineBox::SetParent(LayoutInlineBox* _parent) -{ - parent = _parent; - if (parent != NULL) - parent->children.push_back(this); -} - -// Closes the box. -void LayoutInlineBox::Close() -{ - if (chain) - chain->Close(); - else - { - ROCKET_ASSERT(line != NULL); - line->CloseInlineBox(this); - } -} - -// Returns true if this box needs to close on its line. -bool LayoutInlineBox::CanOverflow() const -{ - return box.GetSize().x < 0; -} - -// Returns true if this box's element is the last child of its parent. -bool LayoutInlineBox::IsLastChild() const -{ - Element* parent = element->GetParentNode(); - if (parent == NULL) - return true; - - return parent->GetLastChild() == element; -} - -// Flows the inline box's content into its parent line. -LayoutInlineBox* LayoutInlineBox::FlowContent(bool ROCKET_UNUSED_PARAMETER(first_box), float ROCKET_UNUSED_PARAMETER(available_width), float ROCKET_UNUSED_PARAMETER(right_spacing_width)) -{ - ROCKET_UNUSED(first_box); - ROCKET_UNUSED(available_width); - ROCKET_UNUSED(right_spacing_width); - - // If we're representing a sized element, then add our element's width onto our parent's. - if (parent != NULL && - box.GetSize().x > 0) - parent->width += box.GetSize(Box::MARGIN).x; - - // Nothing else to do here; static elements will automatically be 'flowed' into their lines when they are placed. - return NULL; -} - -// Computes and sets the vertical position of this element, relative to its parent box. -void LayoutInlineBox::CalculateBaseline(float& ascender, float& descender) -{ - // We're vertically-aligned with one of the standard types. - switch (vertical_align_property) - { - // Aligned with our parent box's baseline, our relative vertical position is set to 0. - case VERTICAL_ALIGN_BASELINE: - { - SetVerticalPosition(0); - } - break; - - // The middle of this box is aligned with the baseline of its parent's plus half an ex. - case VERTICAL_ALIGN_MIDDLE: - { - FontFaceHandle* parent_font = GetParentFont(); - int x_height = 0; - if (parent_font != NULL) - x_height = parent_font->GetXHeight() / -2; - - SetVerticalPosition(x_height + (height / 2 - baseline)); - } - break; - - // This box's baseline is offset from its parent's so it is appropriate for rendering subscript. - case VERTICAL_ALIGN_SUB: - { - FontFaceHandle* parent_font = GetParentFont(); - if (parent_font == NULL) - SetVerticalPosition(0); - else - SetVerticalPosition(LayoutEngine::Round(parent_font->GetLineHeight() * 0.2f)); - } - break; - - // This box's baseline is offset from its parent's so it is appropriate for rendering superscript. - case VERTICAL_ALIGN_SUPER: - { - FontFaceHandle* parent_font = GetParentFont(); - if (parent_font == NULL) - SetVerticalPosition(0); - else - SetVerticalPosition(-1 * LayoutEngine::Round(parent_font->GetLineHeight() * 0.4f)); - } - break; - - // The top of this box is aligned to the top of its parent's font. - case VERTICAL_ALIGN_TEXT_TOP: - { - FontFaceHandle* parent_font = GetParentFont(); - if (parent_font == NULL) - SetVerticalPosition(0); - else - SetVerticalPosition((height - baseline) - (parent_font->GetLineHeight() - parent_font->GetBaseline())); - } - break; - - // The bottom of this box is aligned to the bottom of its parent's font (not the baseline). - case VERTICAL_ALIGN_TEXT_BOTTOM: - { - FontFaceHandle* parent_font = GetParentFont(); - if (parent_font == NULL) - SetVerticalPosition(0); - else - SetVerticalPosition(parent_font->GetBaseline() - baseline); - } - break; - - // This box is aligned with the line box, not an inline box, so we can't position it yet. - case VERTICAL_ALIGN_TOP: - case VERTICAL_ALIGN_BOTTOM: - break; - - // The baseline of this box is offset by a fixed amount from its parent's baseline. - default: - { - SetVerticalPosition(-1 * element->ResolveProperty(element->GetVerticalAlignProperty(), GetParentLineHeight())); - } - break; - } - - // Set the ascender and descender relative to this element. If we're an unsized element (span, em, etc) then we - // have no dimensions ourselves. - if (box.GetSize() == Vector2f(-1, -1)) - { - ascender = 0; - descender = 0; - } - else - { - ascender = height - baseline; - descender = height - ascender; - } - - for (size_t i = 0; i < children.size(); ++i) - { - // Don't include any of our children that are aligned relative to the line box; the line box treats them - // separately. - if (children[i]->GetVerticalAlignProperty() != VERTICAL_ALIGN_TOP && - children[i]->GetVerticalAlignProperty() != VERTICAL_ALIGN_BOTTOM) - { - float child_ascender, child_descender; - children[i]->CalculateBaseline(child_ascender, child_descender); - - ascender = Math::Max(ascender, child_ascender - children[i]->GetPosition().y); - descender = Math::Max(descender, child_descender + children[i]->GetPosition().y); - } - } -} - -// Offsets the baseline of this box, and all of its children, by the ascender of the parent line box. -void LayoutInlineBox::OffsetBaseline(float ascender) -{ - for (size_t i = 0; i < children.size(); ++i) - { - // Don't offset any of our children that are aligned relative to the line box; the line box will take care of - // them separately. - if (children[i]->GetVerticalAlignProperty() != VERTICAL_ALIGN_TOP && - children[i]->GetVerticalAlignProperty() != VERTICAL_ALIGN_BOTTOM) - children[i]->OffsetBaseline(ascender + position.y); - } - - position.y += (ascender - (height - baseline)); -} - -// Returns the inline box's offset from its parent's content area. -const Vector2f& LayoutInlineBox::GetPosition() const -{ - return position; -} - -// Sets the inline box's relative horizontal offset from its parent's content area. -void LayoutInlineBox::SetHorizontalPosition(float _position) -{ - position.x = _position; -} - -// Sets the inline box's relative vertical offset from its parent's content area. -void LayoutInlineBox::SetVerticalPosition(float _position) -{ - position.y = _position; -} - -void LayoutInlineBox::PositionElement() -{ - if (box.GetSize() == Vector2f(-1, -1)) - { - // If this unsised element has any top margins, border or padding, then shift the position up so the borders - // and background will render in the right place. - position.y -= box.GetCumulativeEdge(Box::CONTENT, Box::TOP); - } - // Otherwise; we're a sized element (replaced or inline-block), so we need to offset our element's vertical - // position by our top margin (as the origin of an element is the top-left of the border, not the margin). - else - position.y += box.GetEdge(Box::MARGIN, Box::TOP); - - if (!chained) - element->SetOffset(line->GetRelativePosition() + position, line->GetBlockBox()->GetOffsetParent()->GetElement()); -} - -// Sizes the inline box's element. -void LayoutInlineBox::SizeElement(bool split) -{ - // Resize the box for an unsized inline element. - if (box.GetSize() == Vector2f(-1, -1)) - { - box.SetContent(Vector2f(width, (float) ElementUtilities::GetLineHeight(element))); - if (parent != NULL) - parent->width += width; - } - - Box element_box = box; - if (split) - { - element_box.SetEdge(Box::MARGIN, Box::RIGHT, 0); - element_box.SetEdge(Box::BORDER, Box::RIGHT, 0); - element_box.SetEdge(Box::PADDING, Box::RIGHT, 0); - } - - // The elements of a chained box have already had their positions set by the first link. - if (chained) - { - element_box.SetOffset((line->GetPosition() + position) - element->GetRelativeOffset(Box::BORDER)); - element->AddBox(element_box); - - if (chain != NULL) - element->OnLayout(); - } - else - { - element->SetBox(element_box); - element->OnLayout(); - } -} - -// Returns the vertical align property of the box's element. -int LayoutInlineBox::GetVerticalAlignProperty() const -{ - return vertical_align_property; -} - -// Returns the inline box's element. -Element* LayoutInlineBox::GetElement() -{ - return element; -} - -// Returns the inline box's parent. -LayoutInlineBox* LayoutInlineBox::GetParent() -{ - return parent; -} - -// Returns the inline box's dimension box. -const Box& LayoutInlineBox::GetBox() const -{ - return box; -} - -// Returns the height of the inline box. -float LayoutInlineBox::GetHeight() const -{ - return height; -} - -// Returns the baseline of the inline box. -float LayoutInlineBox::GetBaseline() const -{ - return baseline; -} - -void* LayoutInlineBox::operator new(size_t size) -{ - return LayoutEngine::AllocateLayoutChunk(size); -} - -void LayoutInlineBox::operator delete(void* chunk) -{ - LayoutEngine::DeallocateLayoutChunk(chunk); -} - -// Returns our parent box's font face handle. -FontFaceHandle* LayoutInlineBox::GetParentFont() const -{ - if (parent == NULL) - return line->GetBlockBox()->GetParent()->GetElement()->GetFontFaceHandle(); - else - return parent->GetElement()->GetFontFaceHandle(); -} - -// Returns our parent box's line height. -float LayoutInlineBox::GetParentLineHeight() const -{ - if (parent == NULL) - return (float) ElementUtilities::GetLineHeight(line->GetBlockBox()->GetParent()->GetElement()); - else - return (float) ElementUtilities::GetLineHeight(parent->GetElement()); -} - -} -} diff --git a/libs/libRocket/Source/Core/LayoutInlineBox.h b/libs/libRocket/Source/Core/LayoutInlineBox.h deleted file mode 100644 index 4db3bd85959..00000000000 --- a/libs/libRocket/Source/Core/LayoutInlineBox.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELAYOUTINLINEBOX_H -#define ROCKETCORELAYOUTINLINEBOX_H - -#include "../../Include/Rocket/Core/Box.h" - -namespace Rocket { -namespace Core { - -class Element; -class ElementText; -class FontFaceHandle; -class LayoutBlockBox; -class LayoutLineBox; - -/** - @author Peter Curry - */ - -class LayoutInlineBox -{ -friend class LayoutInlineBoxText; - -public: - /// Constructs a new inline box for an element. - /// @param element[in] The element this inline box is flowing. - /// @param box[in] The extents of the inline box's element. - LayoutInlineBox(Element* element, const Box& box); - /// Constructs a new inline box for a split box. - /// @param chain[in] The box that has overflowed into us. - LayoutInlineBox(LayoutInlineBox* chain); - virtual ~LayoutInlineBox(); - - /// Sets the inline box's line. - /// @param line[in] The line this inline box resides in. - void SetLine(LayoutLineBox* line); - /// Sets the inline box's parent. - /// @param parent[in] The parent this inline box resides in. - void SetParent(LayoutInlineBox* parent); - - /// Closes the box. - void Close(); - - /// Flows the inline box's content into its parent line. - /// @param[in] first_box True if this box is the first box containing content to be flowed into this line. - /// @param[in] available_width The width available for flowing this box's content. This is measured from the left side of this box's content area. - /// @param[in] right_spacing_width The width of the spacing that must be left on the right of the element if no overflow occurs. If overflow occurs, then the entire width can be used. - /// @return The overflow box containing any content that spilled over from the flow. This must be NULL if no overflow occured. - virtual LayoutInlineBox* FlowContent(bool first_box, float available_width, float right_spacing_width); - - /// Computes and sets the vertical position of this element, relative to its parent inline box (or block box, - /// for an un-nested inline box). - /// @param ascender[out] The maximum ascender of this inline box and all of its children. - /// @param descender[out] The maximum descender of this inline box and all of its children. - virtual void CalculateBaseline(float& ascender, float& descender); - /// Offsets the baseline of this box, and all of its children, by the ascender of the parent line box. - /// @param ascender[in] The ascender of the line box. - virtual void OffsetBaseline(float ascender); - - /// Returns true if this box is capable of overflowing, or if it must be rendered on a single line. - /// @return True if this box can overflow, false otherwise. - virtual bool CanOverflow() const; - /// Returns true if this box's element is the last child of its parent. - /// @param True if this box is a last child. - bool IsLastChild() const; - - /// Returns the inline box's offset from its line. - /// @return The box's offset from its line. - const Vector2f& GetPosition() const; - - /// Sets the inline box's horizontal offset from its parent's content area. - /// @param position[in] The box's horizontal offset. - void SetHorizontalPosition(float position); - /// Sets the inline box's vertical offset from its parent's content area. - /// @param position[in] The box's vertical offset. - void SetVerticalPosition(float position); - - /// Positions the inline box's element. - virtual void PositionElement(); - /// Sizes the inline box's element. - /// @param split[in] True if this box is split, false otherwise. - virtual void SizeElement(bool split); - - /// Returns the vertical align property of the box's element. - /// @return the vertical align property, or -1 if it is set to a numerical value. - int GetVerticalAlignProperty() const; - - /// Returns the inline box's element. - /// @return The inline box's element. - Element* GetElement(); - - /// Returns the inline box's parent. - /// @param The parent of this inline box. This will be NULL for a root-level inline box (ie, one that has a block element has a parent in the true hierarchy). - LayoutInlineBox* GetParent(); - - /// Returns the inline box's dimension box. - /// @return The inline box's dimension box. - const Box& GetBox() const; - /// Returns the height of the inline box. This is separate from the the box, as different types of inline - /// elements generate different line heights. The possible types are: - /// * replaced elements (or inline-block elements), which use their entire box (including margins) as their - /// height - /// * non-replaced elements, which use the maximum line-height of their children - /// * text elements, which use their line-height - float GetHeight() const; - /// Returns the baseline of the inline box. - /// @return The box's baseline. - float GetBaseline() const; - - void* operator new(size_t size); - void operator delete(void* chunk); - -protected: - /// Returns our parent box's font face handle. - /// @return The font face handle of our parent box. - FontFaceHandle* GetParentFont() const; - /// Returns our parent box's line height. - /// @return The line height of our parent box. - float GetParentLineHeight() const; - - // The box's element. - Element* element; - - // The line box's offset relative to its parent block box. - Vector2f position; - // The element's inline box. - Box box; - // The inline box's width; note that this is stored separately from the box dimensions. It is only used by - // nesting inline boxes, such as HTML spans containing text. - float width; - // The inline box's height; note that this is stored separately from the box dimensions, as inline elements - // don't necessarily have identical relationships between their box dimensions and line height. - float height; - - // The value of this box's element's vertical-align property. - int vertical_align_property; - // The baseline of the inline element. - float baseline; - - // The inline box's parent; this will be NULL if we're not a nested inline element. - LayoutInlineBox* parent; - // This inline box's line. - LayoutLineBox* line; - - std::vector< LayoutInlineBox* > children; - - // The next link in our element's chain of inline boxes. - LayoutInlineBox* chain; - // True if we're a link in a chain of inline boxes flowing from previous lines. - bool chained; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/LayoutInlineBoxText.cpp b/libs/libRocket/Source/Core/LayoutInlineBoxText.cpp deleted file mode 100644 index 8660c942291..00000000000 --- a/libs/libRocket/Source/Core/LayoutInlineBoxText.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LayoutInlineBoxText.h" -#include -#include "LayoutEngine.h" -#include "LayoutLineBox.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/Property.h" - -namespace Rocket { -namespace Core { - -LayoutInlineBoxText::LayoutInlineBoxText(Element* element, int _line_begin) : LayoutInlineBox(element, Box()) -{ - line_begin = _line_begin; - - // Build the box to represent the dimensions of the first word. - BuildWordBox(); -} - -LayoutInlineBoxText::~LayoutInlineBoxText() -{ -} - -// Returns true if this box is capable of overflowing, or if it must be rendered on a single line. -bool LayoutInlineBoxText::CanOverflow() const -{ - return line_segmented; -} - -// Flows the inline box's content into its parent line. -LayoutInlineBox* LayoutInlineBoxText::FlowContent(bool first_box, float available_width, float right_spacing_width) -{ - ElementText* text_element = GetTextElement(); - ROCKET_ASSERT(text_element != NULL); - - int line_length; - float line_width; - bool overflow = !text_element->GenerateLine(line_contents, line_length, line_width, line_begin, available_width, right_spacing_width, first_box); - - Vector2f content_area; - content_area.x = line_width; - content_area.y = box.GetSize().y; - box.SetContent(content_area); - - // Call the base-class's FlowContent() to increment the width of our parent's box. - LayoutInlineBox::FlowContent(first_box, available_width, right_spacing_width); - - if (overflow) - return new LayoutInlineBoxText(element, line_begin + line_length); - - return NULL; -} - -// Computes and sets the vertical position of this element, relative to its parent inline box (or block box, for an un-nested inline box). -void LayoutInlineBoxText::CalculateBaseline(float& ascender, float& descender) -{ - ascender = height - baseline; - descender = height - ascender; -} - -// Offsets the baseline of this box, and all of its children, by the ascender of the parent line box. -void LayoutInlineBoxText::OffsetBaseline(float ascender) -{ - // Offset by the ascender. - position.y += (ascender - (height - baseline)); - - // Calculate the leading (the difference between font height and line height). - float leading = 0; - - FontFaceHandle* font_face_handle = element->GetFontFaceHandle(); - if (font_face_handle != NULL) - leading = height - font_face_handle->GetLineHeight(); - - // Offset by the half-leading. - position.y += leading * 0.5f; - position.y = LayoutEngine::Round(position.y); -} - -// Positions the inline box's element. -void LayoutInlineBoxText::PositionElement() -{ - if (line_begin == 0) - { - LayoutInlineBox::PositionElement(); - - GetTextElement()->ClearLines(); - GetTextElement()->AddLine(Vector2f(0, 0), line_contents); - } - else - { - GetTextElement()->AddLine(line->GetRelativePosition() + position - element->GetRelativeOffset(Box::BORDER), line_contents); - } -} - -// Sizes the inline box's element. -void LayoutInlineBoxText::SizeElement(bool ROCKET_UNUSED_PARAMETER(split)) -{ - ROCKET_UNUSED(split); -} - -void* LayoutInlineBoxText::operator new(size_t size) -{ - return LayoutEngine::AllocateLayoutChunk(size); -} - -void LayoutInlineBoxText::operator delete(void* chunk) -{ - LayoutEngine::DeallocateLayoutChunk(chunk); -} - -// Returns the box's element as a text element. -ElementText* LayoutInlineBoxText::GetTextElement() -{ - return dynamic_cast< ElementText* >(element); -} - -// Builds a box for the first word of the element. -void LayoutInlineBoxText::BuildWordBox() -{ - ElementText* text_element = GetTextElement(); - ROCKET_ASSERT(text_element != NULL); - - FontFaceHandle* font_face_handle = text_element->GetFontFaceHandle(); - if (font_face_handle == NULL) - { - height = 0; - baseline = 0; - - Log::Message(Log::LT_WARNING, "No font face defined on element %s. Please specify a font-family in your RCSS.", text_element->GetAddress().CString()); - return; - } - - Vector2f content_area; - line_segmented = !text_element->GenerateToken(content_area.x, line_begin); - content_area.y = (float) ElementUtilities::GetLineHeight(element); - box.SetContent(content_area); -} - -} -} diff --git a/libs/libRocket/Source/Core/LayoutInlineBoxText.h b/libs/libRocket/Source/Core/LayoutInlineBoxText.h deleted file mode 100644 index 0ad28e58b72..00000000000 --- a/libs/libRocket/Source/Core/LayoutInlineBoxText.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELAYOUTINLINEBOXTEXT_H -#define ROCKETCORELAYOUTINLINEBOXTEXT_H - -#include "LayoutInlineBox.h" -#include "../../Include/Rocket/Core/String.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class LayoutInlineBoxText : public LayoutInlineBox -{ -public: - /// Constructs a new inline box for a text element. - /// @param[in] element The element this inline box is flowing. - /// @param[in] line_begin The index of the first character of the element's string this text box will render. - LayoutInlineBoxText(Element* element, int line_begin = 0); - virtual ~LayoutInlineBoxText(); - - /// Returns true if this box is capable of overflowing, or if it must be rendered on a single line. - /// @return True if this box can overflow, false otherwise. - virtual bool CanOverflow() const; - - /// Flows the inline box's content into its parent line. - /// @param[in] first_box True if this box is the first box containing content to be flowed into this line. - /// @param available_width[in] The width available for flowing this box's content. This is measured from the left side of this box's content area. - /// @param right_spacing_width[in] The width of the spacing that must be left on the right of the element if no overflow occurs. If overflow occurs, then the entire width can be used. - /// @return The overflow box containing any content that spilled over from the flow. This must be NULL if no overflow occured. - virtual LayoutInlineBox* FlowContent(bool first_box, float available_width, float right_spacing_width); - - /// Computes and sets the vertical position of this element, relative to its parent inline box (or block box, - /// for an un-nested inline box). - /// @param ascender[out] The maximum ascender of this inline box and all of its children. - /// @param descender[out] The maximum descender of this inline box and all of its children. - virtual void CalculateBaseline(float& ascender, float& descender); - /// Offsets the baseline of this box, and all of its children, by the ascender of the parent line box. - /// @param ascender[in] The ascender of the line box. - virtual void OffsetBaseline(float ascender); - - /// Positions the inline box's element. - virtual void PositionElement(); - /// Sizes the inline box's element. - virtual void SizeElement(bool split); - - void* operator new(size_t size); - void operator delete(void* chunk); - -private: - /// Returns the box's element as a text element. - /// @return The box's element cast to a text element. - ElementText* GetTextElement(); - - /// Builds a box for the first word of the element. - void BuildWordBox(); - - // The index of the first character of this line. - int line_begin; - // The contents on this line. - WString line_contents; - - // True if this line can be segmented into parts, false if it consists of only a single word. - bool line_segmented; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/LayoutLineBox.cpp b/libs/libRocket/Source/Core/LayoutLineBox.cpp deleted file mode 100644 index ec0e43aa2e7..00000000000 --- a/libs/libRocket/Source/Core/LayoutLineBox.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LayoutLineBox.h" -#include "LayoutBlockBox.h" -#include "LayoutEngine.h" -#include "LayoutInlineBoxText.h" -#include -#include -#include -#include -#include -#include - -namespace Rocket { -namespace Core { - -static float GetSpacing(const Box& box, Box::Edge edge) -{ - return box.GetEdge(Box::PADDING, edge) + - box.GetEdge(Box::BORDER, edge) + - box.GetEdge(Box::MARGIN, edge); -} - -LayoutLineBox::LayoutLineBox(LayoutBlockBox* _parent) : position(-1, -1), dimensions(-1, -1) -{ - parent = _parent; - - box_cursor = 0; - open_inline_box = NULL; - - position_set = false; - wrap_content = false; -} - -LayoutLineBox::~LayoutLineBox() -{ - for (size_t i = 0; i < inline_boxes.size(); i++) - delete inline_boxes[i]; -} - -// Closes the line box, positioning all inline elements within it. -LayoutInlineBox* LayoutLineBox::Close(LayoutInlineBox* overflow) -{ - // If we haven't positioned this line yet, and it has elements in it, then this is a great opportunity to do so. - if (!position_set && - !inline_boxes.empty()) - { - parent->PositionLineBox(position, dimensions.x, wrap_content, Vector2f(0, 0)); - dimensions.y = 0; - - position_set = true; - } - // If the line has been positioned and our content is greater than our original size (for example, if we aren't - // wrapping or had to render a very long word), then we push our dimensions out to compensate. - else - dimensions.x = Math::Max(dimensions.x, box_cursor); - - // Now we calculate the baselines of each of our inline boxes relative to their parent box's baseline; either us, - // or another of our inline boxes. The maximum distance each element is above and below our baseline is calculated - // from that, and therefore our height. - float ascender = 0; - float descender = 0; - float minimum_height = 0; - - for (size_t i = 0; i < inline_boxes.size(); ++i) - { - LayoutInlineBox* inline_box = inline_boxes[i]; - - // Check if we've got an element aligned to the line box rather than a baseline. - if (inline_box->GetVerticalAlignProperty() == VERTICAL_ALIGN_TOP || - inline_box->GetVerticalAlignProperty() == VERTICAL_ALIGN_BOTTOM) - { - // Get this element to calculate the baseline offsets of its children; it can't calculate its own baseline - // because we don't know the height of the line box yet. We don't actually care about its ascender or - // descender either, just its height. - float box_ascender, box_descender; - inline_box->CalculateBaseline(box_ascender, box_descender); - - minimum_height = Math::Max(minimum_height, inline_box->GetHeight()); - } - // Otherwise, we have an element anchored to a baseline, so we can fetch its ascender and descender relative - // to our baseline. - else if (inline_box->GetParent() == NULL) - { - float box_ascender, box_descender; - inline_box->CalculateBaseline(box_ascender, box_descender); - - ascender = Math::Max(ascender, box_ascender - inline_box->GetPosition().y); - descender = Math::Max(descender, box_descender + inline_box->GetPosition().y); - } - } - - // We've now got the maximum ascender and descender, we can calculate the dimensions of the line box. - dimensions.y = Math::Max(minimum_height, ascender + descender); - // And from that, we can now set the final baseline of each box. - for (size_t i = 0; i < inline_boxes.size(); ++i) - { - LayoutInlineBox* inline_box = inline_boxes[i]; - - // Check again if this element is aligned to the line box. We don't need to worry about offsetting an element - // tied to the top of the line box, as its position will always stay at exactly 0. - if (inline_box->GetVerticalAlignProperty() == VERTICAL_ALIGN_TOP || - inline_box->GetVerticalAlignProperty() == VERTICAL_ALIGN_BOTTOM) - { - if (inline_box->GetVerticalAlignProperty() == VERTICAL_ALIGN_TOP) - inline_box->OffsetBaseline(inline_box->GetHeight() - inline_box->GetBaseline()); - else - inline_box->OffsetBaseline(dimensions.y - inline_box->GetBaseline()); - } - // Otherwise, this element is tied to a baseline. - else if (inline_box->GetParent() == NULL) - inline_box->OffsetBaseline(ascender); - } - - // Position all the boxes horizontally in the line. We only need to reposition the elements if they're set to - // centre or right; the element are already placed left-aligned, and justification occurs at the text level. - int text_align_property = parent->GetParent()->GetElement()->GetTextAlign(); - if (text_align_property == TEXT_ALIGN_CENTER || - text_align_property == TEXT_ALIGN_RIGHT) - { - float element_offset = 0; - switch (text_align_property) - { - case TEXT_ALIGN_CENTER: element_offset = (dimensions.x - box_cursor) * 0.5f; break; - case TEXT_ALIGN_RIGHT: element_offset = (dimensions.x - box_cursor); break; - } - - if (element_offset != 0) - { - element_offset = LayoutEngine::Round(element_offset); - - for (size_t i = 0; i < inline_boxes.size(); i++) - inline_boxes[i]->SetHorizontalPosition(inline_boxes[i]->GetPosition().x + element_offset); - } - } - - // Get each line box to set the position of their element, relative to their parents. - for (int i = (int) inline_boxes.size() - 1; i >= 0; --i) - { - inline_boxes[i]->PositionElement(); - - // Check if this inline box is part of the open box chain. - bool inline_box_open = false; - LayoutInlineBox* open_box = open_inline_box; - while (open_box != NULL && - !inline_box_open) - { - if (inline_boxes[i] == open_box) - inline_box_open = true; - - open_box = open_box->GetParent(); - } - - inline_boxes[i]->SizeElement(inline_box_open); - } - - return parent->CloseLineBox(this, overflow, open_inline_box); -} - -// Closes one of the line box's inline boxes. -void LayoutLineBox::CloseInlineBox(LayoutInlineBox* inline_box) -{ - ROCKET_ASSERT(open_inline_box == inline_box); - - open_inline_box = inline_box->GetParent(); - box_cursor += GetSpacing(inline_box->GetBox(), Box::RIGHT); -} - -// Attempts to add a new element to this line box. -LayoutInlineBox* LayoutLineBox::AddElement(Element* element, const Box& box) -{ - if (dynamic_cast< ElementText* >(element) != NULL) - return AddBox(new LayoutInlineBoxText(element)); - else - return AddBox(new LayoutInlineBox(element, box)); -} - -// Attempts to add a new inline box to this line. -LayoutInlineBox* LayoutLineBox::AddBox(LayoutInlineBox* box) -{ - // Set to true if we're flowing the first box (with content) on the line. - bool first_box = false; - // The spacing this element must leave on the right of the line, to account not only for its margins and padding, - // but also for its parents which will close immediately after it. - float right_spacing; - - // If this line is unplaced, then this is the first inline box; if it is sized, then we can place and size this - // line. - if (!position_set) - { - // Add the new box to the list of boxes in the line box. As this line box has not been placed, we don't have to - // check if it can fit yet. - AppendBox(box); - - // If the new box has a physical prescence, then we must place this line once we've figured out how wide it has to - // be. - if (box->GetBox().GetSize().x >= 0) - { - // Calculate the dimensions for the box we need to fit. - Vector2f minimum_dimensions = box->GetBox().GetSize(); - - // Add the width of any empty, already closed tags, or still opened spaced tags. - minimum_dimensions.x += box_cursor; - - // Calculate the right spacing for the element. - right_spacing = GetSpacing(box->GetBox(), Box::RIGHT); - // Add the right spacing for any ancestor elements that must close immediately after it. - LayoutInlineBox* closing_box = box; - while (closing_box != NULL && - closing_box->IsLastChild()) - { - closing_box = closing_box->GetParent(); - if (closing_box != NULL) - right_spacing += GetSpacing(closing_box->GetBox(), Box::RIGHT); - } - - if (!box->CanOverflow()) - minimum_dimensions.x += right_spacing; - - parent->PositionLineBox(position, dimensions.x, wrap_content, minimum_dimensions); - dimensions.y = minimum_dimensions.y; - - first_box = true; - position_set = true; - } - else - return box; - } - - // This line has already been placed and sized, so we'll check if we can fit this new inline box on the line. - else - { - // Build up the spacing required on the right side of this element. This consists of the right spacing on the - // new element, and the right spacing on all parent element that will close next. - right_spacing = GetSpacing(box->GetBox(), Box::RIGHT); - if (open_inline_box != NULL && - box->IsLastChild()) - { - LayoutInlineBox* closing_box = open_inline_box; - while (closing_box != NULL && - closing_box->IsLastChild()) - { - closing_box = closing_box->GetParent(); - if (closing_box != NULL) - right_spacing += GetSpacing(closing_box->GetBox(), Box::RIGHT); - } - } - - // Determine the inline box's spacing requirements (before we get onto it's actual content width). - float element_width = box->GetBox().GetPosition(Box::CONTENT).x; - if (!box->CanOverflow()) - element_width += right_spacing; - - // Add on the box's content area (if it has content). - if (box->GetBox().GetSize().x >= 0) - element_width += box->GetBox().GetSize().x; - - if (wrap_content && - box_cursor + element_width > dimensions.x) - { - // We can't fit the new inline element into this box! So we'll close this line box, and send the inline box - // onto the next line. - return Close(box); - } - else - { - // We can fit the new inline element into this box. - AppendBox(box); - } - } - - // Flow the box's content into the line. - LayoutInlineBox* overflow_box = open_inline_box->FlowContent(first_box, wrap_content ? dimensions.x - (open_inline_box->GetPosition().x + open_inline_box->GetBox().GetPosition(Box::CONTENT).x) : -1, right_spacing); - box_cursor += open_inline_box->GetBox().GetSize().x; - - // If our box overflowed, then we'll close this line (as no more content will fit onto it) and tell our block box - // to make a new line. - if (overflow_box != NULL) - { - open_inline_box = open_inline_box->GetParent(); - return Close(overflow_box); - } - - return open_inline_box; -} - -// Adds an inline box as a chained hierarchy overflowing to this line. -void LayoutLineBox::AddChainedBox(LayoutInlineBox* chained_box) -{ - std::stack< LayoutInlineBox* > hierarchy; - LayoutInlineBox* chain = chained_box; - while (chain != NULL) - { - hierarchy.push(chain); - chain = chain->GetParent(); - } - - while (!hierarchy.empty()) - { - AddBox(new LayoutInlineBox(hierarchy.top())); - hierarchy.pop(); - } -} - -// Returns the position of the line box, relative to its parent's block box's content area. -const Vector2f& LayoutLineBox::GetPosition() const -{ - return position; -} - -// Returns the position of the line box, relative to its parent's block box's offset parent. -Vector2f LayoutLineBox::GetRelativePosition() const -{ - return position - (parent->GetOffsetParent()->GetPosition() - parent->GetOffsetRoot()->GetPosition()); -} - -// Returns the dimensions of the line box. -const Vector2f& LayoutLineBox::GetDimensions() const -{ - return dimensions; -} - -// Returns the line box's open inline box. -LayoutInlineBox* LayoutLineBox::GetOpenInlineBox() -{ - return open_inline_box; -} - -// Returns the line's containing block box. -LayoutBlockBox* LayoutLineBox::GetBlockBox() -{ - return parent; -} - -void* LayoutLineBox::operator new(size_t size) -{ - return LayoutEngine::AllocateLayoutChunk(size); -} - -void LayoutLineBox::operator delete(void* chunk) -{ - LayoutEngine::DeallocateLayoutChunk(chunk); -} - -// Appends an inline box to the end of the line box's list of inline boxes. -void LayoutLineBox::AppendBox(LayoutInlineBox* box) -{ - inline_boxes.push_back(box); - - box->SetParent(open_inline_box); - box->SetLine(this); - box->SetHorizontalPosition(LayoutEngine::Round(box_cursor + box->GetBox().GetEdge(Box::MARGIN, Box::LEFT))); - box_cursor += GetSpacing(box->GetBox(), Box::LEFT); - - open_inline_box = box; -} - -} -} diff --git a/libs/libRocket/Source/Core/LayoutLineBox.h b/libs/libRocket/Source/Core/LayoutLineBox.h deleted file mode 100644 index e7d83c1dd7c..00000000000 --- a/libs/libRocket/Source/Core/LayoutLineBox.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELAYOUTLINEBOX_H -#define ROCKETCORELAYOUTLINEBOX_H - -#include "LayoutInlineBox.h" - -namespace Rocket { -namespace Core { - -class LayoutBlockBox; - -/** - @author Peter Curry - */ - -class LayoutLineBox -{ -public: - LayoutLineBox(LayoutBlockBox* parent); - ~LayoutLineBox(); - - /// Closes the line box, positioning all inline elements within it. - /// @param overflow[in] The overflow box from a split inline box that caused this line to close. Leave this as NULL if we closed naturally. - /// @return If there was any overflow, this will be the last element generated by the spilling content. Otherwise, this will be NULL. - LayoutInlineBox* Close(LayoutInlineBox* overflow = NULL); - - /// Closes one of the line box's inline boxes. - /// @param inline_box[in] The inline box to close. This should always be the line box's open box. - void CloseInlineBox(LayoutInlineBox* inline_box); - - /// Attempts to add a new element to this line box. If it can't fit, or needs to be split, new line boxes will - /// be created. The inline box for the final section of the element will be returned. - /// @param element[in] The element to fit into this line box. - /// @param box[in] The element's extents. - /// @return The inline box for the element. - LayoutInlineBox* AddElement(Element* element, const Box& box); - - /// Attempts to add a new inline box to this line. If it can't fit, or needs to be split, new line boxes will - /// be created. The inline box for the final section of the element will be returned. - /// @param box[in] The inline box to be added to the line. - /// @return The final inline box. - LayoutInlineBox* AddBox(LayoutInlineBox* box); - /// Adds an inline box as a chained hierarchy overflowing to this line. The chain will be extended into - /// this line box. - /// @param split_box[in] The box overflowed from a previous line. - void AddChainedBox(LayoutInlineBox* chained_box); - - /// Returns the position of the line box, relative to its parent's block box's content area. - /// @return The position of the line box. - const Vector2f& GetPosition() const; - /// Returns the position of the line box, relative to its parent's block box's offset parent. - /// @return The relative position of the line box. - Vector2f GetRelativePosition() const; - /// Returns the dimensions of the line box. - /// @return The dimensions of the line box. - const Vector2f& GetDimensions() const; - - /// Returns the line box's open inline box. - /// @return The line's open inline box, or NULL if it currently has none. - LayoutInlineBox* GetOpenInlineBox(); - /// Returns the line's containing block box. - /// @return The line's block box. - LayoutBlockBox* GetBlockBox(); - - void* operator new(size_t size); - void operator delete(void* chunk); - -private: - /// Appends an inline box to the end of the line box's list of inline boxes. - void AppendBox(LayoutInlineBox* box); - - typedef std::vector< LayoutInlineBox* > InlineBoxList; - - // The block box containing this line. - LayoutBlockBox* parent; - - // The top-left position of the line box; this is set when the first inline box is placed. - Vector2f position; - bool position_set; - - // The width and height of the line box; this is set when the line box is placed. - Vector2f dimensions; - bool wrap_content; - - // The horizontal cursor. This is where the next inline box will be placed along the line. - float box_cursor; - - // The list of inline boxes in this line box. These line boxes may be parented to others in this list. - InlineBoxList inline_boxes; - // The open inline box; this is NULL if all inline boxes are closed. - LayoutInlineBox* open_inline_box; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Log.cpp b/libs/libRocket/Source/Core/Log.cpp deleted file mode 100644 index 2a719c38744..00000000000 --- a/libs/libRocket/Source/Core/Log.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core.h" -#ifdef ROCKET_PLATFORM_WIN32 -#include -#endif - -namespace Rocket { -namespace Core { - -// Initialises the logging interface. -bool Log::Initialise() -{ - return true; -} - -// Shutdown the log interface. -void Log::Shutdown() -{ -} - -// Log the specified message via the registered log interface -void Log::Message(Log::Type type, const char* fmt, ...) -{ - const int buffer_size = 1024; - char buffer[buffer_size]; - va_list argument_list; - - // Print the message to the buffer. - va_start(argument_list, fmt); - int len = vsnprintf(buffer, buffer_size - 2, fmt, argument_list); - if (len < 0 || len > buffer_size - 2) - { - len = buffer_size - 2; - } - buffer[len] = '\0'; - va_end(argument_list); - - GetSystemInterface()->LogMessage(type, buffer); -} - -// Log a parse error on the specified file and line number. -void Log::ParseError(const String& filename, int line_number, const char* fmt, ...) -{ - const int buffer_size = 1024; - char buffer[buffer_size]; - va_list argument_list; - - // Print the message to the buffer. - va_start(argument_list, fmt); - int len = vsnprintf(buffer, buffer_size - 2, fmt, argument_list); - if (len < 0 || len > buffer_size - 2) - { - len = buffer_size - 2; - } - buffer[len] = '\0'; - va_end(argument_list); - - if (line_number >= 0) - Message(Log::LT_ERROR, "%s:%d: %s", filename.CString(), line_number, buffer); - else - Message(Log::LT_ERROR, "%s: %s", filename.CString(), buffer); -} - -bool Assert(const char* msg, const char* file, int line) -{ - Rocket::Core::String message(1024, "%s\n%s:%d", msg, file, line); - return GetSystemInterface()->LogMessage(Log::LT_ASSERT, message); -} - -} -} diff --git a/libs/libRocket/Source/Core/Lua/Colourb.cpp b/libs/libRocket/Source/Core/Lua/Colourb.cpp deleted file mode 100644 index 84a0c2ffb34..00000000000 --- a/libs/libRocket/Source/Core/Lua/Colourb.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Colourb.h" - - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,Colourbnew); - lua_setfield(L,metatable_index-1,"new"); - - lua_pushcfunction(L,Colourb__eq); - lua_setfield(L,metatable_index,"__eq"); - - lua_pushcfunction(L,Colourb__add); - lua_setfield(L,metatable_index,"__add"); - - lua_pushcfunction(L,Colourb__mul); - lua_setfield(L,metatable_index,"__mul"); - - return; -} -int Colourbnew(lua_State* L) -{ - byte red = (byte)luaL_checkinteger(L,1); - byte green = (byte)luaL_checkinteger(L,2); - byte blue = (byte)luaL_checkinteger(L,3); - byte alpha = (byte)luaL_checkinteger(L,4); - - Colourb* col = new Colourb(red,green,blue,alpha); - - LuaType::push(L,col,true); - return 1; -} - -int Colourb__eq(lua_State* L) -{ - Colourb* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Colourb* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - lua_pushboolean(L, (*lhs) == (*rhs) ? 1 : 0); - return 1; -} - -int Colourb__add(lua_State* L) -{ - Colourb* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Colourb* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - Colourb* res = new Colourb((*lhs) + (*rhs)); - - LuaType::push(L,res,true); - return 1; -} - -int Colourb__mul(lua_State* L) -{ - Colourb* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - float rhs = (float)luaL_checknumber(L,2); - - Colourb* res = new Colourb((*lhs) * rhs); - - LuaType::push(L,res,true); - return 1; -} - - - -//getters -int ColourbGetAttrred(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->red); - return 1; -} - -int ColourbGetAttrgreen(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->green); - return 1; -} - -int ColourbGetAttrblue(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->blue); - return 1; -} - -int ColourbGetAttralpha(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->alpha); - return 1; -} - -int ColourbGetAttrrgba(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushinteger(L,obj->red); - lua_pushinteger(L,obj->green); - lua_pushinteger(L,obj->blue); - lua_pushinteger(L,obj->alpha); - return 4; -} - - -//setters -int ColourbSetAttrred(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - byte red = (byte)luaL_checkinteger(L,2); - obj->red = red; - return 0; -} - -int ColourbSetAttrgreen(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - byte green = (byte)luaL_checkinteger(L,2); - obj->green = green; - return 0; -} - -int ColourbSetAttrblue(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - byte blue = (byte)luaL_checkinteger(L,2); - obj->blue = blue; - return 0; -} - -int ColourbSetAttralpha(lua_State* L) -{ - Colourb* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - byte alpha = (byte)luaL_checkinteger(L,2); - obj->alpha = alpha; - return 0; -} - -int ColourbSetAttrrgba(lua_State* L) -{ - Colourb* obj = NULL; - int top = lua_gettop(L); - //each of the items are optional. - if(top > 0) - { - obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - if(top > 1) - { - if(top > 2) - { - if(top > 3) - obj->alpha = luaL_checkinteger(L,4); - obj->blue = luaL_checkinteger(L,3); - } - obj->green = luaL_checkinteger(L,2); - } - obj->red = luaL_checkinteger(L,1); - } - return 0; -} - - -RegType ColourbMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ColourbGetters[] = -{ - LUAGETTER(Colourb,red) - LUAGETTER(Colourb,green) - LUAGETTER(Colourb,blue) - LUAGETTER(Colourb,alpha) - LUAGETTER(Colourb,rgba) - { NULL, NULL }, -}; - -luaL_Reg ColourbSetters[] = -{ - LUASETTER(Colourb,red) - LUASETTER(Colourb,green) - LUASETTER(Colourb,blue) - LUASETTER(Colourb,alpha) - LUASETTER(Colourb,rgba) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Colourb,false) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Colourb.h b/libs/libRocket/Source/Core/Lua/Colourb.h deleted file mode 100644 index a2a4ffb74f5..00000000000 --- a/libs/libRocket/Source/Core/Lua/Colourb.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUACOLOURB_H -#define ROCKETCORELUACOLOURB_H - -#include -#include -#include - -using Rocket::Core::Colourb; -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -int Colourbnew(lua_State* L); -int Colourb__eq(lua_State* L); -int Colourb__add(lua_State* L); -int Colourb__mul(lua_State* L); - - -//getters -int ColourbGetAttrred(lua_State* L); -int ColourbGetAttrgreen(lua_State* L); -int ColourbGetAttrblue(lua_State* L); -int ColourbGetAttralpha(lua_State* L); -int ColourbGetAttrrgba(lua_State* L); - -//setters -int ColourbSetAttrred(lua_State* L); -int ColourbSetAttrgreen(lua_State* L); -int ColourbSetAttrblue(lua_State* L); -int ColourbSetAttralpha(lua_State* L); -int ColourbSetAttrrgba(lua_State* L); - -extern RegType ColourbMethods[]; -extern luaL_Reg ColourbGetters[]; -extern luaL_Reg ColourbSetters[]; - -LUACORETYPEDECLARE(Colourb) -} -} -} -#endif \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Colourf.cpp b/libs/libRocket/Source/Core/Lua/Colourf.cpp deleted file mode 100644 index 3b88d6e32b6..00000000000 --- a/libs/libRocket/Source/Core/Lua/Colourf.cpp +++ /dev/null @@ -1,210 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Colourf.h" - - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,Colourfnew); - lua_setfield(L,metatable_index-1,"new"); - - lua_pushcfunction(L,Colourf__eq); - lua_setfield(L,metatable_index,"__eq"); - - return; -} - -//metamethods -int Colourfnew(lua_State* L) -{ - float red = (float)luaL_checknumber(L,1); - float green = (float)luaL_checknumber(L,2); - float blue = (float)luaL_checknumber(L,3); - float alpha = (float)luaL_checknumber(L,4); - - Colourf* col = new Colourf(red,green,blue,alpha); - - LuaType::push(L,col,true); - return 1; -} - -int Colourf__eq(lua_State* L) -{ - Colourf* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Colourf* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - lua_pushboolean(L, (*lhs) == (*rhs) ? 1 : 0); - return 1; -} - - -//getters -int ColourfGetAttrred(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushnumber(L,obj->red); - return 1; -} - -int ColourfGetAttrgreen(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushnumber(L,obj->green); - return 1; -} - -int ColourfGetAttrblue(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushnumber(L,obj->blue); - return 1; -} - -int ColourfGetAttralpha(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushnumber(L,obj->alpha); - return 1; -} - -int ColourfGetAttrrgba(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - lua_pushnumber(L,obj->red); - lua_pushnumber(L,obj->green); - lua_pushnumber(L,obj->blue); - lua_pushnumber(L,obj->alpha); - return 4; -} - - -//setters -int ColourfSetAttrred(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - float red = (float)luaL_checknumber(L,2); - obj->red = red; - return 0; -} - -int ColourfSetAttrgreen(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - float green = (float)luaL_checknumber(L,2); - obj->green = green; - return 0; -} - -int ColourfSetAttrblue(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - float blue = (float)luaL_checknumber(L,2); - obj->blue = blue; - return 0; -} - -int ColourfSetAttralpha(lua_State* L) -{ - Colourf* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - float alpha = (float)luaL_checknumber(L,2); - obj->alpha = alpha; - return 0; -} - -int ColourfSetAttrrgba(lua_State* L) -{ - Colourf* obj = NULL; - int top = lua_gettop(L); - //each of the items are optional. - if(top > 0) - { - obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - if(top > 1) - { - if(top > 2) - { - if(top > 3) - obj->alpha = (float)luaL_checknumber(L,4); - obj->blue = (float)luaL_checknumber(L,3); - } - obj->green = (float)luaL_checknumber(L,2); - } - obj->red = (float)luaL_checknumber(L,1); - } - return 0; -} - - -RegType ColourfMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ColourfGetters[] = -{ - LUAGETTER(Colourf,red) - LUAGETTER(Colourf,green) - LUAGETTER(Colourf,blue) - LUAGETTER(Colourf,alpha) - LUAGETTER(Colourf,rgba) - { NULL, NULL }, -}; - -luaL_Reg ColourfSetters[] = -{ - LUASETTER(Colourf,red) - LUASETTER(Colourf,green) - LUASETTER(Colourf,blue) - LUASETTER(Colourf,alpha) - LUASETTER(Colourf,rgba) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Colourf,false) - - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Colourf.h b/libs/libRocket/Source/Core/Lua/Colourf.h deleted file mode 100644 index 4c93343540e..00000000000 --- a/libs/libRocket/Source/Core/Lua/Colourf.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUACOLOURF_H -#define ROCKETCORELUACOLOURF_H - -#include -#include -#include - -using Rocket::Core::Colourf; -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -//metamethods -int Colourfnew(lua_State* L); -int Colourf__eq(lua_State* L); - -//getters -int ColourfGetAttrred(lua_State* L); -int ColourfGetAttrgreen(lua_State* L); -int ColourfGetAttrblue(lua_State* L); -int ColourfGetAttralpha(lua_State* L); -int ColourfGetAttrrgba(lua_State* L); - -//setters -int ColourfSetAttrred(lua_State* L); -int ColourfSetAttrgreen(lua_State* L); -int ColourfSetAttrblue(lua_State* L); -int ColourfSetAttralpha(lua_State* L); -int ColourfSetAttrrgba(lua_State* L); - -extern RegType ColourfMethods[]; -extern luaL_Reg ColourfGetters[]; -extern luaL_Reg ColourfSetters[]; - -LUACORETYPEDECLARE(Colourf) -} -} -} -#endif - diff --git a/libs/libRocket/Source/Core/Lua/Context.cpp b/libs/libRocket/Source/Core/Lua/Context.cpp deleted file mode 100644 index 4c887087f33..00000000000 --- a/libs/libRocket/Source/Core/Lua/Context.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Context.h" -#include -#include -#include -#include "LuaEventListener.h" -#include "ContextDocumentsProxy.h" - -namespace Rocket { -namespace Core { -namespace Lua { -typedef Rocket::Core::ElementDocument Document; -template<> void ExtraInit(lua_State* L, int metatable_index) { return; } - -//methods -int ContextAddEventListener(lua_State* L, Context* obj) -{ - //need to make an EventListener for Lua before I can do anything else - const char* evt = luaL_checkstring(L,1); //event - Element* element = NULL; - bool capturephase = false; - //get the rest of the stuff needed to construct the listener - if(lua_gettop(L) > 2) - { - if(!lua_isnoneornil(L,3)) - element = LuaType::check(L,3); - if(!lua_isnoneornil(L,4)) - capturephase = CHECK_BOOL(L,4); - - } - int type = lua_type(L,2); - if(type == LUA_TFUNCTION) - { - if(element) - element->AddEventListener(evt, new LuaEventListener(L,2,element), capturephase); - else - obj->AddEventListener(evt, new LuaEventListener(L,2,NULL), capturephase); - } - else if(type == LUA_TSTRING) - { - if(element) - element->AddEventListener(evt, new LuaEventListener(luaL_checkstring(L,2),element), capturephase); - else - obj->AddEventListener(evt, new LuaEventListener(luaL_checkstring(L,2),NULL), capturephase); - } - else - { - Log::Message(Log::LT_WARNING, "Lua Context:AddEventLisener's 2nd argument can only be a Lua function or a string, you passed in a %s", lua_typename(L,type)); - } - return 0; -} - -int ContextAddMouseCursor(lua_State* L, Context* obj) -{ - Document* cursor_doc = LuaType::check(L,1); - obj->AddMouseCursor(cursor_doc); - return 0; -} - -int ContextCreateDocument(lua_State* L, Context* obj) -{ - const char* tag; - if(lua_gettop(L) < 1) - tag = "body"; - else - tag = luaL_checkstring(L,1); - Document* doc = obj->CreateDocument(tag); - LuaType::push(L,doc,true); - return 1; -} - -int ContextLoadDocument(lua_State* L, Context* obj) -{ - const char* path = luaL_checkstring(L,1); - Document* doc = obj->LoadDocument(path); - LuaType::push(L,doc,false); - doc->RemoveReference(); - return 1; -} - -int ContextLoadMouseCursor(lua_State* L, Context* obj) -{ - const char* path = luaL_checkstring(L,1); - Document* doc = obj->LoadMouseCursor(path); - LuaType::push(L,doc); - return 1; -} - -int ContextRender(lua_State* L, Context* obj) -{ - lua_pushboolean(L,obj->Render()); - return 1; -} - -int ContextShowMouseCursor(lua_State* L, Context* obj) -{ - bool show = CHECK_BOOL(L,1); - obj->ShowMouseCursor(show); - return 0; -} - -int ContextUnloadAllDocuments(lua_State* L, Context* obj) -{ - obj->UnloadAllDocuments(); - return 0; -} - -int ContextUnloadAllMouseCursors(lua_State* L, Context* obj) -{ - obj->UnloadAllMouseCursors(); - return 0; -} - -int ContextUnloadDocument(lua_State* L, Context* obj) -{ - Document* doc = LuaType::check(L,1); - obj->UnloadDocument(doc); - return 0; -} - -int ContextUnloadMouseCursor(lua_State* L, Context* obj) -{ - const char* name = luaL_checkstring(L,1); - obj->UnloadMouseCursor(name); - return 0; -} - -int ContextUpdate(lua_State* L, Context* obj) -{ - lua_pushboolean(L,obj->Update()); - return 1; -} - - -//getters -int ContextGetAttrdimensions(lua_State* L) -{ - Context* cont = LuaType::check(L,1); - const Vector2i* dim = &cont->GetDimensions(); - //const_cast-ing so that the user can do dimensions.x = 3 and it will actually change the dimensions - //of the context - LuaType::push(L,const_cast(dim)); - return 1; -} - -//returns a table of everything -int ContextGetAttrdocuments(lua_State* L) -{ - Context* cont = LuaType::check(L,1); - LUACHECKOBJ(cont); - ContextDocumentsProxy* cdp = new ContextDocumentsProxy(); - cdp->owner = cont; - LuaType::push(L,cdp,true); //does get garbage collected (deleted) - return 1; -} - -int ContextGetAttrfocus_element(lua_State* L) -{ - Context* cont = LuaType::check(L,1); - LUACHECKOBJ(cont); - LuaType::push(L,cont->GetFocusElement()); - return 1; -} - -int ContextGetAttrhover_element(lua_State* L) -{ - Context* cont = LuaType::check(L,1); - LUACHECKOBJ(cont); - LuaType::push(L,cont->GetHoverElement()); - return 1; -} - -int ContextGetAttrname(lua_State* L) -{ - Context* cont = LuaType::check(L,1); - LUACHECKOBJ(cont); - lua_pushstring(L,cont->GetName().CString()); - return 1; -} - -int ContextGetAttrroot_element(lua_State* L) -{ - Context* cont = LuaType::check(L,1); - LUACHECKOBJ(cont); - LuaType::push(L,cont->GetRootElement()); - return 1; -} - - -//setters -int ContextSetAttrdimensions(lua_State* L) -{ - Context* cont = LuaType::check(L,1); - LUACHECKOBJ(cont); - Vector2i* dim = LuaType::check(L,2); - cont->SetDimensions(*dim); - return 0; -} - - - -RegType ContextMethods[] = -{ - LUAMETHOD(Context,AddEventListener) - LUAMETHOD(Context,AddMouseCursor) - LUAMETHOD(Context,CreateDocument) - LUAMETHOD(Context,LoadDocument) - LUAMETHOD(Context,LoadMouseCursor) - LUAMETHOD(Context,Render) - LUAMETHOD(Context,ShowMouseCursor) - LUAMETHOD(Context,UnloadAllDocuments) - LUAMETHOD(Context,UnloadAllMouseCursors) - LUAMETHOD(Context,UnloadDocument) - LUAMETHOD(Context,UnloadMouseCursor) - LUAMETHOD(Context,Update) - { NULL, NULL }, -}; - -luaL_Reg ContextGetters[] = -{ - LUAGETTER(Context,dimensions) - LUAGETTER(Context,documents) - LUAGETTER(Context,focus_element) - LUAGETTER(Context,hover_element) - LUAGETTER(Context,name) - LUAGETTER(Context,root_element) - { NULL, NULL }, -}; - -luaL_Reg ContextSetters[] = -{ - LUASETTER(Context,dimensions) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Context,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Context.h b/libs/libRocket/Source/Core/Lua/Context.h deleted file mode 100644 index 6acaca3fcba..00000000000 --- a/libs/libRocket/Source/Core/Lua/Context.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUACONTEXT_H -#define ROCKETCORELUACONTEXT_H - -#include -#include -#include - - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); - -//methods -int ContextAddEventListener(lua_State* L, Context* obj); -int ContextAddMouseCursor(lua_State* L, Context* obj); -int ContextCreateDocument(lua_State* L, Context* obj); -int ContextLoadDocument(lua_State* L, Context* obj); -int ContextLoadMouseCursor(lua_State* L, Context* obj); -int ContextRender(lua_State* L, Context* obj); -int ContextShowMouseCursor(lua_State* L, Context* obj); -int ContextUnloadAllDocuments(lua_State* L, Context* obj); -int ContextUnloadAllMouseCursors(lua_State* L, Context* obj); -int ContextUnloadDocument(lua_State* L, Context* obj); -int ContextUnloadMouseCursor(lua_State* L, Context* obj); -int ContextUpdate(lua_State* L, Context* obj); - -//getters -int ContextGetAttrdimensions(lua_State* L); -int ContextGetAttrdocuments(lua_State* L); -int ContextGetAttrfocus_element(lua_State* L); -int ContextGetAttrhover_element(lua_State* L); -int ContextGetAttrname(lua_State* L); -int ContextGetAttrroot_element(lua_State* L); - -//setters -int ContextSetAttrdimensions(lua_State* L); - - -extern RegType ContextMethods[]; -extern luaL_Reg ContextGetters[]; -extern luaL_Reg ContextSetters[]; - -LUACORETYPEDECLARE(Context) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/ContextDocumentsProxy.cpp b/libs/libRocket/Source/Core/Lua/ContextDocumentsProxy.cpp deleted file mode 100644 index 60879854d5a..00000000000 --- a/libs/libRocket/Source/Core/Lua/ContextDocumentsProxy.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ContextDocumentsProxy.h" -#include - -namespace Rocket { -namespace Core { -namespace Lua { -typedef Rocket::Core::ElementDocument Document; -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,ContextDocumentsProxy__index); - lua_setfield(L,metatable_index,"__index"); - lua_pushcfunction(L,ContextDocumentsProxy__pairs); - lua_setfield(L,metatable_index,"__pairs"); - lua_pushcfunction(L,ContextDocumentsProxy__ipairs); - lua_setfield(L,metatable_index,"__ipairs"); -} - -int ContextDocumentsProxy__index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - int type = lua_type(L,2); - if(type == LUA_TNUMBER || type == LUA_TSTRING) //only valid key types - { - ContextDocumentsProxy* proxy = LuaType::check(L,1); - Document* ret = NULL; - if(type == LUA_TSTRING) - ret = proxy->owner->GetDocument(luaL_checkstring(L,2)); - else - ret = proxy->owner->GetDocument(luaL_checkinteger(L,2)); - LuaType::push(L,ret,false); - return 1; - } - else - return LuaType::index(L); - -} - -//[1] is the object, [2] is the last used key, [3] is the userdata -int ContextDocumentsProxy__pairs(lua_State* L) -{ - Document* doc = NULL; - ContextDocumentsProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - - int num_docs = obj->owner->GetNumDocuments(); - //because there can be missing indexes, make sure to continue until there - //is actually a document at the index - while((*pindex) < num_docs) - { - doc = obj->owner->GetDocument((*pindex)++); - if(doc != NULL) - break; - } - - //If we found a document - if(doc != NULL) - { - lua_pushstring(L,doc->GetId().CString()); - LuaType::push(L,doc); - } - else //if we were at the end and didn't find a document - { - lua_pushnil(L); - lua_pushnil(L); - } - return 2; -} - -//same as __pairs, but putting an integer key instead of a string key -int ContextDocumentsProxy__ipairs(lua_State* L) -{ - Document* doc = NULL; - ContextDocumentsProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - - int num_docs = obj->owner->GetNumDocuments(); - //because there can be missing indexes, make sure to continue until there - //is actually a document at the index - while((*pindex) < num_docs) - { - doc = obj->owner->GetDocument((*pindex)++); - if(doc != NULL) - break; - } - - //we found a document - if(doc != NULL) - { - lua_pushinteger(L,(*pindex)-1); - LuaType::push(L,doc); - } - else //we got to the end and didn't find another document - { - lua_pushnil(L); - lua_pushnil(L); - } - return 2; -} - - -RegType ContextDocumentsProxyMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ContextDocumentsProxyGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ContextDocumentsProxySetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(ContextDocumentsProxy,false) - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/ContextDocumentsProxy.h b/libs/libRocket/Source/Core/Lua/ContextDocumentsProxy.h deleted file mode 100644 index 300ff470135..00000000000 --- a/libs/libRocket/Source/Core/Lua/ContextDocumentsProxy.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUACONTEXTDOCUMENTSPROXY_H -#define ROCKETCORELUACONTEXTDOCUMENTSPROXY_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -//where owner is the context that we should look information from -struct ContextDocumentsProxy { Context* owner; }; - -template<> void ExtraInit(lua_State* L, int metatable_index); -int ContextDocumentsProxy__index(lua_State* L); -int ContextDocumentsProxy__pairs(lua_State* L); -int ContextDocumentsProxy__ipairs(lua_State* L); - -extern RegType ContextDocumentsProxyMethods[]; -extern luaL_Reg ContextDocumentsProxyGetters[]; -extern luaL_Reg ContextDocumentsProxySetters[]; - -LUACORETYPEDECLARE(ContextDocumentsProxy) -} -} -} -#endif \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Document.cpp b/libs/libRocket/Source/Core/Lua/Document.cpp deleted file mode 100644 index 645047d7897..00000000000 --- a/libs/libRocket/Source/Core/Lua/Document.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Document.h" -#include -#include -#include "Element.h" -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - //we will inherit from Element - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index - 1); - AddTypeToElementAsTable(L); - - //create the DocumentFocus table - lua_getglobal(L,"DocumentFocus"); - if(lua_isnoneornil(L,-1)) - { - lua_pop(L,1); //pop unsucessful getglobal - lua_newtable(L); //create a table for holding the enum - lua_pushinteger(L,ElementDocument::NONE); - lua_setfield(L,-2,"NONE"); - lua_pushinteger(L,ElementDocument::FOCUS); - lua_setfield(L,-2,"FOCUS"); - lua_pushinteger(L,ElementDocument::MODAL); - lua_setfield(L,-2,"MODAL"); - lua_setglobal(L,"DocumentFocus"); - - } -} - -//methods -int DocumentPullToFront(lua_State* L, Document* obj) -{ - obj->PullToFront(); - return 0; -} - -int DocumentPushToBack(lua_State* L, Document* obj) -{ - obj->PushToBack(); - return 0; -} - -int DocumentShow(lua_State* L, Document* obj) -{ - int top = lua_gettop(L); - if(top == 0) - obj->Show(); - else - { - int flag = luaL_checkinteger(L,1); - obj->Show(flag); - } - return 0; -} - -int DocumentHide(lua_State* L, Document* obj) -{ - obj->Hide(); - return 0; -} - -int DocumentClose(lua_State* L, Document* obj) -{ - obj->Close(); - return 0; -} - -int DocumentCreateElement(lua_State* L, Document* obj) -{ - const char* tag = luaL_checkstring(L,1); - Element* ele = obj->CreateElement(tag); - LuaType::push(L,ele,true); - ele->RemoveReference(); - return 1; -} - -int DocumentCreateTextNode(lua_State* L, Document* obj) -{ - //need ElementText object first - const char* text = luaL_checkstring(L,1); - ElementText* et = obj->CreateTextNode(text); - LuaType::push(L, et, true); - et->RemoveReference(); - return 1; -} - - -//getters -int DocumentGetAttrtitle(lua_State* L) -{ - Document* doc = LuaType::check(L,1); - LUACHECKOBJ(doc); - lua_pushstring(L,doc->GetTitle().CString()); - return 1; -} - -int DocumentGetAttrcontext(lua_State* L) -{ - Document* doc = LuaType::check(L,1); - LUACHECKOBJ(doc); - LuaType::push(L,doc->GetContext(),false); - return 1; -} - - -//setters -int DocumentSetAttrtitle(lua_State* L) -{ - Document* doc = LuaType::check(L,1); - LUACHECKOBJ(doc); - const char* title = luaL_checkstring(L,2); - doc->SetTitle(title); - return 0; -} - - -RegType DocumentMethods[] = -{ - LUAMETHOD(Document,PullToFront) - LUAMETHOD(Document,PushToBack) - LUAMETHOD(Document,Show) - LUAMETHOD(Document,Hide) - LUAMETHOD(Document,Close) - LUAMETHOD(Document,CreateElement) - LUAMETHOD(Document,CreateTextNode) - { NULL, NULL }, -}; - -luaL_Reg DocumentGetters[] = -{ - LUAGETTER(Document,title) - LUAGETTER(Document,context) - { NULL, NULL }, -}; - -luaL_Reg DocumentSetters[] = -{ - LUASETTER(Document,title) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Document,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Document.h b/libs/libRocket/Source/Core/Lua/Document.h deleted file mode 100644 index ce44c3ae223..00000000000 --- a/libs/libRocket/Source/Core/Lua/Document.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUADOCUMENT_H -#define ROCKETCORELUADOCUMENT_H - -#include -#include -#include - - -namespace Rocket { -namespace Core { -namespace Lua { -typedef ElementDocument Document; - -template<> void ExtraInit(lua_State* L, int metatable_index); - -//methods -int DocumentPullToFront(lua_State* L, Document* obj); -int DocumentPushToBack(lua_State* L, Document* obj); -int DocumentShow(lua_State* L, Document* obj); -int DocumentHide(lua_State* L, Document* obj); -int DocumentClose(lua_State* L, Document* obj); -int DocumentCreateElement(lua_State* L, Document* obj); -int DocumentCreateTextNode(lua_State* L, Document* obj); - -//getters -int DocumentGetAttrtitle(lua_State* L); -int DocumentGetAttrcontext(lua_State* L); - -//setters -int DocumentSetAttrtitle(lua_State* L); - -extern RegType DocumentMethods[]; -extern luaL_Reg DocumentGetters[]; -extern luaL_Reg DocumentSetters[]; - -LUACORETYPEDECLARE(Document) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/Element.cpp b/libs/libRocket/Source/Core/Lua/Element.cpp deleted file mode 100644 index c431b30bb95..00000000000 --- a/libs/libRocket/Source/Core/Lua/Element.cpp +++ /dev/null @@ -1,619 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Element.h" -#include "ElementStyleProxy.h" -#include "LuaEventListener.h" -#include "ElementAttributesProxy.h" -#include "ElementChildNodesProxy.h" -#include - - -namespace Rocket { -namespace Core { -namespace Lua { -typedef ElementDocument Document; - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - int top = lua_gettop(L); - //guarantee the "Element.As" table exists - lua_getfield(L,metatable_index-1,"As"); - if(lua_isnoneornil(L,-1)) //if it doesn't exist, create it - { - lua_newtable(L); - lua_setfield(L,metatable_index-1,"As"); - } - lua_pop(L,1); //pop the result of lua_getfield - lua_pushcfunction(L,Elementnew); - lua_setfield(L,metatable_index-1,"new"); - lua_settop(L,top); -} - -int Elementnew(lua_State* L) -{ - const char* tag = luaL_checkstring(L,1); - Element* ele = new Element(tag); - LuaType::push(L,ele,true); - ele->RemoveReference(); - return 1; -} - -//methods -int ElementAddEventListener(lua_State* L, Element* obj) -{ - int top = lua_gettop(L); - bool capture = false; - //default false if they didn't pass it in - if (top > 2) - capture = CHECK_BOOL(L,3); - - const char* event = luaL_checkstring(L,1); - - LuaEventListener* listener = NULL; - int type = lua_type(L,2); - if(type == LUA_TFUNCTION) - { - listener = new LuaEventListener(L,2,obj); - } - else if(type == LUA_TSTRING) - { - const char* code = luaL_checkstring(L,2); - listener = new LuaEventListener(code,obj); - } - else - { - Log::Message(Log::LT_WARNING, "Lua Context:AddEventLisener's 2nd argument can only be a Lua function or a string, you passed in a %s", lua_typename(L,type)); - } - - if(listener != NULL) - { - obj->AddEventListener(event,listener,capture); - } - return 0; -} - -int ElementAppendChild(lua_State* L, Element* obj) -{ - Element* ele = LuaType::check(L,1); - obj->AppendChild(ele); - return 0; -} - -int ElementBlur(lua_State* L, Element* obj) -{ - obj->Blur(); - return 0; -} - -int ElementClick(lua_State* L, Element* obj) -{ - obj->Click(); - return 0; -} - -int ElementDispatchEvent(lua_State* L, Element* obj) -{ - const char* event = luaL_checkstring(L,1); - Dictionary params; - lua_pushnil(L); //becauase lua_next pops a key from the stack first, we don't want to pop the table - while(lua_next(L,2) != 0) - { - //[-1] is value, [-2] is key - int type = lua_type(L,-1); - const char* key = luaL_checkstring(L,-2); //key HAS to be a string, or things will go bad - switch(type) - { - case LUA_TNUMBER: - params.Set(key,(float)lua_tonumber(L,-1)); - break; - case LUA_TBOOLEAN: - params.Set(key,CHECK_BOOL(L,-1)); - break; - case LUA_TSTRING: - params.Set(key,luaL_checkstring(L,-1)); - break; - case LUA_TUSERDATA: - case LUA_TLIGHTUSERDATA: - params.Set(key,lua_touserdata(L,-1)); - break; - default: - break; - } - } - obj->DispatchEvent(event,params,false); - return 0; -} - -int ElementFocus(lua_State* L, Element* obj) -{ - obj->Focus(); - return 0; -} - -int ElementGetAttribute(lua_State* L, Element* obj) -{ - const char* name = luaL_checkstring(L,1); - Variant* var = obj->GetAttribute(name); - PushVariant(L,var); - return 1; -} - -int ElementGetElementById(lua_State* L, Element* obj) -{ - const char* id = luaL_checkstring(L,1); - Element* ele = obj->GetElementById(id); - LuaType::push(L,ele,false); - return 1; -} - -int ElementGetElementsByTagName(lua_State* L, Element* obj) -{ - const char* tag = luaL_checkstring(L,1); - ElementList list; - obj->GetElementsByTagName(list,tag); - lua_newtable(L); - for(unsigned int i = 0; i < list.size(); i++) - { - lua_pushinteger(L,i); - LuaType::push(L,list[i],false); - lua_settable(L,-3); //-3 is the table - } - return 1; -} - -int ElementHasAttribute(lua_State* L, Element* obj) -{ - const char* name = luaL_checkstring(L,1); - lua_pushboolean(L,obj->HasAttribute(name)); - return 1; -} - -int ElementHasChildNodes(lua_State* L, Element* obj) -{ - lua_pushboolean(L,obj->HasChildNodes()); - return 1; -} - -int ElementInsertBefore(lua_State* L, Element* obj) -{ - Element* element = LuaType::check(L,1); - Element* adjacent = LuaType::check(L,2); - obj->InsertBefore(element,adjacent); - return 0; -} - -int ElementIsClassSet(lua_State* L, Element* obj) -{ - const char* name = luaL_checkstring(L,1); - lua_pushboolean(L,obj->IsClassSet(name)); - return 1; -} - -int ElementRemoveAttribute(lua_State* L, Element* obj) -{ - const char* name = luaL_checkstring(L,1); - obj->RemoveAttribute(name); - return 0; -} - -int ElementRemoveChild(lua_State* L, Element* obj) -{ - Element* element = LuaType::check(L,1); - lua_pushboolean(L,obj->RemoveChild(element)); - return 1; -} - -int ElementReplaceChild(lua_State* L, Element* obj) -{ - Element* inserted = LuaType::check(L,1); - Element* replaced = LuaType::check(L,2); - lua_pushboolean(L,obj->ReplaceChild(inserted,replaced)); - return 1; -} - -int ElementScrollIntoView(lua_State* L, Element* obj) -{ - bool align = CHECK_BOOL(L,1); - obj->ScrollIntoView(align); - return 0; -} - -int ElementSetAttribute(lua_State* L, Element* obj) -{ - const char* name = luaL_checkstring(L,1); - const char* value = luaL_checkstring(L,2); - obj->SetAttribute(name,String(value)); - return 0; -} - -int ElementSetClass(lua_State* L, Element* obj) -{ - const char* name = luaL_checkstring(L,1); - bool value = CHECK_BOOL(L,2); - obj->SetClass(name,value); - return 0; -} - -//getters -int ElementGetAttrattributes(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - ElementAttributesProxy* proxy = new ElementAttributesProxy(); - proxy->owner = ele; - LuaType::push(L,proxy,true); - return 1; -} - -int ElementGetAttrchild_nodes(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - ElementChildNodesProxy* ecnp = new ElementChildNodesProxy(); - ecnp->owner = ele; - LuaType::push(L,ecnp,true); - return 1; -} - -int ElementGetAttrclass_name(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - const char* classnames = ele->GetClassNames().CString(); - lua_pushstring(L,classnames); - return 1; -} - -int ElementGetAttrclient_left(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetClientLeft()); - return 1; -} - -int ElementGetAttrclient_height(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetClientHeight()); - return 1; -} - -int ElementGetAttrclient_top(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetClientTop()); - return 1; -} - -int ElementGetAttrclient_width(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetClientWidth()); - return 1; -} - -int ElementGetAttrfirst_child(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - Element* child = ele->GetFirstChild(); - if(child == NULL) - lua_pushnil(L); - else - LuaType::push(L,child,false); - return 1; -} - -int ElementGetAttrid(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushstring(L,ele->GetId().CString()); - return 1; -} - -int ElementGetAttrinner_rml(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushstring(L,ele->GetInnerRML().CString()); - return 1; -} - -int ElementGetAttrlast_child(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - Element* child = ele->GetLastChild(); - if(child == NULL) - lua_pushnil(L); - else - LuaType::push(L,child,false); - return 1; -} - -int ElementGetAttrnext_sibling(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - Element* sibling = ele->GetNextSibling(); - if(sibling == NULL) - lua_pushnil(L); - else - LuaType::push(L,sibling,false); - return 1; -} - -int ElementGetAttroffset_height(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetOffsetHeight()); - return 1; -} - -int ElementGetAttroffset_left(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetOffsetLeft()); - return 1; -} - -int ElementGetAttroffset_parent(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - Element* parent = ele->GetOffsetParent(); - LuaType::push(L,parent,false); - return 1; -} - -int ElementGetAttroffset_top(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L, ele->GetOffsetTop()); - return 1; -} - -int ElementGetAttroffset_width(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetOffsetWidth()); - return 1; -} - -int ElementGetAttrowner_document(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - Document* doc = ele->GetOwnerDocument(); - LuaType::push(L,doc,false); - return 1; -} - -int ElementGetAttrparent_node(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - Element* parent = ele->GetParentNode(); - if(parent == NULL) - lua_pushnil(L); - else - LuaType::push(L,parent,false); - return 1; -} - -int ElementGetAttrprevious_sibling(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - Element* sibling = ele->GetPreviousSibling(); - if(sibling == NULL) - lua_pushnil(L); - else - LuaType::push(L,sibling,false); - return 1; -} - -int ElementGetAttrscroll_height(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetScrollHeight()); - return 1; -} - -int ElementGetAttrscroll_left(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetScrollLeft()); - return 1; -} - -int ElementGetAttrscroll_top(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetScrollTop()); - return 1; -} - -int ElementGetAttrscroll_width(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushnumber(L,ele->GetScrollWidth()); - return 1; -} - -int ElementGetAttrstyle(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - ElementStyleProxy* prox = new ElementStyleProxy(); - prox->owner = ele; - LuaType::push(L,prox,true); - return 1; -} - -int ElementGetAttrtag_name(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - lua_pushstring(L,ele->GetTagName().CString()); - return 0; -} - - -//setters -int ElementSetAttrclass_name(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - const char* name = luaL_checkstring(L,2); - ele->SetClassNames(name); - return 0; -} - -int ElementSetAttrid(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - const char* id = luaL_checkstring(L,2); - ele->SetId(id); - return 0; -} - -int ElementSetAttrinner_rml(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - const char* rml = luaL_checkstring(L,2); - ele->SetInnerRML(rml); - return 0; -} - -int ElementSetAttrscroll_left(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - float scroll = (float)luaL_checknumber(L,2); - ele->SetScrollLeft(scroll); - return 0; -} - -int ElementSetAttrscroll_top(lua_State* L) -{ - Element* ele = LuaType::check(L,1); - LUACHECKOBJ(ele); - float scroll = (float)luaL_checknumber(L,2); - ele->SetScrollTop(scroll); - return 0; -} - - - - -RegType ElementMethods[] = -{ - LUAMETHOD(Element,AddEventListener) - LUAMETHOD(Element,AppendChild) - LUAMETHOD(Element,Blur) - LUAMETHOD(Element,Click) - LUAMETHOD(Element,DispatchEvent) - LUAMETHOD(Element,Focus) - LUAMETHOD(Element,GetAttribute) - LUAMETHOD(Element,GetElementById) - LUAMETHOD(Element,GetElementsByTagName) - LUAMETHOD(Element,HasAttribute) - LUAMETHOD(Element,HasChildNodes) - LUAMETHOD(Element,InsertBefore) - LUAMETHOD(Element,IsClassSet) - LUAMETHOD(Element,RemoveAttribute) - LUAMETHOD(Element,RemoveChild) - LUAMETHOD(Element,ReplaceChild) - LUAMETHOD(Element,ScrollIntoView) - LUAMETHOD(Element,SetAttribute) - LUAMETHOD(Element,SetClass) - { NULL, NULL }, -}; - -luaL_Reg ElementGetters[] = -{ - LUAGETTER(Element,attributes) - LUAGETTER(Element,child_nodes) - LUAGETTER(Element,class_name) - LUAGETTER(Element,client_left) - LUAGETTER(Element,client_height) - LUAGETTER(Element,client_top) - LUAGETTER(Element,client_width) - LUAGETTER(Element,first_child) - LUAGETTER(Element,id) - LUAGETTER(Element,inner_rml) - LUAGETTER(Element,last_child) - LUAGETTER(Element,next_sibling) - LUAGETTER(Element,offset_height) - LUAGETTER(Element,offset_left) - LUAGETTER(Element,offset_parent) - LUAGETTER(Element,offset_top) - LUAGETTER(Element,offset_width) - LUAGETTER(Element,owner_document) - LUAGETTER(Element,parent_node) - LUAGETTER(Element,previous_sibling) - LUAGETTER(Element,scroll_height) - LUAGETTER(Element,scroll_left) - LUAGETTER(Element,scroll_top) - LUAGETTER(Element,scroll_width) - LUAGETTER(Element,style) - LUAGETTER(Element,tag_name) - { NULL, NULL }, -}; - -luaL_Reg ElementSetters[] = -{ - LUASETTER(Element,class_name) - LUASETTER(Element,id) - LUASETTER(Element,inner_rml) - LUASETTER(Element,scroll_left) - LUASETTER(Element,scroll_top) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Element,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Element.h b/libs/libRocket/Source/Core/Lua/Element.h deleted file mode 100644 index 8b48b6ea558..00000000000 --- a/libs/libRocket/Source/Core/Lua/Element.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAELEMENT_H -#define ROCKETCORELUAELEMENT_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -template<> ROCKETLUA_API void ExtraInit(lua_State* L, int metatable_index); - -int Elementnew(lua_State* L); -//methods -int ElementAddEventListener(lua_State* L, Element* obj); -int ElementAppendChild(lua_State* L, Element* obj); -int ElementBlur(lua_State* L, Element* obj); -int ElementClick(lua_State* L, Element* obj); -int ElementDispatchEvent(lua_State* L, Element* obj); -int ElementFocus(lua_State* L, Element* obj); -int ElementGetAttribute(lua_State* L, Element* obj); -int ElementGetElementById(lua_State* L, Element* obj); -int ElementGetElementsByTagName(lua_State* L, Element* obj); -int ElementHasAttribute(lua_State* L, Element* obj); -int ElementHasChildNodes(lua_State* L, Element* obj); -int ElementInsertBefore(lua_State* L, Element* obj); -int ElementIsClassSet(lua_State* L, Element* obj); -int ElementRemoveAttribute(lua_State* L, Element* obj); -int ElementRemoveChild(lua_State* L, Element* obj); -int ElementReplaceChild(lua_State* L, Element* obj); -int ElementScrollIntoView(lua_State* L, Element* obj); -int ElementSetAttribute(lua_State* L, Element* obj); -int ElementSetClass(lua_State* L, Element* obj); - -//getters -int ElementGetAttrattributes(lua_State* L); -int ElementGetAttrchild_nodes(lua_State* L); -int ElementGetAttrclass_name(lua_State* L); -int ElementGetAttrclient_left(lua_State* L); -int ElementGetAttrclient_height(lua_State* L); -int ElementGetAttrclient_top(lua_State* L); -int ElementGetAttrclient_width(lua_State* L); -int ElementGetAttrfirst_child(lua_State* L); -int ElementGetAttrid(lua_State* L); -int ElementGetAttrinner_rml(lua_State* L); -int ElementGetAttrlast_child(lua_State* L); -int ElementGetAttrnext_sibling(lua_State* L); -int ElementGetAttroffset_height(lua_State* L); -int ElementGetAttroffset_left(lua_State* L); -int ElementGetAttroffset_parent(lua_State* L); -int ElementGetAttroffset_top(lua_State* L); -int ElementGetAttroffset_width(lua_State* L); -int ElementGetAttrowner_document(lua_State* L); -int ElementGetAttrparent_node(lua_State* L); -int ElementGetAttrprevious_sibling(lua_State* L); -int ElementGetAttrscroll_height(lua_State* L); -int ElementGetAttrscroll_left(lua_State* L); -int ElementGetAttrscroll_top(lua_State* L); -int ElementGetAttrscroll_width(lua_State* L); -int ElementGetAttrstyle(lua_State* L); -int ElementGetAttrtag_name(lua_State* L); - -//setters -int ElementSetAttrclass_name(lua_State* L); -int ElementSetAttrid(lua_State* L); -int ElementSetAttrinner_rml(lua_State* L); -int ElementSetAttrscroll_left(lua_State* L); -int ElementSetAttrscroll_top(lua_State* L); - - - -extern RegType ElementMethods[]; -extern luaL_Reg ElementGetters[]; -extern luaL_Reg ElementSetters[]; - -LUACORETYPEDECLARE(Element) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/ElementAttributesProxy.cpp b/libs/libRocket/Source/Core/Lua/ElementAttributesProxy.cpp deleted file mode 100644 index 7ccaf2abdd6..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementAttributesProxy.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementAttributesProxy.h" -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,ElementAttributesProxy__index); - lua_setfield(L,metatable_index,"__index"); - lua_pushcfunction(L,ElementAttributesProxy__pairs); - lua_setfield(L,metatable_index,"__pairs"); - lua_pushcfunction(L,ElementAttributesProxy__ipairs); - lua_setfield(L,metatable_index,"__ipairs"); -} - -int ElementAttributesProxy__index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - int keytype = lua_type(L,2); - if(keytype == LUA_TSTRING) //only valid key types - { - ElementAttributesProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - const char* key = lua_tostring(L,2); - Variant* attr = obj->owner->GetAttribute(key); - PushVariant(L,attr); //Utilities.h - return 1; - } - else - return LuaType::index(L); -} - -//[1] is the object, [2] is the key that was used previously, [3] is the userdata -int ElementAttributesProxy__pairs(lua_State* L) -{ - ElementAttributesProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - String key = ""; - Variant* val; - if(obj->owner->IterateAttributes((*pindex),key,val)) - { - lua_pushstring(L,key.CString()); - PushVariant(L,val); - } - else - { - lua_pushnil(L); - lua_pushnil(L); - } - return 2; -} - -//Doesn't index by integer, so don't return anything -int ElementAttributesProxy__ipairs(lua_State* L) -{ - lua_pushnil(L); - lua_pushnil(L); - return 2; -} - -RegType ElementAttributesProxyMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementAttributesProxyGetters[] = -{ - { NULL, NULL }, -}; -luaL_Reg ElementAttributesProxySetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(ElementAttributesProxy,false) -} -} -} diff --git a/libs/libRocket/Source/Core/Lua/ElementAttributesProxy.h b/libs/libRocket/Source/Core/Lua/ElementAttributesProxy.h deleted file mode 100644 index 15b2eb2ce13..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementAttributesProxy.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAELEMENTATTRIBUTESPROXY_H -#define ROCKETCORELUAELEMENTATTRIBUTESPROXY_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -//where owner is the Element that we should look up information from -struct ElementAttributesProxy { Element* owner; }; - -template<> void ExtraInit(lua_State* L, int metatable_index); -int ElementAttributesProxy__index(lua_State* L); -int ElementAttributesProxy__pairs(lua_State* L); -int ElementAttributesProxy__ipairs(lua_State* L); - -extern RegType ElementAttributesProxyMethods[]; -extern luaL_Reg ElementAttributesProxyGetters[]; -extern luaL_Reg ElementAttributesProxySetters[]; - -LUACORETYPEDECLARE(ElementAttributesProxy) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/ElementChildNodesProxy.cpp b/libs/libRocket/Source/Core/Lua/ElementChildNodesProxy.cpp deleted file mode 100644 index 0e2f67cc51f..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementChildNodesProxy.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementChildNodesProxy.h" -#include "Element.h" - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,ElementChildNodesProxy__index); - lua_setfield(L,metatable_index,"__index"); - lua_pushcfunction(L,ElementChildNodesProxy__pairs); - lua_setfield(L,metatable_index,"__pairs"); - lua_pushcfunction(L,ElementChildNodesProxy__ipairs); - lua_setfield(L,metatable_index,"__ipairs"); -} - -int ElementChildNodesProxy__index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - int keytype = lua_type(L,2); - if(keytype == LUA_TNUMBER) //only valid key types - { - ElementChildNodesProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int key = luaL_checkinteger(L,2); - Element* child = obj->owner->GetChild(key); - LuaType::push(L,child,false); - return 1; - } - else - return LuaType::index(L); -} - -int ElementChildNodesProxy__pairs(lua_State* L) -{ - //because it is only indexed by integer, just go through ipairs - return ElementChildNodesProxy__ipairs(L); -} - - -//[1] is the object, [2] is the key that was just used, [3] is the userdata -int ElementChildNodesProxy__ipairs(lua_State* L) -{ - ElementChildNodesProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) //initial value - (*pindex) = 0; - int num_children = obj->owner->GetNumChildren(); - if((*pindex) < num_children) - { - lua_pushinteger(L,*pindex); //key - LuaType::push(L,obj->owner->GetChild(*pindex)); //value - (*pindex) += 1; - } - else - { - lua_pushnil(L); - lua_pushnil(L); - } - return 2; -} - -RegType ElementChildNodesProxyMethods[] = -{ - { NULL, NULL }, -}; -luaL_Reg ElementChildNodesProxyGetters[] = -{ - { NULL, NULL }, -}; -luaL_Reg ElementChildNodesProxySetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(ElementChildNodesProxy,false) -} -} -} diff --git a/libs/libRocket/Source/Core/Lua/ElementChildNodesProxy.h b/libs/libRocket/Source/Core/Lua/ElementChildNodesProxy.h deleted file mode 100644 index 1b6ecbf2766..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementChildNodesProxy.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - - -#ifndef ROCKETCORELUAELEMENTCHILDNODESPROXY_H -#define ROCKETCORELUAELEMENTCHILDNODESPROXY_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -//where owner is the Element that we should look up information from -struct ElementChildNodesProxy { Element* owner; }; - -template<> void ExtraInit(lua_State* L, int metatable_index); -int ElementChildNodesProxy__index(lua_State* L); -int ElementChildNodesProxy__pairs(lua_State* L); -int ElementChildNodesProxy__ipairs(lua_State* L); - -extern RegType ElementChildNodesProxyMethods[]; -extern luaL_Reg ElementChildNodesProxyGetters[]; -extern luaL_Reg ElementChildNodesProxySetters[]; - -LUACORETYPEDECLARE(ElementChildNodesProxy) -} -} -} - -#endif \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/ElementInstancer.cpp b/libs/libRocket/Source/Core/Lua/ElementInstancer.cpp deleted file mode 100644 index 504c6935b2e..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementInstancer.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - - -#include "precompiled.h" -#include "ElementInstancer.h" - - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,ElementInstancernew); - lua_setfield(L,metatable_index-1,"new"); -} - -//method -int ElementInstancernew(lua_State* L) -{ - LuaElementInstancer* lei = new LuaElementInstancer(L); - LuaType::push(L,lei,true); - lei->RemoveReference(); - return 1; -} - -//setter -int ElementInstancerSetAttrInstanceElement(lua_State* L) -{ - LuaElementInstancer* lei = (LuaElementInstancer*)LuaType::check(L,1); - LUACHECKOBJ(lei); - - if(lua_type(L,2) != LUA_TFUNCTION) - { - Log::Message(Log::LT_ERROR, "The argument to ElementInstancer.InstanceElement must be a function. You passed in a %s.", luaL_typename(L,2)); - return 0; - } - lei->PushFunctionsTable(L); //top of the stack is now ELEMENTINSTANCERFUNCTIONS table - lua_pushvalue(L,2); //copy of the function - lei->ref_InstanceElement = luaL_ref(L,-2); - lua_pop(L,1); //pop the ELEMENTINSTANCERFUNCTIONS table - return 0; -} - -RegType ElementInstancerMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementInstancerGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementInstancerSetters[] = -{ - LUASETTER(ElementInstancer,InstanceElement) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(ElementInstancer,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/ElementInstancer.h b/libs/libRocket/Source/Core/Lua/ElementInstancer.h deleted file mode 100644 index 53d4345286d..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementInstancer.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAELEMENTINSTANCER_H -#define ROCKETCORELUAELEMENTINSTANCER_H - -#include -#include -#include "LuaElementInstancer.h" - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -//method -int ElementInstancernew(lua_State* L); -//setter -int ElementInstancerSetAttrInstanceElement(lua_State* L); - -extern RegType ElementInstancerMethods[]; -extern luaL_Reg ElementInstancerGetters[]; -extern luaL_Reg ElementInstancerSetters[]; - -LUACORETYPEDECLARE(ElementInstancer) -} -} -} - - -#endif \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/ElementStyleProxy.cpp b/libs/libRocket/Source/Core/Lua/ElementStyleProxy.cpp deleted file mode 100644 index 94766321b39..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementStyleProxy.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include -#include -#include "ElementStyleProxy.h" - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,ElementStyleProxy__index); - lua_setfield(L,metatable_index,"__index"); - - lua_pushcfunction(L,ElementStyleProxy__newindex); - lua_setfield(L,metatable_index,"__newindex"); - - lua_pushcfunction(L,ElementStyleProxy__pairs); - lua_setfield(L,metatable_index,"__pairs"); - - lua_pushcfunction(L,ElementStyleProxy__ipairs); - lua_setfield(L,metatable_index,"__ipairs"); -} - -int ElementStyleProxy__index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - int keytype = lua_type(L,2); - if(keytype == LUA_TSTRING) //if we are trying to access a string, then we will assume that it is a property - { - ElementStyleProxy* es = LuaType::check(L,1); - LUACHECKOBJ(es); - const Property* prop = es->owner->GetProperty(lua_tostring(L,2)); - LUACHECKOBJ(prop) - lua_pushstring(L,prop->ToString().CString()); - return 1; - } - else //if it wasn't trying to get a string - { - lua_settop(L,2); - return LuaType::index(L); - } -} - -int ElementStyleProxy__newindex(lua_State* L) -{ - //[1] = obj, [2] = key, [3] = value - ElementStyleProxy* es = LuaType::check(L,1); - LUACHECKOBJ(es); - int keytype = lua_type(L,2); - int valuetype = lua_type(L,3); - if(keytype == LUA_TSTRING ) - { - const char* key = lua_tostring(L,2); - if(valuetype == LUA_TSTRING) - { - const char* value = lua_tostring(L,3); - lua_pushboolean(L,es->owner->SetProperty(key,value)); - return 1; - } - else if (valuetype == LUA_TNIL) - { - es->owner->RemoveProperty(key); - return 0; - } - } - //everything else returns when it needs to, so we are safe to pass it - //on if needed - - lua_settop(L,3); - return LuaType::newindex(L); - -} - -//[1] is the object, [2] is the last used key, [3] is the userdata -int ElementStyleProxy__pairs(lua_State* L) -{ - ElementStyleProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - //iterate variables - String key,val; - const Property* prop; - PseudoClassList pseudo; - if(obj->owner->IterateProperties((*pindex),pseudo,key,prop)) - { - prop->definition->GetValue(val,*prop); - lua_pushstring(L,key.CString()); - lua_pushstring(L,val.CString()); - } - else - { - lua_pushnil(L); - lua_pushnil(L); - } - return 2; -} - -//only indexed by string -int ElementStyleProxy__ipairs(lua_State* L) -{ - lua_pushnil(L); - lua_pushnil(L); - return 2; -} - -RegType ElementStyleProxyMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementStyleProxyGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementStyleProxySetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(ElementStyleProxy,false) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/ElementStyleProxy.h b/libs/libRocket/Source/Core/Lua/ElementStyleProxy.h deleted file mode 100644 index 86d2000bbdd..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementStyleProxy.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAELEMENTSTYLEPROXY_H -#define ROCKETCORELUAELEMENTSTYLEPROXY_H - -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -struct ElementStyleProxy { Element* owner; }; - -template<> void ExtraInit(lua_State* L, int metatable_index); -int ElementStyleProxy__index(lua_State* L); -int ElementStyleProxy__newindex(lua_State* L); -int ElementStyleProxy__pairs(lua_State* L); -int ElementStyleProxy__ipairs(lua_State* L); - -extern RegType ElementStyleProxyMethods[]; -extern luaL_Reg ElementStyleProxyGetters[]; -extern luaL_Reg ElementStyleProxySetters[]; - -LUACORETYPEDECLARE(ElementStyleProxy) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/ElementText.cpp b/libs/libRocket/Source/Core/Lua/ElementText.cpp deleted file mode 100644 index 96b02e2c2f1..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementText.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "ElementText.h" -#include "Element.h" -#include - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - //inherit from Element - ExtraInit(L,metatable_index); - LuaType::_regfunctions(L,metatable_index,metatable_index-1); - AddTypeToElementAsTable(L); -} - -int ElementTextGetAttrtext(lua_State* L) -{ - ElementText* obj = LuaType::check(L, 1); - LUACHECKOBJ(obj); - String temp; - lua_pushstring(L,obj->GetText().ToUTF8(temp).CString()); - return 1; -} - -int ElementTextSetAttrtext(lua_State* L) -{ - ElementText* obj = LuaType::check(L, 1); - LUACHECKOBJ(obj); - const char* text = luaL_checkstring(L,2); - obj->SetText(text); - return 0; -} - -RegType ElementTextMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg ElementTextGetters[] = -{ - LUAGETTER(ElementText,text) - { NULL, NULL }, -}; - -luaL_Reg ElementTextSetters[] = -{ - LUASETTER(ElementText,text) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(ElementText,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/ElementText.h b/libs/libRocket/Source/Core/Lua/ElementText.h deleted file mode 100644 index dbc6202bf6e..00000000000 --- a/libs/libRocket/Source/Core/Lua/ElementText.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAELEMENTTEXT_H -#define ROCKETCORELUAELEMENTTEXT_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -//will inherit from Element -template<> void ExtraInit(lua_State* L, int metatable_index); - -int ElementTextGetAttrtext(lua_State* L); -int ElementTextSetAttrtext(lua_State* L); - -extern RegType ElementTextMethods[]; -extern luaL_Reg ElementTextGetters[]; -extern luaL_Reg ElementTextSetters[]; - -LUACORETYPEDECLARE(ElementText) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/Event.cpp b/libs/libRocket/Source/Core/Lua/Event.cpp deleted file mode 100644 index 2e9f57ca683..00000000000 --- a/libs/libRocket/Source/Core/Lua/Event.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include -#include -#include -#include -#include -#include "EventParametersProxy.h" - - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) { return; } - -//method -int EventStopPropagation(lua_State* L, Event* obj) -{ - obj->StopPropagation(); - return 0; -} - -//getters -int EventGetAttrcurrent_element(lua_State* L) -{ - Event* evt = LuaType::check(L,1); - LUACHECKOBJ(evt); - Element* ele = evt->GetCurrentElement(); - LuaType::push(L,ele,false); - return 1; -} - -int EventGetAttrtype(lua_State* L) -{ - Event* evt = LuaType::check(L,1); - LUACHECKOBJ(evt); - String type = evt->GetType(); - lua_pushstring(L,type.CString()); - return 1; -} - -int EventGetAttrtarget_element(lua_State* L) -{ - Event* evt = LuaType::check(L,1); - LUACHECKOBJ(evt); - Element* target = evt->GetTargetElement(); - LuaType::push(L,target,false); - return 1; -} - -int EventGetAttrparameters(lua_State* L) -{ - Event* evt = LuaType::check(L,1); - LUACHECKOBJ(evt); - EventParametersProxy* proxy = new EventParametersProxy(); - proxy->owner = evt; - LuaType::push(L,proxy,true); - return 1; -} - -RegType EventMethods[] = -{ - LUAMETHOD(Event,StopPropagation) - { NULL, NULL }, -}; - -luaL_Reg EventGetters[] = -{ - LUAGETTER(Event,current_element) - LUAGETTER(Event,type) - LUAGETTER(Event,target_element) - LUAGETTER(Event,parameters) - { NULL, NULL }, -}; - -luaL_Reg EventSetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Event,true) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Event.h b/libs/libRocket/Source/Core/Lua/Event.h deleted file mode 100644 index f1eed6b55c5..00000000000 --- a/libs/libRocket/Source/Core/Lua/Event.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAEVENT_H -#define ROCKETCORELUAEVENT_H - -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -//method -int EventStopPropagation(lua_State* L, Event* obj); - -//getters -int EventGetAttrcurrent_element(lua_State* L); -int EventGetAttrtype(lua_State* L); -int EventGetAttrtarget_element(lua_State* L); -int EventGetAttrparameters(lua_State* L); - -extern RegType EventMethods[]; -extern luaL_Reg EventGetters[]; -extern luaL_Reg EventSetters[]; - -LUACORETYPEDECLARE(Event) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/EventParametersProxy.cpp b/libs/libRocket/Source/Core/Lua/EventParametersProxy.cpp deleted file mode 100644 index 090103b219c..00000000000 --- a/libs/libRocket/Source/Core/Lua/EventParametersProxy.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "EventParametersProxy.h" -#include -#include -#include - - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,EventParametersProxy__index); - lua_setfield(L,metatable_index,"__index"); - lua_pushcfunction(L,EventParametersProxy__pairs); - lua_setfield(L,metatable_index,"__pairs"); - lua_pushcfunction(L,EventParametersProxy__ipairs); - lua_setfield(L,metatable_index,"__ipairs"); -} - -int EventParametersProxy__index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - int keytype = lua_type(L,2); - if(keytype == LUA_TSTRING) //only valid key types - { - EventParametersProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - const char* key = lua_tostring(L,2); - Variant* param = obj->owner->GetParameters()->Get(key); - PushVariant(L,param); - return 1; - } - else - return LuaType::index(L); -} - - -//[1] is the object, [2] is the last used key, [3] is the userdata -int EventParametersProxy__pairs(lua_State* L) -{ - EventParametersProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - String key = ""; - Variant* value = NULL; - if(obj->owner->GetParameters()->Iterate((*pindex),key,value)) - { - lua_pushstring(L,key.CString()); - PushVariant(L,value); - } - else - { - lua_pushnil(L); - lua_pushnil(L); - } - return 2; -} - -//only index by string -int EventParametersProxy__ipairs(lua_State* L) -{ - lua_pushnil(L); - lua_pushnil(L); - return 2; -} - -RegType EventParametersProxyMethods[] = -{ - { NULL, NULL }, -}; -luaL_Reg EventParametersProxyGetters[] = -{ - { NULL, NULL }, -}; -luaL_Reg EventParametersProxySetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(EventParametersProxy,false) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/EventParametersProxy.h b/libs/libRocket/Source/Core/Lua/EventParametersProxy.h deleted file mode 100644 index 0a71ff4d1b2..00000000000 --- a/libs/libRocket/Source/Core/Lua/EventParametersProxy.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAEVENTPARAMETERSPROXY_H -#define ROCKETCORELUAEVENTPARAMETERSPROXY_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -//where owner is the Element that we should look up information from -struct EventParametersProxy { Event* owner; }; - -template<> void ExtraInit(lua_State* L, int metatable_index); -int EventParametersProxy__index(lua_State* L); -int EventParametersProxy__pairs(lua_State* L); -int EventParametersProxy__ipairs(lua_State* L); - -extern RegType EventParametersProxyMethods[]; -extern luaL_Reg EventParametersProxyGetters[]; -extern luaL_Reg EventParametersProxySetters[]; - -LUACORETYPEDECLARE(EventParametersProxy) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/GlobalLuaFunctions.cpp b/libs/libRocket/Source/Core/Lua/GlobalLuaFunctions.cpp deleted file mode 100644 index 9c5f46f2b8c..00000000000 --- a/libs/libRocket/Source/Core/Lua/GlobalLuaFunctions.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - - -#include "precompiled.h" -#include "GlobalLuaFunctions.h" -#include - -namespace Rocket { -namespace Core { -namespace Lua { -/* -Below here are global functions and their helper functions that help overwrite the Lua global functions -*/ - -//__pairs should return two values. -//upvalue 1 is the __pairs function, upvalue 2 is the userdata created in rocket_pairs -//[1] is the object implementing __pairs -//[2] is the key that was just read -int rocket_pairsaux(lua_State* L) -{ - lua_pushvalue(L,lua_upvalueindex(1)); //push __pairs to top - lua_insert(L,1); //move __pairs to the bottom - lua_pushvalue(L,lua_upvalueindex(2)); //push userdata - //stack looks like [1] = __pairs, [2] = object, [3] = latest key, [4] = userdata - if(lua_pcall(L,lua_gettop(L)-1,LUA_MULTRET,0) != 0) - Report(L,"__pairs"); - return lua_gettop(L); -} - -//A version of paris that respects a __pairs metamethod. -//"next" function is upvalue 1 -int rocket_pairs(lua_State* L) -{ - luaL_checkany(L,1); //[1] is the object given to us by pairs(object) - if(luaL_getmetafield(L,1,"__pairs")) - { - void* ud = lua_newuserdata(L,sizeof(void*)); //create a new block of memory to be used as upvalue 1 - (*(int*)(ud)) = -1; - lua_pushcclosure(L,rocket_pairsaux,2); //uv 1 is __pairs, uv 2 is ud - } - else - lua_pushvalue(L,lua_upvalueindex(1)); //generator - lua_pushvalue(L,1); //state - lua_pushnil(L); //initial value - return 3; -} - -//copy + pasted from Lua's lbaselib.c -int ipairsaux (lua_State *L) { - int i = luaL_checkinteger(L, 2); - luaL_checktype(L, 1, LUA_TTABLE); - i++; /* next value */ - lua_pushinteger(L, i); - lua_rawgeti(L, 1, i); - return (lua_isnil(L, -1)) ? 0 : 2; -} - -//__ipairs should return two values -//upvalue 1 is the __ipairs function, upvalue 2 is the userdata created in rocket_ipairs -//[1] is the object implementing __ipairs, [2] is the key last used -int rocket_ipairsaux(lua_State* L) -{ - lua_pushvalue(L,lua_upvalueindex(1)); //push __ipairs - lua_insert(L,1); //move __ipairs to the bottom - lua_pushvalue(L,lua_upvalueindex(2)); //push userdata - //stack looks like [1] = __ipairs, [2] = object, [3] = latest key, [4] = userdata - if(lua_pcall(L,lua_gettop(L)-1,LUA_MULTRET,0) != 0) - Report(L,"__ipairs"); - return lua_gettop(L); -} - - -//A version of paris that respects a __pairs metamethod. -//ipairsaux function is upvalue 1 -int rocket_ipairs(lua_State* L) -{ - luaL_checkany(L,1); //[1] is the object given to us by ipairs(object) - if(luaL_getmetafield(L,1,"__ipairs")) - { - void* ud = lua_newuserdata(L,sizeof(void*)); //create a new block of memory to be used as upvalue 1 - (*(int*)(ud)) = -1; - lua_pushcclosure(L,rocket_pairsaux,2); //uv 1 is __ipairs, uv 2 is ud - } - else - lua_pushvalue(L,lua_upvalueindex(1)); //generator - lua_pushvalue(L,1); //state - lua_pushnil(L); //initial value - return 3; -} - - -//Based off of the luaB_print function from Lua's lbaselib.c -int LuaPrint(lua_State* L) -{ - int n = lua_gettop(L); /* number of arguments */ - int i; - lua_getglobal(L, "tostring"); - StringList string_list = StringList(); - String output = ""; - for (i=1; i<=n; i++) - { - const char *s; - lua_pushvalue(L, -1); /* function to be called */ - lua_pushvalue(L, i); /* value to print */ - lua_call(L, 1, 1); - s = lua_tostring(L, -1); /* get result */ - if (s == NULL) - return luaL_error(L, LUA_QL("tostring") " must return a string to " - LUA_QL("print")); - if (i>1) - output += "\t"; - output += String(s); - lua_pop(L, 1); /* pop result */ - } - output += "\n"; - Log::Message(Log::LT_INFO, output.CString()); - return 0; -} - -void OverrideLuaGlobalFunctions(lua_State* L) -{ - lua_getglobal(L,"_G"); - - lua_getglobal(L,"next"); - lua_pushcclosure(L,rocket_pairs,1); - lua_setfield(L,-2,"pairs"); - - lua_pushcfunction(L,ipairsaux); - lua_pushcclosure(L,rocket_ipairs,1); - lua_setfield(L,-2,"ipairs"); - - lua_pushcfunction(L,LuaPrint); - lua_setfield(L,-2,"print"); - - lua_pop(L,1); //pop _G -} - -} -} -} diff --git a/libs/libRocket/Source/Core/Lua/GlobalLuaFunctions.h b/libs/libRocket/Source/Core/Lua/GlobalLuaFunctions.h deleted file mode 100644 index f12d666e26b..00000000000 --- a/libs/libRocket/Source/Core/Lua/GlobalLuaFunctions.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAGLOBALLUAFUNCTIONS_H -#define ROCKETCORELUAGLOBALLUAFUNCTIONS_H - -namespace Rocket { -namespace Core { -namespace Lua { -void OverrideLuaGlobalFunctions(lua_State* L); -//overrides pairs and ipairs to respect __pairs and __ipairs metamethods -//overrdes print to print to the console -} -} -} - - -#endif \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Interpreter.cpp b/libs/libRocket/Source/Core/Lua/Interpreter.cpp deleted file mode 100644 index f742eba1f81..00000000000 --- a/libs/libRocket/Source/Core/Lua/Interpreter.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include -#include -#include -#include -#include -#include -#include "LuaDocumentElementInstancer.h" -#include -#include "LuaEventListenerInstancer.h" -#include "Rocket.h" -//the types I made -#include "ContextDocumentsProxy.h" -#include "EventParametersProxy.h" -#include "ElementAttributesProxy.h" -#include "Log.h" -#include "Element.h" -#include "ElementStyleProxy.h" -#include "Document.h" -#include "Colourb.h" -#include "Colourf.h" -#include "Vector2f.h" -#include "Vector2i.h" -#include "Context.h" -#include "Event.h" -#include "ElementInstancer.h" -#include "ElementChildNodesProxy.h" -#include "ElementText.h" -#include "GlobalLuaFunctions.h" -#include "RocketContextsProxy.h" - -namespace Rocket { -namespace Core { -namespace Lua { -lua_State* Interpreter::L_ = NULL; -//typedefs for nicer Lua names -typedef Rocket::Core::ElementDocument Document; - -void Interpreter::Startup() -{ - if(L_ == NULL) - { - Log::Message(Log::LT_INFO, "Loading Lua interpreter"); - L_ = luaL_newstate(); - luaL_openlibs(L_); - } - RegisterCoreTypes(L_); -} - - -void Interpreter::RegisterCoreTypes(lua_State* L) -{ - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - //things that inherit from Element - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - //Proxy tables - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - LuaType::Register(L); - OverrideLuaGlobalFunctions(L); - //push the global variable "rocket" to use the "Rocket" methods - LuaRocketPushrocketGlobal(L); -} - - - -void Interpreter::LoadFile(const String& file) -{ - //use the file interface to get the contents of the script - Rocket::Core::FileInterface* file_interface = Rocket::Core::GetFileInterface(); - Rocket::Core::FileHandle handle = file_interface->Open(file); - if(handle == 0) { - lua_pushfstring(L_, "LoadFile: Unable to open file: %s", file.CString()); - Report(L_); - return; - } - - size_t size = file_interface->Length(handle); - if(size == 0) { - lua_pushfstring(L_, "LoadFile: File is 0 bytes in size: %s", file.CString()); - Report(L_); - return; - } - char* file_contents = new char[size]; - file_interface->Read(file_contents,size,handle); - file_interface->Close(handle); - - if(luaL_loadbuffer(L_,file_contents,size,file.CString()) != 0) - Report(L_); - else //if there were no errors loading, then the compiled function is on the top of the stack - { - if(lua_pcall(L_,0,0,0) != 0) - Report(L_); - } - - delete[] file_contents; -} - - -void Interpreter::DoString(const Rocket::Core::String& code, const Rocket::Core::String& name) -{ - if(luaL_loadbuffer(L_,code.CString(),code.Length(), name.CString()) != 0) - Report(L_); - else - { - if(lua_pcall(L_,0,0,0) != 0) - Report(L_); - } -} - -void Interpreter::LoadString(const Rocket::Core::String& code, const Rocket::Core::String& name) -{ - if(luaL_loadbuffer(L_,code.CString(),code.Length(), name.CString()) != 0) - Report(L_); -} - - -void Interpreter::BeginCall(int funRef) -{ - lua_settop(L_,0); //empty stack - //lua_getref(L_,funRef); - lua_rawgeti(L_, LUA_REGISTRYINDEX, (int)funRef); -} - -bool Interpreter::ExecuteCall(int params, int res) -{ - bool ret = true; - int top = lua_gettop(L_); - if(lua_type(L_,top-params) != LUA_TFUNCTION) - { - ret = false; - //stack cleanup - if(params > 0) - { - for(int i = top; i >= (top-params); i--) - { - if(!lua_isnone(L_,i)) - lua_remove(L_,i); - } - } - } - else - { - if(lua_pcall(L_,params,res,0) != 0) - { - Report(L_); - ret = false; - } - } - return ret; -} - -void Interpreter::EndCall(int res) -{ - //stack cleanup - for(int i = res; i > 0; i--) - { - if(!lua_isnone(L_,res)) - lua_remove(L_,res); - } -} - -lua_State* Interpreter::GetLuaState() { return L_; } - - -//From Plugin -int Interpreter::GetEventClasses() -{ - return EVT_BASIC; -} - -void Interpreter::OnInitialise() -{ - Startup(); - Factory::RegisterElementInstancer("body",new LuaDocumentElementInstancer())->RemoveReference(); - Factory::RegisterEventListenerInstancer(new LuaEventListenerInstancer())->RemoveReference(); -} - -void Interpreter::OnShutdown() -{ -} - -void Interpreter::Initialise() -{ - Rocket::Core::Lua::Interpreter::Initialise(NULL); -} - -void Interpreter::Initialise(lua_State *luaStatePointer) -{ - Interpreter *iPtr = new Interpreter(); - iPtr->L_ = luaStatePointer; - Rocket::Core::RegisterPlugin(iPtr); -} - -void Interpreter::Shutdown() -{ - lua_close(L_); -} - - - - -} -} -} diff --git a/libs/libRocket/Source/Core/Lua/Log.cpp b/libs/libRocket/Source/Core/Lua/Log.cpp deleted file mode 100644 index 3b43ae3db27..00000000000 --- a/libs/libRocket/Source/Core/Lua/Log.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Log.h" -#include -#include -#include - - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - //due to they way that LuaType::Register is made, we know that the method table is at the index - //directly below the metatable - int method_index = metatable_index - 1; - - lua_pushcfunction(L,LogMessage); - lua_setfield(L,method_index, "Message"); - - //construct the "logtype" table, so that we can use the Rocket::Core::Log::Type enum like Log.logtype.always in Lua for Log::LT_ALWAYS - lua_newtable(L); - int logtype = lua_gettop(L); - lua_pushvalue(L,-1); //copy of the new table, so that the logtype index will stay valid - lua_setfield(L,method_index,"logtype"); - - lua_pushinteger(L,(int)Log::LT_ALWAYS); - lua_setfield(L,logtype,"always"); - - lua_pushinteger(L,(int)Log::LT_ERROR); - lua_setfield(L,logtype,"error"); - - lua_pushinteger(L,(int)Log::LT_WARNING); - lua_setfield(L,logtype,"warning"); - - lua_pushinteger(L,(int)Log::LT_INFO); - lua_setfield(L,logtype,"info"); - - lua_pushinteger(L,(int)Log::LT_DEBUG); - lua_setfield(L,logtype,"debug"); - - lua_pop(L,1); //pop the logtype table - return; -} - -int LogMessage(lua_State* L) -{ - Log::Type type = Log::Type((int)luaL_checkinteger(L,1)); - const char* str = luaL_checkstring(L,2); - - Log::Message(type, str); - return 0; -} - -RegType LogMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg LogGetters[] = -{ - { NULL, NULL }, -}; - -luaL_Reg LogSetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Log,false) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Log.h b/libs/libRocket/Source/Core/Lua/Log.h deleted file mode 100644 index 1732b998066..00000000000 --- a/libs/libRocket/Source/Core/Lua/Log.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index); -int LogMessage(lua_State* L); - -extern RegType LogMethods[]; -extern luaL_Reg LogGetters[]; -extern luaL_Reg LogSetters[]; - -LUACORETYPEDECLARE(Log) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/LuaDocument.cpp b/libs/libRocket/Source/Core/Lua/LuaDocument.cpp deleted file mode 100644 index 0af5421c12f..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaDocument.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LuaDocument.h" -#include -#include - - -namespace Rocket { -namespace Core { -namespace Lua { - -LuaDocument::LuaDocument(const String& tag) : ElementDocument(tag) -{ -} - -void LuaDocument::LoadScript(Stream* stream, const String& source_name) -{ - //if it is loaded from a file - if(source_name != "") - { - Interpreter::LoadFile(source_name); - } - else - { - String buffer = ""; - stream->Read(buffer,stream->Length()); //just do the whole thing - Interpreter::DoString(buffer, this->GetSourceURL()); - } -} - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/LuaDocument.h b/libs/libRocket/Source/Core/Lua/LuaDocument.h deleted file mode 100644 index ce6e8a1a8e0..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaDocument.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUALUADOCUMENT_H -#define ROCKETCORELUALUADOCUMENT_H -/* - This class is an ElementDocument that overrides the LoadScript function -*/ -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -class LuaDocument : public ElementDocument -{ -public: - LuaDocument(const String& tag); - virtual void LoadScript(Stream* stream, const String& source_name); -}; - -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/LuaDocumentElementInstancer.cpp b/libs/libRocket/Source/Core/Lua/LuaDocumentElementInstancer.cpp deleted file mode 100644 index bf3c05cfaa4..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaDocumentElementInstancer.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LuaDocumentElementInstancer.h" -#include "LuaDocument.h" - -namespace Rocket { -namespace Core { -namespace Lua { - -/// Instances an element given the tag name and attributes. -/// @param[in] parent The element the new element is destined to be parented to. -/// @param[in] tag The tag of the element to instance. -/// @param[in] attributes Dictionary of attributes. -Element* LuaDocumentElementInstancer::InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) -{ - return new LuaDocument(tag); -} -/// Releases an element instanced by this instancer. -/// @param[in] element The element to release. -void LuaDocumentElementInstancer::ReleaseElement(Element* element) -{ - delete element; -} -/// Release the instancer. -void LuaDocumentElementInstancer::Release() -{ - delete this; -} - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/LuaDocumentElementInstancer.h b/libs/libRocket/Source/Core/Lua/LuaDocumentElementInstancer.h deleted file mode 100644 index e3d78f00e80..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaDocumentElementInstancer.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUALUADOCUMENTELEMENTINSTANCER_H -#define ROCKETCORELUALUADOCUMENTELEMENTINSTANCER_H - -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -class LuaDocumentElementInstancer : public ElementInstancer -{ - /// Instances an element given the tag name and attributes. - /// @param[in] parent The element the new element is destined to be parented to. - /// @param[in] tag The tag of the element to instance. - /// @param[in] attributes Dictionary of attributes. - virtual Element* InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes); - /// Releases an element instanced by this instancer. - /// @param[in] element The element to release. - virtual void ReleaseElement(Element* element); - /// Release the instancer. - virtual void Release(); -}; - -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/LuaElement.h b/libs/libRocket/Source/Core/Lua/LuaElement.h deleted file mode 100644 index 5c5bc4642b2..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaElement.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUALUAELEMENT_H -#define ROCKETCORELUALUAELEMENT_H - -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -class -} -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Lua/LuaElementInstancer.cpp b/libs/libRocket/Source/Core/Lua/LuaElementInstancer.cpp deleted file mode 100644 index f24273d81f0..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaElementInstancer.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LuaElementInstancer.h" -#include -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -//This will be called from Rocket::Core::Lua::ElementInstancernew -LuaElementInstancer::LuaElementInstancer(lua_State* L) : ElementInstancer(), ref_InstanceElement(LUA_NOREF) -{ - if(lua_type(L,1) != LUA_TFUNCTION && !lua_isnoneornil(L,1)) - { - Log::Message(Log::LT_ERROR, "The argument to ElementInstancer.new has to be a function or nil. You passed in a %s.", luaL_typename(L,1)); - return; - } - PushFunctionsTable(L); //top of the table is now ELEMENTINSTANCERFUNCTIONS table - lua_pushvalue(L,1); //copy of the function - ref_InstanceElement = luaL_ref(L,-2); - lua_pop(L,1); //pop the ELEMENTINSTANCERFUNCTIONS table -} - -Element* LuaElementInstancer::InstanceElement(Element* ROCKET_UNUSED_PARAMETER(parent), const String& tag, const XMLAttributes& ROCKET_UNUSED_PARAMETER(attributes)) -{ - ROCKET_UNUSED(parent); - ROCKET_UNUSED(attributes); - - lua_State* L = Interpreter::GetLuaState(); - int top = lua_gettop(L); - Element* ret = NULL; - if(ref_InstanceElement != LUA_REFNIL && ref_InstanceElement != LUA_NOREF) - { - PushFunctionsTable(L); - lua_rawgeti(L,-1,ref_InstanceElement); //push the function - lua_pushstring(L,tag.CString()); //push the tag - Interpreter::ExecuteCall(1,1); //we pass in a string, and we want to get an Element back - ret = LuaType::check(L,-1); - } - else - { - Log::Message(Log::LT_WARNING, "Attempt to call the function for ElementInstancer.InstanceElement, the function does not exist."); - } - lua_settop(L,top); - return ret; -} - -void LuaElementInstancer::ReleaseElement(Element* element) -{ - delete element; -} - -void LuaElementInstancer::Release() -{ - delete this; -} - -void LuaElementInstancer::PushFunctionsTable(lua_State* L) -{ - //make sure there is an area to save the function - lua_getglobal(L,"ELEMENTINSTANCERFUNCTIONS"); - if(lua_isnoneornil(L,-1)) - { - lua_newtable(L); - lua_setglobal(L,"ELEMENTINSTANCERFUNCTIONS"); - lua_pop(L,1); //pop the unsucessful getglobal - lua_getglobal(L,"ELEMENTINSTANCERFUNCTIONS"); - } -} - -} -} -} diff --git a/libs/libRocket/Source/Core/Lua/LuaElementInstancer.h b/libs/libRocket/Source/Core/Lua/LuaElementInstancer.h deleted file mode 100644 index 65a0b35a5ce..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaElementInstancer.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUALUAELEMENTINSTANCER_H -#define ROCKETCORELUALUAELEMENTINSTANCER_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -class LuaElementInstancer : public Rocket::Core::ElementInstancer -{ -public: - LuaElementInstancer(lua_State* L); - /// Instances an element given the tag name and attributes. - /// @param[in] parent The element the new element is destined to be parented to. - /// @param[in] tag The tag of the element to instance. - /// @param[in] attributes Dictionary of attributes. - virtual Element* InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes); - /// Releases an element instanced by this instancer. - /// @param[in] element The element to release. - virtual void ReleaseElement(Element* element); - /// Release the instancer. - virtual void Release(); - - int ref_InstanceElement; - - //Pushes on to the top of the stack the table named EVENTINSTNACERFUNCTIONS - void PushFunctionsTable(lua_State* L); -}; - -} -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Lua/LuaEventListener.cpp b/libs/libRocket/Source/Core/Lua/LuaEventListener.cpp deleted file mode 100644 index 57e99bbe8d1..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaEventListener.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LuaEventListener.h" -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { -typedef Rocket::Core::ElementDocument Document; - -LuaEventListener::LuaEventListener(const String& code, Element* element) : EventListener() -{ - //compose function - String function = "return function (event,element,document) "; - function.Append(code); - function.Append(" end"); - - //make sure there is an area to save the function - lua_State* L = Interpreter::GetLuaState(); - int top = lua_gettop(L); - lua_getglobal(L,"EVENTLISTENERFUNCTIONS"); - if(lua_isnoneornil(L,-1)) - { - lua_newtable(L); - lua_setglobal(L,"EVENTLISTENERFUNCTIONS"); - lua_pop(L,1); //pop the unsucessful getglobal - lua_getglobal(L,"EVENTLISTENERFUNCTIONS"); - } - int tbl = lua_gettop(L); - - //compile,execute,and save the function - if(luaL_loadstring(L,function.CString()) != 0) - { - Report(L); - return; - } - else - { - if(lua_pcall(L,0,1,0) != 0) - { - Report(L); - return; - } - } - luaFuncRef = luaL_ref(L,tbl); //creates a reference to the item at the top of the stack in to the table we just created - lua_pop(L,1); //pop the EVENTLISTENERFUNCTIONS table - - attached = element; - if(element) - parent = element->GetOwnerDocument(); - else - parent = NULL; - strFunc = function; - lua_settop(L,top); -} - -//if it is passed in a Lua function -LuaEventListener::LuaEventListener(lua_State* L, int narg, Element* element) -{ - int top = lua_gettop(L); - lua_getglobal(L,"EVENTLISTENERFUNCTIONS"); - if(lua_isnoneornil(L,-1)) - { - lua_newtable(L); - lua_setglobal(L,"EVENTLISTENERFUNCTIONS"); - lua_pop(L,1); //pop the unsucessful getglobal - lua_getglobal(L,"EVENTLISTENERFUNCTIONS"); - } - lua_pushvalue(L,narg); - luaFuncRef = luaL_ref(L,-2); //put the funtion as a ref in to that table - lua_pop(L,1); //pop the EVENTLISTENERFUNCTIONS table - - attached = element; - if(element) - parent = element->GetOwnerDocument(); - else - parent = NULL; - lua_settop(L,top); -} - -LuaEventListener::~LuaEventListener() -{ - if(attached) - attached->RemoveReference(); - if(parent) - parent->RemoveReference(); -} - -/// Process the incoming Event -void LuaEventListener::ProcessEvent(Event& event) -{ - //not sure if this is the right place to do this, but if the element we are attached to isn't a document, then - //the 'parent' variable will be NULL, because element->ower_document hasn't been set on the construction. We should - //correct that - if(!parent && attached) parent = attached->GetOwnerDocument(); - lua_State* L = Interpreter::GetLuaState(); - int top = lua_gettop(L); - - //push the arguments - lua_getglobal(L,"EVENTLISTENERFUNCTIONS"); - lua_rawgeti(L,-1,luaFuncRef); - LuaType::push(L,&event,false); - LuaType::push(L,attached,false); - LuaType::push(L,parent,false); - - Interpreter::ExecuteCall(3,0); //call the function at the top of the stack with 3 arguments - - lua_settop(L,top); //balanced stack makes Lua happy - -} - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/LuaEventListener.h b/libs/libRocket/Source/Core/Lua/LuaEventListener.h deleted file mode 100644 index 4143335e1fc..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaEventListener.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUALUAEVENTLISTENER_H -#define ROCKETCORELUALUAEVENTLISTENER_H - -#include -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -class LuaEventListener : public EventListener -{ -public: - //The plan is to wrap the code in an anonymous function so that we can have named parameters to use, - //rather than putting them in global variables - LuaEventListener(const String& code, Element* element); - - //This is called from a Lua Element if in element:AddEventListener it passes a function in as the 2nd - //parameter rather than a string. We don't wrap the function in an anonymous function, so the user - //should take care to have the proper order. The order is event,element,document. - //narg is the position on the stack - LuaEventListener(lua_State* L, int narg, Element* element); - - virtual ~LuaEventListener(); - - /// Process the incoming Event - virtual void ProcessEvent(Event& event); -private: - //the lua-side function to call when ProcessEvent is called - int luaFuncRef; - Element* attached; - ElementDocument* parent; - String strFunc; //for debugging purposes -}; - -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/LuaEventListenerInstancer.cpp b/libs/libRocket/Source/Core/Lua/LuaEventListenerInstancer.cpp deleted file mode 100644 index 133490e586b..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaEventListenerInstancer.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "LuaEventListenerInstancer.h" -#include "LuaEventListener.h" - -namespace Rocket { -namespace Core { -namespace Lua { - -/// Instance an event listener object. -/// @param value Value of the event. -/// @param element Element that triggers the events. -EventListener* LuaEventListenerInstancer::InstanceEventListener(const String& value, Element* element) -{ - return new LuaEventListener(value,element); -} - -/// Releases this event listener instancer. -void LuaEventListenerInstancer::Release() -{ - delete this; -} - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/LuaEventListenerInstancer.h b/libs/libRocket/Source/Core/Lua/LuaEventListenerInstancer.h deleted file mode 100644 index 973ae240328..00000000000 --- a/libs/libRocket/Source/Core/Lua/LuaEventListenerInstancer.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUALUAEVENTLISTENERINSTANCER_H -#define ROCKETCORELUALUAEVENTLISTENERINSTANCER_H -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -class LuaEventListenerInstancer : public EventListenerInstancer -{ -public: - /// Instance an event listener object. - /// @param value Value of the event. - /// @param element Element that triggers the events. - virtual EventListener* InstanceEventListener(const String& value, Element* element); - - /// Releases this event listener instancer. - virtual void Release(); -}; - -} -} -} -#endif \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Rocket.cpp b/libs/libRocket/Source/Core/Lua/Rocket.cpp deleted file mode 100644 index 5a596dabf6f..00000000000 --- a/libs/libRocket/Source/Core/Lua/Rocket.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Rocket.h" -#include -#include -#include "ElementInstancer.h" -#include "LuaElementInstancer.h" -#include "RocketContextsProxy.h" - -namespace Rocket { -namespace Core { -namespace Lua { -#define ROCKETLUA_INPUTENUM(keyident,tbl) lua_pushinteger(L,Input::KI_##keyident); lua_setfield(L,(tbl),#keyident); -#define ROCKETLUA_INPUTMODIFIERENUM(keymod,tbl) lua_pushinteger(L,Input::KM_##keymod); lua_setfield(L,(tbl),#keymod); - -//c++ representation of the global variable in Lua so that the syntax is consistent -LuaRocket lua_global_rocket; - -void LuaRocketPushrocketGlobal(lua_State* L) -{ - luaL_getmetatable(L,GetTClassName()); - LuaRocketEnumkey_identifier(L); - lua_global_rocket.key_identifier_ref = luaL_ref(L,-2); - LuaRocketEnumkey_modifier(L); - lua_global_rocket.key_modifier_ref = luaL_ref(L,-2); - LuaType::push(L,&lua_global_rocket,false); - lua_setglobal(L,"rocket"); -} - -template<> void ExtraInit(lua_State* L, int metatable_index) { return; } - -int LuaRocketCreateContext(lua_State* L, LuaRocket* obj) -{ - const char* name = luaL_checkstring(L,1); - Vector2i* dimensions = LuaType::check(L,2); - Context* new_context = CreateContext(name, *dimensions); - if(new_context == NULL || dimensions == NULL) - { - lua_pushnil(L); - } - else - { - LuaType::push(L, new_context); - } - return 1; -} - -int LuaRocketLoadFontFace(lua_State* L, LuaRocket* obj) -{ - const char* file = luaL_checkstring(L,1); - lua_pushboolean(L,FontDatabase::LoadFontFace(file)); - return 1; -} - -int LuaRocketRegisterTag(lua_State* L, LuaRocket* obj) -{ - const char* tag = luaL_checkstring(L,1); - LuaElementInstancer* lei = (LuaElementInstancer*)LuaType::check(L,2); - LUACHECKOBJ(lei); - Factory::RegisterElementInstancer(tag,lei); - return 0; -} - -int LuaRocketGetAttrcontexts(lua_State* L) -{ - RocketContextsProxy* proxy = new RocketContextsProxy(); - LuaType::push(L,proxy,true); - return 1; -} - -int LuaRocketGetAttrkey_identifier(lua_State* L) -{ - luaL_getmetatable(L,GetTClassName()); - lua_rawgeti(L,-1,lua_global_rocket.key_identifier_ref); - return 1; -} - -int LuaRocketGetAttrkey_modifier(lua_State* L) -{ - luaL_getmetatable(L,GetTClassName()); - lua_rawgeti(L,-1,lua_global_rocket.key_modifier_ref); - return 1; -} - -void LuaRocketEnumkey_identifier(lua_State* L) -{ - lua_newtable(L); - int tbl = lua_gettop(L); - ROCKETLUA_INPUTENUM(UNKNOWN,tbl) - ROCKETLUA_INPUTENUM(SPACE,tbl) - ROCKETLUA_INPUTENUM(0,tbl) - ROCKETLUA_INPUTENUM(1,tbl) - ROCKETLUA_INPUTENUM(2,tbl) - ROCKETLUA_INPUTENUM(3,tbl) - ROCKETLUA_INPUTENUM(4,tbl) - ROCKETLUA_INPUTENUM(5,tbl) - ROCKETLUA_INPUTENUM(6,tbl) - ROCKETLUA_INPUTENUM(7,tbl) - ROCKETLUA_INPUTENUM(8,tbl) - ROCKETLUA_INPUTENUM(9,tbl) - ROCKETLUA_INPUTENUM(A,tbl) - ROCKETLUA_INPUTENUM(B,tbl) - ROCKETLUA_INPUTENUM(C,tbl) - ROCKETLUA_INPUTENUM(D,tbl) - ROCKETLUA_INPUTENUM(E,tbl) - ROCKETLUA_INPUTENUM(F,tbl) - ROCKETLUA_INPUTENUM(G,tbl) - ROCKETLUA_INPUTENUM(H,tbl) - ROCKETLUA_INPUTENUM(I,tbl) - ROCKETLUA_INPUTENUM(J,tbl) - ROCKETLUA_INPUTENUM(K,tbl) - ROCKETLUA_INPUTENUM(L,tbl) - ROCKETLUA_INPUTENUM(M,tbl) - ROCKETLUA_INPUTENUM(N,tbl) - ROCKETLUA_INPUTENUM(O,tbl) - ROCKETLUA_INPUTENUM(P,tbl) - ROCKETLUA_INPUTENUM(Q,tbl) - ROCKETLUA_INPUTENUM(R,tbl) - ROCKETLUA_INPUTENUM(S,tbl) - ROCKETLUA_INPUTENUM(T,tbl) - ROCKETLUA_INPUTENUM(U,tbl) - ROCKETLUA_INPUTENUM(V,tbl) - ROCKETLUA_INPUTENUM(W,tbl) - ROCKETLUA_INPUTENUM(X,tbl) - ROCKETLUA_INPUTENUM(Y,tbl) - ROCKETLUA_INPUTENUM(Z,tbl) - ROCKETLUA_INPUTENUM(OEM_1,tbl) - ROCKETLUA_INPUTENUM(OEM_PLUS,tbl) - ROCKETLUA_INPUTENUM(OEM_COMMA,tbl) - ROCKETLUA_INPUTENUM(OEM_MINUS,tbl) - ROCKETLUA_INPUTENUM(OEM_PERIOD,tbl) - ROCKETLUA_INPUTENUM(OEM_2,tbl) - ROCKETLUA_INPUTENUM(OEM_3,tbl) - ROCKETLUA_INPUTENUM(OEM_4,tbl) - ROCKETLUA_INPUTENUM(OEM_5,tbl) - ROCKETLUA_INPUTENUM(OEM_6,tbl) - ROCKETLUA_INPUTENUM(OEM_7,tbl) - ROCKETLUA_INPUTENUM(OEM_8,tbl) - ROCKETLUA_INPUTENUM(OEM_102,tbl) - ROCKETLUA_INPUTENUM(NUMPAD0,tbl) - ROCKETLUA_INPUTENUM(NUMPAD1,tbl) - ROCKETLUA_INPUTENUM(NUMPAD2,tbl) - ROCKETLUA_INPUTENUM(NUMPAD3,tbl) - ROCKETLUA_INPUTENUM(NUMPAD4,tbl) - ROCKETLUA_INPUTENUM(NUMPAD5,tbl) - ROCKETLUA_INPUTENUM(NUMPAD6,tbl) - ROCKETLUA_INPUTENUM(NUMPAD7,tbl) - ROCKETLUA_INPUTENUM(NUMPAD8,tbl) - ROCKETLUA_INPUTENUM(NUMPAD9,tbl) - ROCKETLUA_INPUTENUM(NUMPADENTER,tbl) - ROCKETLUA_INPUTENUM(MULTIPLY,tbl) - ROCKETLUA_INPUTENUM(ADD,tbl) - ROCKETLUA_INPUTENUM(SEPARATOR,tbl) - ROCKETLUA_INPUTENUM(SUBTRACT,tbl) - ROCKETLUA_INPUTENUM(DECIMAL,tbl) - ROCKETLUA_INPUTENUM(DIVIDE,tbl) - ROCKETLUA_INPUTENUM(OEM_NEC_EQUAL,tbl) - ROCKETLUA_INPUTENUM(BACK,tbl) - ROCKETLUA_INPUTENUM(TAB,tbl) - ROCKETLUA_INPUTENUM(CLEAR,tbl) - ROCKETLUA_INPUTENUM(RETURN,tbl) - ROCKETLUA_INPUTENUM(PAUSE,tbl) - ROCKETLUA_INPUTENUM(CAPITAL,tbl) - ROCKETLUA_INPUTENUM(KANA,tbl) - ROCKETLUA_INPUTENUM(HANGUL,tbl) - ROCKETLUA_INPUTENUM(JUNJA,tbl) - ROCKETLUA_INPUTENUM(FINAL,tbl) - ROCKETLUA_INPUTENUM(HANJA,tbl) - ROCKETLUA_INPUTENUM(KANJI,tbl) - ROCKETLUA_INPUTENUM(ESCAPE,tbl) - ROCKETLUA_INPUTENUM(CONVERT,tbl) - ROCKETLUA_INPUTENUM(NONCONVERT,tbl) - ROCKETLUA_INPUTENUM(ACCEPT,tbl) - ROCKETLUA_INPUTENUM(MODECHANGE,tbl) - ROCKETLUA_INPUTENUM(PRIOR,tbl) - ROCKETLUA_INPUTENUM(NEXT,tbl) - ROCKETLUA_INPUTENUM(END,tbl) - ROCKETLUA_INPUTENUM(HOME,tbl) - ROCKETLUA_INPUTENUM(LEFT,tbl) - ROCKETLUA_INPUTENUM(UP,tbl) - ROCKETLUA_INPUTENUM(RIGHT,tbl) - ROCKETLUA_INPUTENUM(DOWN,tbl) - ROCKETLUA_INPUTENUM(SELECT,tbl) - ROCKETLUA_INPUTENUM(PRINT,tbl) - ROCKETLUA_INPUTENUM(EXECUTE,tbl) - ROCKETLUA_INPUTENUM(SNAPSHOT,tbl) - ROCKETLUA_INPUTENUM(INSERT,tbl) - ROCKETLUA_INPUTENUM(DELETE,tbl) - ROCKETLUA_INPUTENUM(HELP,tbl) - ROCKETLUA_INPUTENUM(LWIN,tbl) - ROCKETLUA_INPUTENUM(RWIN,tbl) - ROCKETLUA_INPUTENUM(APPS,tbl) - ROCKETLUA_INPUTENUM(POWER,tbl) - ROCKETLUA_INPUTENUM(SLEEP,tbl) - ROCKETLUA_INPUTENUM(WAKE,tbl) - ROCKETLUA_INPUTENUM(F1,tbl) - ROCKETLUA_INPUTENUM(F2,tbl) - ROCKETLUA_INPUTENUM(F3,tbl) - ROCKETLUA_INPUTENUM(F4,tbl) - ROCKETLUA_INPUTENUM(F5,tbl) - ROCKETLUA_INPUTENUM(F6,tbl) - ROCKETLUA_INPUTENUM(F7,tbl) - ROCKETLUA_INPUTENUM(F8,tbl) - ROCKETLUA_INPUTENUM(F9,tbl) - ROCKETLUA_INPUTENUM(F10,tbl) - ROCKETLUA_INPUTENUM(F11,tbl) - ROCKETLUA_INPUTENUM(F12,tbl) - ROCKETLUA_INPUTENUM(F13,tbl) - ROCKETLUA_INPUTENUM(F14,tbl) - ROCKETLUA_INPUTENUM(F15,tbl) - ROCKETLUA_INPUTENUM(F16,tbl) - ROCKETLUA_INPUTENUM(F17,tbl) - ROCKETLUA_INPUTENUM(F18,tbl) - ROCKETLUA_INPUTENUM(F19,tbl) - ROCKETLUA_INPUTENUM(F20,tbl) - ROCKETLUA_INPUTENUM(F21,tbl) - ROCKETLUA_INPUTENUM(F22,tbl) - ROCKETLUA_INPUTENUM(F23,tbl) - ROCKETLUA_INPUTENUM(F24,tbl) - ROCKETLUA_INPUTENUM(NUMLOCK,tbl) - ROCKETLUA_INPUTENUM(SCROLL,tbl) - ROCKETLUA_INPUTENUM(OEM_FJ_JISHO,tbl) - ROCKETLUA_INPUTENUM(OEM_FJ_MASSHOU,tbl) - ROCKETLUA_INPUTENUM(OEM_FJ_TOUROKU,tbl) - ROCKETLUA_INPUTENUM(OEM_FJ_LOYA,tbl) - ROCKETLUA_INPUTENUM(OEM_FJ_ROYA,tbl) - ROCKETLUA_INPUTENUM(LSHIFT,tbl) - ROCKETLUA_INPUTENUM(RSHIFT,tbl) - ROCKETLUA_INPUTENUM(LCONTROL,tbl) - ROCKETLUA_INPUTENUM(RCONTROL,tbl) - ROCKETLUA_INPUTENUM(LMENU,tbl) - ROCKETLUA_INPUTENUM(RMENU,tbl) - ROCKETLUA_INPUTENUM(BROWSER_BACK,tbl) - ROCKETLUA_INPUTENUM(BROWSER_FORWARD,tbl) - ROCKETLUA_INPUTENUM(BROWSER_REFRESH,tbl) - ROCKETLUA_INPUTENUM(BROWSER_STOP,tbl) - ROCKETLUA_INPUTENUM(BROWSER_SEARCH,tbl) - ROCKETLUA_INPUTENUM(BROWSER_FAVORITES,tbl) - ROCKETLUA_INPUTENUM(BROWSER_HOME,tbl) - ROCKETLUA_INPUTENUM(VOLUME_MUTE,tbl) - ROCKETLUA_INPUTENUM(VOLUME_DOWN,tbl) - ROCKETLUA_INPUTENUM(VOLUME_UP,tbl) - ROCKETLUA_INPUTENUM(MEDIA_NEXT_TRACK,tbl) - ROCKETLUA_INPUTENUM(MEDIA_PREV_TRACK,tbl) - ROCKETLUA_INPUTENUM(MEDIA_STOP,tbl) - ROCKETLUA_INPUTENUM(MEDIA_PLAY_PAUSE,tbl) - ROCKETLUA_INPUTENUM(LAUNCH_MAIL,tbl) - ROCKETLUA_INPUTENUM(LAUNCH_MEDIA_SELECT,tbl) - ROCKETLUA_INPUTENUM(LAUNCH_APP1,tbl) - ROCKETLUA_INPUTENUM(LAUNCH_APP2,tbl) - ROCKETLUA_INPUTENUM(OEM_AX,tbl) - ROCKETLUA_INPUTENUM(ICO_HELP,tbl) - ROCKETLUA_INPUTENUM(ICO_00,tbl) - ROCKETLUA_INPUTENUM(PROCESSKEY,tbl) - ROCKETLUA_INPUTENUM(ICO_CLEAR,tbl) - ROCKETLUA_INPUTENUM(ATTN,tbl) - ROCKETLUA_INPUTENUM(CRSEL,tbl) - ROCKETLUA_INPUTENUM(EXSEL,tbl) - ROCKETLUA_INPUTENUM(EREOF,tbl) - ROCKETLUA_INPUTENUM(PLAY,tbl) - ROCKETLUA_INPUTENUM(ZOOM,tbl) - ROCKETLUA_INPUTENUM(PA1,tbl) - ROCKETLUA_INPUTENUM(OEM_CLEAR,tbl) -} - -void LuaRocketEnumkey_modifier(lua_State* L) -{ - lua_newtable(L); - int tbl = lua_gettop(L); - ROCKETLUA_INPUTMODIFIERENUM(CTRL,tbl) - ROCKETLUA_INPUTMODIFIERENUM(SHIFT,tbl) - ROCKETLUA_INPUTMODIFIERENUM(ALT,tbl) - ROCKETLUA_INPUTMODIFIERENUM(META,tbl) - ROCKETLUA_INPUTMODIFIERENUM(CAPSLOCK,tbl) - ROCKETLUA_INPUTMODIFIERENUM(NUMLOCK,tbl) - ROCKETLUA_INPUTMODIFIERENUM(SCROLLLOCK,tbl) -} - - -RegType LuaRocketMethods[] = -{ - LUAMETHOD(LuaRocket,CreateContext) - LUAMETHOD(LuaRocket,LoadFontFace) - LUAMETHOD(LuaRocket,RegisterTag) - { NULL, NULL }, -}; - -luaL_Reg LuaRocketGetters[] = -{ - LUAGETTER(LuaRocket,contexts) - LUAGETTER(LuaRocket,key_identifier) - LUAGETTER(LuaRocket,key_modifier) - { NULL, NULL }, -}; - -luaL_Reg LuaRocketSetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(LuaRocket,false) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Rocket.h b/libs/libRocket/Source/Core/Lua/Rocket.h deleted file mode 100644 index f4f06b6fec7..00000000000 --- a/libs/libRocket/Source/Core/Lua/Rocket.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAROCKET_H -#define ROCKETCORELUAROCKET_H - -#include -#include - -namespace Rocket { -namespace Core { -namespace Lua { - - -class LuaRocket -{ -public: - //reference to the table defined in LuaRocketEnumkey_identifier - int key_identifier_ref; - //reference to the table defined in LuaRocketEnumkey_modifier - int key_modifier_ref; -}; - -void LuaRocketPushrocketGlobal(lua_State* L); - -template<> void ExtraInit(lua_State* L, int metatable_index); -int LuaRocketCreateContext(lua_State* L, LuaRocket* obj); -int LuaRocketLoadFontFace(lua_State* L, LuaRocket* obj); -int LuaRocketRegisterTag(lua_State* L, LuaRocket* obj); - -int LuaRocketGetAttrcontexts(lua_State* L); -int LuaRocketGetAttrkey_identifier(lua_State* L); -int LuaRocketGetAttrkey_modifier(lua_State* L); - -void LuaRocketEnumkey_identifier(lua_State* L); -void LuaRocketEnumkey_modifier(lua_State* L); - -extern RegType LuaRocketMethods[]; -extern luaL_Reg LuaRocketGetters[]; -extern luaL_Reg LuaRocketSetters[]; - -LUACORETYPEDECLARE(LuaRocket) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/RocketContextsProxy.cpp b/libs/libRocket/Source/Core/Lua/RocketContextsProxy.cpp deleted file mode 100644 index a1580305fef..00000000000 --- a/libs/libRocket/Source/Core/Lua/RocketContextsProxy.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "RocketContextsProxy.h" -#include -#include - - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,RocketContextsProxy__index); - lua_setfield(L,metatable_index,"__index"); - lua_pushcfunction(L,RocketContextsProxy__pairs); - lua_setfield(L,metatable_index,"__pairs"); - lua_pushcfunction(L,RocketContextsProxy__ipairs); - lua_setfield(L,metatable_index,"__ipairs"); -} - -int RocketContextsProxy__index(lua_State* L) -{ - /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/ - int keytype = lua_type(L,2); - if(keytype == LUA_TSTRING || keytype == LUA_TNUMBER) //only valid key types - { - RocketContextsProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - if(keytype == LUA_TSTRING) - { - const char* key = lua_tostring(L,2); - LuaType::push(L,GetContext(key)); - } - else - { - int key = luaL_checkinteger(L,2); - LuaType::push(L,GetContext(key)); - } - return 1; - } - else - return LuaType::index(L); -} - - -//[1] is the object, [2] is the last used key, [3] is the userdata -int RocketContextsProxy__pairs(lua_State* L) -{ - RocketContextsProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - Context* value = NULL; - if((*pindex)++ < GetNumContexts()) - { - value = GetContext(*pindex); - } - if(value == NULL) - { - lua_pushnil(L); - lua_pushnil(L); - } - else - { - lua_pushstring(L,value->GetName().CString()); - LuaType::push(L,value); - } - return 2; -} - -//[1] is the object, [2] is the last used key, [3] is the userdata -int RocketContextsProxy__ipairs(lua_State* L) -{ - RocketContextsProxy* obj = LuaType::check(L,1); - LUACHECKOBJ(obj); - int* pindex = (int*)lua_touserdata(L,3); - if((*pindex) == -1) - *pindex = 0; - Context* value = NULL; - if((*pindex)++ < GetNumContexts()) - { - value = GetContext(*pindex); - } - if(value == NULL) - { - lua_pushnil(L); - lua_pushnil(L); - } - else - { - lua_pushinteger(L,(*pindex)-1); - LuaType::push(L,value); - } - return 2; -} - -RegType RocketContextsProxyMethods[] = -{ - { NULL, NULL }, -}; -luaL_Reg RocketContextsProxyGetters[] = -{ - { NULL, NULL }, -}; -luaL_Reg RocketContextsProxySetters[] = -{ - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(RocketContextsProxy,false) -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/RocketContextsProxy.h b/libs/libRocket/Source/Core/Lua/RocketContextsProxy.h deleted file mode 100644 index 464152e2e2c..00000000000 --- a/libs/libRocket/Source/Core/Lua/RocketContextsProxy.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAROCKETCONTEXTSPROXY_H -#define ROCKETCORELUAROCKETCONTEXTSPROXY_H - -#include -#include - - -namespace Rocket { -namespace Core { -namespace Lua { -//where owner is the Element that we should look up information from -struct RocketContextsProxy { void* nothing; }; - -template<> void ExtraInit(lua_State* L, int metatable_index); -int RocketContextsProxy__index(lua_State* L); -int RocketContextsProxy__pairs(lua_State* L); -int RocketContextsProxy__ipairs(lua_State* L); - -extern RegType RocketContextsProxyMethods[]; -extern luaL_Reg RocketContextsProxyGetters[]; -extern luaL_Reg RocketContextsProxySetters[]; - -LUACORETYPEDECLARE(RocketContextsProxy) -} -} -} -#endif \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Utilities.cpp b/libs/libRocket/Source/Core/Lua/Utilities.cpp deleted file mode 100644 index 30c4efda8b8..00000000000 --- a/libs/libRocket/Source/Core/Lua/Utilities.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -void PushVariant(lua_State* L, Variant* var) -{ - if(var == NULL) - { - lua_pushnil(L); - return; - } - Variant::Type vartype = var->GetType(); - switch(vartype) - { - case Variant::BYTE: - case Variant::CHAR: - case Variant::INT: - lua_pushinteger(L,var->Get()); - break; - case Variant::FLOAT: - lua_pushnumber(L,var->Get()); - break; - case Variant::COLOURB: - LuaType::push(L,new Colourb(var->Get()),true); - break; - case Variant::COLOURF: - LuaType::push(L,new Colourf(var->Get()),true); - break; - case Variant::STRING: - lua_pushstring(L,var->Get().CString()); - break; - case Variant::VECTOR2: - //according to Variant.inl, it is going to be a Vector2f - LuaType::push(L,new Vector2f(var->Get()),true); - break; - case Variant::VOIDPTR: - lua_pushlightuserdata(L,var->Get()); - break; - default: - lua_pushnil(L); - break; - } -} - - -void Report(lua_State* L, const Rocket::Core::String& place) -{ - const char * msg= lua_tostring(L,-1); - String strmsg; - while(msg) - { - lua_pop(L,1); - if(place == "") - strmsg = msg; - else - strmsg = String(place).Append(" ").Append(msg); - Log::Message(Log::LT_WARNING, strmsg.CString()); - msg=lua_tostring(L,-1); - } -} - -} -} -} diff --git a/libs/libRocket/Source/Core/Lua/Vector2f.cpp b/libs/libRocket/Source/Core/Lua/Vector2f.cpp deleted file mode 100644 index 4a62c329425..00000000000 --- a/libs/libRocket/Source/Core/Lua/Vector2f.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Vector2f.h" -#include - -namespace Rocket { -namespace Core { -namespace Lua { - -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,Vector2fnew); - lua_setfield(L,metatable_index-1,"new"); - - lua_pushcfunction(L,Vector2f__mul); - lua_setfield(L,metatable_index,"__mul"); - - lua_pushcfunction(L,Vector2f__div); - lua_setfield(L,metatable_index,"__div"); - - lua_pushcfunction(L,Vector2f__add); - lua_setfield(L,metatable_index,"__add"); - - lua_pushcfunction(L,Vector2f__sub); - lua_setfield(L,metatable_index,"__sub"); - - lua_pushcfunction(L,Vector2f__eq); - lua_setfield(L,metatable_index,"__eq"); - - //stack is in the same state as it was before it entered this function - return; -} - -int Vector2fnew(lua_State* L) -{ - float x = (float)luaL_checknumber(L,1); - float y = (float)luaL_checknumber(L,2); - - Vector2f* vect = new Vector2f(x,y); - - LuaType::push(L,vect,true); //true means it will be deleted when it is garbage collected - return 1; -} - -int Vector2f__mul(lua_State* L) -{ - Vector2f* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - float rhs = (float)luaL_checknumber(L,2); - - Vector2f* res = new Vector2f(0.f,0.f); - (*res) = (*lhs) * rhs; - - LuaType::push(L,res,true); - return 1; -} - -int Vector2f__div(lua_State* L) -{ - Vector2f* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - float rhs = (float)luaL_checknumber(L,2); - - Vector2f* res = new Vector2f(0.f,0.f); - (*res) = (*lhs) / rhs; - - LuaType::push(L,res,true); - return 1; -} - -int Vector2f__add(lua_State* L) -{ - Vector2f* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Vector2f* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - Vector2f* res = new Vector2f(0.f,0.f); - (*res) = (*lhs) + (*rhs); - - LuaType::push(L,res,true); - return 1; -} - -int Vector2f__sub(lua_State* L) -{ - Vector2f* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Vector2f* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - Vector2f* res = new Vector2f(0.f,0.f); - (*res) = (*lhs) - (*rhs); - - LuaType::push(L,res,true); - return 1; -} - -int Vector2f__eq(lua_State* L) -{ - Vector2f* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Vector2f* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - lua_pushboolean(L, (*lhs) == (*rhs) ? 1 : 0); - return 1; -} - - -int Vector2fDotProduct(lua_State* L, Vector2f* obj) -{ - Vector2f* rhs = LuaType::check(L,1); - LUACHECKOBJ(rhs); - - float res = obj->DotProduct(*rhs); - - lua_pushnumber(L,res); - return 1; -} - -int Vector2fNormalise(lua_State* L, Vector2f* obj) -{ - Vector2f* res = new Vector2f(); - (*res) = obj->Normalise(); - - LuaType::push(L,res,true); - return 1; -} - -int Vector2fRotate(lua_State* L, Vector2f* obj) -{ - float num = (float)luaL_checknumber(L,1); - - Vector2f* res = new Vector2f(); - (*res) = obj->Rotate(num); - - LuaType::push(L,res,true); - return 1; -} - -int Vector2fGetAttrx(lua_State*L) -{ - Vector2f* self = LuaType::check(L,1); - LUACHECKOBJ(self); - - lua_pushnumber(L,self->x); - return 1; -} - -int Vector2fGetAttry(lua_State*L) -{ - Vector2f* self = LuaType::check(L,1); - LUACHECKOBJ(self); - - lua_pushnumber(L,self->y); - return 1; -} - -int Vector2fGetAttrmagnitude(lua_State*L) -{ - Vector2f* self = LuaType::check(L,1); - LUACHECKOBJ(self); - - lua_pushnumber(L,self->Magnitude()); - return 1; -} - -int Vector2fSetAttrx(lua_State*L) -{ - Vector2f* self = LuaType::check(L,1); - LUACHECKOBJ(self); - float value = (float)luaL_checknumber(L,2); - - self->x = value; - return 0; -} - -int Vector2fSetAttry(lua_State*L) -{ - Vector2f* self = LuaType::check(L,1); - LUACHECKOBJ(self); - float value = (float)luaL_checknumber(L,2); - - self->y = value; - return 0; -} - - - -RegType Vector2fMethods[] = -{ - LUAMETHOD(Vector2f,DotProduct) - LUAMETHOD(Vector2f,Normalise) - LUAMETHOD(Vector2f,Rotate) - { NULL, NULL }, -}; - -luaL_Reg Vector2fGetters[]= -{ - LUAGETTER(Vector2f,x) - LUAGETTER(Vector2f,y) - LUAGETTER(Vector2f,magnitude) - { NULL, NULL }, -}; - -luaL_Reg Vector2fSetters[]= -{ - LUASETTER(Vector2f,x) - LUASETTER(Vector2f,y) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Vector2f,false) - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Vector2f.h b/libs/libRocket/Source/Core/Lua/Vector2f.h deleted file mode 100644 index 1bb9aa3eebd..00000000000 --- a/libs/libRocket/Source/Core/Lua/Vector2f.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAVECTOR2F_H -#define ROCKETCORELUAVECTOR2F_H - -#include -#include -#include - -using Rocket::Core::Vector2f; -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); - -int Vector2fnew(lua_State* L); -int Vector2f__mul(lua_State* L); -int Vector2f__div(lua_State* L); -int Vector2f__add(lua_State* L); -int Vector2f__sub(lua_State* L); -int Vector2f__eq(lua_State* L); - -int Vector2fDotProduct(lua_State* L, Vector2f* obj); -int Vector2fNormalise(lua_State* L, Vector2f* obj); -int Vector2fRotate(lua_State* L, Vector2f* obj); - -int Vector2fGetAttrx(lua_State*L); -int Vector2fGetAttry(lua_State*L); -int Vector2fGetAttrmagnitude(lua_State*L); - -int Vector2fSetAttrx(lua_State*L); -int Vector2fSetAttry(lua_State*L); - - -extern RegType Vector2fMethods[]; -extern luaL_Reg Vector2fGetters[]; -extern luaL_Reg Vector2fSetters[]; - -LUACORETYPEDECLARE(Vector2f) -} -} -} -#endif diff --git a/libs/libRocket/Source/Core/Lua/Vector2i.cpp b/libs/libRocket/Source/Core/Lua/Vector2i.cpp deleted file mode 100644 index 64e611d1143..00000000000 --- a/libs/libRocket/Source/Core/Lua/Vector2i.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Vector2i.h" - - -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index) -{ - lua_pushcfunction(L,Vector2inew); - lua_setfield(L,metatable_index-1,"new"); - - lua_pushcfunction(L,Vector2i__mul); - lua_setfield(L,metatable_index,"__mul"); - - lua_pushcfunction(L,Vector2i__div); - lua_setfield(L,metatable_index,"__div"); - - lua_pushcfunction(L,Vector2i__add); - lua_setfield(L,metatable_index,"__add"); - - lua_pushcfunction(L,Vector2i__sub); - lua_setfield(L,metatable_index,"__sub"); - - lua_pushcfunction(L,Vector2i__eq); - lua_setfield(L,metatable_index,"__eq"); - - //stack is in the same state as it was before it entered this function - return; -} - -int Vector2inew(lua_State* L) -{ - int x = luaL_checkinteger(L,1); - int y = luaL_checkinteger(L,2); - - Vector2i* vect = new Vector2i(x,y); - - LuaType::push(L,vect,true); //true means it will be deleted when it is garbage collected - return 1; -} - -int Vector2i__mul(lua_State* L) -{ - Vector2i* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - int rhs = luaL_checkinteger(L,2); - - Vector2i* res = new Vector2i(0,0); - (*res) = (*lhs) * rhs; - - LuaType::push(L,res,true); - return 1; -} - -int Vector2i__div(lua_State* L) -{ - Vector2i* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - int rhs = luaL_checkinteger(L,2); - - Vector2i* res = new Vector2i(0,0); - (*res) = (*lhs) / rhs; - - LuaType::push(L,res,true); - return 1; -} - -int Vector2i__add(lua_State* L) -{ - Vector2i* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Vector2i* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - Vector2i* res = new Vector2i(0,0); - (*res) = (*lhs) + (*rhs); - - LuaType::push(L,res,true); - return 1; -} - -int Vector2i__sub(lua_State* L) -{ - Vector2i* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Vector2i* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - Vector2i* res = new Vector2i(0,0); - (*res) = (*lhs) - (*rhs); - - LuaType::push(L,res,true); - return 1; -} - -int Vector2i__eq(lua_State* L) -{ - Vector2i* lhs = LuaType::check(L,1); - LUACHECKOBJ(lhs); - Vector2i* rhs = LuaType::check(L,2); - LUACHECKOBJ(rhs); - - lua_pushboolean(L, (*lhs) == (*rhs) ? 1 : 0); - return 1; -} - -int Vector2iGetAttrx(lua_State*L) -{ - Vector2i* self = LuaType::check(L,1); - LUACHECKOBJ(self); - - lua_pushinteger(L,self->x); - return 1; -} - -int Vector2iGetAttry(lua_State*L) -{ - Vector2i* self = LuaType::check(L,1); - LUACHECKOBJ(self); - - lua_pushinteger(L,self->y); - return 1; -} - -int Vector2iGetAttrmagnitude(lua_State*L) -{ - Vector2i* self = LuaType::check(L,1); - LUACHECKOBJ(self); - - lua_pushnumber(L,self->Magnitude()); - return 1; -} - -int Vector2iSetAttrx(lua_State*L) -{ - Vector2i* self = LuaType::check(L,1); - LUACHECKOBJ(self); - int value = luaL_checkinteger(L,2); - - self->x = value; - return 0; -} - -int Vector2iSetAttry(lua_State*L) -{ - Vector2i* self = LuaType::check(L,1); - LUACHECKOBJ(self); - int value = luaL_checkinteger(L,2); - - self->y = value; - return 0; -} - - - -RegType Vector2iMethods[] = -{ - { NULL, NULL }, -}; - -luaL_Reg Vector2iGetters[]= -{ - LUAGETTER(Vector2i,x) - LUAGETTER(Vector2i,y) - LUAGETTER(Vector2i,magnitude) - { NULL, NULL }, -}; - -luaL_Reg Vector2iSetters[]= -{ - LUASETTER(Vector2i,x) - LUASETTER(Vector2i,y) - { NULL, NULL }, -}; - -LUACORETYPEDEFINE(Vector2i,false) - -} -} -} \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/Vector2i.h b/libs/libRocket/Source/Core/Lua/Vector2i.h deleted file mode 100644 index 16c2c56d6f6..00000000000 --- a/libs/libRocket/Source/Core/Lua/Vector2i.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAVECTOR2I_H -#define ROCKETCORELUAVECTOR2I_H - -#include -#include -#include - -using Rocket::Core::Vector2i; -namespace Rocket { -namespace Core { -namespace Lua { -template<> void ExtraInit(lua_State* L, int metatable_index); -int Vector2inew(lua_State* L); -int Vector2i__mul(lua_State* L); -int Vector2i__div(lua_State* L); -int Vector2i__add(lua_State* L); -int Vector2i__sub(lua_State* L); -int Vector2i__eq(lua_State* L); - -//getters -int Vector2iGetAttrx(lua_State*L); -int Vector2iGetAttry(lua_State*L); -int Vector2iGetAttrmagnitude(lua_State*L); - -//setters -int Vector2iSetAttrx(lua_State*L); -int Vector2iSetAttry(lua_State*L); - - -extern RegType Vector2iMethods[]; -extern luaL_Reg Vector2iGetters[]; -extern luaL_Reg Vector2iSetters[]; - -LUACORETYPEDECLARE(Vector2i) -} -} -} -#endif - diff --git a/libs/libRocket/Source/Core/Lua/precompiled.cpp b/libs/libRocket/Source/Core/Lua/precompiled.cpp deleted file mode 100644 index 8b0aa0ed6bb..00000000000 --- a/libs/libRocket/Source/Core/Lua/precompiled.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" \ No newline at end of file diff --git a/libs/libRocket/Source/Core/Lua/precompiled.h b/libs/libRocket/Source/Core/Lua/precompiled.h deleted file mode 100644 index 65ce20e16ab..00000000000 --- a/libs/libRocket/Source/Core/Lua/precompiled.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORELUAPRECOMPILED_H -#define ROCKETCORELUAPRECOMPILED_H - -#include -#include -#include -#include -#endif diff --git a/libs/libRocket/Source/Core/Math.cpp b/libs/libRocket/Source/Core/Math.cpp deleted file mode 100644 index 77dc990691a..00000000000 --- a/libs/libRocket/Source/Core/Math.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Math.h" -#include -#include - -namespace Rocket { -namespace Core { -namespace Math { - -const float ROCKET_PI = 3.141592653f; - -static const float FZERO = 0.0001f; - -// Evaluates if a number is, or close to, zero. -ROCKETCORE_API bool IsZero(float value) -{ - return AbsoluteValue(value) < FZERO; -} - -// Evaluates if two floating-point numbers are equal, or so similar that they could be considered -// so. -ROCKETCORE_API bool AreEqual(float value_0, float value_1) -{ - return IsZero(value_1 - value_0); -} - -// Calculates the absolute value of a number. -ROCKETCORE_API float AbsoluteValue(float value) -{ - return fabsf(value); -} - -// Calculates the cosine of an angle. -ROCKETCORE_API float Cos(float angle) -{ - return cosf(angle); -} - -// Calculates the arc-cosine of an value. -ROCKETCORE_API float ACos(float value) -{ - return acos(value); -} - -// Calculates the sine of an angle. -ROCKETCORE_API float Sin(float angle) -{ - return sin(angle); -} - -// Calculates the arc-sine of an value. -ROCKETCORE_API float ASin(float angle) -{ - return asinf(angle); -} - -// Calculates the tangent of an angle. -ROCKETCORE_API float Tan(float angle) -{ - return tanf(angle); -} - -// Calculates the angle of a two-dimensional line. -ROCKETCORE_API float ATan2(float y, float x) -{ - return atan2f(y, x); -} - -// Converts an angle from radians to degrees. -ROCKETCORE_API float RadiansToDegrees(float angle) -{ - return angle * (180.0f / ROCKET_PI); -} - -// Converts an angle from degrees to radians. -ROCKETCORE_API float DegreesToRadians(float angle) -{ - return angle * (ROCKET_PI / 180.0f); -} - -// Normalises and angle in radians -ROCKETCORE_API float NormaliseAngle(float angle) -{ - return fmodf(angle, ROCKET_PI * 2.0f); -} - -// Calculates the square root of a value. -ROCKETCORE_API float SquareRoot(float value) -{ - return sqrtf(value); -} - -// Rounds a floating-point value to the nearest integer. -ROCKETCORE_API int Round(float value) -{ - if (value > 0.0f) - return RealToInteger(value + 0.5f); - - return RealToInteger(value - 0.5f); -} - -// Rounds a floating-point value up to the nearest integer. -ROCKETCORE_API int RoundUp(float value) -{ - return RealToInteger(ceilf(value)); -} - -// Rounds a floating-point value down to the nearest integer. -ROCKETCORE_API int RoundDown(float value) -{ - return RealToInteger(floorf(value)); -} - -// Efficiently truncates a floating-point value into an integer. -ROCKETCORE_API int RealToInteger(float value) -{ -#if defined(ROCKET_PLATFORM_WIN32) && !defined(_M_X64) && !defined(__amd64__) && !defined(__MINGW32__) - int i; - _asm - { - mov eax, value; // loaded mem to acc - rcl eax, 1; // left shift acc to remove the sign - mov ebx, eax; // save the acc - mov edx, 4278190080; // clear reg edx; - and eax, edx; // and acc to retrieve the exponent - shr eax, 24; - sub eax, 7fh; // subtract 7fh(127) to get the actual power - mov edx, eax; // save acc val power - mov eax, ebx; // retrieve from ebx - rcl eax, 8; // trim the left 8 bits that contain the power - mov ebx, eax; // store - mov ecx, 1fh; // subtract 17 h - sub ecx, edx; - mov edx, 00000000h; - cmp ecx, 0; - je loop2; - shr eax, 1; - or eax, 80000000h; - loop1: - shr eax, 1; // shift (total bits - power bits); - sub ecx, 1; - add edx, 1; - cmp ecx, 0; - ja loop1; - loop2: - mov i, eax; - - // check sign +/- - mov eax, value; - and eax, 80000000h; - cmp eax, 80000000h; - je putsign; - } - - return i; - -putsign: - return -i; -#else - return (int) value; -#endif -} - -// Converts the given number to a power of two, rounding up if necessary. -ROCKETCORE_API int ToPowerOfTwo(int number) -{ - // Check if the number is already a power of two. - if ((number & (number - 1)) == 0) - return number; - - // Assuming 31 useful bits in an int here ... ! - for (int i = 31; i >= 0; i--) - { - if (number & (1 << i)) - { - if (i == 31) - return 1 << 31; - else - return 1 << (i + 1); - } - } - - return 0; -} - -// Converts from a hexadecimal digit to decimal. -ROCKETCORE_API int HexToDecimal(char hex_digit) -{ - if (hex_digit >= '0' && hex_digit <= '9') - return hex_digit - '0'; - else if (hex_digit >= 'a' && hex_digit <= 'f') - return 10 + (hex_digit - 'a'); - else if (hex_digit >= 'A' && hex_digit <= 'F') - return 10 + (hex_digit - 'A'); - - return -1; -} - -// Generates a random floating-point value between 0 and a user-specified value. -ROCKETCORE_API float RandomReal(float max_value) -{ - return (rand() / (float) RAND_MAX) * max_value; -} - -// Generates a random integer value between 0 and a user-specified value. -ROCKETCORE_API int RandomInteger(int max_value) -{ - return (rand() % max_value); -} - -// Generates a random boolean value, with equal chance of true or false. -ROCKETCORE_API bool RandomBool() -{ - return RandomInteger(2) == 1; -} - -} -} -} diff --git a/libs/libRocket/Source/Core/Plugin.cpp b/libs/libRocket/Source/Core/Plugin.cpp deleted file mode 100644 index 0f3c1a6e1e1..00000000000 --- a/libs/libRocket/Source/Core/Plugin.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Plugin.h" - -namespace Rocket { -namespace Core { - -Plugin::~Plugin() -{ -} - -int Plugin::GetEventClasses() -{ - return EVT_ALL; -} - -void Plugin::OnInitialise() -{ -} - -void Plugin::OnShutdown() -{ -} - -// Called when a new context is created. -void Plugin::OnContextCreate(Context* ROCKET_UNUSED_PARAMETER(context)) -{ - ROCKET_UNUSED(context); -} - -// Called when a context is destroyed. -void Plugin::OnContextDestroy(Context* ROCKET_UNUSED_PARAMETER(context)) -{ - ROCKET_UNUSED(context); -} - -// Called when a document load request occurs, before the document's file is opened. -void Plugin::OnDocumentOpen(Context* ROCKET_UNUSED_PARAMETER(context), const String& ROCKET_UNUSED_PARAMETER(document_path)) -{ - ROCKET_UNUSED(context); - ROCKET_UNUSED(document_path); -} - -// Called when a document is successfully loaded from file or instanced, initialised and added to -// its context. -void Plugin::OnDocumentLoad(ElementDocument* ROCKET_UNUSED_PARAMETER(document)) -{ - ROCKET_UNUSED(document); -} - -// Called when a document is unloaded from its context. -void Plugin::OnDocumentUnload(ElementDocument* ROCKET_UNUSED_PARAMETER(document)) -{ - ROCKET_UNUSED(document); -} - -// Called when a new element is created. -void Plugin::OnElementCreate(Element* ROCKET_UNUSED_PARAMETER(element)) -{ - ROCKET_UNUSED(element); -} - -// Called when an element is destroyed. -void Plugin::OnElementDestroy(Element* ROCKET_UNUSED_PARAMETER(element)) -{ - ROCKET_UNUSED(element); -} - -} -} diff --git a/libs/libRocket/Source/Core/PluginRegistry.cpp b/libs/libRocket/Source/Core/PluginRegistry.cpp deleted file mode 100644 index 75f6e2f90ba..00000000000 --- a/libs/libRocket/Source/Core/PluginRegistry.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "PluginRegistry.h" -#include "../../Include/Rocket/Core/Plugin.h" - -namespace Rocket { -namespace Core { - -typedef std::vector< Plugin* > PluginList; -static PluginList basic_plugins; -static PluginList document_plugins; -static PluginList element_plugins; - -PluginRegistry::PluginRegistry() -{ -} - -void PluginRegistry::RegisterPlugin(Plugin* plugin) -{ - int event_classes = plugin->GetEventClasses(); - - if (event_classes & Plugin::EVT_BASIC) - basic_plugins.push_back(plugin); - if (event_classes & Plugin::EVT_DOCUMENT) - document_plugins.push_back(plugin); - if (event_classes & Plugin::EVT_ELEMENT) - element_plugins.push_back(plugin); -} - -// Calls OnInitialise() on all plugins. -void PluginRegistry::NotifyInitialise() -{ - for (size_t i = 0; i < basic_plugins.size(); ++i) - basic_plugins[i]->OnInitialise(); -} - -// Calls OnShutdown() on all plugins. -void PluginRegistry::NotifyShutdown() -{ - while (!basic_plugins.empty()) - { - basic_plugins.back()->OnShutdown(); - basic_plugins.pop_back(); - } - document_plugins.clear(); - element_plugins.clear(); -} - -// Calls OnContextCreate() on all plugins. -void PluginRegistry::NotifyContextCreate(Context* context) -{ - for (size_t i = 0; i < basic_plugins.size(); ++i) - basic_plugins[i]->OnContextCreate(context); -} - -// Calls OnContextDestroy() on all plugins. -void PluginRegistry::NotifyContextDestroy(Context* context) -{ - for (size_t i = 0; i < basic_plugins.size(); ++i) - basic_plugins[i]->OnContextDestroy(context); -} - -// Calls OnDocumentOpen() on all plugins. -void PluginRegistry::NotifyDocumentOpen(Context* context, const String& document_path) -{ - for (size_t i = 0; i < document_plugins.size(); ++i) - document_plugins[i]->OnDocumentOpen(context, document_path); -} - -// Calls OnDocumentLoad() on all plugins. -void PluginRegistry::NotifyDocumentLoad(ElementDocument* document) -{ - for (size_t i = 0; i < document_plugins.size(); ++i) - document_plugins[i]->OnDocumentLoad(document); -} - -// Calls OnDocumentUnload() on all plugins. -void PluginRegistry::NotifyDocumentUnload(ElementDocument* document) -{ - for (size_t i = 0; i < document_plugins.size(); ++i) - document_plugins[i]->OnDocumentUnload(document); -} - -// Calls OnElementCreate() on all plugins. -void PluginRegistry::NotifyElementCreate(Element* element) -{ - for (size_t i = 0; i < element_plugins.size(); ++i) - element_plugins[i]->OnElementCreate(element); -} - -// Calls OnElementDestroy() on all plugins. -void PluginRegistry::NotifyElementDestroy(Element* element) -{ - for (size_t i = 0; i < element_plugins.size(); ++i) - element_plugins[i]->OnElementDestroy(element); -} - -} -} diff --git a/libs/libRocket/Source/Core/PluginRegistry.h b/libs/libRocket/Source/Core/PluginRegistry.h deleted file mode 100644 index ed8e0a3f260..00000000000 --- a/libs/libRocket/Source/Core/PluginRegistry.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPLUGINREGISTRY_H -#define ROCKETCOREPLUGINREGISTRY_H - -namespace Rocket { -namespace Core { - -class Context; -class Element; -class ElementDocument; -class Plugin; - -/** - @author Peter Curry - */ - -class PluginRegistry -{ -public: - static void RegisterPlugin(Plugin* plugin); - - /// Calls OnInitialise() on all plugins. - static void NotifyInitialise(); - /// Calls OnShutdown() on all plugins. - static void NotifyShutdown(); - - /// Calls OnContextCreate() on all plugins. - static void NotifyContextCreate(Context* context); - /// Calls OnContextDestroy() on all plugins. - static void NotifyContextDestroy(Context* context); - - /// Calls OnDocumentOpen() on all plugins. - static void NotifyDocumentOpen(Context* context, const String& document_path); - /// Calls OnDocumentLoad() on all plugins. - static void NotifyDocumentLoad(ElementDocument* document); - /// Calls OnDocumentUnload() on all plugins. - static void NotifyDocumentUnload(ElementDocument* document); - - /// Calls OnElementCreate() on all plugins. - static void NotifyElementCreate(Element* element); - /// Calls OnElementDestroy() on all plugins. - static void NotifyElementDestroy(Element* element); - -private: - PluginRegistry(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Pool.h b/libs/libRocket/Source/Core/Pool.h deleted file mode 100644 index 910d8478b60..00000000000 --- a/libs/libRocket/Source/Core/Pool.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPOOL_H -#define ROCKETCOREPOOL_H - -#include "../../Include/Rocket/Core/Header.h" -#include "../../Include/Rocket/Core/Debug.h" - -namespace Rocket { -namespace Core { - -template < typename PoolType > -class Pool -{ -private: - class PoolNode - { - public: - PoolType object; - PoolNode* previous; - PoolNode* next; - }; - - class PoolChunk - { - public: - PoolNode* chunk; - PoolChunk* next; - }; - -public: - /** - Iterator objects are used for safe traversal of the allocated - members of a pool. - */ - class Iterator - { - friend class Pool< PoolType >; - - public : - /// Increments the iterator to reference the next node in the - /// linked list. It is an error to call this function if the - /// node this iterator references is invalid. - inline void operator++() - { - ROCKET_ASSERT(node != NULL); - node = node->next; - } - /// Returns true if it is OK to deference or increment this - /// iterator. - inline operator bool() - { - return (node != NULL); - } - - /// Returns the object referenced by the iterator's current - /// node. - inline PoolType& operator*() - { - return node->object; - } - /// Returns a pointer to the object referenced by the - /// iterator's current node. - inline PoolType* operator->() - { - return &node->object; - } - - private: - // Constructs an iterator referencing the given node. - inline Iterator(PoolNode* node) - { - this->node = node; - } - - PoolNode* node; - }; - - Pool(int chunk_size = 0, bool grow = false); - ~Pool(); - - /// Initialises the pool to a given size. - void Initialise(int chunk_size, bool grow = false); - - /// Returns the head of the linked list of allocated objects. - inline Iterator Begin(); - - /// Attempts to allocate a deallocated object in the memory pool. If - /// the process is successful, the newly allocated object is returned. - /// If the process fails (due to no free objects being available), NULL - /// is returned. - inline PoolType* AllocateObject(); - - /// Deallocates the object pointed to by the given iterator. - inline void DeallocateObject(Iterator& iterator); - /// Deallocates the given object. - inline void DeallocateObject(PoolType* object); - - /// Returns the number of objects in the pool. - inline int GetSize() const; - /// Returns the number of object chunks in the pool. - inline int GetNumChunks() const; - /// Returns the number of allocated objects in the pool. - inline int GetNumAllocatedObjects() const; - -private: - // Creates a new pool chunk and appends its nodes to the beginning of the free list. - void CreateChunk(); - - int chunk_size; - bool grow; - - PoolChunk* pool; - - // The heads of the two linked lists. - PoolNode* first_allocated_node; - PoolNode* first_free_node; - - int num_allocated_objects; -}; - -#include "Pool.inl" - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Pool.inl b/libs/libRocket/Source/Core/Pool.inl deleted file mode 100644 index 51dcdebf2b4..00000000000 --- a/libs/libRocket/Source/Core/Pool.inl +++ /dev/null @@ -1,247 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -template < typename PoolType > -Pool< PoolType >::Pool(int _chunk_size, bool _grow) -{ - chunk_size = 0; - grow = _grow; - - num_allocated_objects = 0; - - pool = NULL; - first_allocated_node = NULL; - first_free_node = NULL; - - if (_chunk_size > 0) - Initialise(_chunk_size, _grow); -} - -template < typename PoolType > -Pool< PoolType >::~Pool() -{ - PoolChunk* chunk = pool; - while (chunk) - { - PoolChunk* next_chunk = chunk->next; - - delete[] chunk->chunk; - delete chunk; - - chunk = next_chunk; - } -} - -// Initialises the pool to a given size. -template < typename PoolType > -void Pool< PoolType >::Initialise(int _chunk_size, bool _grow) -{ - // Should resize the pool here ... ? - if (chunk_size > 0) - return; - - if (_chunk_size <= 0) - return; - - grow = _grow; - chunk_size = _chunk_size; - pool = NULL; - - // Create the initial chunk. - CreateChunk(); -} - -// Returns the head of the linked list of allocated objects. -template < typename PoolType > -typename Pool< PoolType >::Iterator Pool< PoolType >::Begin() -{ - return typename Pool< PoolType >::Iterator(first_allocated_node); -} - -// Attempts to allocate a deallocated object in the memory pool. -template < typename PoolType > -PoolType* Pool< PoolType >::AllocateObject() -{ - // We can't allocate a new object if the deallocated list is empty. - if (first_free_node == NULL) - { - // Attempt to grow the pool first. - if (grow) - { - CreateChunk(); - if (first_free_node == NULL) - return NULL; - } - else - return NULL; - } - - // We're about to allocate an object. - ++num_allocated_objects; - - // This one! - PoolNode* allocated_object = first_free_node; - - // Remove the newly allocated object from the list of deallocated objects. - first_free_node = first_free_node->next; - if (first_free_node != NULL) - first_free_node->previous = NULL; - - // Add the newly allocated object to the head of the list of allocated objects. - if (first_allocated_node != NULL) - { - allocated_object->previous = NULL; - allocated_object->next = first_allocated_node; - first_allocated_node->previous = allocated_object; - } - else - { - // This object is the only allocated object. - allocated_object->previous = NULL; - allocated_object->next = NULL; - } - - first_allocated_node = allocated_object; - - return new (&allocated_object->object) PoolType(); -} - -// Deallocates the object pointed to by the given iterator. -template < typename PoolType > -void Pool< PoolType >::DeallocateObject(Iterator& iterator) -{ - // We're about to deallocate an object. - --num_allocated_objects; - - PoolNode* object = iterator.node; - object->object.~PoolType(); - - // Get the previous and next pointers now, because they will be overwritten - // before we're finished. - PoolNode* previous_object = object->previous; - PoolNode* next_object = object->next; - - if (previous_object != NULL) - previous_object->next = next_object; - else - { - ROCKET_ASSERT(first_allocated_node == object); - first_allocated_node = next_object; - } - - if (next_object != NULL) - next_object->previous = previous_object; - - // Insert the freed node at the beginning of the free object list. - if (first_free_node == NULL) - { - object->previous = NULL; - object->next = NULL; - } - else - { - object->previous = NULL; - object->next = first_free_node; - } - - first_free_node = object; - - // Increment the iterator, so it points to the next active object. - iterator.node = next_object; -} - -// Deallocates the given object. -template < typename PoolType > -void Pool< PoolType >::DeallocateObject(PoolType* object) -{ - // This assumes the object has the same address as the node, which will be - // true as long as the struct definition does not change. - Iterator iterator((PoolNode*) object); - DeallocateObject(iterator); -} - -// Returns the number of objects in the pool. -template < typename PoolType > -int Pool< PoolType >::GetSize() const -{ - return chunk_size * GetNumChunks(); -} - -/// Returns the number of object chunks in the pool. -template < typename PoolType > -int Pool< PoolType >::GetNumChunks() const -{ - int num_chunks = 0; - - PoolChunk* chunk = pool; - while (chunk != NULL) - { - ++num_chunks; - chunk = chunk->next; - } - - return num_chunks; -} - -// Returns the number of allocated objects in the pool. -template < typename PoolType > -int Pool< PoolType >::GetNumAllocatedObjects() const -{ - return num_allocated_objects; -} - -// Creates a new pool chunk and appends its nodes to the beginning of the free list. -template < typename PoolType > -void Pool< PoolType >::CreateChunk() -{ - if (chunk_size <= 0) - return; - - // Create the new chunk and mark it as the first chunk. - PoolChunk* new_chunk = new PoolChunk(); - new_chunk->next = pool; - pool = new_chunk; - - // Create chunk's pool nodes. - new_chunk->chunk = new PoolNode[chunk_size]; - - // Initialise the linked list. - for (int i = 0; i < chunk_size; i++) - { - if (i == 0) - new_chunk->chunk[i].previous = NULL ; - else - new_chunk->chunk[i].previous = &new_chunk->chunk[i - 1]; - - if (i == chunk_size - 1) - new_chunk->chunk[i].next = first_free_node; - else - new_chunk->chunk[i].next = &new_chunk->chunk[i + 1]; - } - - first_free_node = new_chunk->chunk; -} diff --git a/libs/libRocket/Source/Core/Property.cpp b/libs/libRocket/Source/Core/Property.cpp deleted file mode 100644 index ffadf5a268c..00000000000 --- a/libs/libRocket/Source/Core/Property.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/PropertyDefinition.h" - -namespace Rocket { -namespace Core { - -Property::Property() : unit(UNKNOWN), specificity(-1) -{ - definition = NULL; - parser_index = -1; -} - -Property::~Property() -{ -} - -String Property::ToString() const -{ - if (definition == NULL) - return value.Get< String >(); - - String string; - definition->GetValue(string, *this); - return string; -} - -} -} diff --git a/libs/libRocket/Source/Core/PropertyDefinition.cpp b/libs/libRocket/Source/Core/PropertyDefinition.cpp deleted file mode 100644 index 0742e5cc709..00000000000 --- a/libs/libRocket/Source/Core/PropertyDefinition.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/PropertyDefinition.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/StyleSheetSpecification.h" - -namespace Rocket { -namespace Core { - -PropertyDefinition::PropertyDefinition(const String& _default_value, bool _inherited, bool _forces_layout) : default_value(_default_value, Property::UNKNOWN) -{ - inherited = _inherited; - forces_layout = _forces_layout; -} - -PropertyDefinition::~PropertyDefinition() -{ -} - -// Registers a parser to parse values for this definition. -PropertyDefinition& PropertyDefinition::AddParser(const String& parser_name, const String& parser_parameters) -{ - ParserState new_parser; - - // Fetch the parser. - new_parser.parser = StyleSheetSpecification::GetParser(parser_name); - if (new_parser.parser == NULL) - { - Log::Message(Log::LT_ERROR, "Property was registered with invalid parser '%s'.", parser_name.CString()); - return *this; - } - - // Split the parameter list, and set up the map. - if (!parser_parameters.Empty()) - { - StringList parameter_list; - StringUtilities::ExpandString(parameter_list, parser_parameters); - for (size_t i = 0; i < parameter_list.size(); i++) - new_parser.parameters[parameter_list[i]] = (int) i; - } - - parsers.push_back(new_parser); - - // If the default value has not been parsed successfully yet, run it through the new parser. - if (default_value.unit == Property::UNKNOWN) - { - String unparsed_value = default_value.value.Get< String >(); - if (!new_parser.parser->ParseValue(default_value, unparsed_value, new_parser.parameters)) - { - default_value.value.Set(unparsed_value); - default_value.unit = Property::UNKNOWN; - } - } - - return *this; -} - -// Called when parsing a RCSS declaration. -bool PropertyDefinition::ParseValue(Property& property, const String& value) const -{ - for (size_t i = 0; i < parsers.size(); i++) - { - if (parsers[i].parser->ParseValue(property, value, parsers[i].parameters)) - { - property.definition = this; - property.parser_index = (int) i; - return true; - } - } - - property.unit = Property::UNKNOWN; - return false; -} - -// Called to convert a parsed property back into a value. -bool PropertyDefinition::GetValue(String& value, const Property& property) const -{ - value = property.value.Get< String >(); - - switch (property.unit) - { - case Property::KEYWORD: - { - if (property.parser_index < 0 || property.parser_index >= (int) parsers.size()) - return false; - - int keyword = property.value.Get< int >(); - for (ParameterMap::const_iterator i = parsers[property.parser_index].parameters.begin(); i != parsers[property.parser_index].parameters.end(); ++i) - { - if ((*i).second == keyword) - { - value = (*i).first; - break; - } - } - - return false; - } - break; - - case Property::COLOUR: - { - Colourb colour = property.value.Get< Colourb >(); - value.FormatString(32, "rgb(%d,%d,%d,%d)", colour.red, colour.green, colour.blue, colour.alpha); - } - break; - - case Property::PX: value.Append("px"); break; - case Property::EM: value.Append("em"); break; - case Property::REM: value.Append("rem"); break; - case Property::PERCENT: value.Append("%"); break; - case Property::INCH: value.Append("in"); break; - case Property::CM: value.Append("cm"); break; - case Property::MM: value.Append("mm"); break; - case Property::PT: value.Append("pt"); break; - case Property::PC: value.Append("pc"); break; - default: break; - } - - return true; -} - -// Returns true if this property is inherited from a parent to child elements. -bool PropertyDefinition::IsInherited() const -{ - return inherited; -} - -// Returns true if this property forces a re-layout when changed. -bool PropertyDefinition::IsLayoutForced() const -{ - return forces_layout; -} - -// Returns the default for this property. -const Property* PropertyDefinition::GetDefaultValue() const -{ - return &default_value; -} - -} -} diff --git a/libs/libRocket/Source/Core/PropertyDictionary.cpp b/libs/libRocket/Source/Core/PropertyDictionary.cpp deleted file mode 100644 index 355277586f5..00000000000 --- a/libs/libRocket/Source/Core/PropertyDictionary.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/PropertyDictionary.h" - -namespace Rocket { -namespace Core { - -PropertyDictionary::PropertyDictionary() -{ -} - -PropertyDictionary::~PropertyDictionary() -{ -} - -// Sets a property on the dictionary. Any existing property with a similar name will be overwritten. -void PropertyDictionary::SetProperty(const String& name, const Property& property) -{ - properties[name] = property; -} - -// Removes a property from the dictionary, if it exists. -void PropertyDictionary::RemoveProperty(const String& name) -{ - properties.erase(name); -} - -// Returns the value of the property with the requested name, if one exists. -const Property* PropertyDictionary::GetProperty(const String& name) const -{ - PropertyMap::const_iterator iterator = properties.find(name); - if (iterator == properties.end()) - return NULL; - - return &(*iterator).second; -} - -// Returns the number of properties in the dictionary. -int PropertyDictionary::GetNumProperties() const -{ - return (int)properties.size(); -} - -// Returns the map of properties in the dictionary. -const PropertyMap& PropertyDictionary::GetProperties() const -{ - return properties; -} - -// Imports potentially un-specified properties into the dictionary. -void PropertyDictionary::Import(const PropertyDictionary& property_dictionary, int property_specificity) -{ - for (PropertyMap::const_iterator iterator = property_dictionary.properties.begin(); iterator != property_dictionary.properties.end(); ++iterator) - { - const Property& property = iterator->second; - SetProperty(iterator->first, property, property_specificity > 0 ? property_specificity : property.specificity); - } -} - -// Merges the contents of another fully-specified property dictionary with this one. -void PropertyDictionary::Merge(const PropertyDictionary& property_dictionary, int specificity_offset) -{ - for (PropertyMap::const_iterator iterator = property_dictionary.properties.begin(); iterator != property_dictionary.properties.end(); ++iterator) - { - const Property& property = iterator->second; - SetProperty(iterator->first, property, property.specificity + specificity_offset); - } -} - -// Sets a property on the dictionary and its specificity. -void PropertyDictionary::SetProperty(const String& name, const Rocket::Core::Property& property, int specificity) -{ - PropertyMap::iterator iterator = properties.find(name); - if (iterator != properties.end() && - iterator->second.specificity > specificity) - return; - - Property& new_property = (properties[name] = property); - new_property.specificity = specificity; -} - -} -} diff --git a/libs/libRocket/Source/Core/PropertyParserColour.cpp b/libs/libRocket/Source/Core/PropertyParserColour.cpp deleted file mode 100644 index 86bad13aa81..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserColour.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "PropertyParserColour.h" - -namespace Rocket { -namespace Core { - -PropertyParserColour::PropertyParserColour() -{ - html_colours["black"] = Colourb(0, 0, 0); - html_colours["silver"] = Colourb(192, 192, 192); - html_colours["gray"] = Colourb(128, 128, 128); - html_colours["grey"] = Colourb(128, 128, 128); - html_colours["white"] = Colourb(255, 255, 255); - html_colours["maroon"] = Colourb(128, 0, 0); - html_colours["red"] = Colourb(255, 0, 0); - html_colours["orange"] = Colourb(255, 165, 0); - html_colours["purple"] = Colourb(128, 0, 128); - html_colours["fuschia"] = Colourb(255, 0, 255); - html_colours["green"] = Colourb(0, 128, 0); - html_colours["lime"] = Colourb(0, 255, 0); - html_colours["olive"] = Colourb(128, 128, 0); - html_colours["yellow"] = Colourb(255, 255, 0); - html_colours["navy"] = Colourb(0, 0, 128); - html_colours["blue"] = Colourb(0, 0, 255); - html_colours["teal"] = Colourb(0, 128, 128); - html_colours["aqua"] = Colourb(0, 255, 255); - html_colours["transparent"] = Colourb(255, 255, 255, 0); -} - -PropertyParserColour::~PropertyParserColour() -{ -} - -// Called to parse a RCSS colour declaration. -bool PropertyParserColour::ParseValue(Property& property, const String& value, const ParameterMap& ROCKET_UNUSED_PARAMETER(parameters)) const -{ - ROCKET_UNUSED(parameters); - - if (value.Empty()) - return false; - - Colourb colour; - - // Check for a hex colour. - if (value[0] == '#') - { - char hex_values[4][2] = { {'f', 'f'}, - {'f', 'f'}, - {'f', 'f'}, - {'f', 'f'} }; - - switch (value.Length()) - { - // Single hex digit per channel, RGB and alpha. - case 5: hex_values[3][0] = hex_values[3][1] = value[4]; - - // Single hex digit per channel, RGB only. - case 4: hex_values[0][0] = hex_values[0][1] = value[1]; - hex_values[1][0] = hex_values[1][1] = value[2]; - hex_values[2][0] = hex_values[2][1] = value[3]; - break; - - // Two hex digits per channel, RGB and alpha. - case 9: hex_values[3][0] = value[7]; - hex_values[3][1] = value[8]; - - // Two hex digits per channel, RGB only. - case 7: memcpy(hex_values, &value.CString()[1], sizeof(char) * 6); - break; - - default: - return false; - } - - // Parse each of the colour elements. - for (int i = 0; i < 4; i++) - { - int tens = Math::HexToDecimal(hex_values[i][0]); - int ones = Math::HexToDecimal(hex_values[i][1]); - if (tens == -1 || - ones == -1) - return false; - - colour[i] = (byte) (tens * 16 + ones); - } - } - else if (value.Substring(0, 3) == "rgb") - { - StringList values; - - int find = (int)value.Find("(") + 1; - StringUtilities::ExpandString(values, value.Substring(find, value.RFind(")") - find), ','); - - // Check if we're parsing an 'rgba' or 'rgb' colour declaration. - if (value.Length() > 3 && value[3] == 'a') - { - if (values.size() != 4) - return false; - } - else - { - if (values.size() != 3) - return false; - - values.push_back("255"); - } - - // Parse the three RGB values. - for (int i = 0; i < 4; ++i) - { - int component; - - // We're parsing a percentage value. - if (values[i].Length() > 0 && values[i][values[i].Length() - 1] == '%') - component = Math::RealToInteger((float) (atof(values[i].Substring(0, values[i].Length() - 1).CString()) / 100.0f) * 255.0f); - // We're parsing a 0 -> 255 integer value. - else - component = atoi(values[i].CString()); - - colour[i] = (byte) (Math::Clamp(component, 0, 255)); - } - } - else - { - // Check for the specification of an HTML colour. - ColourMap::const_iterator iterator = html_colours.find(value); - if (iterator == html_colours.end()) - return false; - else - colour = (*iterator).second; - } - - property.value = Variant(colour); - property.unit = Property::COLOUR; - - return true; -} - -// Destroys the parser. -void PropertyParserColour::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/PropertyParserColour.h b/libs/libRocket/Source/Core/PropertyParserColour.h deleted file mode 100644 index cf52b3b9137..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserColour.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYPARSERCOLOUR_H -#define ROCKETCOREPROPERTYPARSERCOLOUR_H - -#include "../../Include/Rocket/Core/PropertyParser.h" -#include - -namespace Rocket { -namespace Core { - -/** - A property parser that parses a colour value. - - @author Peter Curry - */ - -class PropertyParserColour : public PropertyParser -{ -public: - PropertyParserColour(); - virtual ~PropertyParserColour(); - - /// Called to parse a RCSS colour declaration. - /// @param[out] property The property to set the parsed value on. - /// @param[in] value The raw value defined for this property. - /// @param[in] parameters The parameters defined for this property; not used for this parser. - /// @return True if the value was parsed successfully, false otherwise. - virtual bool ParseValue(Property& property, const String& value, const ParameterMap& parameters) const; - - /// Destroys the parser. - virtual void Release(); - -private: - typedef std::map< String, Colourb, StringUtilities::StringComparei > ColourMap; - ColourMap html_colours; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/PropertyParserKeyword.cpp b/libs/libRocket/Source/Core/PropertyParserKeyword.cpp deleted file mode 100644 index 638778539f5..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserKeyword.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "PropertyParserKeyword.h" - -namespace Rocket { -namespace Core { - -PropertyParserKeyword::PropertyParserKeyword() -{ -} - -PropertyParserKeyword::~PropertyParserKeyword() -{ -} - -// Called to parse a RCSS keyword declaration. -bool PropertyParserKeyword::ParseValue(Property& property, const String& value, const ParameterMap& parameters) const -{ - ParameterMap::const_iterator iterator = parameters.find(value); - if (iterator == parameters.end()) - return false; - - property.value = Variant((*iterator).second); - property.unit = Property::KEYWORD; - - return true; -} - -// Destroys the parser. -void PropertyParserKeyword::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/PropertyParserKeyword.h b/libs/libRocket/Source/Core/PropertyParserKeyword.h deleted file mode 100644 index 3466c6e0cd9..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserKeyword.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYPARSERKEYWORD_H -#define ROCKETCOREPROPERTYPARSERKEYWORD_H - -#include "../../Include/Rocket/Core/PropertyParser.h" - -namespace Rocket { -namespace Core { - -/** - A property parser that validates a value is part of a specified list of keywords. - - @author Peter Curry - */ - -class PropertyParserKeyword : public PropertyParser -{ -public: - PropertyParserKeyword(); - virtual ~PropertyParserKeyword(); - - /// Called to parse a RCSS keyword declaration. - /// @param[out] property The property to set the parsed value on. - /// @param[in] value The raw value defined for this property. - /// @param[in] parameters The parameters defined for this property. - /// @return True if the value was validated successfully, false otherwise. - virtual bool ParseValue(Property& property, const String& value, const ParameterMap& parameters) const; - - // Destroys the parser. - void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/PropertyParserNumber.cpp b/libs/libRocket/Source/Core/PropertyParserNumber.cpp deleted file mode 100644 index 5cda2a23ae5..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserNumber.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "PropertyParserNumber.h" - -namespace Rocket { -namespace Core { - -PropertyParserNumber::PropertyParserNumber() -{ - unit_suffixes.push_back(UnitSuffix(Property::PX, "px")); - unit_suffixes.push_back(UnitSuffix(Property::REM, "rem")); - unit_suffixes.push_back(UnitSuffix(Property::EM, "em")); - unit_suffixes.push_back(UnitSuffix(Property::INCH, "in")); - unit_suffixes.push_back(UnitSuffix(Property::CM, "cm")); - unit_suffixes.push_back(UnitSuffix(Property::MM, "mm")); - unit_suffixes.push_back(UnitSuffix(Property::PT, "pt")); - unit_suffixes.push_back(UnitSuffix(Property::PC, "pc")); - unit_suffixes.push_back(UnitSuffix(Property::PERCENT, "%")); -} - -PropertyParserNumber::~PropertyParserNumber() -{ -} - -// Called to parse a RCSS number declaration. -bool PropertyParserNumber::ParseValue(Property& property, const String& value, const ParameterMap& ROCKET_UNUSED_PARAMETER(parameters)) const -{ - ROCKET_UNUSED(parameters); - - // Default to a simple number. - property.unit = Property::NUMBER; - - // Check for a unit declaration at the end of the number. - for (size_t i = 0; i < unit_suffixes.size(); i++) - { - const UnitSuffix& unit_suffix = unit_suffixes[i]; - - if (value.Length() < unit_suffix.second.Length()) - continue; - - if (strcasecmp(value.CString() + (value.Length() - unit_suffix.second.Length()), unit_suffix.second.CString()) == 0) - { - property.unit = unit_suffix.first; - break; - } - } - - float float_value; - if (sscanf(value.CString(), "%f", &float_value) == 1) - { - property.value = Variant(float_value); - return true; - } - - return false; -} - -// Destroys the parser. -void PropertyParserNumber::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/PropertyParserNumber.h b/libs/libRocket/Source/Core/PropertyParserNumber.h deleted file mode 100644 index d3f2a535923..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserNumber.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYPARSERNUMBER_H -#define ROCKETCOREPROPERTYPARSERNUMBER_H - -#include "../../Include/Rocket/Core/PropertyParser.h" - -namespace Rocket { -namespace Core { - -/** - A property parser that parses a floating-point number with an optional unit. - - @author Peter Curry - */ - -class PropertyParserNumber : public PropertyParser -{ -public: - PropertyParserNumber(); - virtual ~PropertyParserNumber(); - - /// Called to parse a RCSS number declaration. - /// @param[out] property The property to set the parsed value on. - /// @param[in] value The raw value defined for this property. - /// @param[in] parameters The parameters defined for this property. - /// @return True if the value was validated successfully, false otherwise. - virtual bool ParseValue(Property& property, const String& value, const ParameterMap& parameters) const; - - // Destroys the parser. - void Release(); - -private: - // Stores a list of the numerical units and their suffixes. - typedef std::pair< Property::Unit, String > UnitSuffix; - std::vector< UnitSuffix > unit_suffixes; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/PropertyParserString.cpp b/libs/libRocket/Source/Core/PropertyParserString.cpp deleted file mode 100644 index 3e69b1c9bf1..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserString.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "PropertyParserString.h" - -namespace Rocket { -namespace Core { - -PropertyParserString::PropertyParserString() -{ -} - -PropertyParserString::~PropertyParserString() -{ -} - -// Called to parse a RCSS string declaration. -bool PropertyParserString::ParseValue(Property& property, const String& value, const ParameterMap& ROCKET_UNUSED_PARAMETER(parameters)) const -{ - ROCKET_UNUSED(parameters); - - property.value = Variant(value); - property.unit = Property::STRING; - - return true; -} - -// Destroys the parser. -void PropertyParserString::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/PropertyParserString.h b/libs/libRocket/Source/Core/PropertyParserString.h deleted file mode 100644 index 82e59347dbc..00000000000 --- a/libs/libRocket/Source/Core/PropertyParserString.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYPARSERSTRING_H -#define ROCKETCOREPROPERTYPARSERSTRING_H - -#include "../../Include/Rocket/Core/PropertyParser.h" - -namespace Rocket { -namespace Core { - -/** - A passthrough property parser that parses a string. - - @author Peter Curry - */ - -class PropertyParserString : public PropertyParser -{ -public: - PropertyParserString(); - virtual ~PropertyParserString(); - - /// Called to parse a RCSS string declaration. - /// @param[out] property The property to set the parsed value on. - /// @param[in] value The raw value defined for this property. - /// @param[in] parameters The parameters defined for this property; not used for this parser. - /// @return True if the value was validated successfully, false otherwise. - virtual bool ParseValue(Property& property, const String& value, const ParameterMap& parameters) const; - - // Destroys the parser. - void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/PropertyShorthandDefinition.h b/libs/libRocket/Source/Core/PropertyShorthandDefinition.h deleted file mode 100644 index f863b51da86..00000000000 --- a/libs/libRocket/Source/Core/PropertyShorthandDefinition.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPROPERTYSHORTHANDDEFINITION_H -#define ROCKETCOREPROPERTYSHORTHANDDEFINITION_H - -#include "../../Include/Rocket/Core/PropertySpecification.h" - -namespace Rocket { -namespace Core { - -class PropertyDefinition; - -/** - @author Peter Curry - */ - -struct PropertyShorthandDefinition -{ - typedef std::vector< std::pair< String, const PropertyDefinition* > > PropertyDefinitionList; - - PropertyDefinitionList properties; - PropertySpecification::ShorthandType type; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/PropertySpecification.cpp b/libs/libRocket/Source/Core/PropertySpecification.cpp deleted file mode 100644 index 3f9c2393e1a..00000000000 --- a/libs/libRocket/Source/Core/PropertySpecification.cpp +++ /dev/null @@ -1,481 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/PropertySpecification.h" -#include "PropertyShorthandDefinition.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/PropertyDefinition.h" -#include "../../Include/Rocket/Core/PropertyDictionary.h" -#include "../../Include/Rocket/Core/StyleSheetSpecification.h" - -namespace Rocket { -namespace Core { - -PropertySpecification::PropertySpecification() -{ -} - -PropertySpecification::~PropertySpecification() -{ - for (PropertyMap::iterator iterator = properties.begin(); iterator != properties.end(); ++iterator) - delete (*iterator).second; - - for (ShorthandMap::iterator iterator = shorthands.begin(); iterator != shorthands.end(); ++iterator) - delete (*iterator).second; -} - -// Registers a property with a new definition. -PropertyDefinition& PropertySpecification::RegisterProperty(const String& property_name, const String& default_value, bool inherited, bool forces_layout) -{ - String lower_case_name = property_name.ToLower(); - - // Create the property and validate the default value. - PropertyDefinition* property_definition = new PropertyDefinition(default_value, inherited, forces_layout); - - // Delete any existing property. - PropertyMap::iterator iterator = properties.find(lower_case_name); - if (iterator != properties.end()) - { - delete (*iterator).second; - } - else - { - property_names.insert(lower_case_name); - if (inherited) - { - inherited_property_names.insert(lower_case_name); - } - } - - properties[lower_case_name] = property_definition; - return *property_definition; -} - -// Returns a property definition. -const PropertyDefinition* PropertySpecification::GetProperty(const String& property_name) const -{ - PropertyMap::const_iterator iterator = properties.find(property_name); - if (iterator == properties.end()) - return NULL; - - return (*iterator).second; -} - -// Fetches a list of the names of all registered property definitions. -const PropertyNameList& PropertySpecification::GetRegisteredProperties(void) const -{ - return property_names; -} - -// Fetches a list of the names of all registered property definitions. -const PropertyNameList& PropertySpecification::GetRegisteredInheritedProperties(void) const -{ - return inherited_property_names; -} - -// Registers a shorthand property definition. -bool PropertySpecification::RegisterShorthand(const String& shorthand_name, const String& property_names, ShorthandType type) -{ - StringList properties; - StringUtilities::ExpandString(properties, property_names.ToLower()); - - if (properties.empty()) - return false; - - String lower_case_name = shorthand_name.ToLower(); - - // Construct the new shorthand definition and resolve its properties. - PropertyShorthandDefinition* property_shorthand = new PropertyShorthandDefinition(); - for (size_t i = 0; i < properties.size(); i++) - { - const PropertyDefinition* property = GetProperty(properties[i]); - if (property == NULL) - { - Log::Message(Log::LT_ERROR, "Shorthand property '%s' was registered with invalid property '%s'.", shorthand_name.CString(), properties[i].CString()); - delete property_shorthand; - - return false; - } - - property_shorthand->properties.push_back(PropertyShorthandDefinition::PropertyDefinitionList::value_type(properties[i], property)); - } - - if (type == AUTO) - { - if (properties.size() == 4 && - properties[0].Find("-top") != String::npos && - properties[1].Find("-right") != String::npos && - properties[2].Find("-bottom") != String::npos && - properties[3].Find("-left") != String::npos) - property_shorthand->type = BOX; - else - property_shorthand->type = FALL_THROUGH; - } - else - property_shorthand->type = type; - - shorthands[lower_case_name] = property_shorthand; - return true; -} - -// Returns a shorthand definition. -const PropertyShorthandDefinition* PropertySpecification::GetShorthand(const String& shorthand_name) const -{ - ShorthandMap::const_iterator iterator = shorthands.find(shorthand_name); - if (iterator == shorthands.end()) - return NULL; - - return (*iterator).second; -} - -// Parses a property declaration, setting any parsed and validated properties on the given dictionary. -bool PropertySpecification::ParsePropertyDeclaration(PropertyDictionary& dictionary, const String& property_name, const String& property_value, const String& source_file, int source_line_number) const -{ - String lower_case_name = property_name.ToLower(); - - // Attempt to parse as a single property. - const PropertyDefinition* property_definition = GetProperty(lower_case_name); - - StringList property_values; - if (!ParsePropertyValues(property_values, property_value, property_definition == NULL) || property_values.size() == 0) - return false; - - if (property_definition != NULL) - { - Property new_property; - new_property.source = source_file; - new_property.source_line_number = source_line_number; - if (property_definition->ParseValue(new_property, property_values[0])) - { - dictionary.SetProperty(lower_case_name, new_property); - return true; - } - - return false; - } - - // Try as a shorthand. - const PropertyShorthandDefinition* shorthand_definition = GetShorthand(lower_case_name); - if (shorthand_definition != NULL) - { - // If this definition is a 'box'-style shorthand (x-top, x-right, x-bottom, x-left, etc) and there are fewer - // than four values - if (shorthand_definition->type == BOX && - property_values.size() < 4) - { - switch (property_values.size()) - { - // Only one value is defined, so it is parsed onto all four sides. - case 1: - { - for (int i = 0; i < 4; i++) - { - Property new_property; - if (!shorthand_definition->properties[i].second->ParseValue(new_property, property_values[0])) - return false; - - new_property.source = source_file; - new_property.source_line_number = source_line_number; - dictionary.SetProperty(shorthand_definition->properties[i].first, new_property); - } - } - break; - - // Two values are defined, so the first one is parsed onto the top and bottom value, the second onto - // the left and right. - case 2: - { - // Parse the first value into the top and bottom properties. - Property new_property; - new_property.source = source_file; - new_property.source_line_number = source_line_number; - - if (!shorthand_definition->properties[0].second->ParseValue(new_property, property_values[0])) - return false; - dictionary.SetProperty(shorthand_definition->properties[0].first, new_property); - - if (!shorthand_definition->properties[2].second->ParseValue(new_property, property_values[0])) - return false; - dictionary.SetProperty(shorthand_definition->properties[2].first, new_property); - - // Parse the second value into the left and right properties. - if (!shorthand_definition->properties[1].second->ParseValue(new_property, property_values[1])) - return false; - dictionary.SetProperty(shorthand_definition->properties[1].first, new_property); - - if (!shorthand_definition->properties[3].second->ParseValue(new_property, property_values[1])) - return false; - dictionary.SetProperty(shorthand_definition->properties[3].first, new_property); - } - break; - - // Three values are defined, so the first is parsed into the top value, the second onto the left and - // right, and the third onto the bottom. - case 3: - { - // Parse the first value into the top property. - Property new_property; - new_property.source = source_file; - new_property.source_line_number = source_line_number; - - if (!shorthand_definition->properties[0].second->ParseValue(new_property, property_values[0])) - return false; - dictionary.SetProperty(shorthand_definition->properties[0].first, new_property); - - // Parse the second value into the left and right properties. - if (!shorthand_definition->properties[1].second->ParseValue(new_property, property_values[1])) - return false; - dictionary.SetProperty(shorthand_definition->properties[1].first, new_property); - - if (!shorthand_definition->properties[3].second->ParseValue(new_property, property_values[1])) - return false; - dictionary.SetProperty(shorthand_definition->properties[3].first, new_property); - - // Parse the third value into the bottom property. - if (!shorthand_definition->properties[2].second->ParseValue(new_property, property_values[2])) - return false; - dictionary.SetProperty(shorthand_definition->properties[2].first, new_property); - } - break; - - default: break; - } - } - else - { - size_t value_index = 0; - size_t property_index = 0; - - for (; value_index < property_values.size() && property_index < shorthand_definition->properties.size(); property_index++) - { - Property new_property; - new_property.source = source_file; - new_property.source_line_number = source_line_number; - - if (!shorthand_definition->properties[property_index].second->ParseValue(new_property, property_values[value_index])) - { - // This definition failed to parse; if we're falling through, try the next property. If there is no - // next property, then abort! - if (shorthand_definition->type == FALL_THROUGH) - { - if (property_index + 1 < shorthand_definition->properties.size()) - continue; - } - return false; - } - - dictionary.SetProperty(shorthand_definition->properties[property_index].first, new_property); - - // Increment the value index, unless we're replicating the last value and we're up to the last value. - if (shorthand_definition->type != REPLICATE || - value_index < property_values.size() - 1) - value_index++; - } - } - - return true; - } - - // Can't find it! Store as an unknown string value. - Property new_property(property_value, Property::UNKNOWN); - new_property.source = source_file; - new_property.source_line_number = source_line_number; - dictionary.SetProperty(lower_case_name, new_property); - - return true; -} - -// Sets all undefined properties in the dictionary to their defaults. -void PropertySpecification::SetPropertyDefaults(PropertyDictionary& dictionary) const -{ - for (PropertyMap::const_iterator i = properties.begin(); i != properties.end(); ++i) - { - if (dictionary.GetProperty((*i).first) == NULL) - dictionary.SetProperty((*i).first, *(*i).second->GetDefaultValue()); - } -} - -bool PropertySpecification::ParsePropertyValues(StringList& values_list, const String& values, bool split_values) const -{ - String value; - - enum ParseState { VALUE, VALUE_PARENTHESIS, VALUE_QUOTE }; - ParseState state = VALUE; - int open_parentheses = 0; - - size_t character_index = 0; - char previous_character = 0; - while (character_index < values.Length()) - { - char character = values[character_index]; - character_index++; - - switch (state) - { - case VALUE: - { - if (character == ';') - { - value = StringUtilities::StripWhitespace(value); - if (value.Length() > 0) - { - values_list.push_back(value); - value.Clear(); - } - } - else if (StringUtilities::IsWhitespace(character)) - { - if (split_values) - { - value = StringUtilities::StripWhitespace(value); - if (value.Length() > 0) - { - values_list.push_back(value); - value.Clear(); - } - } - else - value.Append(character); - } - else if (character == '"') - { - if (split_values) - { - value = StringUtilities::StripWhitespace(value); - if (value.Length() > 0) - { - values_list.push_back(value); - value.Clear(); - } - state = VALUE_QUOTE; - } - else - { - value.Append(' '); - state = VALUE_QUOTE; - } - } - else if (character == '(') - { - open_parentheses = 1; - value.Append(character); - state = VALUE_PARENTHESIS; - } - else - { - value.Append(character); - } - } - break; - - case VALUE_PARENTHESIS: - { - if (previous_character == '/') - { - if (character == ')' || character == '(') - value.Append(character); - else - { - value.Append('/'); - value.Append(character); - } - } - else - { - if (character == '(') - { - open_parentheses++; - value.Append(character); - } - else if (character == ')') - { - open_parentheses--; - value.Append(character); - if (open_parentheses == 0) - state = VALUE; - } - else if (character != '/') - { - value.Append(character); - } - } - } - break; - - case VALUE_QUOTE: - { - if (previous_character == '/') - { - if (character == '"') - value.Append(character); - else - { - value.Append('/'); - value.Append(character); - } - } - else - { - if (character == '"') - { - if (split_values) - { - value = StringUtilities::StripWhitespace(value); - if (value.Length() > 0) - { - values_list.push_back(value); - value.Clear(); - } - } - else - value.Append(' '); - state = VALUE; - } - else if (character != '/') - { - value.Append(character); - } - } - } - } - - previous_character = character; - } - - if (state == VALUE) - { - value = StringUtilities::StripWhitespace(value); - if (value.Length() > 0) - values_list.push_back(value); - } - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/ReferenceCountable.cpp b/libs/libRocket/Source/Core/ReferenceCountable.cpp deleted file mode 100644 index d93971a25b1..00000000000 --- a/libs/libRocket/Source/Core/ReferenceCountable.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/ReferenceCountable.h" - -namespace Rocket { -namespace Core { - -static int num_outstanding_objects = 0; - -// Constructor. -ReferenceCountable::ReferenceCountable(int initial_count) -{ - reference_count = initial_count; - ++num_outstanding_objects; -} - -// Destructor. The reference count must be 0 when this is invoked. -ReferenceCountable::~ReferenceCountable() -{ - ROCKET_ASSERT(reference_count == 0); - --num_outstanding_objects; -} - -// Returns the number of references outstanding against this object. -int ReferenceCountable::GetReferenceCount() -{ - return reference_count; -} - -// Adds a reference to the object. -void ReferenceCountable::AddReference() -{ - reference_count++; - if (reference_count == 1) - { - OnReferenceActivate(); - } -} - -// Removes a reference from the object. -void ReferenceCountable::RemoveReference() -{ - ROCKET_ASSERT(reference_count > 0); - reference_count--; - if (reference_count == 0) - { - OnReferenceDeactivate(); - } -} - -ReferenceCountable& ReferenceCountable::operator=(const ReferenceCountable& /*copy*/) -{ - ROCKET_ERRORMSG("Attempting to copy a reference counted object. This is not advisable."); - return *this; -} - -// If any reference countable objects are still allocated, this function will write a leak report to the log. -void ReferenceCountable::DumpLeakReport() -{ - if (num_outstanding_objects > 0) - Log::Message(Log::LT_WARNING, "%d %s still allocated.", num_outstanding_objects, num_outstanding_objects == 1 ? "object" : "objects"); -} - -// A hook method called when the reference count climbs from 0. -void ReferenceCountable::OnReferenceActivate() -{ -} - -// A hook method called when the reference count drops to 0. -void ReferenceCountable::OnReferenceDeactivate() -{ -} - -} -} diff --git a/libs/libRocket/Source/Core/RenderInterface.cpp b/libs/libRocket/Source/Core/RenderInterface.cpp deleted file mode 100644 index ce55afb7d98..00000000000 --- a/libs/libRocket/Source/Core/RenderInterface.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/RenderInterface.h" -#include "TextureDatabase.h" - -namespace Rocket { -namespace Core { - -RenderInterface::RenderInterface() : ReferenceCountable(0) -{ - context = NULL; -} - -RenderInterface::~RenderInterface() -{ -} - -// Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future. -CompiledGeometryHandle RenderInterface::CompileGeometry(Vertex* ROCKET_UNUSED_PARAMETER(vertices), int ROCKET_UNUSED_PARAMETER(num_vertices), int* ROCKET_UNUSED_PARAMETER(indices), int ROCKET_UNUSED_PARAMETER(num_indices), TextureHandle ROCKET_UNUSED_PARAMETER(texture)) -{ - ROCKET_UNUSED(vertices); - ROCKET_UNUSED(num_vertices); - ROCKET_UNUSED(indices); - ROCKET_UNUSED(num_indices); - ROCKET_UNUSED(texture); - - return 0; -} - -// Called by Rocket when it wants to render application-compiled geometry. -void RenderInterface::RenderCompiledGeometry(CompiledGeometryHandle ROCKET_UNUSED_PARAMETER(geometry), const Vector2f& ROCKET_UNUSED_PARAMETER(translation)) -{ - ROCKET_UNUSED(geometry); - ROCKET_UNUSED(translation); -} - -// Called by Rocket when it wants to release application-compiled geometry. -void RenderInterface::ReleaseCompiledGeometry(CompiledGeometryHandle ROCKET_UNUSED_PARAMETER(geometry)) -{ - ROCKET_UNUSED(geometry); -} - -// Called by Rocket when a texture is required by the library. -bool RenderInterface::LoadTexture(TextureHandle& ROCKET_UNUSED_PARAMETER(texture_handle), Vector2i& ROCKET_UNUSED_PARAMETER(texture_dimensions), const String& ROCKET_UNUSED_PARAMETER(source)) -{ - ROCKET_UNUSED(texture_handle); - ROCKET_UNUSED(texture_dimensions); - ROCKET_UNUSED(source); - - return false; -} - -// Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels. -bool RenderInterface::GenerateTexture(TextureHandle& ROCKET_UNUSED_PARAMETER(texture_handle), const byte* ROCKET_UNUSED_PARAMETER(source), const Vector2i& ROCKET_UNUSED_PARAMETER(source_dimensions), - int ROCKET_UNUSED_PARAMETER(source_samples)) -{ - ROCKET_UNUSED(texture_handle); - ROCKET_UNUSED(source); - ROCKET_UNUSED(source_dimensions); - ROCKET_UNUSED(source_samples); - - return false; -} - -// Called by Rocket when a loaded texture is no longer required. -void RenderInterface::ReleaseTexture(TextureHandle ROCKET_UNUSED_PARAMETER(texture)) -{ - ROCKET_UNUSED(texture); -} - -// Returns the native horizontal texel offset for the renderer. -float RenderInterface::GetHorizontalTexelOffset() -{ - return 0; -} - -// Returns the native vertical texel offset for the renderer. -float RenderInterface::GetVerticalTexelOffset() -{ - return 0; -} - -// Returns the number of pixels per inch. -float RenderInterface::GetPixelsPerInch() -{ - return 100; -} - -// Called when this render interface is released. -void RenderInterface::Release() -{ -} - -void RenderInterface::OnReferenceDeactivate() -{ - TextureDatabase::ReleaseTextures(this); - Release(); -} - -// Get the context currently being rendered. -Context* RenderInterface::GetContext() const -{ - return context; -} - -} -} diff --git a/libs/libRocket/Source/Core/Stream.cpp b/libs/libRocket/Source/Core/Stream.cpp deleted file mode 100644 index e88228b0961..00000000000 --- a/libs/libRocket/Source/Core/Stream.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Stream.h" -#include -#include - -namespace Rocket { -namespace Core { - -const size_t READ_BLOCK_SIZE = 1024; - -Stream::Stream() : ReferenceCountable(1) -{ - stream_mode = 0; -} - -Stream::~Stream() -{ -} - -void Stream::Close() -{ - stream_mode = 0; -} - -// Returns the mode the stream was opened in. -int Stream::GetStreamMode() const -{ - return stream_mode; -} - -// Returns the source url (if available) -const URL& Stream::GetSourceURL() const -{ - return url; -} - -bool Stream::IsEOS() const -{ - return Tell() >= Length(); -} - -size_t Stream::Peek(void* buffer, size_t bytes) const -{ - size_t pos = Tell(); - size_t read = Read( buffer, bytes ); - Seek( (long)pos, SEEK_SET ); - return read; -} - -// Read from one stream into another -size_t Stream::Read(Stream* stream, size_t bytes) const -{ - byte buffer[ READ_BLOCK_SIZE ]; - size_t total_bytes_read = 0; - while (total_bytes_read < bytes) - { - size_t bytes_read = this->Read(buffer, Core::Math::Min(READ_BLOCK_SIZE, bytes - total_bytes_read)); - if (bytes_read < 1) - return total_bytes_read; - stream->Write(buffer, bytes_read); - total_bytes_read += bytes_read; - } - return total_bytes_read; -} - -// Read from one stream into another -size_t Stream::Read(String& string, size_t bytes) const -{ - size_t string_size = string.Length(); - string.Resize(string_size + bytes + 1); - size_t read = Read(&string[string_size], bytes); - string[string_size + read] = '\0'; - string.Resize(string_size + read); - return read; -} - -/// Write to this stream from another stream -size_t Stream::Write(const Stream* stream, size_t bytes) -{ - return stream->Read(this, bytes); -} - -size_t Stream::Write(const char* string) -{ - return Write(string, strlen(string)); -} - -size_t Stream::Write(const String& string) -{ - return Write(string.CString(), string.Length()); -} - -// Push onto the front of the stream -size_t Stream::PushFront(const void* ROCKET_UNUSED_PARAMETER(buffer), size_t ROCKET_UNUSED_PARAMETER(bytes)) -{ - ROCKET_UNUSED(buffer); - ROCKET_UNUSED(bytes); - - ROCKET_ERRORMSG("No generic way to PushFront to a stream."); - return false; -} - -// Push onto the back of the stream -size_t Stream::PushBack(const void* buffer, size_t bytes) -{ - size_t pos = Tell(); - Seek(0, SEEK_END); - size_t wrote = Write(buffer, bytes); - Seek((long)pos, SEEK_SET); - return wrote; -} - -// Push onto the front of the stream -size_t Stream::PopFront(size_t ROCKET_UNUSED_PARAMETER(bytes)) -{ - ROCKET_UNUSED(bytes); - - ROCKET_ERRORMSG("No generic way to PopFront from a stream."); - return 0; -} - -// Push onto the back of the stream -size_t Stream::PopBack(size_t bytes) -{ - return Truncate(Length() - bytes); -} - -// Sets the mode on the stream; should be called by a stream when it is opened. -void Stream::SetStreamDetails(const URL& _url, int _stream_mode) -{ - url = _url; - stream_mode = _stream_mode; -} - -// Deletes the stream. -void Stream::OnReferenceDeactivate() -{ - Close(); - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/StreamFile.cpp b/libs/libRocket/Source/Core/StreamFile.cpp deleted file mode 100644 index 0d34b29fd01..00000000000 --- a/libs/libRocket/Source/Core/StreamFile.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StreamFile.h" -#include "../../Include/Rocket/Core/FileInterface.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -StreamFile::StreamFile() -{ - file_handle = 0; - length = 0; -} - -StreamFile::~StreamFile() -{ - if (file_handle) - Close(); -} - -/// Attempts to open the stream pointing at a given URL. -bool StreamFile::Open(const String& path) -{ - String url_safe_path = path.Replace(":", "|"); - SetStreamDetails(URL(url_safe_path), Stream::MODE_READ); - - if (file_handle) - Close(); - - // Fix the path if a leading colon has been replaced with a pipe. - String fixed_path = path.Replace("|", ":"); - file_handle = GetFileInterface()->Open(fixed_path); - if (!file_handle) - { - Log::Message(Log::LT_WARNING, "Unable to open file %s.", fixed_path.CString()); - return false; - } - - GetLength(); - - return true; -} - -// Closes the stream. -void StreamFile::Close() -{ - if (file_handle) - { - GetFileInterface()->Close(file_handle); - file_handle = 0; - } - - length = 0; -} - -/// Returns the size of this stream (in bytes). -size_t StreamFile::Length() const -{ - return length; -} - -// Returns the position of the stream pointer (in bytes). -size_t StreamFile::Tell() const -{ - return GetFileInterface()->Tell(file_handle); -} - -// Sets the stream position (in bytes). -bool StreamFile::Seek(long offset, int origin) const -{ - return GetFileInterface()->Seek(file_handle, offset, origin); -} - -// Read from the stream. -size_t StreamFile::Read(void* buffer, size_t bytes) const -{ - return GetFileInterface()->Read(buffer, bytes, file_handle); -} - -// Write to the stream at the current position. -size_t StreamFile::Write(const void* ROCKET_UNUSED_PARAMETER(buffer), size_t ROCKET_UNUSED_PARAMETER(bytes)) -{ - ROCKET_UNUSED(buffer); - ROCKET_UNUSED(bytes); - - ROCKET_ERROR; - return 0; -} - -// Truncate the stream to the specified length. -size_t StreamFile::Truncate(size_t ROCKET_UNUSED_PARAMETER(bytes)) -{ - ROCKET_UNUSED(bytes); - - ROCKET_ERROR; - return 0; -} - -// Returns true if the stream is ready for reading, false otherwise. -bool StreamFile::IsReadReady() -{ - return Tell() < Length(); -} - -// Returns true if the stream is ready for writing, false otherwise. -bool StreamFile::IsWriteReady() -{ - return false; -} -// Determines the length of the stream. -void StreamFile::GetLength() -{ - length = GetFileInterface()->Length(file_handle); -} - -} -} diff --git a/libs/libRocket/Source/Core/StreamFile.h b/libs/libRocket/Source/Core/StreamFile.h deleted file mode 100644 index 4b048c07503..00000000000 --- a/libs/libRocket/Source/Core/StreamFile.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTREAMFILE_H -#define ROCKETCORESTREAMFILE_H - -#include "../../Include/Rocket/Core/Stream.h" -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class StreamFile : public Stream -{ -public: - StreamFile(); - virtual ~StreamFile(); - - /// Attempts to open the stream pointing at a given location. - bool Open(const String& path); - /// Closes the stream. - virtual void Close(); - - /// Returns the size of this stream (in bytes). - virtual size_t Length() const; - - /// Returns the position of the stream pointer (in bytes). - virtual size_t Tell() const; - /// Sets the stream position (in bytes). - virtual bool Seek(long offset, int origin) const; - - /// Read from the stream. - virtual size_t Read(void* buffer, size_t bytes) const; - using Stream::Read; - - /// Write to the stream at the current position. - virtual size_t Write(const void* buffer, size_t bytes); - using Stream::Write; - - /// Truncate the stream to the specified length. - virtual size_t Truncate(size_t bytes); - - /// Returns true if the stream is ready for reading, false otherwise. - virtual bool IsReadReady(); - /// Returns false. - virtual bool IsWriteReady(); - -private: - // Determines the length of the stream. - void GetLength(); - - FileHandle file_handle; - size_t length; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StreamMemory.cpp b/libs/libRocket/Source/Core/StreamMemory.cpp deleted file mode 100644 index 61eab1e8d14..00000000000 --- a/libs/libRocket/Source/Core/StreamMemory.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/StreamMemory.h" -#include - -namespace Rocket { -namespace Core { - -const int DEFAULT_BUFFER_SIZE = 256; -const int BUFFER_INCREMENTS = 256; - -StreamMemory::StreamMemory() -{ - buffer = NULL; - buffer_ptr = NULL; - buffer_size = 0; - buffer_used = 0; - owns_buffer = true; - Reallocate(DEFAULT_BUFFER_SIZE); -} - -StreamMemory::StreamMemory(size_t initial_size) -{ - buffer = NULL; - buffer_ptr = NULL; - buffer_size = 0; - buffer_used = 0; - owns_buffer = true; - Reallocate(initial_size); -} - -StreamMemory::StreamMemory(const byte* _buffer, size_t _buffer_size) -{ - buffer = (byte*)_buffer; - buffer_size = _buffer_size; - buffer_used = _buffer_size; - owns_buffer = false; - buffer_ptr = buffer; -} - -StreamMemory::StreamMemory(const StreamMemory& copy) : Stream(copy) -{ - buffer = NULL; - buffer_ptr = NULL; - buffer_size = 0; - buffer_used = 0; - owns_buffer = true; - - // Copy the buffer and pointer offsets - Reallocate( ( ( copy.buffer_used + BUFFER_INCREMENTS ) / BUFFER_INCREMENTS ) * BUFFER_INCREMENTS ); - ROCKET_ASSERTMSG(buffer != NULL, "Could not allocate buffer for StreamMemory reader."); - if(buffer != NULL) - { - memcpy( buffer, copy.buffer, copy.buffer_used ); - buffer_ptr = buffer + ( copy.buffer_ptr - copy.buffer ); - } -} - -StreamMemory::~StreamMemory() -{ - if ( owns_buffer ) - free( buffer ); -} - -StreamMemory& StreamMemory::operator=( const StreamMemory& copy ) -{ - // Copy the buffer and pointer offsets - Reallocate( ( ( copy.buffer_used + BUFFER_INCREMENTS ) / BUFFER_INCREMENTS ) * BUFFER_INCREMENTS ); - memcpy( buffer, copy.buffer, copy.buffer_used ); - buffer_ptr = buffer + ( copy.buffer_ptr - copy.buffer ); - - return *this; -} - -void StreamMemory::Close() -{ - Stream::Close(); -} - -bool StreamMemory::IsEOS() const -{ - return buffer_ptr >= buffer + buffer_used; -} - -// Get current offset -size_t StreamMemory::Tell() const -{ - return buffer_ptr - buffer; -} - -size_t StreamMemory::Length() const -{ - return buffer_used; -} - -// Read bytes from the buffer, advancing the internal pointer -size_t StreamMemory::Read(void *_buffer, size_t bytes) const -{ - bytes = Math::ClampUpper(bytes, (size_t) (buffer + buffer_used - buffer_ptr)); - - memcpy(_buffer, buffer_ptr, bytes); - - buffer_ptr += bytes; - - return bytes; -} - -// Read bytes from the buffer, not advancing the internal pointer -size_t StreamMemory::Peek( void *_buffer, size_t bytes ) const -{ - bytes = Math::ClampUpper(bytes, (size_t) (buffer + buffer_used - buffer_ptr)); - - memcpy(_buffer, buffer_ptr, bytes); - - return bytes; -} - -// Read bytes from the buffer, advancing the internal pointer -size_t StreamMemory::Write( const void *_buffer, size_t bytes ) -{ - if ( buffer_ptr + bytes > buffer + buffer_size ) - if ( !Reallocate( bytes + BUFFER_INCREMENTS ) ) - return 0; - - memcpy( buffer_ptr, _buffer, bytes ); - - buffer_ptr += bytes; - buffer_used = Math::Max( (size_t)(buffer_ptr - buffer), buffer_used ); - - return bytes; -} - -// Truncate the stream to the specified length -size_t StreamMemory::Truncate( size_t bytes ) -{ - if ( bytes > buffer_used ) - return 0; - - size_t old_size = buffer_used; - buffer_used = bytes; - buffer_ptr = buffer + bytes; - return old_size - buffer_used; -} - -// Set pointer to the specified offset -bool StreamMemory::Seek( long offset, int origin ) const -{ - byte* new_ptr = NULL; - - switch ( origin ) - { - case SEEK_SET: - new_ptr = buffer + offset; - break; - case SEEK_END: - new_ptr = buffer + ( buffer_used - offset ); - break; - case SEEK_CUR: - new_ptr = buffer_ptr + offset; - } - - // Check of overruns - if ( new_ptr < buffer || new_ptr > buffer + buffer_used ) - return false; - - buffer_ptr = new_ptr; - - return true; -} - -size_t StreamMemory::PushFront( const void* _buffer, size_t bytes ) -{ - if ( buffer_used + bytes > buffer_size ) - if ( !Reallocate( bytes + BUFFER_INCREMENTS ) ) - return 0; - - memmove( &buffer[ bytes ], &buffer[ 0 ], buffer_used ); - memcpy( buffer, _buffer, bytes ); - buffer_used += bytes; - buffer_ptr += bytes; - return bytes; -} - -size_t StreamMemory::PopFront( size_t bytes ) -{ - Erase( 0, bytes ); - buffer_ptr -= bytes; - buffer_ptr = Math::ClampLower(buffer_ptr, buffer); - return bytes; -} - -const byte* StreamMemory::RawStream() const -{ - return buffer; -} - -void StreamMemory::Erase( size_t offset, size_t bytes ) -{ - bytes = Math::ClampUpper(bytes, buffer_used - offset); - memmove(&buffer[offset], &buffer[offset + bytes], buffer_used - offset - bytes); - buffer_used -= bytes; -} - -bool StreamMemory::IsReadReady() -{ - return !IsEOS(); -} - -bool StreamMemory::IsWriteReady() -{ - return true; -} - -void StreamMemory::SetSourceURL(const URL& url) -{ - SetStreamDetails(url, Stream::MODE_READ | (owns_buffer ? Stream::MODE_WRITE : 0)); -} - -// Resize the buffer -bool StreamMemory::Reallocate( size_t size ) -{ - ROCKET_ASSERT( owns_buffer ); - if ( !owns_buffer ) - return false; - - byte *new_buffer = (byte*)realloc( buffer, buffer_size + size ); - if ( new_buffer == NULL ) - return false; - - buffer_ptr = new_buffer + ( buffer_ptr - buffer ); - - buffer = new_buffer; - buffer_size += size; - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/String.cpp b/libs/libRocket/Source/Core/String.cpp deleted file mode 100644 index a09e9531b34..00000000000 --- a/libs/libRocket/Source/Core/String.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/String.h" -#include "../../Include/Rocket/Core/StringBase.h" - -namespace Rocket { -namespace Core { - -int ROCKETCORE_API RocketStringFormatString(StringBase& string, int max_size, const char* format, va_list argument_list) -{ - const int INTERNAL_BUFFER_SIZE = 1024; - static char buffer[INTERNAL_BUFFER_SIZE]; - char* buffer_ptr = buffer; - - if (max_size + 1 > INTERNAL_BUFFER_SIZE) - buffer_ptr = new char[max_size + 1]; - - int length = vsnprintf(buffer_ptr, max_size, format, argument_list); - buffer_ptr[length >= 0 ? length : max_size] = '\0'; - #ifdef ROCKET_DEBUG - if (length == -1) - { - Log::Message(Log::LT_WARNING, "String::sprintf: String truncated to %d bytes when processing %s", max_size, format); - } - #endif - - string = buffer_ptr; - - if (buffer_ptr != buffer) - delete[] buffer_ptr; - - return length; -} - -template <> -StringBase::StringBase(StringBase::size_type max_size, const char* fmt, ...) : value(local_buffer), buffer_size(LOCAL_BUFFER_SIZE), length(0), hash(0) -{ - va_list argument_list; - va_start(argument_list, fmt); - - RocketStringFormatString(*this, (int)max_size, fmt, argument_list); - - va_end(argument_list); -} - -template <> -int StringBase::FormatString(StringBase::size_type max_size, const char* fmt, ...) -{ - va_list argument_list; - va_start(argument_list, fmt); - - int length = RocketStringFormatString(*this, (int)max_size, fmt, argument_list); - - va_end(argument_list); - - return length; -} - -String operator+(const char* cstring, const String& string) -{ - return String(cstring) + string; -} - -//#define ENABLE_STRING_TESTS -#ifdef ENABLE_STRING_TESTS -#include -#include "Rocket/Core/SystemInterface.h" -ROCKETCORE_API void StringTests() -{ - SystemInterface* sys = Rocket::Core::GetSystemInterface(); - - std::string ss = "test"; - String es = "test"; - - es = "hello"; - es.Resize(100); - es.Erase(4); - es.Erase(2,100); - es += "y"; - - String sub1 = es.Replace("lo", "l"); - sub1 = sub1.Replace("h", "!"); - ROCKET_ASSERT(sub1 == "!el"); - - Time start; - - { - // Create a few free buffers - String tempstring("buffer"); - String tempstring1("buffer1"); - String tempstring2("buffer2"); - } - - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - std::string str("test"); - } - printf( "SS Assign Short: %f\n", sys->GetElapsedTime() - start); - - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - String str("test"); - } - printf( "ES Assign Short: %f\n", sys->GetElapsedTime() - start); - - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - std::string str("test this really long string that won't fit in a local buffer"); - } - printf( "SS Assign Long: %f\n", sys->GetElapsedTime() - start); - - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - String str("test this really long string that won't fit in a local buffer"); - } - printf( "ES Assign Long: %f\n", sys->GetElapsedTime() - start); - - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - if (ss == "hello") - { - int bob = 10; - } - } - printf( "SS Compare: %f (char*)\n", sys->GetElapsedTime() - start); - - ss = "bo1"; - std::string oss = ss; - std::string nss = "bob"; - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - //if (ss == oss) - { - int bob = 10; - } - if (ss == nss) - { - int bob = 10; - } - } - printf( "SS Compare: %f (std::string)\n", sys->GetElapsedTime() - start); - - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - if (es == "hello") - { - int bob = 10; - } - } - printf( "ES Compare: %f (char*)\n", sys->GetElapsedTime() - start); - - es = "bo1"; - String oes = es; - String nes = "bob"; - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - //if (es == oes) - { - int bob = 10; - } - - if (nes == oes) - { - int bob = 10; - } - } - printf( "ES Compare: %f (String)\n", sys->GetElapsedTime() - start); - - start = sys->GetElapsedTime(); - std::string ss_concat = "hello"; - for (int i = 0; i < 100000; i++) - { - ss_concat += "y"; - } - printf( "SS +=: %f\n", sys->GetElapsedTime() - start); - - String es_concat = "hello"; - start = sys->GetElapsedTime(); - for (int i = 0; i < 100000; i++) - { - if (i == 42) - { - int bob = 10; - } - es_concat += "y"; - } - printf( "ES +=: %f\n", sys->GetElapsedTime() - start); - - const char* x1 = "bob"; - String s; - String t; - String u; - s = "hello"; - t = "hell"; - u = "hello"; - if (s == t) - { - int bob = 10; - } - if (s == u) - { - int bob = 10; - } - - t = s + u; - if (t == "hellohello") - { - int bob = 10; - } - if (t == "x") - { - int bob = 10; - } - - t += u; - - - size_t x = s.Find("e"); - size_t y = s.Find("z"); - - String sub = t.Replace("lo", "l"); - sub = sub.Replace("h", "!"); - - sub.FormatString(128, "%s", "hello"); - int bob = 10; -} -#endif - -} -} - -/*namespace std { - -ROCKETCORE_API size_t hash< String >::operator()(const String& string) const -{ - return StringUtilities::FNVHash(string.CString()); -} - -}*/ diff --git a/libs/libRocket/Source/Core/StringCache.cpp b/libs/libRocket/Source/Core/StringCache.cpp deleted file mode 100644 index 78cf934dd6c..00000000000 --- a/libs/libRocket/Source/Core/StringCache.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" - -namespace Rocket { -namespace Core { - -const String MARGIN_TOP = "margin-top"; -const String MARGIN_RIGHT = "margin-right"; -const String MARGIN_BOTTOM = "margin-bottom"; -const String MARGIN_LEFT = "margin-left"; -const String MARGIN = "margin"; -const String PADDING_TOP = "padding-top"; -const String PADDING_RIGHT = "padding-right"; -const String PADDING_BOTTOM = "padding-bottom"; -const String PADDING_LEFT = "padding-left"; -const String PADDING = "padding"; -const String BORDER_TOP_WIDTH = "border-top-width"; -const String BORDER_RIGHT_WIDTH = "border-right-width"; -const String BORDER_BOTTOM_WIDTH = "border-bottom-width"; -const String BORDER_LEFT_WIDTH = "border-left-width"; -const String BORDER_WIDTH = "border-width"; -const String BORDER_TOP_COLOR = "border-top-color"; -const String BORDER_RIGHT_COLOR = "border-right-color"; -const String BORDER_BOTTOM_COLOR = "border-bottom-color"; -const String BORDER_LEFT_COLOR = "border-left-color"; -const String BORDER_COLOR = "border-color"; -const String BORDER_TOP = "border-top"; -const String BORDER_RIGHT = "border-right"; -const String BORDER_BOTTOM = "border-bottom"; -const String BORDER_LEFT = "border-left"; -const String DISPLAY = "display"; -const String POSITION = "position"; -const String TOP = "top"; -const String RIGHT = "right"; -const String BOTTOM = "bottom"; -const String LEFT = "left"; -const String FLOAT = "float"; -const String CLEAR = "clear"; -const String Z_INDEX = "z-index"; -const String WIDTH = "width"; -const String MIN_WIDTH = "min-width"; -const String MAX_WIDTH = "max-width"; -const String HEIGHT = "height"; -const String MIN_HEIGHT = "min-height"; -const String MAX_HEIGHT = "max-height"; -const String LINE_HEIGHT = "line-height"; -const String VERTICAL_ALIGN = "vertical-align"; -const String OVERFLOW_X = "overflow-x"; -const String OVERFLOW_Y = "overflow-y"; -const String CLIP = "clip"; -const String VISIBILITY = "visibility"; -const String BACKGROUND_COLOR = "background-color"; -const String BACKGROUND = "background"; -const String COLOR = "color"; -const String FONT_FAMILY = "font-family"; -const String FONT_CHARSET = "font-charset"; -const String FONT_STYLE = "font-style"; -const String FONT_WEIGHT = "font-weight"; -const String FONT_SIZE = "font-size"; -const String FONT = "font"; -const String TEXT_ALIGN = "text-align"; -const String TEXT_DECORATION = "text-decoration"; -const String TEXT_TRANSFORM = "text-transform"; -const String WHITE_SPACE = "white-space"; -const String CURSOR = "cursor"; -const String DRAG = "drag"; -const String TAB_INDEX = "tab-index"; -const String SCROLLBAR_MARGIN = "scrollbar-margin"; -const String OPACITY = "opacity"; - -const String MOUSEDOWN = "mousedown"; -const String MOUSESCROLL = "mousescroll"; -const String MOUSEOVER = "mouseover"; -const String MOUSEOUT = "mouseout"; -const String FOCUS = "focus"; -const String BLUR = "blur"; -const String KEYDOWN = "keydown"; -const String MOUSEUP = "mouseup"; -const String CLICK = "click"; -const String DRAGSTART = "dragstart"; -const String DRAGOVER = "dragover"; -const String LOAD = "load"; -const String UNLOAD = "unload"; -const String KEYUP = "keyup"; -const String TEXTINPUT = "textinput"; -const String MOUSEMOVE = "mousemove"; -const String DRAGMOVE = "dragmove"; -const String DBLCLICK = "dblclick"; -const String DRAGDROP = "dragdrop"; -const String DRAGOUT = "dragout"; -const String DRAGEND = "dragend"; -const String RESIZE = "resize"; - -} -} diff --git a/libs/libRocket/Source/Core/StringCache.h b/libs/libRocket/Source/Core/StringCache.h deleted file mode 100644 index f79d683e4b1..00000000000 --- a/libs/libRocket/Source/Core/StringCache.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTRINGCACHE_H -#define ROCKETCORESTRINGCACHE_H - -#include "../../Include/Rocket/Core/String.h" - -namespace Rocket { -namespace Core { - -extern const String MARGIN_TOP; -extern const String MARGIN_RIGHT; -extern const String MARGIN_BOTTOM; -extern const String MARGIN_LEFT; -extern const String MARGIN; -extern const String PADDING_TOP; -extern const String PADDING_RIGHT; -extern const String PADDING_BOTTOM; -extern const String PADDING_LEFT; -extern const String PADDING; -extern const String BORDER_TOP_WIDTH; -extern const String BORDER_RIGHT_WIDTH; -extern const String BORDER_BOTTOM_WIDTH; -extern const String BORDER_LEFT_WIDTH; -extern const String BORDER_WIDTH; -extern const String BORDER_TOP_COLOR; -extern const String BORDER_RIGHT_COLOR; -extern const String BORDER_BOTTOM_COLOR; -extern const String BORDER_LEFT_COLOR; -extern const String BORDER_COLOR; -extern const String BORDER_TOP; -extern const String BORDER_RIGHT; -extern const String BORDER_BOTTOM; -extern const String BORDER_LEFT; -extern const String DISPLAY; -extern const String POSITION; -extern const String TOP; -extern const String RIGHT; -extern const String BOTTOM; -extern const String LEFT; -extern const String FLOAT; -extern const String CLEAR; -extern const String Z_INDEX; -extern const String WIDTH; -extern const String MIN_WIDTH; -extern const String MAX_WIDTH; -extern const String HEIGHT; -extern const String MIN_HEIGHT; -extern const String MAX_HEIGHT; -extern const String LINE_HEIGHT; -extern const String VERTICAL_ALIGN; -extern const String OVERFLOW_X; -extern const String OVERFLOW_Y; -extern const String CLIP; -extern const String VISIBILITY; -extern const String BACKGROUND_COLOR; -extern const String BACKGROUND; -extern const String COLOR; -extern const String FONT_FAMILY; -extern const String FONT_CHARSET; -extern const String FONT_STYLE; -extern const String FONT_WEIGHT; -extern const String FONT_SIZE; -extern const String FONT; -extern const String TEXT_ALIGN; -extern const String TEXT_DECORATION; -extern const String TEXT_TRANSFORM; -extern const String WHITE_SPACE; -extern const String CURSOR; -extern const String DRAG; -extern const String TAB_INDEX; -extern const String SCROLLBAR_MARGIN; -extern const String OPACITY; - -extern const String MOUSEDOWN; -extern const String MOUSESCROLL; -extern const String MOUSEOVER; -extern const String MOUSEOUT; -extern const String FOCUS; -extern const String BLUR; -extern const String KEYDOWN; -extern const String MOUSEUP; -extern const String CLICK; -extern const String DRAGSTART; -extern const String LOAD; -extern const String UNLOAD; -extern const String KEYUP; -extern const String TEXTINPUT; -extern const String MOUSEMOVE; -extern const String DRAGMOVE; -extern const String DBLCLICK; -extern const String DRAGDROP; -extern const String DRAGOUT; -extern const String DRAGEND; -extern const String DRAGOVER; -extern const String RESIZE; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StringUtilities.cpp b/libs/libRocket/Source/Core/StringUtilities.cpp deleted file mode 100644 index 9db42a857ff..00000000000 --- a/libs/libRocket/Source/Core/StringUtilities.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/StringUtilities.h" -#include -#include - -namespace Rocket { -namespace Core { - -// Expands character-delimited list of values in a single string to a whitespace-trimmed list of values. -void StringUtilities::ExpandString(StringList& string_list, const String& string, const char delimiter) -{ - char quote = 0; - bool last_char_delimiter = true; - const char* ptr = string.CString(); - const char* start_ptr = NULL; - const char* end_ptr = ptr; - - while (*ptr) - { - // Switch into quote mode if the last char was a delimeter ( excluding whitespace ) - // and we're not already in quote mode - if (last_char_delimiter && !quote && (*ptr == '"' || *ptr == '\'')) - { - quote = *ptr; - } - // Switch out of quote mode if we encounter a quote that hasn't been escaped - else if (*ptr == quote && *(ptr-1) != '\\') - { - quote = 0; - } - // If we encouter a delimiter while not in quote mode, add the item to the list - else if (*ptr == delimiter && !quote) - { - if (start_ptr) - string_list.push_back(String(start_ptr, end_ptr + 1)); - else - string_list.push_back(""); - last_char_delimiter = true; - start_ptr = NULL; - } - // Otherwise if its not white space or we're in quote mode, advance the pointers - else if (!isspace(*ptr) || quote) - { - if (!start_ptr) - start_ptr = ptr; - end_ptr = ptr; - last_char_delimiter = false; - } - - ptr++; - } - - // If there's data pending, add it. - if (start_ptr) - string_list.push_back(String(start_ptr, end_ptr + 1)); -} - -// Joins a list of string values into a single string separated by a character delimiter. -void StringUtilities::JoinString(String& string, const StringList& string_list, const char delimiter) -{ - for (size_t i = 0; i < string_list.size(); i++) - { - string += string_list[i]; - if (delimiter != '\0' && i < string_list.size() - 1) - string.Append(delimiter); - } -} - -// Hashes a string of data to an integer value using the FNV algorithm. -Hash StringUtilities::FNVHash(const char *string, int length) -{ - // FNV-1 hash algorithm - Hash hval = 0; - unsigned char* bp = (unsigned char *)string; // start of buffer - unsigned char* be = (unsigned char *)string + length; - - // FNV-1 hash each octet in the buffer - while (*bp || (length >= 0 && bp < be)) - { - // xor the bottom with the current octet - hval ^= *bp++; - - /* multiply by the 32 bit FNV magic prime mod 2^32 */ -#if !defined(__GNUC__) - const unsigned int FNV_32_PRIME = ((unsigned int)16777619); - hval *= FNV_32_PRIME; -#else - hval += (hval<<1) + (hval<<4) + (hval<<7) + (hval<<8) + (hval<<24); -#endif - } - - return hval; -} - - // Defines, helper functions for the UTF8 / UCS2 conversion functions. -#define _NXT 0x80 -#define _SEQ2 0xc0 -#define _SEQ3 0xe0 -#define _SEQ4 0xf0 -#define _SEQ5 0xf8 -#define _SEQ6 0xfc - -#define _BOM 0xfeff - -static int __wchar_forbidden(unsigned int sym) -{ - // Surrogate pairs - if (sym >= 0xd800 && sym <= 0xdfff) - return -1; - - return 0; -} - -static int __utf8_forbidden(unsigned char octet) -{ - switch (octet) - { - case 0xc0: - case 0xc1: - case 0xf5: - case 0xff: - return -1; - - default: - return 0; - } -} - - - -// Converts a character array in UTF-8 encoding to a vector of words. -bool StringUtilities::UTF8toUCS2(const String& input, std::vector< word >& output) -{ - if (input.Empty()) - return true; - - unsigned char* p = (unsigned char*) input.CString(); - unsigned char* lim = p + input.Length(); - - // Skip the UTF-8 byte order marker if it exists. - if (input.Substring(0, 3) == "\xEF\xBB\xBF") - p += 3; - - int num_bytes; - for (; p < lim; p += num_bytes) - { - if (__utf8_forbidden(*p) != 0) - return false; - - // Get number of bytes for one wide character. - word high; - num_bytes = 1; - - if ((*p & 0x80) == 0) - { - high = (wchar_t)*p; - } - else if ((*p & 0xe0) == _SEQ2) - { - num_bytes = 2; - high = (wchar_t)(*p & 0x1f); - } - else if ((*p & 0xf0) == _SEQ3) - { - num_bytes = 3; - high = (wchar_t)(*p & 0x0f); - } - else if ((*p & 0xf8) == _SEQ4) - { - num_bytes = 4; - high = (wchar_t)(*p & 0x07); - } - else if ((*p & 0xfc) == _SEQ5) - { - num_bytes = 5; - high = (wchar_t)(*p & 0x03); - } - else if ((*p & 0xfe) == _SEQ6) - { - num_bytes = 6; - high = (wchar_t)(*p & 0x01); - } - else - { - return false; - } - - // Does the sequence header tell us the truth about length? - if (lim - p <= num_bytes - 1) - { - return false; - } - - // Validate the sequence. All symbols must have higher bits set to 10xxxxxx. - if (num_bytes > 1) - { - int i; - for (i = 1; i < num_bytes; i++) - { - if ((p[i] & 0xc0) != _NXT) - break; - } - - if (i != num_bytes) - { - return false; - } - } - - // Make up a single UCS-4 (32-bit) character from the required number of UTF-8 tokens. The first byte has - // been determined earlier, the second and subsequent bytes contribute the first six of their bits into the - // final character code. - unsigned int ucs4_char = 0; - int num_bits = 0; - for (int i = 1; i < num_bytes; i++) - { - ucs4_char |= (word)(p[num_bytes - i] & 0x3f) << num_bits; - num_bits += 6; - } - ucs4_char |= high << num_bits; - - // Check for surrogate pairs. - if (__wchar_forbidden(ucs4_char) != 0) - { - return false; - } - - // Only add the character to the output if it exists in the Basic Multilingual Plane (ie, fits in a single - // word). - if (ucs4_char <= 0xffff) - output.push_back((word) ucs4_char); - } - - output.push_back(0); - return true; -} - -// Converts a vector of words in UCS-2 encoding a character array in UTF-8 encoding. -bool StringUtilities::UCS2toUTF8(const std::vector< word >& input, String& output) -{ - return UCS2toUTF8(&input[0], input.size(), output); -} - -// Converts an array of words in UCS-2 encoding into a character array in UTF-8 encoding. -bool StringUtilities::UCS2toUTF8(const word* input, size_t input_size, String& output) -{ - unsigned char *oc; - size_t n; - - word* w = (word*) input; - word* wlim = w + input_size; - - //Log::Message(LC_CORE, Log::LT_ALWAYS, "UCS2TOUTF8 size: %d", input_size); - for (; w < wlim; w++) - { - if (__wchar_forbidden(*w) != 0) - return false; - - if (*w == _BOM) - continue; - - //if (*w < 0) - // return false; - if (*w <= 0x007f) - n = 1; - else if (*w <= 0x07ff) - n = 2; - else //if (*w <= 0x0000ffff) - n = 3; - /*else if (*w <= 0x001fffff) - n = 4; - else if (*w <= 0x03ffffff) - n = 5; - else // if (*w <= 0x7fffffff) - n = 6;*/ - - // Convert to little endian. - word ch = (*w >> 8) & 0x00FF; - ch |= (*w << 8) & 0xFF00; - // word ch = EMPConvertEndian(*w, ROCKET_ENDIAN_BIG); - - oc = (unsigned char *)&ch; - switch (n) - { - case 1: - output += oc[1]; - break; - - case 2: - output += (_SEQ2 | (oc[1] >> 6) | ((oc[0] & 0x07) << 2)); - output += (_NXT | (oc[1] & 0x3f)); - break; - - case 3: - output += (_SEQ3 | ((oc[0] & 0xf0) >> 4)); - output += (_NXT | (oc[1] >> 6) | ((oc[0] & 0x0f) << 2)); - output += (_NXT | (oc[1] & 0x3f)); - break; - - case 4: - break; - - case 5: - break; - - case 6: - break; - } - - //Log::Message(LC_CORE, Log::LT_ALWAYS, "Converting...%c(%d) %d -> %d", *w, *w, w - input, output.Length()); - } - - return true; -} - -// Strip whitespace characters from the beginning and end of a string. -String StringUtilities::StripWhitespace(const String& string) -{ - const char* start = string.CString(); - const char* end = start + string.Length(); - - while (start < end && IsWhitespace(*start)) - start++; - - while (end > start && IsWhitespace(*(end - 1))) - end--; - - if (start < end) - return String(start, end); - - return String(); -} - -// Operators for STL containers using strings. -bool StringUtilities::StringComparei::operator()(const String& lhs, const String& rhs) const -{ - return strcasecmp(lhs.CString(), rhs.CString()) < 0; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheet.cpp b/libs/libRocket/Source/Core/StyleSheet.cpp deleted file mode 100644 index 9802cb01734..00000000000 --- a/libs/libRocket/Source/Core/StyleSheet.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/StyleSheet.h" -#include -#include "ElementDefinition.h" -#include "StyleSheetFactory.h" -#include "StyleSheetNode.h" -#include "StyleSheetParser.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/PropertyDefinition.h" -#include "../../Include/Rocket/Core/StyleSheetSpecification.h" - -namespace Rocket { -namespace Core { - -// Sorts style nodes based on specificity. -static bool StyleSheetNodeSort(const StyleSheetNode* lhs, const StyleSheetNode* rhs) -{ - return lhs->GetSpecificity() < rhs->GetSpecificity(); -} - -StyleSheet::StyleSheet() -{ - root = new StyleSheetNode("", StyleSheetNode::ROOT); - specificity_offset = 0; -} - -StyleSheet::~StyleSheet() -{ - delete root; - - // Release our reference count on the cached element definitions. - for (ElementDefinitionCache::iterator cache_iterator = address_cache.begin(); cache_iterator != address_cache.end(); cache_iterator++) - (*cache_iterator).second->RemoveReference(); - - for (ElementDefinitionCache::iterator cache_iterator = node_cache.begin(); cache_iterator != node_cache.end(); cache_iterator++) - (*cache_iterator).second->RemoveReference(); -} - -bool StyleSheet::LoadStyleSheet(Stream* stream) -{ - StyleSheetParser parser; - specificity_offset = parser.Parse(root, stream); - return specificity_offset >= 0; -} - -/// Combines this style sheet with another one, producing a new sheet -StyleSheet* StyleSheet::CombineStyleSheet(const StyleSheet* other_sheet) const -{ - StyleSheet* new_sheet = new StyleSheet(); - if (!new_sheet->root->MergeHierarchy(root) || - !new_sheet->root->MergeHierarchy(other_sheet->root, specificity_offset)) - { - delete new_sheet; - return NULL; - } - - new_sheet->specificity_offset = specificity_offset + other_sheet->specificity_offset; - return new_sheet; -} - -// Builds the node index for a combined style sheet. -void StyleSheet::BuildNodeIndex() -{ - if (complete_node_index.empty()) - { - styled_node_index.clear(); - complete_node_index.clear(); - - root->BuildIndex(styled_node_index, complete_node_index); - } -} - -// Returns the compiled element definition for a given element hierarchy. -ElementDefinition* StyleSheet::GetElementDefinition(const Element* element) const -{ - // Address cache is disabled for the time being; this doesn't work since the introduction of structural - // pseudo-classes. - ElementDefinitionCache::iterator cache_iterator; -/* String element_address = element->GetAddress(); - - // Look the address up in the definition, see if we've processed a similar element before. - cache_iterator = address_cache.find(element_address); - if (cache_iterator != address_cache.end()) - { - ElementDefinition* definition = (*cache_iterator).second; - definition->AddReference(); - return definition; - }*/ - - // See if there are any styles defined for this element. - std::vector< const StyleSheetNode* > applicable_nodes; - - String tags[] = {element->GetTagName(), ""}; - for (int i = 0; i < 2; i++) - { - NodeIndex::const_iterator iterator = styled_node_index.find(tags[i]); - if (iterator != styled_node_index.end()) - { - const NodeList& nodes = (*iterator).second; - - // There are! Now see if we satisfy all of their parenting requirements. What this involves is traversing the style - // nodes backwards, trying to match nodes in the element's hierarchy to nodes in the style hierarchy. - for (NodeList::const_iterator iterator = nodes.begin(); iterator != nodes.end(); iterator++) - { - if ((*iterator)->IsApplicable(element)) - { - // Get the node to add any of its non-tag children that we match into our list. - (*iterator)->GetApplicableDescendants(applicable_nodes, element); - } - } - } - } - - std::sort(applicable_nodes.begin(), applicable_nodes.end(), StyleSheetNodeSort); - - // Compile the list of volatile pseudo-classes for this element definition. - PseudoClassList volatile_pseudo_classes; - bool structurally_volatile = false; - - for (int i = 0; i < 2; ++i) - { - NodeIndex::const_iterator iterator = complete_node_index.find(tags[i]); - if (iterator != complete_node_index.end()) - { - const NodeList& nodes = (*iterator).second; - - // See if we satisfy all of the parenting requirements for each of these nodes (as in the previous loop). - for (NodeList::const_iterator iterator = nodes.begin(); iterator != nodes.end(); iterator++) - { - structurally_volatile |= (*iterator)->IsStructurallyVolatile(); - - if ((*iterator)->IsApplicable(element)) - { - std::vector< const StyleSheetNode* > volatile_nodes; - (*iterator)->GetApplicableDescendants(volatile_nodes, element); - - for (size_t i = 0; i < volatile_nodes.size(); ++i) - volatile_nodes[i]->GetVolatilePseudoClasses(volatile_pseudo_classes); - } - } - } - } - - // If this element definition won't actually store any information, don't bother with it. - if (applicable_nodes.empty() && - volatile_pseudo_classes.empty() && - !structurally_volatile) - return NULL; - - // Check if this puppy has already been cached in the node index; it may be that it has already been created by an - // element with a different address but an identical output definition. - String node_ids; - for (size_t i = 0; i < applicable_nodes.size(); i++) - node_ids += String(10, "%x ", applicable_nodes[i]); - for (PseudoClassList::iterator i = volatile_pseudo_classes.begin(); i != volatile_pseudo_classes.end(); ++i) - node_ids += String(32, ":%s", (*i).CString()); - - cache_iterator = node_cache.find(node_ids); - if (cache_iterator != node_cache.end()) - { - ElementDefinition* definition = (*cache_iterator).second; - definition->AddReference(); - return definition; - } - - // Create the new definition and add it to our cache. One reference count is added, bringing the total to two; one - // for the element that requested it, and one for the cache. - ElementDefinition* new_definition = new ElementDefinition(); - new_definition->Initialise(applicable_nodes, volatile_pseudo_classes, structurally_volatile); - - // Add to the address cache. -// address_cache[element_address] = new_definition; -// new_definition->AddReference(); - - // Add to the node cache. - node_cache[node_ids] = new_definition; - new_definition->AddReference(); - - return new_definition; -} - -// Destroys the style sheet. -void StyleSheet::OnReferenceDeactivate() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetFactory.cpp b/libs/libRocket/Source/Core/StyleSheetFactory.cpp deleted file mode 100644 index bc95fc2e2f6..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetFactory.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetFactory.h" -#include "../../Include/Rocket/Core/StyleSheet.h" -#include "StreamFile.h" -#include "StyleSheetNodeSelectorNthChild.h" -#include "StyleSheetNodeSelectorNthLastChild.h" -#include "StyleSheetNodeSelectorNthOfType.h" -#include "StyleSheetNodeSelectorNthLastOfType.h" -#include "StyleSheetNodeSelectorFirstChild.h" -#include "StyleSheetNodeSelectorLastChild.h" -#include "StyleSheetNodeSelectorFirstOfType.h" -#include "StyleSheetNodeSelectorLastOfType.h" -#include "StyleSheetNodeSelectorOnlyChild.h" -#include "StyleSheetNodeSelectorOnlyOfType.h" -#include "StyleSheetNodeSelectorEmpty.h" -#include "../../Include/Rocket/Core/Log.h" - -namespace Rocket { -namespace Core { - -static StyleSheetFactory* instance = NULL; - -StyleSheetFactory::StyleSheetFactory() -{ - ROCKET_ASSERT(instance == NULL); - instance = this; -} - -StyleSheetFactory::~StyleSheetFactory() -{ - instance = NULL; -} - -bool StyleSheetFactory::Initialise() -{ - new StyleSheetFactory(); - - instance->selectors["nth-child"] = new StyleSheetNodeSelectorNthChild(); - instance->selectors["nth-last-child"] = new StyleSheetNodeSelectorNthLastChild(); - instance->selectors["nth-of-type"] = new StyleSheetNodeSelectorNthOfType(); - instance->selectors["nth-last-of-type"] = new StyleSheetNodeSelectorNthLastOfType(); - instance->selectors["first-child"] = new StyleSheetNodeSelectorFirstChild(); - instance->selectors["last-child"] = new StyleSheetNodeSelectorLastChild(); - instance->selectors["first-of-type"] = new StyleSheetNodeSelectorFirstOfType(); - instance->selectors["last-of-type"] = new StyleSheetNodeSelectorLastOfType(); - instance->selectors["only-child"] = new StyleSheetNodeSelectorOnlyChild(); - instance->selectors["only-of-type"] = new StyleSheetNodeSelectorOnlyOfType(); - instance->selectors["empty"] = new StyleSheetNodeSelectorEmpty(); - - return true; -} - -void StyleSheetFactory::Shutdown() -{ - if (instance != NULL) - { - ClearStyleSheetCache(); - - for (SelectorMap::iterator i = instance->selectors.begin(); i != instance->selectors.end(); ++i) - delete (*i).second; - - delete instance; - } -} - -StyleSheet* StyleSheetFactory::GetStyleSheet(const String& sheet_name) -{ - // Look up the sheet definition in the cache - StyleSheets::iterator itr = instance->stylesheets.find(sheet_name); - if (itr != instance->stylesheets.end()) - { - (*itr).second->AddReference(); - return (*itr).second; - } - - // Don't currently have the sheet, attempt to load it - StyleSheet* sheet = instance->LoadStyleSheet(sheet_name); - if (sheet == NULL) - return NULL; - - // Add it to the cache, and add a reference count so the cache will keep hold of it. - instance->stylesheets[sheet_name] = sheet; - sheet->AddReference(); - - return sheet; -} - -StyleSheet* StyleSheetFactory::GetStyleSheet(const StringList& sheets) -{ - // Generate a unique key for these sheets - String combined_key; - for (size_t i = 0; i < sheets.size(); i++) - { - URL path(sheets[i]); - combined_key += path.GetFileName(); - } - - // Look up the sheet definition in the cache. - StyleSheets::iterator itr = instance->stylesheet_cache.find(combined_key); - if (itr != instance->stylesheet_cache.end()) - { - (*itr).second->AddReference(); - return (*itr).second; - } - - // Load and combine the sheets. - StyleSheet* sheet = NULL; - for (size_t i = 0; i < sheets.size(); i++) - { - StyleSheet* sub_sheet = GetStyleSheet(sheets[i]); - if (sub_sheet) - { - if (sheet) - { - StyleSheet* new_sheet = sheet->CombineStyleSheet(sub_sheet); - sheet->RemoveReference(); - sub_sheet->RemoveReference(); - - sheet = new_sheet; - } - else - sheet = sub_sheet; - } - else - Log::Message(Log::LT_ERROR, "Failed to load style sheet %s.", sheets[i].CString()); - } - - if (sheet == NULL) - return NULL; - - // Add to cache, and a reference to the sheet to hold it in the cache. - instance->stylesheet_cache[combined_key] = sheet; - sheet->AddReference(); - return sheet; -} - -// Clear the style sheet cache. -void StyleSheetFactory::ClearStyleSheetCache() -{ - for (StyleSheets::iterator i = instance->stylesheets.begin(); i != instance->stylesheets.end(); ++i) - (*i).second->RemoveReference(); - - for (StyleSheets::iterator i = instance->stylesheet_cache.begin(); i != instance->stylesheet_cache.end(); ++i) - (*i).second->RemoveReference(); - - instance->stylesheets.clear(); - instance->stylesheet_cache.clear(); -} - -// Returns one of the available node selectors. -StyleSheetNodeSelector* StyleSheetFactory::GetSelector(const String& name) -{ - size_t index = name.Find("("); - SelectorMap::iterator i = instance->selectors.find(name.Substring(0, index)); - if (i == instance->selectors.end()) - return NULL; - return (*i).second; -} - -StyleSheet* StyleSheetFactory::LoadStyleSheet(const String& sheet) -{ - StyleSheet* new_style_sheet = NULL; - - // Open stream, construct new sheet and pass the stream into the sheet - // TODO: Make this support ASYNC - StreamFile* stream = new StreamFile(); - if (stream->Open(sheet)) - { - new_style_sheet = new StyleSheet(); - if (!new_style_sheet->LoadStyleSheet(stream)) - { - new_style_sheet->RemoveReference(); - new_style_sheet = NULL; - } - } - - stream->RemoveReference(); - return new_style_sheet; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetFactory.h b/libs/libRocket/Source/Core/StyleSheetFactory.h deleted file mode 100644 index 9e78c72fa14..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetFactory.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETFACTORY_H -#define ROCKETCORESTYLESHEETFACTORY_H - -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Core { - -class StyleSheet; -class StyleSheetNodeSelector; - -/** - Creates stylesheets on the fly as needed. The factory keeps a cache of built sheets for optimisation. - - @author Lloyd Weehuizen - */ - -class StyleSheetFactory -{ -public: - /// Initialise the style factory - static bool Initialise(); - /// Shutdown style manager - static void Shutdown(); - - /// Gets the named sheet, retrieving it from the cache if its already been loaded - /// @param sheet name of sheet to load - static StyleSheet* GetStyleSheet(const String& sheet); - - /// Builds and returns a stylesheet based on the list of input sheets - /// Generated sheets will be cached for later use - /// @param sheets List of sheets to combine into one - static StyleSheet* GetStyleSheet(const StringList& sheets); - - /// Clear the style sheet cache. - static void ClearStyleSheetCache(); - - /// Returns one of the available node selectors. - /// @param name[in] The name of the desired selector. - /// @return The selector registered with the given name, or NULL if none exists. - static StyleSheetNodeSelector* GetSelector(const String& name); - -private: - StyleSheetFactory(); - ~StyleSheetFactory(); - - // Loads an individual style sheet - StyleSheet* LoadStyleSheet(const String& sheet); - - // Individual loaded stylesheets - typedef std::map StyleSheets; - StyleSheets stylesheets; - - // Cache of combined style sheets - StyleSheets stylesheet_cache; - - // Custom complex selectors available for style sheets. - typedef std::map< String, StyleSheetNodeSelector* > SelectorMap; - SelectorMap selectors; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNode.cpp b/libs/libRocket/Source/Core/StyleSheetNode.cpp deleted file mode 100644 index 03586b72e74..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNode.cpp +++ /dev/null @@ -1,613 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNode.h" -#include -#include "../../Include/Rocket/Core/Element.h" -#include "StyleSheetFactory.h" -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -StyleSheetNode::StyleSheetNode(const String& name, NodeType _type, StyleSheetNode* _parent) : name(name) -{ - type = _type; - parent = _parent; - - specificity = CalculateSpecificity(); - - selector = NULL; - a = 0; - b = 0; -} - -// Constructs a structural style-sheet node. -StyleSheetNode::StyleSheetNode(const String& name, StyleSheetNode* _parent, StyleSheetNodeSelector* _selector, int _a, int _b) : name(name) -{ - type = STRUCTURAL_PSEUDO_CLASS; - parent = _parent; - - specificity = CalculateSpecificity(); - - selector = _selector; - a = _a; - b = _b; -} - -StyleSheetNode::~StyleSheetNode() -{ - for (int i = 0; i < NUM_NODE_TYPES; i++) - { - for (NodeMap::iterator j = children[i].begin(); j != children[i].end(); j++) - delete (*j).second; - } -} - -// Writes the style sheet node (and all ancestors) into the stream. -void StyleSheetNode::Write(Stream* stream) -{ - if (properties.GetNumProperties() > 0) - { - String rule; - StyleSheetNode* hierarchy = this; - while (hierarchy != NULL) - { - switch (hierarchy->type) - { - case TAG: - rule = " " + hierarchy->name + rule; - break; - - case CLASS: - rule = "." + hierarchy->name + rule; - break; - - case ID: - rule = "#" + hierarchy->name + rule; - break; - - case PSEUDO_CLASS: - rule = ":" + hierarchy->name + rule; - break; - - case STRUCTURAL_PSEUDO_CLASS: - rule = ":" + hierarchy->name + rule; - break; - - default: - break; - } - - hierarchy = hierarchy->parent; - } - - stream->Write(String(1024, "%s /* specificity: %d */\n", StringUtilities::StripWhitespace(rule).CString(), specificity)); - stream->Write("{\n"); - - const Rocket::Core::PropertyMap& property_map = properties.GetProperties(); - for (Rocket::Core::PropertyMap::const_iterator i = property_map.begin(); i != property_map.end(); ++i) - { - const String& name = i->first; - const Rocket::Core::Property& property = i->second; - - stream->Write(String(1024, "\t%s: %s; /* specificity: %d */\n", name.CString(), property.value.Get< String >().CString(), property.specificity)); - } - - stream->Write("}\n\n"); - } - - for (size_t i = 0; i < NUM_NODE_TYPES; ++i) - { - for (NodeMap::iterator j = children[i].begin(); j != children[i].end(); ++j) - (*j).second->Write(stream); - } -} - -// Merges an entire tree hierarchy into our hierarchy. -bool StyleSheetNode::MergeHierarchy(StyleSheetNode* node, int specificity_offset) -{ - // Merge the other node's properties into ours. - MergeProperties(node->properties, specificity_offset); - - selector = node->selector; - a = node->a; - b = node->b; - - for (int i = 0; i < NUM_NODE_TYPES; i++) - { - for (NodeMap::iterator iterator = node->children[i].begin(); iterator != node->children[i].end(); iterator++) - { - StyleSheetNode* local_node = GetChildNode((*iterator).second->name, (NodeType) i); - local_node->MergeHierarchy((*iterator).second, specificity_offset); - } - } - - return true; -} - -// Builds up a style sheet's index recursively. -void StyleSheetNode::BuildIndex(StyleSheet::NodeIndex& styled_index, StyleSheet::NodeIndex& complete_index) -{ - // If this is a tag node, then we insert it into the list of all tag nodes. Makes sense, neh? - if (type == TAG) - { - StyleSheet::NodeIndex::iterator iterator = complete_index.find(name); - if (iterator == complete_index.end()) - (*complete_index.insert(StyleSheet::NodeIndex::value_type(name, StyleSheet::NodeList())).first).second.insert(this); - else - (*iterator).second.insert(this); - } - - // If we are a styled node (ie, have some style attributes attached), then we insert our closest parent tag node - // into the list of styled tag nodes. - if (properties.GetNumProperties() > 0) - { - StyleSheetNode* tag_node = this; - while (tag_node != NULL && - tag_node->type != TAG) - tag_node = tag_node->parent; - - if (tag_node != NULL) - { - StyleSheet::NodeIndex::iterator iterator = styled_index.find(tag_node->name); - if (iterator == styled_index.end()) - (*styled_index.insert(StyleSheet::NodeIndex::value_type(tag_node->name, StyleSheet::NodeList())).first).second.insert(tag_node); - else - (*iterator).second.insert(tag_node); - } - } - - for (int i = 0; i < NUM_NODE_TYPES; i++) - { - for (NodeMap::iterator j = children[i].begin(); j != children[i].end(); ++j) - (*j).second->BuildIndex(styled_index, complete_index); - } -} - -// Returns the name of this node. -const String& StyleSheetNode::GetName() const -{ - return name; -} - -// Returns the specificity of this node. -int StyleSheetNode::GetSpecificity() const -{ - return specificity; -} - -// Imports properties from a single rule definition (ie, with a shared specificity) into the node's -// properties. -void StyleSheetNode::ImportProperties(const PropertyDictionary& _properties, int rule_specificity) -{ - properties.Import(_properties, specificity + rule_specificity); -} - -// Merges properties from another node (ie, with potentially differing specificities) into the -// node's properties. -void StyleSheetNode::MergeProperties(const PropertyDictionary& _properties, int rule_specificity_offset) -{ - properties.Merge(_properties, rule_specificity_offset); -} - -// Returns the node's default properties. -const PropertyDictionary& StyleSheetNode::GetProperties() const -{ - return properties; -} - -// Builds the properties of all of the pseudo-classes of this style sheet node into a single map. -void StyleSheetNode::GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties) const -{ - for (NodeMap::const_iterator i = children[PSEUDO_CLASS].begin(); i != children[PSEUDO_CLASS].end(); ++i) - (*i).second->GetPseudoClassProperties(pseudo_class_properties, StringList()); -} - -// Adds to a list the names of this node's pseudo-classes which are deemed volatile. -bool StyleSheetNode::GetVolatilePseudoClasses(PseudoClassList& volatile_pseudo_classes) const -{ - if (type == PSEUDO_CLASS) - { - bool self_volatile = !children[TAG].empty(); - - for (NodeMap::const_iterator i = children[PSEUDO_CLASS].begin(); i != children[PSEUDO_CLASS].end(); ++i) - self_volatile = (*i).second->GetVolatilePseudoClasses(volatile_pseudo_classes) | self_volatile; - - if (self_volatile) - volatile_pseudo_classes.insert(name); - - return self_volatile; - } - else - { - for (NodeMap::const_iterator i = children[PSEUDO_CLASS].begin(); i != children[PSEUDO_CLASS].end(); ++i) - (*i).second->GetVolatilePseudoClasses(volatile_pseudo_classes); - } - - return false; -} - -// Returns a direct child node of this node of the requested type. -StyleSheetNode* StyleSheetNode::GetChildNode(const String& child_name, NodeType child_type, bool create) -{ - // Look for a node with given name. - NodeMap::iterator iterator = children[child_type].find(child_name); - if (iterator != children[child_type].end()) - { - // Traverse into node. - return (*iterator).second; - } - else - { - if (create) - { - StyleSheetNode* new_node = NULL; - - // Create the node; structural pseudo-classes require a little extra leg-work. - if (child_type == STRUCTURAL_PSEUDO_CLASS) - new_node = CreateStructuralChild(child_name); - else - new_node = new StyleSheetNode(child_name, child_type, this); - - if (new_node != NULL) - { - children[child_type][child_name] = new_node; - return new_node; - } - } - - return NULL; - } -} - -// Returns true if this node is applicable to the given element, given its IDs, classes and heritage. -bool StyleSheetNode::IsApplicable(const Element* element) const -{ - // This function is called with an element that matches a style node only with the tag name. We have to determine - // here whether or not it also matches the required hierarchy. - - // We must have a parent; if not, something's amok with the style tree. - if (parent == NULL) - { - ROCKET_ERRORMSG("Invalid RCSS hierarchy."); - return false; - } - - // If we've hit a child of the root of the style sheet tree, then we're done; no more lineage to resolve. - if (parent->type == ROOT) - return true; - - // Determine the tag (and possibly id / class as well) of the next required parent in the RCSS hierarchy. - const StyleSheetNode* parent_node = parent; - String ancestor_id; - StringList ancestor_classes; - StringList ancestor_pseudo_classes; - std::vector< const StyleSheetNode* > ancestor_structural_pseudo_classes; - - while (parent_node != NULL && parent_node->type != TAG) - { - switch (parent_node->type) - { - case ID: ancestor_id = parent_node->name; break; - case CLASS: ancestor_classes.push_back(parent_node->name); break; - case PSEUDO_CLASS: ancestor_pseudo_classes.push_back(parent_node->name); break; - case STRUCTURAL_PSEUDO_CLASS: ancestor_structural_pseudo_classes.push_back(parent_node); break; - default: ROCKET_ERRORMSG("Invalid RCSS hierarchy."); return false; - } - - parent_node = parent_node->parent; - } - - // Check for an invalid RCSS hierarchy. - if (parent_node == NULL) - { - ROCKET_ERRORMSG("Invalid RCSS hierarchy."); - return false; - } - - // Now we know the name / class / ID / pseudo-class / structural requirements for the next ancestor requirement of - // the element. So we look back through the element's ancestors to find one that matches. - for (const Element* ancestor_element = element->GetParentNode(); ancestor_element != NULL; ancestor_element = ancestor_element->GetParentNode()) - { - // Skip this ancestor if the name of the next style node doesn't match its tag name, and one was specified. - if (!parent_node->name.Empty() - && parent_node->name != ancestor_element->GetTagName()) - continue; - - // Skip this ancestor if the ID of the next style node doesn't match its ID, and one was specified. - if (!ancestor_id.Empty() && - ancestor_id != ancestor_element->GetId()) - continue; - - // Skip this ancestor if the class of the next style node don't match its classes. - bool resolved_requirements = true; - for (size_t i = 0; i < ancestor_classes.size(); ++i) - { - if (!ancestor_element->IsClassSet(ancestor_classes[i])) - { - resolved_requirements = false; - break; - } - } - if (!resolved_requirements) - continue; - - // Skip this ancestor if the required pseudo-classes of the style node aren't set on it. - resolved_requirements = true; - for (size_t i = 0; i < ancestor_pseudo_classes.size(); ++i) - { - if (!ancestor_element->IsPseudoClassSet(ancestor_pseudo_classes[i])) - { - resolved_requirements = false; - break; - } - } - if (!resolved_requirements) - continue; - - // Skip this ancestor if the required structural pseudo-classes of the style node aren't applicable to it. - resolved_requirements = true; - for (size_t i = 0; i < ancestor_structural_pseudo_classes.size(); ++i) - { - if (!ancestor_structural_pseudo_classes[i]->selector->IsApplicable(ancestor_element, ancestor_structural_pseudo_classes[i]->a, ancestor_structural_pseudo_classes[i]->b)) - { - resolved_requirements = false; - break; - } - } - if (!resolved_requirements) - continue; - - return parent_node->IsApplicable(ancestor_element); - } - - // We hit the end of the hierarchy before matching the required ancestor, so bail. - return false; -} - -// Appends all applicable non-tag descendants of this node into the given element list. -void StyleSheetNode::GetApplicableDescendants(std::vector< const StyleSheetNode* >& applicable_nodes, const Element* element) const -{ - // Check if this node matches this element. - switch (type) - { - ROCKET_UNUSED_SWITCH_ENUM(NUM_NODE_TYPES); - case ROOT: - case TAG: - { - // These nodes always match. - } - break; - - case CLASS: - { - if (!element->IsClassSet(name)) - return; - } - break; - - case ID: - { - if (name != element->GetId()) - return; - } - break; - - case PSEUDO_CLASS: - { - if (!element->IsPseudoClassSet(name)) - return; - } - break; - - case STRUCTURAL_PSEUDO_CLASS: - { - if (selector == NULL) - return; - - if (!selector->IsApplicable(element, a, b)) - return; - } - break; - } - - if (properties.GetNumProperties() > 0 || - !children[PSEUDO_CLASS].empty()) - applicable_nodes.push_back(this); - - for (int i = CLASS; i < NUM_NODE_TYPES; i++) - { - // Don't recurse into pseudo-classes; they can't be built into the root definition. - if (i == PSEUDO_CLASS) - continue; - - for (NodeMap::const_iterator j = children[i].begin(); j != children[i].end(); ++j) - (*j).second->GetApplicableDescendants(applicable_nodes, element); - } -} - -// Returns true if this node employs a structural selector, and therefore generates element definitions that are -// sensitive to sibling changes. -bool StyleSheetNode::IsStructurallyVolatile(bool check_ancestors) const -{ - if (type == STRUCTURAL_PSEUDO_CLASS) - return true; - - if (!children[STRUCTURAL_PSEUDO_CLASS].empty()) - return true; - - // Check our children for structural pseudo-classes. - for (int i = 0; i < NUM_NODE_TYPES; ++i) - { - if (i == STRUCTURAL_PSEUDO_CLASS) - continue; - - for (NodeMap::const_iterator j = children[i].begin(); j != children[i].end(); ++j) - { - if ((*j).second->IsStructurallyVolatile(false)) - return true; - } - } - - if (check_ancestors) - { - StyleSheetNode* ancestor = parent; - while (ancestor != NULL) - { - if (ancestor->type == STRUCTURAL_PSEUDO_CLASS) - return true; - - ancestor = ancestor->parent; - } - } - - return false; -} - -// Constructs a structural pseudo-class child node. -StyleSheetNode* StyleSheetNode::CreateStructuralChild(const String& child_name) -{ - StyleSheetNodeSelector* child_selector = StyleSheetFactory::GetSelector(child_name); - if (child_selector == NULL) - return NULL; - - // Parse the 'a' and 'b' values. - int child_a = 1; - int child_b = 0; - - size_t parameter_start = child_name.Find("("); - size_t parameter_end = child_name.Find(")"); - if (parameter_start != String::npos && - parameter_end != String::npos) - { - String parameters = child_name.Substring(parameter_start + 1, parameter_end - (parameter_start + 1)); - - // Check for 'even' or 'odd' first. - if (parameters == "even") - { - child_a = 2; - child_b = 0; - } - else if (parameters == "odd") - { - child_a = 2; - child_b = 1; - } - else - { - // Alrighty; we've got an equation in the form of [[+/-]an][(+/-)b]. So, foist up, we split on 'n'. - size_t n_index = parameters.Find("n"); - if (n_index == String::npos) - { - // The equation is 0n + b. So a = 0, and we only have to parse b. - child_a = 0; - child_b = atoi(parameters.CString()); - } - else - { - if (n_index == 0) - child_a = 1; - else - { - String a_parameter = parameters.Substring(0, n_index); - if (StringUtilities::StripWhitespace(a_parameter) == "-") - child_a = -1; - else - child_a = atoi(a_parameter.CString()); - } - - if (n_index == parameters.Length() - 1) - child_b = 0; - else - child_b = atoi(parameters.Substring(n_index + 1).CString()); - } - } - } - - return new StyleSheetNode(child_name, this, child_selector, child_a, child_b); -} - -// Recursively builds up a list of all pseudo-classes branching from a single node. -void StyleSheetNode::GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties, const StringList& ancestor_pseudo_classes) -{ - StringList pseudo_classes(ancestor_pseudo_classes); - pseudo_classes.push_back(name); - - if (properties.GetNumProperties() > 0) - pseudo_class_properties[pseudo_classes] = properties; - - for (NodeMap::const_iterator i = children[PSEUDO_CLASS].begin(); i != children[PSEUDO_CLASS].end(); ++i) - (*i).second->GetPseudoClassProperties(pseudo_class_properties, pseudo_classes); -} - -int StyleSheetNode::CalculateSpecificity() -{ - // Calculate the specificity of just this node; tags are worth 10,000, IDs 1,000,000 and other specifiers (classes - // and pseudo-classes) 100,000. - - int specificity = 0; - switch (type) - { - case TAG: - { - if (!name.Empty()) - specificity = 10000; - } - break; - - case CLASS: - case PSEUDO_CLASS: - case STRUCTURAL_PSEUDO_CLASS: - { - specificity = 100000; - } - break; - - case ID: - { - specificity = 1000000; - } - break; - - default: - { - specificity = 0; - } - break; - } - - // Add our parent's specificity onto ours. - if (parent != NULL) - specificity += parent->CalculateSpecificity(); - - return specificity; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNode.h b/libs/libRocket/Source/Core/StyleSheetNode.h deleted file mode 100644 index 4aa38218080..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNode.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODE_H -#define ROCKETCORESTYLESHEETNODE_H - -#include "../../Include/Rocket/Core/PropertyDictionary.h" -#include "../../Include/Rocket/Core/StyleSheet.h" -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { -namespace Core { - -class StyleSheetNodeSelector; - -typedef std::map< StringList, PropertyDictionary > PseudoClassPropertyMap; - -/** - A style sheet is composed of a tree of nodes. - - @author Pete / Lloyd - */ - -class StyleSheetNode -{ -public: - enum NodeType - { - TAG = 0, - CLASS, - ID, - PSEUDO_CLASS, - STRUCTURAL_PSEUDO_CLASS, - NUM_NODE_TYPES, // only counts the listed node types - ROOT // special node type we don't keep in a list - }; - - /// Constructs a generic style-sheet node. - StyleSheetNode(const String& name, NodeType type, StyleSheetNode* parent = NULL); - /// Constructs a structural style-sheet node. - StyleSheetNode(const String& name, StyleSheetNode* parent, StyleSheetNodeSelector* selector, int a, int b); - ~StyleSheetNode(); - - /// Writes the style sheet node (and all ancestors) into the stream. - void Write(Stream* stream); - - /// Merges an entire tree hierarchy into our hierarchy. - bool MergeHierarchy(StyleSheetNode* node, int specificity_offset = 0); - /// Builds up a style sheet's index recursively. - void BuildIndex(StyleSheet::NodeIndex& styled_index, StyleSheet::NodeIndex& complete_index); - - /// Returns the name of this node. - const String& GetName() const; - /// Returns the specificity of this node. - int GetSpecificity() const; - - /// Imports properties from a single rule definition into the node's properties and sets the - /// appropriate specificity on them. Any existing attributes sharing a key with a new attribute - /// will be overwritten if they are of a lower specificity. - /// @param[in] properties The properties to import. - /// @param[in] rule_specificity The specificity of the importing rule. - void ImportProperties(const PropertyDictionary& properties, int rule_specificity); - /// Merges properties from another node (ie, with potentially differing specificities) into the - /// node's properties. Any existing properties sharing a key with a new attribute will be - /// overwritten if they are of a lower specificity. - /// @param[in] properties The properties to merge with this node's. - /// @param[in] rule_specificity_offset The offset of the importing properties' specificities. - void MergeProperties(const PropertyDictionary& properties, int rule_specificity_offset); - /// Returns the node's default properties. - const PropertyDictionary& GetProperties() const; - - /// Merges the properties of all of the pseudo-classes of this style sheet node into a single map. - /// @param pseudo_class_properties[out] The dictionary to fill with the pseudo-class properties. - void GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties) const; - /// Adds to a list the names of this node's pseudo-classes which are deemed volatile; that is, which will - /// potentially affect child node's element definition if set or unset. - /// @param volatile_pseudo_classes[out] The list of volatile pseudo-classes. - bool GetVolatilePseudoClasses(PseudoClassList& volatile_pseudo_classes) const; - - /// Returns a direct child node of this node of the requested type. - /// @param name The name of the child node to fetch. - /// @param type The type of node to fetch; this must be one of either TAG, CLASS, ID, PSEUDO_CLASS or PSEUDO_CLASS_STRUCTURAL. - /// @param create If set to true, the node will be created if it doesn't exist. - StyleSheetNode* GetChildNode(const String& name, NodeType type, bool create = true); - - /// Returns true if this node is applicable to the given element, given its IDs, classes and heritage. - bool IsApplicable(const Element* element) const; - /// Appends all applicable non-tag descendants of this node into the given element list. - void GetApplicableDescendants(std::vector< const StyleSheetNode* >& applicable_nodes, const Element* element) const; - - /// Returns true if this node employs a structural selector, and therefore generates element definitions that are - /// sensitive to sibling changes. - /// @return True if this node uses a structural selector. - bool IsStructurallyVolatile(bool check_ancestors = true) const; - -private: - // Constructs a structural pseudo-class child node. - StyleSheetNode* CreateStructuralChild(const String& child_name); - // Recursively builds up a list of all pseudo-classes branching from a single node. - void GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties, const StringList& ancestor_pseudo_classes); - - int CalculateSpecificity(); - - // The parent of this node; is NULL for the root node. - StyleSheetNode* parent; - - // The name and type. - String name; - NodeType type; - - // The complex selector for this node; only used for structural nodes. - StyleSheetNodeSelector* selector; - int a; - int b; - - // A measure of specificity of this node; the attribute in a node with a higher value will override those of a - // node with a lower value. - int specificity; - - // The generic properties for this node. - PropertyDictionary properties; - - // This node's child nodes, whether standard tagged children, or further derivations of this tag by ID or class. - typedef std::map< String, StyleSheetNode* > NodeMap; - NodeMap children[NUM_NODE_TYPES]; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelector.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelector.cpp deleted file mode 100644 index 7717dd9de5e..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelector.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelector::StyleSheetNodeSelector() -{ -} - -StyleSheetNodeSelector::~StyleSheetNodeSelector() -{ -} - -// Returns true if a positive integer can be found for n in the equation an + b = count. -bool StyleSheetNodeSelector::IsNth(int a, int b, int count) -{ - int x = count; - x -= b; - if (a != 0) - x /= a; - - return (x >= 0 && x * a + b == count); -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelector.h b/libs/libRocket/Source/Core/StyleSheetNodeSelector.h deleted file mode 100644 index e3e7be827e6..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelector.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTOR_H -#define ROCKETCORESTYLESHEETNODESELECTOR_H - -namespace Rocket { -namespace Core { - -class Element; - -/** - The ABC for any complex node selector, such as structural selectors. - - @author Peter Curry - */ - -class StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelector(); - virtual ~StyleSheetNodeSelector(); - - /// Returns true if the the node this selector is discriminating for is applicable to a given element. - /// @param element[in] The element to determine node applicability for. - /// @param a[in] For counting selectors, this is the 'a' variable of an + b. - /// @param b[in] For counting selectors, this is the 'b' variable of an + b. - virtual bool IsApplicable(const Element* element, int a, int b) = 0; - -protected: - /// Returns true if a positive integer can be found for n in the equation an + b = count. - bool IsNth(int a, int b, int count); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorEmpty.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorEmpty.cpp deleted file mode 100644 index 517c4f905e3..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorEmpty.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorEmpty.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorEmpty::StyleSheetNodeSelectorEmpty() -{ -} - -StyleSheetNodeSelectorEmpty::~StyleSheetNodeSelectorEmpty() -{ -} - -// Returns true if the element has no DOM children. -bool StyleSheetNodeSelectorEmpty::IsApplicable(const Element* element, int ROCKET_UNUSED_PARAMETER(a), int ROCKET_UNUSED_PARAMETER(b)) -{ - ROCKET_UNUSED(a); - ROCKET_UNUSED(b); - - for (int i = 0; i < element->GetNumChildren(); ++i) - { - if (element->GetChild(i)->GetDisplay() != DISPLAY_NONE) - return false; - } - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorEmpty.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorEmpty.h deleted file mode 100644 index e886fa58de1..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorEmpty.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTOREMPTY_H -#define ROCKETCORESTYLESHEETNODESELECTOREMPTY_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for an empty node. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorEmpty : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorEmpty(); - virtual ~StyleSheetNodeSelectorEmpty(); - - // Returns true if the element has no DOM children. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstChild.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstChild.cpp deleted file mode 100644 index b93fc47de5c..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstChild.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorFirstChild.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorFirstChild::StyleSheetNodeSelectorFirstChild() -{ -} - -StyleSheetNodeSelectorFirstChild::~StyleSheetNodeSelectorFirstChild() -{ -} - -// Returns true if the element is the first DOM child in its parent. -bool StyleSheetNodeSelectorFirstChild::IsApplicable(const Element* element, int ROCKET_UNUSED_PARAMETER(a), int ROCKET_UNUSED_PARAMETER(b)) -{ - ROCKET_UNUSED(a); - ROCKET_UNUSED(b); - - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - int child_index = 0; - while (child_index < parent->GetNumChildren()) - { - // If this child (the first non-text child) is our element, then the selector succeeds. - Element* child = parent->GetChild(child_index); - if (child == element) - return true; - - // If this child is not a text element, then the selector fails; this element is non-trivial. - if (dynamic_cast< ElementText* >(child) == NULL && - child->GetDisplay() != DISPLAY_NONE) - return false; - - // Otherwise, skip over the text element to find the last non-trivial element. - child_index++; - } - - return false; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstChild.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstChild.h deleted file mode 100644 index d14985764b5..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstChild.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORFIRSTCHILD_H -#define ROCKETCORESTYLESHEETNODESELECTORFIRSTCHILD_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the first generic child. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorFirstChild : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorFirstChild(); - virtual ~StyleSheetNodeSelectorFirstChild(); - - // Returns true if the element is the first DOM child in its parent. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp deleted file mode 100644 index b44e1596b03..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorFirstOfType.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorFirstOfType::StyleSheetNodeSelectorFirstOfType() -{ -} - -StyleSheetNodeSelectorFirstOfType::~StyleSheetNodeSelectorFirstOfType() -{ -} - -// Returns true if the element is the first DOM child in its parent of its type. -bool StyleSheetNodeSelectorFirstOfType::IsApplicable(const Element* element, int ROCKET_UNUSED_PARAMETER(a), int ROCKET_UNUSED_PARAMETER(b)) -{ - ROCKET_UNUSED(a); - ROCKET_UNUSED(b); - - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - int child_index = 0; - while (child_index < parent->GetNumChildren()) - { - // If this child is our element, then it's the first one we've found with our tag; the selector succeeds. - Element* child = parent->GetChild(child_index); - if (child == element) - return true; - - // Otherwise, if this child shares our element's tag, then our element is not the first tagged child; the - // selector fails. - if (child->GetTagName() == element->GetTagName() && - child->GetDisplay() != DISPLAY_NONE) - return false; - - child_index++; - } - - return false; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstOfType.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstOfType.h deleted file mode 100644 index 0e0a872cdfb..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorFirstOfType.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORFIRSTOFTYPE_H -#define ROCKETCORESTYLESHEETNODESELECTORFIRSTOFTYPE_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the first child of its type. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorFirstOfType : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorFirstOfType(); - virtual ~StyleSheetNodeSelectorFirstOfType(); - - /// Returns true if the element is the first DOM child in its parent of its type. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastChild.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastChild.cpp deleted file mode 100644 index bfff73e996d..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastChild.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorLastChild.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorLastChild::StyleSheetNodeSelectorLastChild() -{ -} - -StyleSheetNodeSelectorLastChild::~StyleSheetNodeSelectorLastChild() -{ -} - -// Returns true if the element is the last DOM child in its parent. -bool StyleSheetNodeSelectorLastChild::IsApplicable(const Element* element, int ROCKET_UNUSED_PARAMETER(a), int ROCKET_UNUSED_PARAMETER(b)) -{ - ROCKET_UNUSED(a); - ROCKET_UNUSED(b); - - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - int child_index = parent->GetNumChildren() - 1; - while (child_index >= 0) - { - // If this child (the last non-text child) is our element, then the selector succeeds. - Element* child = parent->GetChild(child_index); - if (child == element) - return true; - - // If this child is not a text element, then the selector fails; this element is non-trivial. - if (dynamic_cast< ElementText* >(child) == NULL && - child->GetDisplay() != DISPLAY_NONE) - return false; - - // Otherwise, skip over the text element to find the last non-trivial element. - child_index--; - } - - return false; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastChild.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastChild.h deleted file mode 100644 index d51521d5a56..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastChild.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORLASTCHILD_H -#define ROCKETCORESTYLESHEETNODESELECTORLASTCHILD_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the last generic child. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorLastChild : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorLastChild(); - virtual ~StyleSheetNodeSelectorLastChild(); - - // Returns true if the element is the last DOM child in its parent. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastOfType.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastOfType.cpp deleted file mode 100644 index 7f9b07d6a18..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastOfType.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorLastOfType.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorLastOfType::StyleSheetNodeSelectorLastOfType() -{ -} - -StyleSheetNodeSelectorLastOfType::~StyleSheetNodeSelectorLastOfType() -{ -} - -// Returns true if the element is the last DOM child in its parent. -bool StyleSheetNodeSelectorLastOfType::IsApplicable(const Element* element, int ROCKET_UNUSED_PARAMETER(a), int ROCKET_UNUSED_PARAMETER(b)) -{ - ROCKET_UNUSED(a); - ROCKET_UNUSED(b); - - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - int child_index = parent->GetNumChildren() - 1; - while (child_index >= 0) - { - // If this child is our element, then it's the first one we've found with our tag; the selector succeeds. - Element* child = parent->GetChild(child_index); - if (child == element) - return true; - - // Otherwise, if this child shares our element's tag, then our element is not the first tagged child; the - // selector fails. - if (child->GetTagName() == element->GetTagName() && - child->GetDisplay() != DISPLAY_NONE) - return false; - - child_index--; - } - - return false; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastOfType.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastOfType.h deleted file mode 100644 index 51c541cfb31..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorLastOfType.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORLASTOFTYPE_H -#define ROCKETCORESTYLESHEETNODESELECTORLASTOFTYPE_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the first child of its type. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorLastOfType : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorLastOfType(); - virtual ~StyleSheetNodeSelectorLastOfType(); - - // Returns true if the element is the last DOM child in its parent. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthChild.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthChild.cpp deleted file mode 100644 index 2a6477ebb5f..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthChild.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorNthChild.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorNthChild::StyleSheetNodeSelectorNthChild() -{ -} - -StyleSheetNodeSelectorNthChild::~StyleSheetNodeSelectorNthChild() -{ -} - -// Returns true if the element index is (n * a) + b for a given integer value of n. -bool StyleSheetNodeSelectorNthChild::IsApplicable(const Element* element, int a, int b) -{ - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - // Start counting elements until we find this one. - int element_index = 1; - for (int i = 0; i < parent->GetNumChildren(); i++) - { - Element* child = parent->GetChild(i); - - // Skip text nodes. - if (dynamic_cast< ElementText* >(child) != NULL) - continue; - - // If we've found our element, then break; the current index is our element's index. - if (child == element) - break; - - // Skip nodes without a display type. - if (child->GetDisplay() == DISPLAY_NONE) - continue; - - element_index++; - } - - return IsNth(a, b, element_index); -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthChild.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthChild.h deleted file mode 100644 index faacfdcbaa9..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthChild.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORNTHCHILD_H -#define ROCKETCORESTYLESHEETNODESELECTORNTHCHILD_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the nth generic child. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorNthChild : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorNthChild(); - virtual ~StyleSheetNodeSelectorNthChild(); - - // Returns true if the element index is (n * a) + b for a given integer value of n. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastChild.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastChild.cpp deleted file mode 100644 index caa15b9118e..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastChild.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorNthLastChild.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorNthLastChild::StyleSheetNodeSelectorNthLastChild() -{ -} - -StyleSheetNodeSelectorNthLastChild::~StyleSheetNodeSelectorNthLastChild() -{ -} - -// Returns true if the element's reverse index is (n * a) + b for a given integer value of n. -bool StyleSheetNodeSelectorNthLastChild::IsApplicable(const Element* element, int a, int b) -{ - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - // Start counting elements until we find this one. - int element_index = 1; - for (int i = parent->GetNumChildren() - 1; i >= 0; --i) - { - Element* child = parent->GetChild(i); - - // Skip text nodes. - if (dynamic_cast< ElementText* >(child) != NULL) - continue; - - // If we've found our element, then break; the current index is our element's index. - if (child == element) - break; - - if (child->GetDisplay() == DISPLAY_NONE) - continue; - - element_index++; - } - - return IsNth(a, b, element_index); -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastChild.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastChild.h deleted file mode 100644 index 8d3be306415..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastChild.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORNTHLASTCHILD_H -#define ROCKETCORESTYLESHEETNODESELECTORNTHLASTCHILD_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the nth-last generic child. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorNthLastChild : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorNthLastChild(); - virtual ~StyleSheetNodeSelectorNthLastChild(); - - // Returns true if the element's reverse index is (n * a) + b for a given integer value of n. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastOfType.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastOfType.cpp deleted file mode 100644 index 5025560320c..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastOfType.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorNthLastOfType.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorNthLastOfType::StyleSheetNodeSelectorNthLastOfType() -{ -} - -StyleSheetNodeSelectorNthLastOfType::~StyleSheetNodeSelectorNthLastOfType() -{ -} - -// Returns true if the element index is (n * a) + b for a given integer value of n. -bool StyleSheetNodeSelectorNthLastOfType::IsApplicable(const Element* element, int a, int b) -{ - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - // Start counting elements until we find this one. - int element_index = 1; - for (int i = parent->GetNumChildren() - 1; i >= 0; --i) - { - Element* child = parent->GetChild(i); - - // If we've found our element, then break; the current index is our element's index. - if (child == element) - break; - - // Skip nodes that don't share our tag. - if (child->GetTagName() != element->GetTagName() || - child->GetDisplay() == DISPLAY_NONE) - continue; - - element_index++; - } - - return IsNth(a, b, element_index); -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastOfType.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastOfType.h deleted file mode 100644 index 423888df75a..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthLastOfType.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORNTHLASTOFTYPE_H -#define ROCKETCORESTYLESHEETNODESELECTORNTHLASTOFTYPE_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the nth-last generic child of its type. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorNthLastOfType : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorNthLastOfType(); - virtual ~StyleSheetNodeSelectorNthLastOfType(); - - // Returns true if the element index is (n * a) + b for a given integer value of n. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthOfType.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthOfType.cpp deleted file mode 100644 index 85d0cfc8211..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthOfType.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorNthOfType.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorNthOfType::StyleSheetNodeSelectorNthOfType() -{ -} - -StyleSheetNodeSelectorNthOfType::~StyleSheetNodeSelectorNthOfType() -{ -} - -// Returns true if the element index is (n * a) + b for a given integer value of n. -bool StyleSheetNodeSelectorNthOfType::IsApplicable(const Element* element, int a, int b) -{ - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - // Start counting elements until we find this one. - int element_index = 1; - for (int i = 0; i < parent->GetNumChildren(); ++i) - { - Element* child = parent->GetChild(i); - - // If we've found our element, then break; the current index is our element's index. - if (child == element) - break; - - // Skip nodes that don't share our tag. - if (child->GetTagName() != element->GetTagName() || - child->GetDisplay() == DISPLAY_NONE) - continue; - - element_index++; - } - - return IsNth(a, b, element_index); -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthOfType.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthOfType.h deleted file mode 100644 index aa7de09efa6..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorNthOfType.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORNTHOFTYPE_H -#define ROCKETCORESTYLESHEETNODESELECTORNTHOFTYPE_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the nth generic child. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorNthOfType : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorNthOfType(); - virtual ~StyleSheetNodeSelectorNthOfType(); - - // Returns true if the element index is (n * a) + b for a given integer value of n. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp deleted file mode 100644 index d0a106dc94e..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorOnlyChild.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorOnlyChild::StyleSheetNodeSelectorOnlyChild() -{ -} - -StyleSheetNodeSelectorOnlyChild::~StyleSheetNodeSelectorOnlyChild() -{ -} - -// Returns true if the element is the only non-trivial DOM child of its parent. -bool StyleSheetNodeSelectorOnlyChild::IsApplicable(const Element* element, int ROCKET_UNUSED_PARAMETER(a), int ROCKET_UNUSED_PARAMETER(b)) -{ - ROCKET_UNUSED(a); - ROCKET_UNUSED(b); - - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - for (int i = 0; i < parent->GetNumChildren(); ++i) - { - Element* child = parent->GetChild(i); - - // Skip the child if it is our element. - if (child == element) - continue; - - // Skip the child if it is trivial. - if (dynamic_cast< const ElementText* >(element) != NULL || - child->GetDisplay() == DISPLAY_NONE) - continue; - - return false; - } - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyChild.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyChild.h deleted file mode 100644 index 78b8fcea61d..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyChild.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORONLYCHILD_H -#define ROCKETCORESTYLESHEETNODESELECTORONLYCHILD_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for an only child. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorOnlyChild : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorOnlyChild(); - virtual ~StyleSheetNodeSelectorOnlyChild(); - - // Returns true if the element is the only non-trivial DOM child of its parent. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp b/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp deleted file mode 100644 index 1b65e835a85..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetNodeSelectorOnlyOfType.h" -#include "../../Include/Rocket/Core/ElementText.h" -#include "../../Include/Rocket/Core/StyleSheetKeywords.h" - -namespace Rocket { -namespace Core { - -StyleSheetNodeSelectorOnlyOfType::StyleSheetNodeSelectorOnlyOfType() -{ -} - -StyleSheetNodeSelectorOnlyOfType::~StyleSheetNodeSelectorOnlyOfType() -{ -} - -// Returns true if the element is the only DOM child of its parent of its type. -bool StyleSheetNodeSelectorOnlyOfType::IsApplicable(const Element* element, int ROCKET_UNUSED_PARAMETER(a), int ROCKET_UNUSED_PARAMETER(b)) -{ - ROCKET_UNUSED(a); - ROCKET_UNUSED(b); - - Element* parent = element->GetParentNode(); - if (parent == NULL) - return false; - - for (int i = 0; i < parent->GetNumChildren(); ++i) - { - Element* child = parent->GetChild(i); - - // Skip the child if it is our element. - if (child == element) - continue; - - // Skip the child if it does not share our tag. - if (child->GetTagName() != element->GetTagName() || - child->GetDisplay() == DISPLAY_NONE) - continue; - - // We've found a similarly-tagged child to our element; selector fails. - return false; - } - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyOfType.h b/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyOfType.h deleted file mode 100644 index e3f0bfc6b60..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetNodeSelectorOnlyOfType.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETNODESELECTORONLYOFTYPE_H -#define ROCKETCORESTYLESHEETNODESELECTORONLYOFTYPE_H - -#include "StyleSheetNodeSelector.h" - -namespace Rocket { -namespace Core { - -/** - A node selector for the only child of its type. - - @author Peter Curry - */ - -class StyleSheetNodeSelectorOnlyOfType : public StyleSheetNodeSelector -{ -public: - StyleSheetNodeSelectorOnlyOfType(); - virtual ~StyleSheetNodeSelectorOnlyOfType(); - - // Returns true if the element is the only DOM child of its parent of its type. - virtual bool IsApplicable(const Element* element, int a, int b); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetParser.cpp b/libs/libRocket/Source/Core/StyleSheetParser.cpp deleted file mode 100644 index b803da01995..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetParser.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "StyleSheetParser.h" -#include -#include "StyleSheetFactory.h" -#include "StyleSheetNode.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/StreamMemory.h" -#include "../../Include/Rocket/Core/StyleSheet.h" -#include "../../Include/Rocket/Core/StyleSheetSpecification.h" - -namespace Rocket { -namespace Core { - -StyleSheetParser::StyleSheetParser() -{ - line_number = 0; - stream = NULL; - parse_buffer_pos = 0; -} - -StyleSheetParser::~StyleSheetParser() -{ -} - -int StyleSheetParser::Parse(StyleSheetNode* node, Stream* _stream) -{ - int rule_count = 0; - line_number = 0; - stream = _stream; - stream_file_name = stream->GetSourceURL().GetURL().Replace("|", ":"); - - // Look for more styles while data is available - while (FillBuffer()) - { - String style_names; - - while (FindToken(style_names, "{", true)) - { - // Read the attributes - PropertyDictionary properties; - if (!ReadProperties(properties)) - { - continue; - } - - StringList style_name_list; - StringUtilities::ExpandString(style_name_list, style_names); - - // Add style nodes to the root of the tree - for (size_t i = 0; i < style_name_list.size(); i++) - ImportProperties(node, style_name_list[i], properties, rule_count); - - rule_count++; - } - } - - return rule_count; -} - -bool StyleSheetParser::ParseProperties(PropertyDictionary& parsed_properties, const String& properties) -{ - stream = new StreamMemory((const byte*)properties.CString(), properties.Length()); - bool success = ReadProperties(parsed_properties); - stream->RemoveReference(); - stream = NULL; - return success; -} - -bool StyleSheetParser::ReadProperties(PropertyDictionary& properties) -{ - int rule_line_number = (int)line_number; - String name; - String value; - - enum ParseState { NAME, VALUE, QUOTE }; - ParseState state = NAME; - - char character; - char previous_character = 0; - while (ReadCharacter(character)) - { - parse_buffer_pos++; - - switch (state) - { - case NAME: - { - if (character == ';') - { - name = StringUtilities::StripWhitespace(name); - if (!name.Empty()) - { - Log::Message(Log::LT_WARNING, "Found name with no value parsing property declaration '%s' at %s:%d", name.CString(), stream_file_name.CString(), line_number); - name.Clear(); - } - } - else if (character == '}') - { - name = StringUtilities::StripWhitespace(name); - if (!StringUtilities::StripWhitespace(name).Empty()) - Log::Message(Log::LT_WARNING, "End of rule encountered while parsing property declaration '%s' at %s:%d", name.CString(), stream_file_name.CString(), line_number); - return true; - } - else if (character == ':') - { - name = StringUtilities::StripWhitespace(name); - state = VALUE; - } - else - name.Append(character); - } - break; - - case VALUE: - { - if (character == ';') - { - value = StringUtilities::StripWhitespace(value); - - if (!StyleSheetSpecification::ParsePropertyDeclaration(properties, name, value, stream_file_name, rule_line_number)) - Log::Message(Log::LT_WARNING, "Syntax error parsing property declaration '%s: %s;' in %s: %d.", name.CString(), value.CString(), stream_file_name.CString(), line_number); - - name.Clear(); - value.Clear(); - state = NAME; - } - else if (character == '}') - { - Log::Message(Log::LT_WARNING, "End of rule encountered while parsing property declaration '%s: %s;' in %s: %d.", name.CString(), value.CString(), stream_file_name.CString(), line_number); - return true; - } - else - { - value.Append(character); - if (character == '"') - state = QUOTE; - } - } - break; - - case QUOTE: - { - value.Append(character); - if (character == '"' && previous_character != '/') - state = VALUE; - } - break; - } - - previous_character = character; - } - - if (!name.Empty() || !value.Empty()) - Log::Message(Log::LT_WARNING, "Invalid property declaration at %s:%d", stream_file_name.CString(), line_number); - - return true; -} - -// Updates the StyleNode tree, creating new nodes as necessary, setting the definition index -bool StyleSheetParser::ImportProperties(StyleSheetNode* node, const String& names, const PropertyDictionary& properties, int rule_specificity) -{ - StyleSheetNode* tag_node = NULL; - StyleSheetNode* leaf_node = node; - - StringList nodes; - StringUtilities::ExpandString(nodes, names, ' '); - - // Create each node going down the tree - for (size_t i = 0; i < nodes.size(); i++) - { - String name = nodes[i]; - - String tag; - String id; - StringList classes; - StringList pseudo_classes; - StringList structural_pseudo_classes; - - size_t index = 0; - while (index < name.Length()) - { - size_t start_index = index; - size_t end_index = index + 1; - - // Read until we hit the next identifier. - while (end_index < name.Length() && - name[end_index] != '#' && - name[end_index] != '.' && - name[end_index] != ':') - end_index++; - - String identifier = name.Substring(start_index, end_index - start_index); - if (!identifier.Empty()) - { - switch (identifier[0]) - { - case '#': id = identifier.Substring(1); break; - case '.': classes.push_back(identifier.Substring(1)); break; - case ':': - { - String pseudo_class_name = identifier.Substring(1); - if (StyleSheetFactory::GetSelector(pseudo_class_name) != NULL) - structural_pseudo_classes.push_back(pseudo_class_name); - else - pseudo_classes.push_back(pseudo_class_name); - } - break; - - default: tag = identifier; - } - } - - index = end_index; - } - - // Sort the classes and pseudo-classes so they are consistent across equivalent declarations that shuffle the - // order around. - std::sort(classes.begin(), classes.end()); - std::sort(pseudo_classes.begin(), pseudo_classes.end()); - std::sort(structural_pseudo_classes.begin(), structural_pseudo_classes.end()); - - // Get the named child node. - leaf_node = leaf_node->GetChildNode(tag, StyleSheetNode::TAG); - tag_node = leaf_node; - - if (!id.Empty()) - leaf_node = leaf_node->GetChildNode(id, StyleSheetNode::ID); - - for (size_t j = 0; j < classes.size(); ++j) - leaf_node = leaf_node->GetChildNode(classes[j], StyleSheetNode::CLASS); - - for (size_t j = 0; j < structural_pseudo_classes.size(); ++j) - leaf_node = leaf_node->GetChildNode(structural_pseudo_classes[j], StyleSheetNode::STRUCTURAL_PSEUDO_CLASS); - - for (size_t j = 0; j < pseudo_classes.size(); ++j) - leaf_node = leaf_node->GetChildNode(pseudo_classes[j], StyleSheetNode::PSEUDO_CLASS); - } - - // Merge the new properties with those already on the leaf node. - leaf_node->ImportProperties(properties, rule_specificity); - - return true; -} - -bool StyleSheetParser::FindToken(String& buffer, const char* tokens, bool remove_token) -{ - buffer.Clear(); - char character; - while (ReadCharacter(character)) - { - if (strchr(tokens, character) != NULL) - { - if (remove_token) - parse_buffer_pos++; - return true; - } - else - { - buffer.Append(character); - parse_buffer_pos++; - } - } - - return false; -} - -// Attempts to find the next character in the active stream. -bool StyleSheetParser::ReadCharacter(char& buffer) -{ - bool comment = false; - - // Continuously fill the buffer until either we run out of - // stream or we find the requested token - do - { - while (parse_buffer_pos < parse_buffer.Length()) - { - if (parse_buffer[parse_buffer_pos] == '\n') - line_number++; - else if (comment) - { - // Check for closing comment - if (parse_buffer[parse_buffer_pos] == '*') - { - parse_buffer_pos++; - if (parse_buffer_pos >= parse_buffer.Length()) - { - if (!FillBuffer()) - return false; - } - - if (parse_buffer[parse_buffer_pos] == '/') - comment = false; - } - } - else - { - // Check for an opening comment - if (parse_buffer[parse_buffer_pos] == '/') - { - parse_buffer_pos++; - if (parse_buffer_pos >= parse_buffer.Length()) - { - if (!FillBuffer()) - { - buffer = '/'; - parse_buffer = "/"; - return true; - } - } - - if (parse_buffer[parse_buffer_pos] == '*') - comment = true; - else - { - buffer = '/'; - if (parse_buffer_pos == 0) - parse_buffer.Insert(parse_buffer_pos, '/'); - else - parse_buffer_pos--; - return true; - } - } - - if (!comment) - { - // If we find a character, return it - buffer = parse_buffer[parse_buffer_pos]; - return true; - } - } - - parse_buffer_pos++; - } - } - while (FillBuffer()); - - return false; -} - -// Fills the internal buffer with more content -bool StyleSheetParser::FillBuffer() -{ - // If theres no data to process, abort - if (stream->IsEOS()) - return false; - - // Read in some data (4092 instead of 4096 to avoid the buffer growing when we have to add back - // a character after a failed comment parse.) - parse_buffer.Clear(); - bool read = stream->Read(parse_buffer, 4092) > 0; - parse_buffer_pos = 0; - - return read; -} - -} -} diff --git a/libs/libRocket/Source/Core/StyleSheetParser.h b/libs/libRocket/Source/Core/StyleSheetParser.h deleted file mode 100644 index e4b96d89d5a..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetParser.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORESTYLESHEETPARSER_H -#define ROCKETCORESTYLESHEETPARSER_H - -namespace Rocket { -namespace Core { - -class PropertyDictionary; -class Stream; -class StyleSheetNode; - -/** - Helper class for parsing a style sheet into its memory representation. - - @author Lloyd Weehuizen - */ - -class StyleSheetParser -{ -public: - StyleSheetParser(); - ~StyleSheetParser(); - - /// Parses the given stream into the style sheet - /// @param node The root node the stream will be parsed into - /// @param stream The stream to read - /// @return The number of parsed rules, or -1 if an error occured. - int Parse(StyleSheetNode* node, Stream* stream); - - /// Parses the given string into the property dictionary - /// @param parsed_properties The properties dictionary the properties will be read into - /// @param properties The properties to parse - /// @return True if the parse was successful, or false if an error occured. - bool ParseProperties(PropertyDictionary& parsed_properties, const String& properties); - -private: - // Stream we're parsing from. - Stream* stream; - // Parser memory buffer. - String parse_buffer; - // How far we've read through the buffer. - size_t parse_buffer_pos; - - // The name of the file we'r parsing. - String stream_file_name; - // Current line number we're parsing. - size_t line_number; - - // Parses properties from the parse buffer into the dictionary - // @param properties The dictionary to store the properties in - bool ReadProperties(PropertyDictionary& properties); - - // Import properties into the stylesheet node - // @param node Node to import into - // @param names The names of the nodes - // @param properties The dictionary of properties - // @param rule_specificity The specifity of the rule - bool ImportProperties(StyleSheetNode* node, const String& names, const PropertyDictionary& properties, int rule_specificity); - - // Attempts to find one of the given character tokens in the active stream - // If it's found, buffer is filled with all content up until the token - // @param buffer The buffer that receives the content - // @param characters The character tokens to find - // @param remove_token If the token that caused the find to stop should be removed from the stream - bool FindToken(String& buffer, const char* tokens, bool remove_token); - - // Attempts to find the next character in the active stream. - // If it's found, buffer is filled with the character - // @param buffer The buffer that receives the character, if read. - bool ReadCharacter(char& buffer); - - // Fill the internal parse buffer - bool FillBuffer(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/StyleSheetSpecification.cpp b/libs/libRocket/Source/Core/StyleSheetSpecification.cpp deleted file mode 100644 index daf54ff6895..00000000000 --- a/libs/libRocket/Source/Core/StyleSheetSpecification.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/StyleSheetSpecification.h" -#include "PropertyParserNumber.h" -#include "PropertyParserColour.h" -#include "PropertyParserKeyword.h" -#include "PropertyParserString.h" - -namespace Rocket { -namespace Core { - -static StyleSheetSpecification* instance = NULL; - -StyleSheetSpecification::StyleSheetSpecification() -{ - ROCKET_ASSERT(instance == NULL); - instance = this; -} - -StyleSheetSpecification::~StyleSheetSpecification() -{ - ROCKET_ASSERT(instance == this); - instance = NULL; -} - -bool StyleSheetSpecification::Initialise() -{ - if (instance == NULL) - { - new StyleSheetSpecification(); - - instance->RegisterDefaultParsers(); - instance->RegisterDefaultProperties(); - } - - return true; -} - -void StyleSheetSpecification::Shutdown() -{ - if (instance != NULL) - { - for (ParserMap::iterator iterator = instance->parsers.begin(); iterator != instance->parsers.end(); iterator++) - (*iterator).second->Release(); - - delete instance; - } -} - -// Registers a parser for use in property definitions. -bool StyleSheetSpecification::RegisterParser(const String& parser_name, PropertyParser* parser) -{ - ParserMap::iterator iterator = instance->parsers.find(parser_name); - if (iterator != instance->parsers.end()) - (*iterator).second->Release(); - - instance->parsers[parser_name] = parser; - return true; -} - -// Returns the parser registered with a specific name. -PropertyParser* StyleSheetSpecification::GetParser(const String& parser_name) -{ - ParserMap::iterator iterator = instance->parsers.find(parser_name); - if (iterator == instance->parsers.end()) - return NULL; - - return (*iterator).second; -} - -// Registers a property with a new definition. -PropertyDefinition& StyleSheetSpecification::RegisterProperty(const String& property_name, const String& default_value, bool inherited, bool forces_layout) -{ - return instance->properties.RegisterProperty(property_name, default_value, inherited, forces_layout); -} - -// Returns a property definition. -const PropertyDefinition* StyleSheetSpecification::GetProperty(const String& property_name) -{ - return instance->properties.GetProperty(property_name); -} - -// Fetches a list of the names of all registered property definitions. -const PropertyNameList& StyleSheetSpecification::GetRegisteredProperties() -{ - return instance->properties.GetRegisteredProperties(); -} - -const PropertyNameList & StyleSheetSpecification::GetRegisteredInheritedProperties() -{ - return instance->properties.GetRegisteredInheritedProperties(); -} - -// Registers a shorthand property definition. -bool StyleSheetSpecification::RegisterShorthand(const String& shorthand_name, const String& property_names, PropertySpecification::ShorthandType type) -{ - return instance->properties.RegisterShorthand(shorthand_name, property_names, type); -} - -// Returns a shorthand definition. -const PropertyShorthandDefinition* StyleSheetSpecification::GetShorthand(const String& shorthand_name) -{ - return instance->properties.GetShorthand(shorthand_name); -} - -// Parses a property declaration, setting any parsed and validated properties on the given dictionary. -bool StyleSheetSpecification::ParsePropertyDeclaration(PropertyDictionary& dictionary, const String& property_name, const String& property_value, const String& source_file, int source_line_number) -{ - return instance->properties.ParsePropertyDeclaration(dictionary, property_name, property_value, source_file, source_line_number); -} - -// Registers Rocket's default parsers. -void StyleSheetSpecification::RegisterDefaultParsers() -{ - RegisterParser("number", new PropertyParserNumber()); - RegisterParser("keyword", new PropertyParserKeyword()); - RegisterParser("string", new PropertyParserString()); - RegisterParser(COLOR, new PropertyParserColour()); -} - -// Registers Rocket's default style properties. -void StyleSheetSpecification::RegisterDefaultProperties() -{ - // Style property specifications (ala RCSS). - - RegisterProperty(MARGIN_TOP, "0px", false, true) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(MARGIN_RIGHT, "0px", false, true) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(MARGIN_BOTTOM, "0px", false, true) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(MARGIN_LEFT, "0px", false, true) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterShorthand(MARGIN, "margin-top, margin-right, margin-bottom, margin-left"); - - RegisterProperty(PADDING_TOP, "0px", false, true).AddParser("number"); - RegisterProperty(PADDING_RIGHT, "0px", false, true).AddParser("number"); - RegisterProperty(PADDING_BOTTOM, "0px", false, true).AddParser("number"); - RegisterProperty(PADDING_LEFT, "0px", false, true).AddParser("number"); - RegisterShorthand(PADDING, "padding-top, padding-right, padding-bottom, padding-left"); - - RegisterProperty(BORDER_TOP_WIDTH, "0px", false, true).AddParser("number"); - RegisterProperty(BORDER_RIGHT_WIDTH, "0px", false, true).AddParser("number"); - RegisterProperty(BORDER_BOTTOM_WIDTH, "0px", false, true).AddParser("number"); - RegisterProperty(BORDER_LEFT_WIDTH, "0px", false, true).AddParser("number"); - RegisterShorthand(BORDER_WIDTH, "border-top-width, border-right-width, border-bottom-width, border-left-width"); - - RegisterProperty(BORDER_TOP_COLOR, "black", false, false).AddParser(COLOR); - RegisterProperty(BORDER_RIGHT_COLOR, "black", false, false).AddParser(COLOR); - RegisterProperty(BORDER_BOTTOM_COLOR, "black", false, false).AddParser(COLOR); - RegisterProperty(BORDER_LEFT_COLOR, "black", false, false).AddParser(COLOR); - RegisterShorthand(BORDER_COLOR, "border-top-color, border-right-color, border-bottom-color, border-left-color"); - - RegisterShorthand(BORDER_TOP, "border-top-width, border-top-color"); - RegisterShorthand(BORDER_RIGHT, "border-right-width, border-right-color"); - RegisterShorthand(BORDER_BOTTOM, "border-bottom-width, border-bottom-color"); - RegisterShorthand(BORDER_LEFT, "border-left-width, border-left-color"); - - RegisterProperty(DISPLAY, "inline", false, true).AddParser("keyword", "none, block, inline, inline-block"); - RegisterProperty(POSITION, "static", false, true).AddParser("keyword", "static, relative, absolute, fixed"); - RegisterProperty(TOP, "auto", false, false) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(RIGHT, "auto", false, false) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(BOTTOM, "auto", false, false) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(LEFT, "auto", false, false) - .AddParser("keyword", "auto") - .AddParser("number"); - - RegisterProperty(FLOAT, "none", false, true).AddParser("keyword", "none, left, right"); - RegisterProperty(CLEAR, "none", false, true).AddParser("keyword", "none, left, right, both"); - - RegisterProperty(Z_INDEX, "auto", false, false) - .AddParser("keyword", "auto, top, bottom") - .AddParser("number"); - - RegisterProperty(WIDTH, "auto", false, true) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(MIN_WIDTH, "0px", false, true).AddParser("number"); - RegisterProperty(MAX_WIDTH, "-1", false, true).AddParser("number"); - - RegisterProperty(HEIGHT, "auto", false, true) - .AddParser("keyword", "auto") - .AddParser("number"); - RegisterProperty(MIN_HEIGHT, "0px", false, true).AddParser("number"); - RegisterProperty(MAX_HEIGHT, "-1", false, true).AddParser("number"); - - RegisterProperty(LINE_HEIGHT, "1.2", true, true).AddParser("number"); - RegisterProperty(VERTICAL_ALIGN, "baseline", false, true) - .AddParser("keyword", "baseline, middle, sub, super, text-top, text-bottom, top, bottom") - .AddParser("number"); - - RegisterProperty(OVERFLOW_X, "visible", false, true).AddParser("keyword", "visible, hidden, auto, scroll"); - RegisterProperty(OVERFLOW_Y, "visible", false, true).AddParser("keyword", "visible, hidden, auto, scroll"); - RegisterShorthand("overflow", "overflow-x, overflow-y", PropertySpecification::REPLICATE); - RegisterProperty(CLIP, "auto", true, false) - .AddParser("keyword", "auto, none") - .AddParser("number"); - RegisterProperty(VISIBILITY, "visible", false, false).AddParser("keyword", "visible, hidden"); - - // Need some work on this if we are to include images. - RegisterProperty(BACKGROUND_COLOR, "transparent", false, false).AddParser(COLOR); - RegisterShorthand(BACKGROUND, BACKGROUND_COLOR); - - RegisterProperty(COLOR, "white", true, false).AddParser(COLOR); - - RegisterProperty(FONT_FAMILY, "", true, true).AddParser("string"); - RegisterProperty(FONT_CHARSET, "U+0020-0100", true, false).AddParser("string"); - RegisterProperty(FONT_STYLE, "normal", true, true).AddParser("keyword", "normal, italic"); - RegisterProperty(FONT_WEIGHT, "normal", true, true).AddParser("keyword", "normal, bold"); - RegisterProperty(FONT_SIZE, "12", true, true).AddParser("number"); - RegisterShorthand(FONT, "font-style, font-weight, font-size, font-family, font-charset"); - - RegisterProperty(TEXT_ALIGN, LEFT, true, true).AddParser("keyword", "left, right, center, justify"); - RegisterProperty(TEXT_DECORATION, "none", true, false).AddParser("keyword", "none, underline"/*"none, underline, overline, line-through"*/); - RegisterProperty(TEXT_TRANSFORM, "none", true, true).AddParser("keyword", "none, capitalize, uppercase, lowercase"); - RegisterProperty(WHITE_SPACE, "normal", true, true).AddParser("keyword", "normal, pre, nowrap, pre-wrap, pre-line"); - - RegisterProperty(CURSOR, "auto", true, false) - .AddParser("keyword", "auto") - .AddParser("string"); - - // Functional property specifications. - RegisterProperty(DRAG, "none", false, false).AddParser("keyword", "none, drag, drag-drop, block, clone"); - RegisterProperty(TAB_INDEX, "none", false, false).AddParser("keyword", "none, auto"); - RegisterProperty(FOCUS, "auto", true, false).AddParser("keyword", "none, auto"); - - RegisterProperty(SCROLLBAR_MARGIN, "0", false, false).AddParser("number"); - - RegisterProperty(OPACITY, "1", true).AddParser("number"); -} - -} -} diff --git a/libs/libRocket/Source/Core/SystemInterface.cpp b/libs/libRocket/Source/Core/SystemInterface.cpp deleted file mode 100644 index bd9cb5efba6..00000000000 --- a/libs/libRocket/Source/Core/SystemInterface.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/SystemInterface.h" -#include "../../Include/Rocket/Core/Log.h" - -#ifdef ROCKET_PLATFORM_WIN32 -#include -#endif - -namespace Rocket { -namespace Core { - -SystemInterface::SystemInterface() : ReferenceCountable(0) -{ -} - -SystemInterface::~SystemInterface() -{ -} - -#ifdef ROCKET_PLATFORM_WIN32 -bool SystemInterface::LogMessage(Log::Type logtype, const String& message) -{ - // By default we just send a platform message - if (logtype == Log::LT_ASSERT) - { - Core::String message(1024, "%s\nWould you like to interrupt execution?", message.CString()); - - // Return TRUE if the user presses NO (continue execution) - return (IDNO == MessageBoxA(NULL, message.CString(), "Assertion Failure", MB_YESNO | MB_ICONSTOP | MB_DEFBUTTON2 | MB_TASKMODAL)); - } - else - { - OutputDebugStringA(message.CString()); - OutputDebugStringA("\r\n"); - } - return true; -} -#else -bool SystemInterface::LogMessage(Log::Type ROCKET_UNUSED_PARAMETER(logtype), const String& message) -{ - ROCKET_UNUSED(logtype); - - fprintf(stderr,"%s\n", message.CString()); - return true; -} -#endif - -int SystemInterface::TranslateString(String& translated, const String& input) -{ - translated = input; - return 0; -} - -// Joins the path of an RML or RCSS file with the path of a resource specified within the file. -void SystemInterface::JoinPath(String& translated_path, const String& document_path, const String& path) -{ - // If the path is absolute, strip the leading / and return it. - if (path.Substring(0, 1) == "/") - { - translated_path = path.Substring(1); - return; - } - - // If the path is a Windows-style absolute path, return it directly. - size_t drive_pos = path.Find(":"); - size_t slash_pos = Math::Min(path.Find("/"), path.Find("\\")); - if (drive_pos != String::npos && - drive_pos < slash_pos) - { - translated_path = path; - return; - } - - // Strip off the referencing document name. - translated_path = document_path; - translated_path = translated_path.Replace("\\", "/"); - size_t file_start = translated_path.RFind("/"); - if (file_start != String::npos) - translated_path.Resize(file_start + 1); - else - translated_path.Clear(); - - // Append the paths and send through URL to removing any '..'. - URL url(translated_path.Replace(":", "|") + path.Replace("\\", "/")); - translated_path = url.GetPathedFileName().Replace("|", ":"); -} - -// Activate keyboard (for touchscreen devices) -void SystemInterface::ActivateKeyboard() -{ -} - -// Deactivate keyboard (for touchscreen devices) -void SystemInterface::DeactivateKeyboard() -{ -} - -// Called when this system interface is released. -void SystemInterface::Release() -{ -} - -void SystemInterface::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/Template.cpp b/libs/libRocket/Source/Core/Template.cpp deleted file mode 100644 index 7de3d12ac1e..00000000000 --- a/libs/libRocket/Source/Core/Template.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "Template.h" -#include "XMLParseTools.h" -#include "../../Include/Rocket/Core/ElementUtilities.h" -#include "../../Include/Rocket/Core/XMLParser.h" - -namespace Rocket { -namespace Core { - -Template::Template() -{ - body = NULL; -} - -Template::~Template() -{ - if (body) - body->RemoveReference(); -} - -const String& Template::GetName() const -{ - return name; -} - -bool Template::Load(Stream* stream) -{ - // Load the entire template into memory so we can pull out - // the header and body tags - String buffer; - stream->Read(buffer, stream->Length()); - - // Pull out the header - const char* head_start = XMLParseTools::FindTag("head", buffer.CString()); - if (!head_start) - return false; - - const char* head_end = XMLParseTools::FindTag("head", head_start, true); - if (!head_end) - return false; - // Advance to the end of the tag - head_end = strchr(head_end, '>') + 1; - - // Pull out the body - const char* body_start = XMLParseTools::FindTag("body", head_end); - if (!body_start) - return false; - - const char* body_end = XMLParseTools::FindTag("body", body_start, true); - if (!body_end) - return false; - // Advance to the end of the tag - body_end = strchr(body_end, '>') + 1; - - // Find the RML tag, skip over it and read the attributes, - // storing the ones we're interested in. - String attribute_name; - String attribute_value; - const char* ptr = XMLParseTools::FindTag("template", buffer.CString()); - if (!ptr) - return false; - - while (XMLParseTools::ReadAttribute(++ptr, attribute_name, attribute_value)) - { - if (attribute_name == "name") - name = attribute_value; - if (attribute_name == "content") - content = attribute_value; - } - - // Create a stream around the header, parse it and store it - StreamMemory* header_stream = new StreamMemory((const byte*) head_start,head_end - head_start); - header_stream->SetSourceURL(stream->GetSourceURL()); - - XMLParser parser(NULL); - parser.Parse(header_stream); - - header_stream->RemoveReference(); - - header = *parser.GetDocumentHeader(); - - // Store the body in stream form - body = new StreamMemory(body_end - body_start); - body->SetSourceURL(stream->GetSourceURL()); - body->PushBack(body_start, body_end - body_start); - - return true; -} - -Element* Template::ParseTemplate(Element* element) -{ - body->Seek(0, SEEK_SET); - - XMLParser parser(element); - parser.Parse(body); - - // If theres an inject attribute on the template, - // attempt to find the required element - if (!content.Empty()) - { - Element* content_element = ElementUtilities::GetElementById(element, content); - if (content_element) - element = content_element; - } - - return element; -} - -const DocumentHeader* Template::GetHeader() -{ - return &header; -} - -} -} diff --git a/libs/libRocket/Source/Core/Template.h b/libs/libRocket/Source/Core/Template.h deleted file mode 100644 index d2026934270..00000000000 --- a/libs/libRocket/Source/Core/Template.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORETEMPLATE_H -#define ROCKETCORETEMPLATE_H - -#include "../../Include/Rocket/Core/StreamMemory.h" -#include "DocumentHeader.h" - -namespace Rocket { -namespace Core { - -class Element; - -/** - Contains a RML template. The Header is stored in parsed form, body in an unparsed stream. - - @author Lloyd Weehuizen - */ - -class Template -{ -public: - Template(); - ~Template(); - - /// Load a template from the given stream - bool Load(Stream* stream); - - /// Get the ID of the template - const String& GetName() const; - - /// Parse the template into the given element - /// @param element Element to parse into - /// @returns The element to continue the parse from - Element* ParseTemplate(Element* element); - - /// Get the template header - const DocumentHeader* GetHeader(); - -private: - String name; - String content; - DocumentHeader header; - StreamMemory* body; - - String ReadAttribute(const String& string); - const String& FindTag(const String& tag, const String& string, bool closing_tag = false); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/TemplateCache.cpp b/libs/libRocket/Source/Core/TemplateCache.cpp deleted file mode 100644 index ca3e21081bc..00000000000 --- a/libs/libRocket/Source/Core/TemplateCache.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TemplateCache.h" -#include "StreamFile.h" -#include "Template.h" -#include "../../Include/Rocket/Core/Log.h" - -namespace Rocket { -namespace Core { - -static TemplateCache* instance = NULL; - -TemplateCache::TemplateCache() -{ - ROCKET_ASSERT(instance == NULL); - instance = this; -} - -TemplateCache::~TemplateCache() -{ - for (Templates::iterator itr = instance->templates.begin(); itr != instance->templates.end(); ++itr) - { - delete (*itr).second; - } - - instance = NULL; -} - -bool TemplateCache::Initialise() -{ - new TemplateCache(); - - return true; -} - -void TemplateCache::Shutdown() -{ - delete instance; -} - -Template* TemplateCache::LoadTemplate(const String& name) -{ - // Check if the template is already loaded - Templates::iterator itr = instance->templates.find(name); - if (itr != instance->templates.end()) - return (*itr).second; - - // Nope, we better load it - Template* new_template = NULL; - StreamFile* stream = new StreamFile(); - if (stream->Open(name)) - { - new_template = new Template(); - if (!new_template->Load(stream)) - { - Log::Message(Log::LT_ERROR, "Failed to load template %s.", name.CString()); - delete new_template; - new_template = NULL; - } - else if (new_template->GetName().Empty()) - { - Log::Message(Log::LT_ERROR, "Failed to load template %s, template is missing its name.", name.CString()); - delete new_template; - new_template = NULL; - } - else - { - instance->templates[name] = new_template; - instance->template_ids[new_template->GetName()] = new_template; - } - } - else - { - Log::Message(Log::LT_ERROR, "Failed to open template file %s.", name.CString()); - } - stream->RemoveReference(); - - return new_template; -} - -Template* TemplateCache::GetTemplate(const String& name) -{ - // Check if the template is already loaded - Templates::iterator itr = instance->template_ids.find(name); - if (itr != instance->template_ids.end()) - return (*itr).second; - - return NULL; -} - -void TemplateCache::Clear() -{ - for (Templates::iterator i = instance->templates.begin(); i != instance->templates.end(); ++i) - delete (*i).second; - - instance->templates.clear(); - instance->template_ids.clear(); -} - -} -} diff --git a/libs/libRocket/Source/Core/TemplateCache.h b/libs/libRocket/Source/Core/TemplateCache.h deleted file mode 100644 index 9719ddb4f68..00000000000 --- a/libs/libRocket/Source/Core/TemplateCache.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORETEMPLATECACHE_H -#define ROCKETCORETEMPLATECACHE_H - -#include - -namespace Rocket { -namespace Core { - -class Template; - -/** - Manages requests for loading templates, caching as it goes. - - @author Lloyd Weehuizen - */ - -class TemplateCache -{ -public: - /// Initialisation and Shutdown - static bool Initialise(); - static void Shutdown(); - - /// Load the named template from the given path, if its already loaded get the cached copy - static Template* LoadTemplate(const String& path); - /// Get the template by id - static Template* GetTemplate(const String& id); - - /// Clear the template cache. - static void Clear(); - -private: - TemplateCache(); - ~TemplateCache(); - - typedef std::map Templates; - Templates templates; - Templates template_ids; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/Texture.cpp b/libs/libRocket/Source/Core/Texture.cpp deleted file mode 100644 index 55857978f23..00000000000 --- a/libs/libRocket/Source/Core/Texture.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Texture.h" -#include "TextureDatabase.h" -#include "TextureResource.h" - -namespace Rocket { -namespace Core { - -// Constructs an unloaded texture with no resource. -Texture::Texture() -{ - resource = NULL; -} - -// Constructs a texture sharing the resource of another. -Texture::Texture(const Texture& copy) -{ - resource = NULL; - *this = copy; -} - -Texture::~Texture() -{ - if (resource) - resource->RemoveReference(); -} - -// Attempts to load a texture. -bool Texture::Load(const String& source, const String& source_path) -{ - if (resource != NULL) - resource->RemoveReference(); - - resource = TextureDatabase::Fetch(source, source_path); - return resource != NULL; -} - -// Returns the texture's source name. This is usually the name of the file the texture was loaded from. -String Texture::GetSource() const -{ - if (resource == NULL) - return NULL; - - return resource->GetSource(); -} - -// Returns the texture's handle. -TextureHandle Texture::GetHandle(RenderInterface* render_interface) const -{ - if (resource == NULL) - return 0; - - return resource->GetHandle(render_interface); -} - -// Returns the texture's dimensions. -Vector2i Texture::GetDimensions(RenderInterface* render_interface) const -{ - if (resource == NULL) - return Vector2i(0, 0); - - return resource->GetDimensions(render_interface); -} - -// Releases this texture's resource (if any), and sets it to another texture's resource. -const Texture& Texture::operator=(const Texture& copy) -{ - if (resource != NULL) - resource->RemoveReference(); - - resource = copy.resource; - if (resource != NULL) - resource->AddReference(); - - return *this; -} - -} -} diff --git a/libs/libRocket/Source/Core/TextureDatabase.cpp b/libs/libRocket/Source/Core/TextureDatabase.cpp deleted file mode 100644 index 0596d193d3e..00000000000 --- a/libs/libRocket/Source/Core/TextureDatabase.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TextureDatabase.h" -#include "TextureResource.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -static TextureDatabase* instance = NULL; - -TextureDatabase::TextureDatabase() -{ - ROCKET_ASSERT(instance == NULL); - instance = this; -} - -TextureDatabase::~TextureDatabase() -{ - ROCKET_ASSERT(instance == this); - instance = NULL; -} - -void TextureDatabase::Initialise() -{ - new TextureDatabase(); -} - -void TextureDatabase::Shutdown() -{ - delete instance; -} - -// If the requested texture is already in the database, it will be returned with an extra reference count. If not, it -// will be loaded through the application's render interface. -TextureResource* TextureDatabase::Fetch(const String& source, const String& source_directory) -{ - String path; - if (source.Substring(0, 1) == "?") - path = source; - else - GetSystemInterface()->JoinPath(path, source_directory.Replace("|", ":"), source); - - TextureMap::iterator iterator = instance->textures.find(path); - if (iterator != instance->textures.end()) - { - (*iterator).second->AddReference(); - return (*iterator).second; - } - - TextureResource* resource = new TextureResource(); - if (!resource->Load(path)) - { - resource->RemoveReference(); - return NULL; - } - - instance->textures[resource->GetSource()] = resource; - return resource; -} - -// Releases all textures in the database. -void TextureDatabase::ReleaseTextures() -{ - for (TextureMap::iterator i = instance->textures.begin(); i != instance->textures.end(); ++i) - i->second->Release(); -} - -// Removes a texture from the database. -void TextureDatabase::RemoveTexture(TextureResource* texture) -{ - if (instance != NULL) - { - TextureMap::iterator iterator = instance->textures.find(texture->GetSource()); - if (iterator != instance->textures.end()) - instance->textures.erase(iterator); - } -} - -// Release all textures bound through a render interface. -void TextureDatabase::ReleaseTextures(RenderInterface* render_interface) -{ - if (instance != NULL) - { - for (TextureMap::iterator i = instance->textures.begin(); i != instance->textures.end(); ++i) - i->second->Release(render_interface); - } -} - -} -} diff --git a/libs/libRocket/Source/Core/TextureDatabase.h b/libs/libRocket/Source/Core/TextureDatabase.h deleted file mode 100644 index a346b991903..00000000000 --- a/libs/libRocket/Source/Core/TextureDatabase.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORETEXTUREDATABASE_H -#define ROCKETCORETEXTUREDATABASE_H - -#include "../../Include/Rocket/Core/String.h" -#include - -namespace Rocket { -namespace Core { - -class RenderInterface; -class TextureResource; - -/** - @author Peter Curry - */ - -class TextureDatabase -{ -public: - static void Initialise(); - static void Shutdown(); - - /// If the requested texture is already in the database, it will be returned with an extra - /// reference count. If not, it will be loaded through the application's render interface. - static TextureResource* Fetch(const String& source, const String& source_directory); - - /// Releases all textures in the database. - static void ReleaseTextures(); - - /// Removes a texture from the database. - static void RemoveTexture(TextureResource* texture); - - /// Release all textures bound through a render interface. - static void ReleaseTextures(RenderInterface* render_interface); - -private: - TextureDatabase(); - ~TextureDatabase(); - - typedef std::map< String, TextureResource* > TextureMap; - TextureMap textures; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/TextureLayout.cpp b/libs/libRocket/Source/Core/TextureLayout.cpp deleted file mode 100644 index 7edc578b1fb..00000000000 --- a/libs/libRocket/Source/Core/TextureLayout.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TextureLayout.h" -#include -#include "TextureLayoutRectangle.h" -#include "TextureLayoutTexture.h" - -namespace Rocket { -namespace Core { - -struct RectangleSort -{ - bool operator()(const TextureLayoutRectangle& lhs, const TextureLayoutRectangle& rhs) const - { - return lhs.GetDimensions().y > rhs.GetDimensions().y; - } -}; - -TextureLayout::TextureLayout() -{ -} - -TextureLayout::~TextureLayout() -{ -} - -// Adds a rectangle to the list of rectangles to be laid out. -void TextureLayout::AddRectangle(int id, const Vector2i& dimensions) -{ - rectangles.push_back(TextureLayoutRectangle(id, dimensions)); -} - -// Returns one of the layout's rectangles. -TextureLayoutRectangle& TextureLayout::GetRectangle(int index) -{ - ROCKET_ASSERT(index >= 0); - ROCKET_ASSERT(index < GetNumRectangles()); - - return rectangles[index]; -} - -// Returns the number of rectangles in the layout. -int TextureLayout::GetNumRectangles() const -{ - return (int) rectangles.size(); -} - -// Returns one of the layout's textures. -TextureLayoutTexture& TextureLayout::GetTexture(int index) -{ - ROCKET_ASSERT(index >= 0); - ROCKET_ASSERT(index < GetNumTextures()); - - return textures[index]; -} - -// Returns the number of textures in the layout. -int TextureLayout::GetNumTextures() const -{ - return (int) textures.size(); -} - -// Attempts to generate an efficient texture layout for the rectangles. -bool TextureLayout::GenerateLayout(int max_texture_dimensions, int samples) -{ - // Sort the rectangles by height. - std::sort(rectangles.begin(), rectangles.end(), RectangleSort()); - - int num_placed_rectangles = 0; - while (num_placed_rectangles != GetNumRectangles()) - { - TextureLayoutTexture texture(samples); - int texture_size = texture.Generate(*this, max_texture_dimensions); - if (texture_size == 0) - return false; - - textures.push_back(texture); - num_placed_rectangles += texture_size; - } - - return true; -} - -} -} diff --git a/libs/libRocket/Source/Core/TextureLayout.h b/libs/libRocket/Source/Core/TextureLayout.h deleted file mode 100644 index ea381cf7edb..00000000000 --- a/libs/libRocket/Source/Core/TextureLayout.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef TEXTURELAYOUT_H -#define TEXTURELAYOUT_H - -#include "TextureLayoutRectangle.h" -#include "TextureLayoutTexture.h" - -namespace Rocket { -namespace Core { - -/** - A texture layout generates and stores a layout of rectangles within a series of textures. It is - used primarily by the font system for generating font textures. - - @author Peter - */ - -class TextureLayout -{ -public: - TextureLayout(); - ~TextureLayout(); - - /// Adds a rectangle to the list of rectangles to be laid out. All rectangles must be added to - /// the layout before the layout is generated. - /// @param[in] id The id of the rectangle; used to identify the rectangle after it has been positioned. - /// @param[in] dimensions The dimensions of the rectangle. - void AddRectangle(int id, const Vector2i& dimensions); - - /// Returns one of the layout's rectangles. - /// @param[in] index The index of the desired rectangle. - /// @return The desired rectangle. - TextureLayoutRectangle& GetRectangle(int index); - /// Returns the number of rectangles in the layout. - /// @return The layout's rectangle count. - int GetNumRectangles() const; - - /// Returns one of the layout's textures. - /// @param[in] index The index of the desired texture. - /// @return The desired texture. - TextureLayoutTexture& GetTexture(int index); - /// Returns the number of textures in the layout. - /// @return The layout's texture count. - int GetNumTextures() const; - - /// Attempts to generate an efficient texture layout for the rectangles. - /// @param[in] max_texture_dimensions The maximum dimensions allowed for any single texture. - /// @param[in] samples Pixel size of texture data, in bytes. - /// @return True if the layout was generated successfully, false if not. - bool GenerateLayout(int max_texture_dimensions, int samples); - -private: - typedef std::vector< TextureLayoutRectangle > RectangleList; - typedef std::vector< TextureLayoutTexture > TextureList; - - TextureList textures; - RectangleList rectangles; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/TextureLayoutRectangle.cpp b/libs/libRocket/Source/Core/TextureLayoutRectangle.cpp deleted file mode 100644 index 09ca8f89af5..00000000000 --- a/libs/libRocket/Source/Core/TextureLayoutRectangle.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TextureLayoutRectangle.h" - -namespace Rocket { -namespace Core { - -TextureLayoutRectangle::TextureLayoutRectangle(int _id, const Vector2i& dimensions) : dimensions(dimensions), texture_position(0, 0) -{ - id = _id; - texture_index = -1; - - texture_data = NULL; - texture_stride = 0; -} - -TextureLayoutRectangle::~TextureLayoutRectangle() -{ -} - -// Returns the rectangle's id. -int TextureLayoutRectangle::GetId() const -{ - return id; -} - -// Returns the rectangle's position; this is only valid if it has been placed. -const Vector2i& TextureLayoutRectangle::GetPosition() const -{ - return texture_position; -} - -// Returns the rectangle's dimensions. -const Vector2i& TextureLayoutRectangle::GetDimensions() const -{ - return dimensions; -} - -// Places the rectangle within a texture. -void TextureLayoutRectangle::Place(int _texture_index, const Vector2i& position) -{ - texture_index = _texture_index; - texture_position = position; -} - -// Unplaces the rectangle. -void TextureLayoutRectangle::Unplace() -{ - texture_index = -1; -} - -// Returns the rectangle's placed state. -bool TextureLayoutRectangle::IsPlaced() const -{ - return texture_index > -1; -} - -// Sets the rectangle's texture data and stride. -void TextureLayoutRectangle::Allocate(byte* _texture_data, int _texture_stride, int _texture_samples) -{ - texture_data = _texture_data + ((texture_position.y * _texture_stride) + texture_position.x * _texture_samples); - texture_stride = _texture_stride; - texture_samples = _texture_samples; -} - -// Returns the index of the texture this rectangle is placed on. -int TextureLayoutRectangle::GetTextureIndex() -{ - return texture_index; -} - -// Returns the rectangle's allocated texture data. -byte* TextureLayoutRectangle::GetTextureData() -{ - return texture_data; -} - -// Returns the stride of the rectangle's texture data. -int TextureLayoutRectangle::GetTextureStride() const -{ - return texture_stride; -} - -} -} diff --git a/libs/libRocket/Source/Core/TextureLayoutRectangle.h b/libs/libRocket/Source/Core/TextureLayoutRectangle.h deleted file mode 100644 index 85e838bacbf..00000000000 --- a/libs/libRocket/Source/Core/TextureLayoutRectangle.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef TEXTURELAYOUTRECTANGLE_H -#define TEXTURELAYOUTRECTANGLE_H - -namespace Rocket { -namespace Core { - -/** - A texture layout rectangle is an area positioned with a texture layout. - - @author Peter - */ - -class TextureLayoutRectangle -{ -public: - TextureLayoutRectangle(int id, const Vector2i& dimensions); - ~TextureLayoutRectangle(); - - /// Returns the rectangle's id. - /// @return The rectangle's id. - int GetId() const; - /// Returns the rectangle's position; this is only valid if it has been placed. - /// @return The rectangle's position within its texture. - const Vector2i& GetPosition() const; - /// Returns the rectangle's dimensions. - /// @return The rectangle's dimensions. - const Vector2i& GetDimensions() const; - - /// Places the rectangle within a texture. - /// @param[in] texture_index The index of the texture this rectangle is placed on. - /// @param[in] position The position within the texture of this rectangle's top-left corner. - void Place(int texture_index, const Vector2i& position); - /// Unplaces the rectangle. - void Unplace(); - /// Returns the rectangle's placed state. - /// @return True if the rectangle has been placed, false if not. - bool IsPlaced() const; - - /// Sets the rectangle's texture data and stride. - /// @param[in] texture_data The pointer to the top-left corner of the texture's data. - /// @param[in] texture_stride The stride of the texture data, in bytes. - /// @param[in] texture_samples Pixel size of the texture data, in bytes. - void Allocate(byte* texture_data, int texture_stride, int texture_samples); - - /// Returns the index of the texture this rectangle is placed on. - /// @return The texture index. - int GetTextureIndex(); - /// Returns the rectangle's allocated texture data. - /// @return The texture data. - byte* GetTextureData(); - /// Returns the stride of the rectangle's texture data. - /// @return The texture data stride. - int GetTextureStride() const; - -private: - int id; - Vector2i dimensions; - - int texture_index; - Vector2i texture_position; - - byte* texture_data; - int texture_stride; - int texture_samples; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/TextureLayoutRow.cpp b/libs/libRocket/Source/Core/TextureLayoutRow.cpp deleted file mode 100644 index a81fc93fc0f..00000000000 --- a/libs/libRocket/Source/Core/TextureLayoutRow.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TextureLayoutRow.h" -#include "TextureLayout.h" - -namespace Rocket { -namespace Core { - -TextureLayoutRow::TextureLayoutRow() -{ - height = 0; -} - -TextureLayoutRow::~TextureLayoutRow() -{ -} - -// Attempts to position unplaced rectangles from the layout into this row. -int TextureLayoutRow::Generate(TextureLayout& layout, int max_width, int y) -{ - int width = 1; - int first_unplaced_index = 0; - int placed_rectangles = 0; - - while (width < max_width) - { - // Find the first unplaced rectangle we can fit. - int index; - for (index = first_unplaced_index; index < layout.GetNumRectangles(); ++index) - { - TextureLayoutRectangle& rectangle = layout.GetRectangle(index); - if (!rectangle.IsPlaced()) - { - if (width + rectangle.GetDimensions().x + 1 <= max_width) - break; - } - } - - if (index == layout.GetNumRectangles()) - return placed_rectangles; - - TextureLayoutRectangle& rectangle = layout.GetRectangle(index); - - // Increment the row height if necessary. - height = Math::Max(height, rectangle.GetDimensions().y); - - // Add this glyph onto our list and mark it as placed. - rectangles.push_back(&rectangle); - rectangle.Place(layout.GetNumTextures(), Vector2i(width, y)); - ++placed_rectangles; - - // Increment our width. An extra pixel is added on so the rectangles aren't pushed up - // against each other. This will avoid filtering artifacts. - if (rectangle.GetDimensions().x > 0) - width += rectangle.GetDimensions().x + 1; - - first_unplaced_index = index + 1; - } - - return placed_rectangles; -} - -// Assigns allocated texture data to all rectangles in this row. -void TextureLayoutRow::Allocate(byte* texture_data, int stride, int samples) -{ - for (size_t i = 0; i < rectangles.size(); ++i) - rectangles[i]->Allocate(texture_data, stride, samples); -} - -// Returns the height of the row. -int TextureLayoutRow::GetHeight() const -{ - return height; -} - -// Resets the placed status for all of the rectangles within this row. -void TextureLayoutRow::Unplace() -{ - for (size_t i = 0; i < rectangles.size(); ++i) - rectangles[i]->Unplace(); -} - -} -} diff --git a/libs/libRocket/Source/Core/TextureLayoutRow.h b/libs/libRocket/Source/Core/TextureLayoutRow.h deleted file mode 100644 index 420c8e9dfee..00000000000 --- a/libs/libRocket/Source/Core/TextureLayoutRow.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef TEXTURELAYOUTROW_H -#define TEXTURELAYOUTROW_H - -#include "TextureLayoutRectangle.h" - -namespace Rocket { -namespace Core { - -class TextureLayout; - -/** - A texture layout row is a single row of rectangles positioned vertically within a texture. - - @author Peter - */ - -class TextureLayoutRow -{ -public: - TextureLayoutRow(); - ~TextureLayoutRow(); - - /// Attempts to position unplaced rectangles from the layout into this row. - /// @param[in] layout The layout to position rectangles from. - /// @param[in] width The maximum width of this row. - /// @param[in] y The y-coordinate of this row. - /// @return The number of placed rectangles. - int Generate(TextureLayout& layout, int width, int y); - - /// Assigns allocated texture data to all rectangles in this row. - /// @param[in] texture_data The pointer to the beginning of the texture's data. - /// @param[in] stride The stride of the texture's surface, in bytes; - /// @param[in] samples Pixel size of the texture, in bytes; - void Allocate(byte* texture_data, int stride, int samples); - - /// Returns the height of the row. - /// @return The row's height. - int GetHeight() const; - - /// Resets the placed status for all of the rectangles within this row. - void Unplace(); - -private: - typedef std::vector< TextureLayoutRectangle* > RectangleList; - - int height; - RectangleList rectangles; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/TextureLayoutTexture.cpp b/libs/libRocket/Source/Core/TextureLayoutTexture.cpp deleted file mode 100644 index f3d537db464..00000000000 --- a/libs/libRocket/Source/Core/TextureLayoutTexture.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TextureLayoutTexture.h" -#include "../../Include/Rocket/Core/Core.h" -#include "TextureDatabase.h" -#include "TextureLayout.h" - -namespace Rocket { -namespace Core { - -TextureLayoutTexture::TextureLayoutTexture(int samples) : - dimensions(0, 0), texture_data(NULL), samples(samples) -{ -} - -TextureLayoutTexture::~TextureLayoutTexture() -{ - // Don't free texture data; freed in the texture loader. -} - -// Returns the texture's dimensions. This is only valid after the texture has been generated. -const Vector2i& TextureLayoutTexture::GetDimensions() const -{ - return dimensions; -} - -// Attempts to position unplaced rectangles from the layout into this texture. -int TextureLayoutTexture::Generate(TextureLayout& layout, int maximum_dimensions) -{ - // Come up with an estimate for how big a texture we need. Calculate the total square pixels - // required by the remaining rectangles to place, square-root it to get the dimensions of the - // smallest texture necessary (under optimal circumstances) and round it up to the nearest - // power of two. - int square_pixels = 0; - int unplaced_rectangles = 0; - for (int i = 0; i < layout.GetNumRectangles(); ++i) - { - const TextureLayoutRectangle& rectangle = layout.GetRectangle(i); - - if (!rectangle.IsPlaced()) - { - square_pixels += (rectangle.GetDimensions().x + 1) * (rectangle.GetDimensions().y + 1); - ++unplaced_rectangles; - } - } - - int texture_width = Math::RealToInteger(Math::SquareRoot((float) square_pixels)); - dimensions.y = Math::ToPowerOfTwo(texture_width); - dimensions.x = dimensions.y >> 1; - - dimensions.x = Math::Min(dimensions.x, maximum_dimensions); - dimensions.y = Math::Min(dimensions.y, maximum_dimensions); - - // Now we're layout out the rectangles in the texture. If we don't fit all the rectangles on - // and have room to grow (ie, haven't hit the maximum texture size in both dimensions) then - // we'll have another go with a bigger texture. - int num_placed_rectangles = 0; - for (;;) - { - bool success = true; - int height = 1; - - while (num_placed_rectangles != unplaced_rectangles) - { - TextureLayoutRow row; - int row_size = row.Generate(layout, dimensions.x, height); - if (row_size == 0) - { - success = false; - break; - } - - height += row.GetHeight() + 1; - if (height > dimensions.y) - { - // D'oh! We've exceeded our height boundaries. This row should be unplaced. - row.Unplace(); - success = false; - break; - } - - rows.push_back(row); - num_placed_rectangles += row_size; - } - - // If the rectangles were successfully laid out within the texture limits, we're done. - if (success) - return num_placed_rectangles; - - // Couldn't do it! Increase the texture size, clear the rectangles and try again - unless - // we've hit the maximum texture size, in which case return true if we've placed any - // rectangles (ie, the layout isn't empty). - if (dimensions.y > dimensions.x) - dimensions.x = dimensions.y; - else - { - if (dimensions.y << 1 > maximum_dimensions) - return num_placed_rectangles; - - dimensions.y <<= 1; - } - - // Unplace all of the glyphs we tried to place and have an other crack. - for (size_t i = 0; i < rows.size(); i++) - rows[i].Unplace(); - - rows.clear(); - num_placed_rectangles = 0; - } -} - -// Allocates the texture. -byte* TextureLayoutTexture::AllocateTexture() -{ - // Note: this object does not free this texture data. It is freed in the font texture loader. - - if (dimensions.x > 0 && - dimensions.y > 0) - { - texture_data = new byte[dimensions.x * dimensions.y * samples]; - - // Set the texture to transparent white. - switch (samples) { - case 4: - for (int i = 0; i < dimensions.x * dimensions.y; i++) - ((unsigned int*)(texture_data))[i] = 0x00ffffff; - break; - default: - memset(texture_data, 255, dimensions.x * dimensions.y * samples); - break; - } - - for (size_t i = 0; i < rows.size(); ++i) - rows[i].Allocate(texture_data, dimensions.x * samples, samples); - } - - return texture_data; -} - -} -} diff --git a/libs/libRocket/Source/Core/TextureLayoutTexture.h b/libs/libRocket/Source/Core/TextureLayoutTexture.h deleted file mode 100644 index 070427238ab..00000000000 --- a/libs/libRocket/Source/Core/TextureLayoutTexture.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef TEXTURELAYOUTTEXTURE_H -#define TEXTURELAYOUTTEXTURE_H - -#include "../../Include/Rocket/Core/Texture.h" -#include "TextureLayoutRow.h" - -namespace Rocket { -namespace Core { - -class TextureLayout; -class TextureResource; - -/** - A texture layout texture is a single rectangular area which sub-rectangles are placed on within - a complete texture layout. - - @author Peter - */ - -class TextureLayoutTexture -{ -public: - TextureLayoutTexture(int samples = 4); - ~TextureLayoutTexture(); - - /// Returns the texture's dimensions. This is only valid after the texture has been generated. - /// @return The texture's dimensions. - const Vector2i& GetDimensions() const; - - /// Attempts to position unplaced rectangles from the layout into this texture. The size of - /// this texture will be determined by its contents. - /// @param[in] layout The layout to position rectangles from. - /// @param[in] maximum_dimensions The maximum dimensions of this texture. If this is not big enough to place all the rectangles, then as many will be placed as possible. - /// @return The number of placed rectangles. - int Generate(TextureLayout& layout, int maximum_dimensions); - - /// Allocates the texture. - /// @return The allocated texture data. - byte* AllocateTexture(); - -private: - typedef std::vector< TextureLayoutRow > RowList; - - Vector2i dimensions; - RowList rows; - - byte* texture_data; - int samples; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/TextureResource.cpp b/libs/libRocket/Source/Core/TextureResource.cpp deleted file mode 100644 index db7a3222f0b..00000000000 --- a/libs/libRocket/Source/Core/TextureResource.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TextureResource.h" -#include -#include "TextureDatabase.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -TextureResource::TextureResource() -{ -} - -TextureResource::~TextureResource() -{ - TextureDatabase::RemoveTexture(this); -} - -// Attempts to load a texture from the application into the resource. -bool TextureResource::Load(const String& _source) -{ - Release(); - source = _source; - - return true; -} - -// Returns the resource's underlying texture. -TextureHandle TextureResource::GetHandle(RenderInterface* render_interface) const -{ - TextureDataMap::iterator texture_iterator = texture_data.find(render_interface); - if (texture_iterator == texture_data.end()) - { - Load(render_interface); - texture_iterator = texture_data.find(render_interface); - } - - return texture_iterator->second.first; -} - -// Returns the dimensions of the resource's texture. -const Vector2i& TextureResource::GetDimensions(RenderInterface* render_interface) const -{ - TextureDataMap::iterator texture_iterator = texture_data.find(render_interface); - if (texture_iterator == texture_data.end()) - { - Load(render_interface); - texture_iterator = texture_data.find(render_interface); - } - - return texture_iterator->second.second; -} - -// Returns the resource's source. -const String& TextureResource::GetSource() const -{ - return source; -} - -// Releases the texture's handle. -void TextureResource::Release(RenderInterface* render_interface) -{ - if (render_interface == NULL) - { - for (TextureDataMap::iterator texture_iterator = texture_data.begin(); texture_iterator != texture_data.end(); ++texture_iterator) - { - TextureHandle handle = texture_iterator->second.first; - if (handle) - texture_iterator->first->ReleaseTexture(handle); - } - - texture_data.clear(); - } - else - { - TextureDataMap::iterator texture_iterator = texture_data.find(render_interface); - if (texture_iterator == texture_data.end()) - return; - - TextureHandle handle = texture_iterator->second.first; - if (handle) - texture_iterator->first->ReleaseTexture(handle); - - texture_data.erase(render_interface); - } -} - -// Attempts to load the texture from the source. -bool TextureResource::Load(RenderInterface* render_interface) const -{ - // Check for special loader tokens. - if (!source.Empty() && - source[0] == '?') - { - Vector2i dimensions; - - bool delete_data = false; - const byte* data = NULL; - int samples = 4; - - // Find the generation protocol and generate the data accordingly. - String protocol = source.Substring(1, source.Find("::") - 1); - if (protocol == "font") - { - // The requested texture is a font layer. - delete_data = true; - - FontFaceHandle* handle; - FontEffect* layer_id; - int layout_id; - int texture_id; - - if (sscanf(source.CString(), "?font::%p/%p/%d/%d", &handle, &layer_id, &layout_id, &texture_id) == 4) - { - handle->GenerateLayerTexture(data, - dimensions, - samples, - layer_id, - layout_id, - texture_id); - } - } - - // If texture data was generated, great! Otherwise, fallback to the LoadTexture() code and - // hope the client knows what the hell to do with the question mark in their file name. - if (data != NULL) - { - TextureHandle handle; - bool success = render_interface->GenerateTexture(handle, data, dimensions, samples); - - if (delete_data) - delete[] data; - - if (success) - { - texture_data[render_interface] = TextureData(handle, dimensions); - return true; - } - else - { - Log::Message(Log::LT_WARNING, "Failed to generate internal texture %s.", source.CString()); - texture_data[render_interface] = TextureData(0, Vector2i(0, 0)); - - return false; - } - } - } - - TextureHandle handle; - Vector2i dimensions; - if (!render_interface->LoadTexture(handle, dimensions, source)) - { - Log::Message(Log::LT_WARNING, "Failed to load texture from %s.", source.CString()); - texture_data[render_interface] = TextureData(0, Vector2i(0, 0)); - - return false; - } - - texture_data[render_interface] = TextureData(handle, dimensions); - return true; -} - -void TextureResource::OnReferenceDeactivate() -{ - Release(); - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/TextureResource.h b/libs/libRocket/Source/Core/TextureResource.h deleted file mode 100644 index 310732fcddf..00000000000 --- a/libs/libRocket/Source/Core/TextureResource.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCORETEXTURERESOURCE_H -#define ROCKETCORETEXTURERESOURCE_H - -#include "../../Include/Rocket/Core/ReferenceCountable.h" -#include "../../Include/Rocket/Core/Texture.h" - -namespace Rocket { -namespace Core { - -/** - A texture resource stores application-generated texture data (handle and dimensions) for each - unique render interface that needs to render the data. It is used through a Texture object. - - @author Peter Curry - */ - -class TextureResource : public ReferenceCountable -{ -friend class TextureDatabase; - -public: - virtual ~TextureResource(); - - /// Attempts to load a texture from the application into the resource. Note that this always - /// succeeds now; as texture loading is now delayed until the texture is accessed by a specific - /// render interface, all this does is store the source. - bool Load(const String& source); - - /// Returns the resource's underlying texture handle. - TextureHandle GetHandle(RenderInterface* render_interface) const; - /// Returns the dimensions of the resource's texture. - const Vector2i& GetDimensions(RenderInterface* render_interface) const; - - /// Returns the resource's source. - const String& GetSource() const; - - /// Releases the texture's handle. - void Release(RenderInterface* render_interface = NULL); - -protected: - /// Attempts to load the texture from the source. - bool Load(RenderInterface* render_interface) const; - - /// Releases the texture and destroys the resource. - virtual void OnReferenceDeactivate(); - -private: - TextureResource(); - - String source; - - typedef std::pair< TextureHandle, Vector2i > TextureData; - typedef std::map< RenderInterface*, TextureData > TextureDataMap; - mutable TextureDataMap texture_data; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/URL.cpp b/libs/libRocket/Source/Core/URL.cpp deleted file mode 100644 index 12fc43287df..00000000000 --- a/libs/libRocket/Source/Core/URL.cpp +++ /dev/null @@ -1,626 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/URL.h" -#include - -namespace Rocket { -namespace Core { - -const char* DEFAULT_PROTOCOL = "file"; - -// Constructs an Empty URL. -URL::URL() -{ - port = 0; - url_dirty = false; -} - -// Constructs a new URL from the given string. -URL::URL(const String& _url) -{ - port = 0; - ROCKET_VERIFY(SetURL(_url)); -} - -// Constructs a new URL from the given string. -URL::URL(const char* _url) -{ - port = 0; - ROCKET_VERIFY(SetURL(_url)); -} - -// Destroys the URL. -URL::~URL() -{ -} - -// Assigns a new URL to the object. -bool URL::SetURL(const String& _url) -{ - url_dirty = false; - url = _url; - - // Make sure an Empty URL is completely Empty. - if (url.Empty()) - { - protocol.Clear(); - login.Clear(); - password.Clear(); - host.Clear(); - port = 0; - path.Clear(); - file_name.Clear(); - extension.Clear(); - - return true; - } - - // Find the protocol. This consists of the string appearing before the - // '://' token (ie, file://, http://). - const char* host_begin = strchr(_url.CString(), ':'); - if (NULL != host_begin) - { - protocol.Assign(_url.CString(), host_begin); - if (0 != strncmp(host_begin, "://", 3)) - { - char malformed_terminator[4] = {0, 0, 0, 0}; - strncpy(malformed_terminator, host_begin, 3); - Log::Message(Log::LT_ERROR, "Malformed protocol identifier found in URL %s; expected %s://, found %s%s.\n", _url.CString(), protocol.CString(), protocol.CString(), malformed_terminator); - - return false; - } - host_begin += 3; - } - else - { - protocol = DEFAULT_PROTOCOL; - host_begin = _url.CString(); - } - - - // We only want to look for a host if a protocol was specified. - const char* path_begin; - if (host_begin != _url.CString()) - { - // Find the host. This is the string appearing after the protocol or after - // the username:password combination, and terminated either with a colon, - // if a port is specified, or a forward slash if there is no port. - - // Check for a login pair - const char* at_symbol = strchr( host_begin, '@' ); - if ( at_symbol ) - { - String login_password; - login_password.Assign( host_begin, at_symbol ); - host_begin = at_symbol + 1; - - const char* password_ptr = strchr( login_password.CString(), ':' ); - if ( password_ptr ) - { - login.Assign( login_password.CString(), password_ptr ); - password.Assign( password_ptr + 1 ); - } - else - { - login = login_password; - } - } - - // Get the host portion - path_begin = strchr(host_begin, '/'); - // Search for the colon in the host name, which will indicate a port. - const char* port_begin = strchr(host_begin, ':'); - if (NULL != port_begin && (NULL == path_begin || port_begin < path_begin)) - { - if (1 != sscanf(port_begin, ":%d", &port)) - { - Log::Message(Log::LT_ERROR, "Malformed port number found in URL %s.\n", _url.CString()); - return false; - } - - host.Assign(host_begin, port_begin); - - // Don't continue if there is no path. - if (NULL == path_begin) - { - return true; - } - - // Increment the path string past the trailing slash. - ++path_begin; - } - else - { - port = -1; - - if (NULL == path_begin) - { - host = host_begin; - return true; - } - else - { - // Assign the host name, then increment the path string past the - // trailing slash. - host.Assign(host_begin, path_begin); - ++path_begin; - } - } - } - else - { - path_begin = _url.CString(); - } - - // Check for parameters - String path_segment; - const char* parameters = strchr(path_begin, '?'); - if ( parameters ) - { - // Pull the path segment out, so further processing doesn't read the parameters - path_segment.Assign(path_begin, parameters); - path_begin = path_segment.CString(); - - // Loop through all parameters, loading them - StringList parameter_list; - StringUtilities::ExpandString( parameter_list, parameters + 1, '&' ); - for ( size_t i = 0; i < parameter_list.size(); i++ ) - { - // Split into key and value - StringList key_value; - StringUtilities::ExpandString( key_value, parameter_list[i], '=' ); - - key_value[0] = UrlDecode(key_value[0]); - if ( key_value.size() == 2 ) - this->parameters[key_value[0]] = UrlDecode(key_value[1]); - else - this->parameters[key_value[0]] = ""; - } - } - - - // Find the path. This is the string appearing after the host, terminated - // by the last forward slash. - const char* file_name_begin = strrchr(path_begin, '/'); - if (NULL == file_name_begin) - { - // No path! - file_name_begin = path_begin; - path = ""; - } - else - { - // Copy the path including the trailing slash. - path.Assign(path_begin, ++file_name_begin); - - // Normalise the path, stripping any ../'s from it - size_t parent_dir_pos = String::npos; - while ((parent_dir_pos = path.Find("/..")) != String::npos) - { - // If we found a /.. we should be able to find the start of the parent - // directory, if we can't something wierd has happend, bail - size_t parent_dir_start_pos = path.RFind("/", parent_dir_pos); - if (parent_dir_start_pos == String::npos) - break; - - // Strip out the parent dir and the /.. - path.Erase(parent_dir_start_pos, parent_dir_pos - parent_dir_start_pos + 3); - - // We've altered the URL, mark it dirty - url_dirty = true; - } - } - - - // Find the file name. This is the string after the trailing slash of the - // path, and just before the extension. - const char* extension_begin = strrchr(file_name_begin, '.'); - if (NULL == extension_begin) - { - file_name = file_name_begin; - extension = ""; - } - else - { - file_name.Assign(file_name_begin, extension_begin); - extension = extension_begin + 1; - } - - return true; -} - -// Returns the entire URL. -const String& URL::GetURL() const -{ - if (url_dirty) - ConstructURL(); - - return url; -} - -// Sets the URL's protocol. -bool URL::SetProtocol(const String& _protocol) -{ - protocol = _protocol; - url_dirty = true; - - return true; -} - -// Returns the protocol this URL is utilising. -const String& URL::GetProtocol() const -{ - return protocol; -} - -/// Sets the URL's login -bool URL::SetLogin( const String& _login ) -{ - login = _login; - url_dirty = true; - return true; -} - -/// Returns the URL's login -const String& URL::GetLogin() const -{ - return login; -} - -/// Sets the URL's password -bool URL::SetPassword(const String& _password) -{ - password = _password; - url_dirty = true; - return true; -} - -/// Returns the URL's password -const String& URL::GetPassword() const -{ - return password; -} - -// Sets the URL's host. -bool URL::SetHost(const String& _host) -{ - host = _host; - url_dirty = true; - - return true; -} - -// Returns the URL's host. -const String& URL::GetHost() const -{ - return host; -} - -// Sets the URL's port number. -bool URL::SetPort(int _port) -{ - port = _port; - url_dirty = true; - - return true; -} - -// Returns the URL's port number. -int URL::GetPort() const -{ - return port; -} - -// Sets the URL's path. -bool URL::SetPath(const String& _path) -{ - path = _path; - url_dirty = true; - - return true; -} - -// Prefixes the URL's existing path with the given prefix. -bool URL::PrefixPath(const String& prefix) -{ - // If there's no trailing slash on the end of the prefix, add one. - if (!prefix.Empty() && - prefix[prefix.Length() - 1] != '/') - path = prefix + "/" + path; - else - path = prefix + path; - - url_dirty = true; - - return true; -} - -// Returns the URL's path. -const String& URL::GetPath() const -{ - return path; -} - -// Sets the URL's file name. -bool URL::SetFileName(const String& _file_name) -{ - file_name = _file_name; - url_dirty = true; - - return true; -} - -// Returns the URL's file name. -const String& URL::GetFileName() const -{ - return file_name; -} - -// Sets the URL's file extension. -bool URL::SetExtension(const String& _extension) -{ - extension = _extension; - url_dirty = true; - - return true; -} - -// Returns the URL's file extension. -const String& URL::GetExtension() const -{ - return extension; -} - -// Gets the current parameters -const URL::Parameters& URL::GetParameters() const -{ - return parameters; -} - -// Set an individual parameter -void URL::SetParameter(const String& key, const String& value) -{ - parameters[key] = value; - url_dirty = true; -} - -// Set all parameters -void URL::SetParameters(const Parameters& _parameters) -{ - parameters = _parameters; - url_dirty = true; -} - -// Clear the parameters -void URL::ClearParameters() -{ - parameters.clear(); -} - -// Returns the URL's path, file name and extension. -String URL::GetPathedFileName() const -{ - String pathed_file_name = path; - - // Append the file name. - pathed_file_name += file_name; - - // Append the extension. - if (!extension.Empty()) - { - pathed_file_name.Append("."); - pathed_file_name += extension; - } - - return pathed_file_name; -} - -String URL::GetQueryString() const -{ - String query_string; - - int count = 0; - for ( Parameters::const_iterator itr = parameters.begin(); itr != parameters.end(); ++itr ) - { - query_string += ( count == 0 ) ? "" : "&"; - - query_string += UrlEncode((*itr).first); - query_string += "="; - query_string += UrlEncode((*itr).second); - - count++; - } - - return query_string; -} - -// Less-than operator for use as a key in STL containers. -bool URL::operator<(const URL& rhs) const -{ - if (url_dirty) - ConstructURL(); - if (rhs.url_dirty) - rhs.ConstructURL(); - - return url < rhs.url; -} - -void URL::ConstructURL() const -{ - url = ""; - - // Append the protocol. - if (!protocol.Empty() && !host.Empty()) - { - url = protocol; - url.Append("://"); - } - - // Append login and password - if (!login.Empty()) - { - url.Append( login ); - if (!password.Empty()) - { - url.Append( ":" ); - url.Append( password ); - } - url.Append( "@" ); - } - ROCKET_ASSERTMSG( password.Empty() || ( !password.Empty() && !login.Empty() ), "Can't have a password without a login!" ); - - // Append the host. - url += host; - - // Only check ports if there is some host/protocol part - if ( !url.Empty() ) - { - if (port > 0) - { - ROCKET_ASSERTMSG( !host.Empty(), "Can't have a port without a host!" ); - char port_string[16]; - sprintf(port_string, ":%d/", port); - url.Append(port_string); - } - else - { - url.Append("/"); - } - } - - // Append the path. - if (!path.Empty()) - { - url += path; - } - - // Append the file name. - url += file_name; - - // Append the extension. - if (!extension.Empty()) - { - url.Append("."); - url += extension; - } - - // Append parameters - if (!parameters.empty()) - { - url += "?"; - url += GetQueryString(); - } - - url_dirty = false; -} - -String URL::UrlEncode(const String &value) -{ - String encoded; - char hex[4] = {0,0,0,0}; - - encoded.Clear(); - - const char *value_c = value.CString(); - for (String::size_type i = 0; value_c[i]; i++) - { - char c = value_c[i]; - if (IsUnreservedChar(c)) - encoded.Append(c); - else - { - sprintf(hex, "%%%02X", c); - encoded.Append(hex); - } - } - - return encoded; -} - -String URL::UrlDecode(const String &value) -{ - String decoded; - - decoded.Clear(); - - const char *value_c = value.CString(); - String::size_type value_len = value.Length(); - for (String::size_type i = 0; i < value_len; i++) - { - char c = value_c[i]; - if (c == '+') - { - decoded.Append(' ' ); - } - else if (c == '%') - { - char *endp; - String t = value.Substring(i+1, 2); - int ch = strtol(t.CString(), &endp, 16); - if (*endp == '\0') - decoded.Append(char(ch)); - else - decoded.Append(t); - i += 2; - } - else - { - decoded.Append(c); - } - } - - return decoded; -} - -bool URL::IsUnreservedChar(const char in) -{ - switch (in) - { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': case 'g': case 'h': case 'i': case 'j': - case 'k': case 'l': case 'm': case 'n': case 'o': - case 'p': case 'q': case 'r': case 's': case 't': - case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': case 'G': case 'H': case 'I': case 'J': - case 'K': case 'L': case 'M': case 'N': case 'O': - case 'P': case 'Q': case 'R': case 'S': case 'T': - case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': - case '-': case '.': case '_': case '~': - return true; - default: - break; - } - return false; -} - -} -} diff --git a/libs/libRocket/Source/Core/UnicodeRange.cpp b/libs/libRocket/Source/Core/UnicodeRange.cpp deleted file mode 100644 index 9eaa1417da2..00000000000 --- a/libs/libRocket/Source/Core/UnicodeRange.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include - -namespace Rocket { -namespace Core { - -UnicodeRange::UnicodeRange() -{ - min_codepoint = UINT_MAX; - max_codepoint = UINT_MAX; -} - -UnicodeRange::UnicodeRange(int _min_codepoint, int _max_codepoint) -{ - min_codepoint = _min_codepoint; - max_codepoint = _max_codepoint; - - ROCKET_ASSERT(min_codepoint <= max_codepoint); -} - -// Initialises the range from a unicode range in string form. -bool UnicodeRange::Initialise(const String& unicode_range) -{ - // Check for a 'U+' at the start. - if (unicode_range.Length() < 2 || - unicode_range[0] != 'U' || - unicode_range[1] != '+') - return false; - - // Check if there's a '-' sign; if so, we've got a range. - String::size_type separator_index = unicode_range.Find("-", 2); - if (separator_index != String::npos) - { - const char* end = unicode_range.CString() + separator_index; - min_codepoint = strtoul(unicode_range.CString() + 2, (char **) &end, 16); - - end = unicode_range.CString() + unicode_range.Length(); - max_codepoint = strtoul(unicode_range.CString() + separator_index + 1, (char **) &end, 16); - - return min_codepoint <= max_codepoint; - } - - // No range! Check if we have any wildcards. - String::size_type wildcard_index = unicode_range.Find("?", 2); - if (wildcard_index != String::npos) - { - String range_min(unicode_range.CString() + 2, unicode_range.CString() + wildcard_index); - String range_max(range_min); - - for (String::size_type i = 0; i < unicode_range.Length() - wildcard_index; ++i) - { - range_min += "0"; - range_max += "F"; - } - - const char* end = range_min.CString() + range_min.Length(); - min_codepoint = strtoul(range_min.CString(), (char**) &end, 16); - end = range_max.CString() + range_max.Length(); - max_codepoint = strtoul(range_max.CString(), (char**) &end, 16); - - return true; - } - - const char* end = unicode_range.CString() + unicode_range.Length(); - min_codepoint = strtoul(unicode_range.CString() + 2, (char**) &end, 16); - max_codepoint = min_codepoint; - - return true; -} - -// Builds up a list of unicode ranges from a comma-separated list of unicode ranges in string form. -bool UnicodeRange::BuildList(UnicodeRangeList& list, const String& unicode_range) -{ - StringList unicode_ranges; - StringUtilities::ExpandString(unicode_ranges, unicode_range); - - for (size_t i = 0; i < unicode_ranges.size(); ++i) - { - UnicodeRange range; - if (!range.Initialise(unicode_ranges[i])) - return false; - - list.push_back(range); - } - - // Collapse contiguous ranges. - for (size_t i = 0; i < list.size(); ++i) - { - size_t j = i + 1; - while (j < list.size()) - { - if (list[i].IsContiguous(list[j])) - { - list[i] = list[i].Join(list[j]); - list.erase(list.begin() + j); - } - else - ++j; - } - } - - return !list.empty(); -} - -// Returns true if this range is wholly contained within another range. -bool UnicodeRange::IsContained(const UnicodeRange& rhs) -{ - return rhs.min_codepoint <= min_codepoint && - rhs.max_codepoint >= max_codepoint; -} - -// Returns true if this range is wholly contained within another range list. -bool UnicodeRange::IsContained(const UnicodeRangeList& rhs) -{ - for (size_t i = 0; i < rhs.size(); ++i) - { - if (IsContained(rhs[i])) - return true; - } - - return false; -} - -// Returns true if this range is contained or contiguous with another range. -bool UnicodeRange::IsContiguous(const UnicodeRange& rhs) -{ - return (min_codepoint >= rhs.min_codepoint && min_codepoint <= ((rhs.max_codepoint == 0xFFFFFFFF) ? rhs.max_codepoint : rhs.max_codepoint + 1)) || - (max_codepoint >= ((rhs.min_codepoint == 0) ? 0 : rhs.min_codepoint - 1) && max_codepoint <= rhs.max_codepoint); -} - -// Joins this range with another that it is contiguous with. -UnicodeRange UnicodeRange::Join(const UnicodeRange& rhs) -{ - return UnicodeRange(Math::Min(min_codepoint, rhs.min_codepoint), - Math::Max(max_codepoint, rhs.max_codepoint)); -} - -} -} diff --git a/libs/libRocket/Source/Core/Variant.cpp b/libs/libRocket/Source/Core/Variant.cpp deleted file mode 100644 index c8318538397..00000000000 --- a/libs/libRocket/Source/Core/Variant.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/Variant.h" - -namespace Rocket { -namespace Core { - -Variant::Variant() : type(NONE) -{ - // Make sure our object size assumptions fit inside the static buffer - ROCKET_STATIC_ASSERT(sizeof(Colourb) <= LOCAL_DATA_SIZE, LOCAL_DATA_TOO_SMALL_FOR_Colourb); - ROCKET_STATIC_ASSERT(sizeof(Colourf) <= LOCAL_DATA_SIZE, LOCAL_DATA_TOO_SMALL_FOR_Colourf); - ROCKET_STATIC_ASSERT(sizeof(String) <= LOCAL_DATA_SIZE, LOCAL_DATA_TOO_SMALL_FOR_String); -} - -Variant::Variant( const Variant& copy ) : type(NONE) -{ - Set(copy); -} - -Variant::~Variant() -{ - Clear(); -} - -void Variant::Clear() -{ - // Free any allocated types. - switch (type) - { - case STRING: - { - // Clean up the string. - String* string = (String*)data; - string->~String(); - } - break; - - default: - break; - } - type = NONE; -} - -Variant::Type Variant::GetType() const -{ - return type; -} - -////////////////////////////////////////////////// -// Set methods -////////////////////////////////////////////////// - -#define SET_VARIANT(type) *((type*)data) = value; - -void Variant::Set(const Variant& copy) -{ - switch (copy.type) - { - case STRING: - { - // Create the string - Set(*(String*)copy.data); - } - break; - - default: - Clear(); - memcpy(data, copy.data, LOCAL_DATA_SIZE); - break; - } - type = copy.type; -} - -void Variant::Set(const byte value) -{ - type = BYTE; - SET_VARIANT(byte); -} - -void Variant::Set(const char value) -{ - type = CHAR; - SET_VARIANT(char); -} - -void Variant::Set(const float value) -{ - type = FLOAT; - SET_VARIANT(float); -} - -void Variant::Set(const int value) -{ - type = INT; - SET_VARIANT(int); -} - -void Variant::Set(const String& value) -{ - if (type == STRING) - { - ((String*)data)->Assign(value); - } - else - { - type = STRING; - new(data) String(value); - } -} - -void Variant::Set(const word value) -{ - type = WORD; - SET_VARIANT(word); -} - -void Variant::Set(const char* value) -{ - Set(String(value)); -} - -void Variant::Set(void* voidptr) -{ - type = VOIDPTR; - memcpy(data, &voidptr, sizeof(void*)); -} - -void Variant::Set(const Vector2f& value) -{ - type = VECTOR2; - SET_VARIANT(Vector2f); -} - -void Variant::Set(const Colourf& value) -{ - type = COLOURF; - SET_VARIANT(Colourf); -} - -void Variant::Set(const Colourb& value) -{ - type = COLOURB; - SET_VARIANT(Colourb); -} - -void Variant::Set(ScriptInterface* value) -{ - type = SCRIPTINTERFACE; - memcpy(data, &value, sizeof(ScriptInterface*)); -} - -Variant& Variant::operator=(const Variant& copy) -{ - Set(copy); - return *this; -} - -} -} diff --git a/libs/libRocket/Source/Core/Vector2.cpp b/libs/libRocket/Source/Core/Vector2.cpp deleted file mode 100644 index 8eadb12b798..00000000000 --- a/libs/libRocket/Source/Core/Vector2.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include - -namespace Rocket { -namespace Core { - -Vector2i operator*(int lhs, const Vector2i& rhs) -{ - return Vector2i(lhs * rhs.x, lhs * rhs.y); -} - -Vector2f operator*(float lhs, const Vector2f& rhs) -{ - return Vector2f(lhs * rhs.x, lhs * rhs.y); -} - -template <> -Vector2< float > Vector2< float >::Normalise() const -{ - float magnitude = Magnitude(); - if (Math::IsZero(magnitude)) - return *this; - - return *this / magnitude; -} - -template <> -Vector2< float > Vector2< float >::Rotate(float theta) const -{ - float cos_theta = Math::Cos(theta); - float sin_theta = Math::Sin(theta); - - return Vector2< float >(cos_theta * x - sin_theta * y, - sin_theta * x + cos_theta * y); -} - -} -} diff --git a/libs/libRocket/Source/Core/WString.cpp b/libs/libRocket/Source/Core/WString.cpp deleted file mode 100644 index 854e993f47c..00000000000 --- a/libs/libRocket/Source/Core/WString.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/WString.h" - -namespace Rocket { -namespace Core { - -// Constructs an empty string. -WString::WString() -{ -} - -// Constructs a string as a copy of another UCS-2 string. -WString::WString(const WStringBase& ucs2_string) : WStringBase(ucs2_string) -{ -} - -// Constructs a string from a sequence of UCS-2 encoded characters. -WString::WString(const word* ucs2_string_begin, const word* ucs2_string_end) : WStringBase(ucs2_string_begin, ucs2_string_end) -{ -} - -// Constructs a string from multiples of a UCS-2 encoded character. -WString::WString(WStringBase::size_type count, word ucs2_char) : WStringBase(count, ucs2_char) -{ -} - -// Constructs a string from a sequence of UTF-8 encoded characters. -WString::WString(const char* utf8_string) -{ - std::vector< word > ucs2_string; - StringUtilities::UTF8toUCS2(utf8_string, ucs2_string); - - if (ucs2_string.size() > 1) - Assign(&ucs2_string[0], &ucs2_string[ucs2_string.size() - 1]); -} - -// Constructs a string from a sequence of UTF-8 encoded characters. - WString::WString(const char* utf8_string_begin, const char* utf8_string_end) -{ - std::vector< word > ucs2_string; - StringUtilities::UTF8toUCS2(String(utf8_string_begin, utf8_string_end), ucs2_string); - - if (ucs2_string.size() > 1) - Assign(&ucs2_string[0], &ucs2_string[ucs2_string.size() - 1]); -} - -// Constructs a string from a sequence of UTF-8 encoded characters. - WString::WString(const String& utf8_string) -{ - std::vector< word > ucs2_string; - StringUtilities::UTF8toUCS2(utf8_string, ucs2_string); - - if (ucs2_string.size() > 1) - Assign(&ucs2_string[0], &ucs2_string[ucs2_string.size() - 1]); -} - -// Destroys the string. -WString::~WString() -{ -} - -// Converts the string to UTF-8 encoding. -String& WString::ToUTF8(String& utf8_string, bool append) const -{ - if (!append) - { - utf8_string.Clear(); - } - StringUtilities::UCS2toUTF8(CString(), Length(), utf8_string); - return utf8_string; -} - -/// Assigns a UCS-2 string to this string. -WString& WString::operator=(const WStringBase& string) -{ - WStringBase::operator=(string); - return *this; -} - -// Assigns a UCS-2 string to this string. -WString& WString::operator=(const WString& string) -{ - WStringBase::operator=(string); - return *this; -} - -// Assigns a null-terminated UCS-2 string to this string. -WString& WString::operator=(const word* string) -{ - WStringBase::operator=(string); - return *this; -} - -// Converts a UTF-8 encoded string into UCS-2 and assigns it to this string. -WString& WString::operator=(const char* string) -{ - std::vector< word > ucs2_string; - StringUtilities::UTF8toUCS2(string, ucs2_string); - - if (ucs2_string.size() > 1) - Assign(&ucs2_string[0], &ucs2_string[ucs2_string.size() - 1]); - else - Clear(); - - return *this; -} - -// Checks equality between two UCS-2 encoded strings. -bool WString::operator==(const WString& string) const -{ - return WStringBase::operator==(string); -} - -// Checks equality between this string and another string in UTF-8 encoded. -bool WString::operator==(const char* _string) const -{ - return WStringBase::operator==(WString(_string)); -} - -WStringBase::size_type WString::Find(const WString& s, size_type pos) const -{ - return WStringBase::Find(s, pos); -} - -WStringBase::size_type WString::Find(const word* s, size_type pos) const -{ - return WStringBase::Find(s, pos); -} - -WStringBase::size_type WString::Find(const word& s, size_type pos) const -{ - word buffer[2] = { s, 0 }; - return WStringBase::Find(buffer, pos); -} - -word& WString::operator[](size_type offset) -{ - return WStringBase::operator[](offset); -} - -word WString::operator[](size_type offset) const -{ - return WStringBase::operator[](offset); -} - -} -} diff --git a/libs/libRocket/Source/Core/WidgetSlider.cpp b/libs/libRocket/Source/Core/WidgetSlider.cpp deleted file mode 100644 index ed730ac7199..00000000000 --- a/libs/libRocket/Source/Core/WidgetSlider.cpp +++ /dev/null @@ -1,488 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "WidgetSlider.h" -#include "Clock.h" -#include "LayoutEngine.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Event.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/Property.h" - -namespace Rocket { -namespace Core { - -const float DEFAULT_REPEAT_DELAY = 0.5f; -const float DEFAULT_REPEAT_PERIOD = 0.1f; - -WidgetSlider::WidgetSlider(Element* _parent) -{ - parent = _parent; - - orientation = UNKNOWN; - - track = NULL; - bar = NULL; - arrows[0] = NULL; - arrows[1] = NULL; - - bar_position = 0; - bar_drag_anchor = 0; - - arrow_timers[0] = -1; - arrow_timers[1] = -1; - last_update_time = 0; -} - -WidgetSlider::~WidgetSlider() -{ - if (bar != NULL) - { - bar->RemoveEventListener(DRAG, this); - bar->RemoveEventListener(DRAGSTART, this); - } - - if (track != NULL) - track->RemoveEventListener(CLICK, this); - - for (int i = 0; i < 2; i++) - { - if (arrows[i] != NULL) - { - arrows[i]->RemoveEventListener(MOUSEDOWN, this); - arrows[i]->RemoveEventListener(MOUSEUP, this); - arrows[i]->RemoveEventListener(MOUSEOUT, this); - } - } -} - -// Initialises the slider to a given orientation. -bool WidgetSlider::Initialise(Orientation _orientation) -{ - // Check that we haven't already been successfully initialised. - if (orientation != UNKNOWN) - { - ROCKET_ERROR; - return false; - } - - // Check that a valid orientation has been passed in. - if (_orientation != HORIZONTAL && - _orientation != VERTICAL) - { - ROCKET_ERROR; - return false; - } - - orientation = _orientation; - - // Create all of our child elements as standard elements, and abort if we can't create them. - track = Factory::InstanceElement(parent, "*", "slidertrack", XMLAttributes()); - - bar = Factory::InstanceElement(parent, "*", "sliderbar", XMLAttributes()); - bar->SetProperty(DRAG, DRAG); - - arrows[0] = Factory::InstanceElement(parent, "*", "sliderarrowdec", XMLAttributes()); - arrows[1] = Factory::InstanceElement(parent, "*", "sliderarrowinc", XMLAttributes()); - - if (track == NULL || - bar == NULL || - arrows[0] == NULL || - arrows[1] == NULL) - { - if (track != NULL) - track->RemoveReference(); - - if (bar != NULL) - bar->RemoveReference(); - - if (arrows[0] != NULL) - arrows[0]->RemoveReference(); - - if (arrows[1] != NULL) - arrows[1]->RemoveReference(); - - return false; - } - - // Add them as non-DOM elements. - parent->AppendChild(track, false); - parent->AppendChild(bar, false); - parent->AppendChild(arrows[0], false); - parent->AppendChild(arrows[1], false); - - // Remove the initial references on the elements. - track->RemoveReference(); - bar->RemoveReference(); - arrows[0]->RemoveReference(); - arrows[1]->RemoveReference(); - - // Attach the listeners as appropriate. - bar->AddEventListener(DRAG, this); - bar->AddEventListener(DRAGSTART, this); - - track->AddEventListener(CLICK, this); - - for (int i = 0; i < 2; i++) - { - arrows[i]->AddEventListener(MOUSEDOWN, this); - arrows[i]->AddEventListener(MOUSEUP, this); - arrows[i]->AddEventListener(MOUSEOUT, this); - } - - return true; -} - -// Updates the key repeats for the increment / decrement arrows. -void WidgetSlider::Update() -{ - for (int i = 0; i < 2; i++) - { - bool updated_time = false; - float delta_time = 0; - - if (arrow_timers[i] > 0) - { - if (!updated_time) - { - float current_time = Clock::GetElapsedTime(); - delta_time = current_time - last_update_time; - last_update_time = current_time; - } - - arrow_timers[i] -= delta_time; - while (arrow_timers[i] <= 0) - { - arrow_timers[i] += DEFAULT_REPEAT_PERIOD; - SetBarPosition(i == 0 ? OnLineDecrement() : OnLineIncrement()); - } - } - } -} - -// Sets the position of the bar. -void WidgetSlider::SetBarPosition(float _bar_position) -{ - bar_position = Math::Clamp(_bar_position, 0.0f, 1.0f); - PositionBar(); - - Dictionary parameters; - parameters.Set("value", bar_position); - parent->DispatchEvent("scrollchange", parameters); -} - -// Returns the current position of the bar. -float WidgetSlider::GetBarPosition() -{ - return bar_position; -} - -// Returns the slider's orientation. -WidgetSlider::Orientation WidgetSlider::GetOrientation() const -{ - return orientation; -} - -// Sets the dimensions to the size of the slider. -void WidgetSlider::GetDimensions(Vector2f& dimensions) const -{ - switch (orientation) - { - ROCKET_UNUSED_SWITCH_ENUM(UNKNOWN); - case VERTICAL: dimensions.x = 256; dimensions.y = 16; break; - case HORIZONTAL: dimensions.x = 16; dimensions.y = 256; break; - } -} - -// Lays out and resizes the internal elements. -void WidgetSlider::FormatElements(const Vector2f& containing_block, bool resize_element, float slider_length, float bar_length) -{ - int length_axis = orientation == VERTICAL ? 1 : 0; - - // Build the box for the containing slider element. As the containing block is not guaranteed to have a defined - // height, we must use the width for both axes. - Box parent_box; - LayoutEngine::BuildBox(parent_box, Vector2f(containing_block.x, containing_block.x), parent); - slider_length -= orientation == VERTICAL ? (parent_box.GetCumulativeEdge(Box::CONTENT, Box::TOP) + parent_box.GetCumulativeEdge(Box::CONTENT, Box::BOTTOM)) : - (parent_box.GetCumulativeEdge(Box::CONTENT, Box::LEFT) + parent_box.GetCumulativeEdge(Box::CONTENT, Box::RIGHT)); - - // Set the length of the slider. - Vector2f content = parent_box.GetSize(); - content[length_axis] = slider_length; - parent_box.SetContent(content); - // And set it on the slider element! - if (resize_element) - parent->SetBox(parent_box); - - // Generate the initial dimensions for the track. It'll need to be cut down to fit the arrows. - Box track_box; - LayoutEngine::BuildBox(track_box, parent_box.GetSize(), track); - content = track_box.GetSize(); - content[length_axis] = slider_length -= orientation == VERTICAL ? (track_box.GetCumulativeEdge(Box::CONTENT, Box::TOP) + track_box.GetCumulativeEdge(Box::CONTENT, Box::BOTTOM)) : - (track_box.GetCumulativeEdge(Box::CONTENT, Box::LEFT) + track_box.GetCumulativeEdge(Box::CONTENT, Box::RIGHT)); - // If no height has been explicitly specified for the track, it'll be initialised to -1 as per normal block - // elements. We'll fix that up here. - if (orientation == HORIZONTAL && - content.y < 0) - content.y = parent_box.GetSize().y; - - // Now we size the arrows. - for (int i = 0; i < 2; i++) - { - Box arrow_box; - LayoutEngine::BuildBox(arrow_box, parent_box.GetSize(), arrows[i]); - - // Clamp the size to (0, 0). - Vector2f arrow_size = arrow_box.GetSize(); - if (arrow_size.x < 0 || - arrow_size.y < 0) - arrow_box.SetContent(Vector2f(0, 0)); - - arrows[i]->SetBox(arrow_box); - - // Shrink the track length by the arrow size. - content[length_axis] -= arrow_box.GetSize(Box::MARGIN)[length_axis]; - } - - // Now the track has been sized, we can fix everything into position. - track_box.SetContent(content); - track->SetBox(track_box); - - if (orientation == VERTICAL) - { - Vector2f offset(arrows[0]->GetBox().GetEdge(Box::MARGIN, Box::LEFT), arrows[0]->GetBox().GetEdge(Box::MARGIN, Box::TOP)); - arrows[0]->SetOffset(offset, parent); - - offset.x = track->GetBox().GetEdge(Box::MARGIN, Box::LEFT); - offset.y += arrows[0]->GetBox().GetSize(Box::BORDER).y + arrows[0]->GetBox().GetEdge(Box::MARGIN, Box::BOTTOM) + track->GetBox().GetEdge(Box::MARGIN, Box::TOP); - track->SetOffset(offset, parent); - - offset.x = arrows[1]->GetBox().GetEdge(Box::MARGIN, Box::LEFT); - offset.y += track->GetBox().GetSize(Box::BORDER).y + track->GetBox().GetEdge(Box::MARGIN, Box::BOTTOM) + arrows[1]->GetBox().GetEdge(Box::MARGIN, Box::TOP); - arrows[1]->SetOffset(offset, parent); - } - else - { - Vector2f offset(arrows[0]->GetBox().GetEdge(Box::MARGIN, Box::LEFT), arrows[0]->GetBox().GetEdge(Box::MARGIN, Box::TOP)); - arrows[0]->SetOffset(offset, parent); - - offset.x += arrows[0]->GetBox().GetSize(Box::BORDER).x + arrows[0]->GetBox().GetEdge(Box::MARGIN, Box::RIGHT) + track->GetBox().GetEdge(Box::MARGIN, Box::LEFT); - offset.y = track->GetBox().GetEdge(Box::MARGIN, Box::TOP); - track->SetOffset(offset, parent); - - offset.x += track->GetBox().GetSize(Box::BORDER).x + track->GetBox().GetEdge(Box::MARGIN, Box::RIGHT) + arrows[1]->GetBox().GetEdge(Box::MARGIN, Box::LEFT); - offset.y = arrows[1]->GetBox().GetEdge(Box::MARGIN, Box::TOP); - arrows[1]->SetOffset(offset, parent); - } - - FormatBar(bar_length); -} - -// Lays out and positions the bar element. -void WidgetSlider::FormatBar(float bar_length) -{ - Box bar_box; - LayoutEngine::BuildBox(bar_box, parent->GetBox().GetSize(), bar); - - const Property *local_width, *local_height; - bar->GetLocalDimensionProperties(&local_width, &local_height); - - Vector2f bar_box_content = bar_box.GetSize(); - if (orientation == HORIZONTAL) - { - if (local_height == NULL) - bar_box_content.y = parent->GetBox().GetSize().y; - } - - if (bar_length >= 0) - { - Vector2f track_size = track->GetBox().GetSize(); - - if (orientation == VERTICAL) - { - float track_length = track_size.y - (bar_box.GetCumulativeEdge(Box::CONTENT, Box::TOP) + bar_box.GetCumulativeEdge(Box::CONTENT, Box::BOTTOM)); - - if (local_height == NULL) - { - bar_box_content.y = track_length * bar_length; - - // Check for 'min-height' restrictions. - float min_track_length = bar->ResolveProperty(MIN_HEIGHT, track_length); - bar_box_content.y = Math::Max(min_track_length, bar_box_content.y); - - // Check for 'max-height' restrictions. - float max_track_length = bar->ResolveProperty(MAX_HEIGHT, track_length); - if (max_track_length > 0) - bar_box_content.y = Math::Min(max_track_length, bar_box_content.y); - } - - // Make sure we haven't gone further than we're allowed to (min-height may have made us too big). - bar_box_content.y = Math::Min(bar_box_content.y, track_length); - } - else - { - float track_length = track_size.x - (bar_box.GetCumulativeEdge(Box::CONTENT, Box::LEFT) + bar_box.GetCumulativeEdge(Box::CONTENT, Box::RIGHT)); - - if (local_width == NULL) - { - bar_box_content.x = track_length * bar_length; - - // Check for 'min-width' restrictions. - float min_track_length = bar->ResolveProperty(MIN_WIDTH, track_length); - bar_box_content.x = Math::Max(min_track_length, bar_box_content.x); - - // Check for 'max-width' restrictions. - float max_track_length = bar->ResolveProperty(MAX_WIDTH, track_length); - if (max_track_length > 0) - bar_box_content.x = Math::Min(max_track_length, bar_box_content.x); - } - - // Make sure we haven't gone further than we're allowed to (min-width may have made us too big). - bar_box_content.x = Math::Min(bar_box_content.x, track_length); - } - } - - // Set the new dimensions on the bar to re-decorate it. - bar_box.SetContent(bar_box_content); - bar->SetBox(bar_box); - - // Now that it's been resized, re-position it. - PositionBar(); -} - -// Returns the widget's parent element. -Element* WidgetSlider::GetParent() const -{ - return parent; -} - -// Handles events coming through from the slider's components. -void WidgetSlider::ProcessEvent(Event& event) -{ - if (event.GetTargetElement() == bar) - { - if (event == DRAG) - { - if (orientation == HORIZONTAL) - { - float traversable_track_length = track->GetBox().GetSize(Box::CONTENT).x - bar->GetBox().GetSize(Box::CONTENT).x; - if (traversable_track_length > 0) - { - float traversable_track_origin = track->GetAbsoluteOffset().x + bar_drag_anchor; - float new_bar_position = (event.GetParameter< float >("mouse_x", 0) - traversable_track_origin) / traversable_track_length; - new_bar_position = Math::Clamp(new_bar_position, 0.0f, 1.0f); - - SetBarPosition(OnBarChange(new_bar_position)); - } - } - else - { - float traversable_track_length = track->GetBox().GetSize(Box::CONTENT).y - bar->GetBox().GetSize(Box::CONTENT).y; - if (traversable_track_length > 0) - { - float traversable_track_origin = track->GetAbsoluteOffset().y + bar_drag_anchor; - float new_bar_position = (event.GetParameter< float >("mouse_y", 0) - traversable_track_origin) / traversable_track_length; - new_bar_position = Math::Clamp(new_bar_position, 0.0f, 1.0f); - - SetBarPosition(OnBarChange(new_bar_position)); - } - } - } - else if (event == DRAGSTART) - { - if (orientation == HORIZONTAL) - bar_drag_anchor = event.GetParameter< int >("mouse_x", 0) - Math::RealToInteger(bar->GetAbsoluteOffset().x); - else - bar_drag_anchor = event.GetParameter< int >("mouse_y", 0) - Math::RealToInteger(bar->GetAbsoluteOffset().y); - } - } - else if (event.GetTargetElement() == track) - { - if (event == CLICK) - { - if (orientation == HORIZONTAL) - { - float mouse_position = event.GetParameter< float >("mouse_x", 0); - float click_position = (mouse_position - track->GetAbsoluteOffset().x) / track->GetBox().GetSize().x; - - SetBarPosition(click_position <= bar_position ? OnPageDecrement(click_position) : OnPageIncrement(click_position)); - } - else - { - float mouse_position = event.GetParameter< float >("mouse_y", 0); - float click_position = (mouse_position - track->GetAbsoluteOffset().y) / track->GetBox().GetSize().y; - - SetBarPosition(click_position <= bar_position ? OnPageDecrement(click_position) : OnPageIncrement(click_position)); - } - } - } - - if (event == MOUSEDOWN) - { - if (event.GetTargetElement() == arrows[0]) - { - arrow_timers[0] = DEFAULT_REPEAT_DELAY; - last_update_time = Clock::GetElapsedTime(); - SetBarPosition(OnLineDecrement()); - } - else if (event.GetTargetElement() == arrows[1]) - { - arrow_timers[1] = DEFAULT_REPEAT_DELAY; - last_update_time = Clock::GetElapsedTime(); - SetBarPosition(OnLineIncrement()); - } - } - else if (event == MOUSEUP || - event == MOUSEOUT) - { - if (event.GetTargetElement() == arrows[0]) - arrow_timers[0] = -1; - else if (event.GetTargetElement() == arrows[1]) - arrow_timers[1] = -1; - } -} - -void WidgetSlider::PositionBar() -{ - const Vector2f& track_dimensions = track->GetBox().GetSize(); - const Vector2f& bar_dimensions = bar->GetBox().GetSize(Box::BORDER); - - if (orientation == VERTICAL) - { - float traversable_track_length = track_dimensions.y - bar_dimensions.y; - bar->SetOffset(Vector2f(bar->GetBox().GetEdge(Box::MARGIN, Box::LEFT), track->GetRelativeOffset().y + traversable_track_length * bar_position), parent); - } - else - { - float traversable_track_length = track_dimensions.x - bar_dimensions.x; - bar->SetOffset(Vector2f(track->GetRelativeOffset().x + traversable_track_length * bar_position, bar->GetBox().GetEdge(Box::MARGIN, Box::TOP)), parent); - } -} - -} -} diff --git a/libs/libRocket/Source/Core/WidgetSlider.h b/libs/libRocket/Source/Core/WidgetSlider.h deleted file mode 100644 index 62771714482..00000000000 --- a/libs/libRocket/Source/Core/WidgetSlider.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREWIDGETSLIDER_H -#define ROCKETCOREWIDGETSLIDER_H - -#include "../../Include/Rocket/Core/EventListener.h" - -namespace Rocket { -namespace Core { - -class Element; - -/** - A generic widget for incorporating sliding functionality into an element. - - @author Peter Curry - */ - -class WidgetSlider : public EventListener -{ -public: - enum Orientation - { - UNKNOWN, - VERTICAL, - HORIZONTAL - }; - - WidgetSlider(Element* parent); - virtual ~WidgetSlider(); - - /// Initialises the slider to a given orientation. - bool Initialise(Orientation orientation); - - /// Updates the key repeats for the increment / decrement arrows. - void Update(); - - /// Sets the position of the bar. - /// @param[in] bar_position The new position of the bar (0 representing the start of the track, 1 representing the end). - void SetBarPosition(float bar_position); - /// Returns the current position of the bar. - /// @return The current position of the bar (0 representing the start of the track, 1 representing the end). - float GetBarPosition(); - - /// Returns the slider's orientation. - /// @return The orientation of the slider. - Orientation GetOrientation() const; - - /// Sets the dimensions to the size of the slider. - /// @param[in] dimensions The dimensions to size. - void GetDimensions(Vector2f& dimensions) const; - -protected: - /// Lays out and resizes the slider's internal elements. - /// @param[in] containing_block The padded box containing the slider. This is used to resolve relative properties. - /// @param[in] resize_element True to resize the parent slider element, false to only resize its components. - /// @param[in] slider_length The total length, in pixels, of the slider widget. - /// @param[in] bar_length The total length of the bar, as a proportion of the track length. If this is -1, the intrinsic length will be used. - void FormatElements(const Vector2f& containing_block, bool resize_element, float slider_length, float bar_length = -1); - /// Lays out and positions the bar element. - /// @param[in] bar_length The total length of the bar, as a proportion of the track length. If this is -1, the intrinsic length will be used. - void FormatBar(float bar_length = -1); - - /// Returns the widget's parent element. - Element* GetParent() const; - - /// Handles events coming through from the slider's components. - virtual void ProcessEvent(Event& event); - - /// Called when the slider's bar position is set or dragged. - /// @param[in] bar_position The new position of the bar (0 representing the start of the track, 1 representing the end). - /// @return The new position of the bar. - virtual float OnBarChange(float bar_position) = 0; - /// Called when the slider is incremented by one 'line', either by the down / right key or a mouse-click on the - /// increment arrow. - /// @return The new position of the bar. - virtual float OnLineIncrement() = 0; - /// Called when the slider is decremented by one 'line', either by the up / left key or a mouse-click on the - /// decrement arrow. - /// @return The new position of the bar. - virtual float OnLineDecrement() = 0; - /// Called when the slider is incremented by one 'page', either by the page-up key or a mouse-click on the - /// track below / right of the bar. - /// @param[in] click_position The parametric position of the click along the track, or -1 if this was not generated by a mouse click. - /// @return The new position of the bar. - virtual float OnPageIncrement(float click_position) = 0; - /// Called when the slider is incremented by one 'page', either by the page-down key or a mouse-click on the - /// track above / left of the bar. - /// @param[in] click_position The parametric position of the click along the track, or -1 if this was not generated by a mouse click. - /// @return The new position of the bar. - virtual float OnPageDecrement(float click_position) = 0; - -private: - void PositionBar(); - - Element* parent; - - Orientation orientation; - - // The background track element, across which the bar slides. - Element* track; - // The bar element. This is the element that is dragged across the trough. - Element* bar; - // The two (optional) buttons for incrementing and decrementing the slider. - Element* arrows[2]; - - // A number from 0 to 1, indicating how far along the track the bar is. - float bar_position; - // If the bar is being dragged, this is the pixel offset from the start of the bar to where it was picked up. - int bar_drag_anchor; - - // Set to the auto-repeat timer if either of the arrow buttons have been pressed, -1 if they haven't. - float arrow_timers[2]; - float last_update_time; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/WidgetSliderScroll.cpp b/libs/libRocket/Source/Core/WidgetSliderScroll.cpp deleted file mode 100644 index f0131c56f94..00000000000 --- a/libs/libRocket/Source/Core/WidgetSliderScroll.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "WidgetSliderScroll.h" - -namespace Rocket { -namespace Core { - -WidgetSliderScroll::WidgetSliderScroll(Element* parent) : WidgetSlider(parent) -{ - track_length = 0; - bar_length = 0; - line_height = 12; -} - -WidgetSliderScroll::~WidgetSliderScroll() -{ -} - -// Sets the length of the entire track in some arbitrary unit. -void WidgetSliderScroll::SetTrackLength(float _track_length, bool ROCKET_UNUSED_PARAMETER(force_resize)) -{ - ROCKET_UNUSED(force_resize); - - if (track_length != _track_length) - { - track_length = _track_length; -// GenerateBar(); - } -} - -// Sets the length the bar represents in some arbitrary unit, relative to the track length. -void WidgetSliderScroll::SetBarLength(float _bar_length, bool ROCKET_UNUSED_PARAMETER(force_resize)) -{ - ROCKET_UNUSED(force_resize); - - if (bar_length != _bar_length) - { - bar_length = _bar_length; -// GenerateBar(); - } -} - -// Sets the line height of the parent element; this is used for scrolling speeds. -void WidgetSliderScroll::SetLineHeight(float _line_height) -{ - line_height = _line_height; -} - -// Lays out and resizes the internal elements. -void WidgetSliderScroll::FormatElements(const Vector2f& containing_block, float slider_length) -{ - float relative_bar_length; - - if (track_length <= 0) - relative_bar_length = 1; - else if (bar_length <= 0) - relative_bar_length = 0; - else - relative_bar_length = bar_length / track_length; - - WidgetSlider::FormatElements(containing_block, true, slider_length, relative_bar_length); -} - -// Called when the slider's bar position is set or dragged. -float WidgetSliderScroll::OnBarChange(float bar_position) -{ - return bar_position; -} - -// Called when the slider is incremented by one 'line', either by the down / right key or a mouse-click on the -// increment arrow. -float WidgetSliderScroll::OnLineIncrement() -{ - return Scroll(line_height); -} - -// Called when the slider is decremented by one 'line', either by the up / left key or a mouse-click on the decrement -// arrow. -float WidgetSliderScroll::OnLineDecrement() -{ - return Scroll(-line_height); -} - -// Called when the slider is incremented by one 'page', either by the page-up key or a mouse-click on the track -// below / right of the bar. -float WidgetSliderScroll::OnPageIncrement(float ROCKET_UNUSED_PARAMETER(click_position)) -{ - ROCKET_UNUSED(click_position); - - return Scroll(bar_length); -} - -// Called when the slider is incremented by one 'page', either by the page-down key or a mouse-click on the track -// above / left of the bar. -float WidgetSliderScroll::OnPageDecrement(float ROCKET_UNUSED_PARAMETER(click_position)) -{ - ROCKET_UNUSED(click_position); - - return Scroll(-bar_length); -} - -// Returns the bar position after scrolling for a number of pixels. -float WidgetSliderScroll::Scroll(float distance) -{ - float traversable_track_length = (track_length - bar_length); - if (traversable_track_length <= 0) - return GetBarPosition(); - - return (GetBarPosition() * traversable_track_length + distance) / traversable_track_length; -} - -} -} diff --git a/libs/libRocket/Source/Core/WidgetSliderScroll.h b/libs/libRocket/Source/Core/WidgetSliderScroll.h deleted file mode 100644 index 0653db3906d..00000000000 --- a/libs/libRocket/Source/Core/WidgetSliderScroll.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREWIDGETSLIDERSCROLL_H -#define ROCKETCOREWIDGETSLIDERSCROLL_H - -#include "WidgetSlider.h" - -namespace Rocket { -namespace Core { - -/** - @author Peter Curry - */ - -class WidgetSliderScroll : public WidgetSlider -{ -public: - WidgetSliderScroll(Element* parent); - virtual ~WidgetSliderScroll(); - - /// Sets the length of the entire track in scrollable units (usually lines or characters). This affects the - /// length of the bar element and the speed of scrolling using the mouse-wheel or arrows. - /// @param[in] track_length The length of the track. - /// @param[in] force_resize True to resize the bar immediately, false to wait until the next format. - void SetTrackLength(float track_length, bool force_resize = true); - /// Sets the length the bar represents in scrollable units (usually lines or characters), relative to the track - /// length. For example, for a scroll bar, this would represent how big each visible 'page' is compared to the - /// whole document (which would be set as the track length). - /// @param[in] bar_length The length of the slider's bar. - /// @param[in] force_resize True to resize the bar immediately, false to wait until the next format. - void SetBarLength(float bar_length, bool force_resize = true); - - /// Sets the line height of the parent element; this is used for scrolling speeds. - /// @param[in] line_height The line height of the parent element. - void SetLineHeight(float line_height); - - /// Lays out and resizes the internal elements. - /// @param[in] containing_block The padded box containing the slider. This is used to resolve relative properties. - /// @param[in] length The total length, in pixels, of the slider widget. - void FormatElements(const Vector2f& containing_block, float slider_length); - -protected: - /// Called when the slider's bar position is set or dragged. - /// @param bar_position[in] The new position of the bar (0 representing the start of the track, 1 representing the end). - /// @return The new position of the bar. - virtual float OnBarChange(float bar_position); - /// Called when the slider is incremented by one 'line', either by the down / right key or a mouse-click on the - /// increment arrow. - /// @return The new position of the bar. - virtual float OnLineIncrement(); - /// Called when the slider is decremented by one 'line', either by the up / left key or a mouse-click on the - /// decrement arrow. - /// @return The new position of the bar. - virtual float OnLineDecrement(); - /// Called when the slider is incremented by one 'page', either by the page-up key or a mouse-click on the - /// track below / right of the bar. - /// @return The new position of the bar. - virtual float OnPageIncrement(float click_position); - /// Called when the slider is incremented by one 'page', either by the page-down key or a mouse-click on the - /// track above / left of the bar. - /// @return The new position of the bar. - virtual float OnPageDecrement(float click_position); - -private: - // Returns the bar position after scrolling for a number of pixels. - float Scroll(float distance); - - float track_length; - float bar_length; - float line_height; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/XMLNodeHandler.cpp b/libs/libRocket/Source/Core/XMLNodeHandler.cpp deleted file mode 100644 index 8fbf7b49df9..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandler.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Core { - -XMLNodeHandler::~XMLNodeHandler() -{ -} - -void XMLNodeHandler::OnReferenceDeactivate() -{ - Release(); -} - -} -} diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerBody.cpp b/libs/libRocket/Source/Core/XMLNodeHandlerBody.cpp deleted file mode 100644 index c0e283883c7..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerBody.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "XMLNodeHandlerBody.h" -#include "XMLParseTools.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -XMLNodeHandlerBody::XMLNodeHandlerBody() -{ -} - -XMLNodeHandlerBody::~XMLNodeHandlerBody() -{ -} - -Element* XMLNodeHandlerBody::ElementStart(XMLParser* parser, const String& ROCKET_UNUSED_ASSERT_PARAMETER(name), const XMLAttributes& attributes) -{ - ROCKET_UNUSED_ASSERT(name); - ROCKET_ASSERT(name == "body"); - - Element* element = parser->GetParseFrame()->element; - - // Check for and apply any template - String template_name = attributes.Get("template", ""); - if (!template_name.Empty()) - { - element = XMLParseTools::ParseTemplate(element, template_name); - } - - // Apply any attributes to the document - ElementDocument* document = parser->GetParseFrame()->element->GetOwnerDocument(); - if (document) - document->SetAttributes(&attributes); - - // Tell the parser to use the element handler for all children - parser->PushDefaultHandler(); - - return element; -} - -bool XMLNodeHandlerBody::ElementEnd(XMLParser* ROCKET_UNUSED_PARAMETER(parser), const String& ROCKET_UNUSED_PARAMETER(name)) -{ - ROCKET_UNUSED(parser); - ROCKET_UNUSED(name); - - return true; -} - -bool XMLNodeHandlerBody::ElementData(XMLParser* parser, const String& data) -{ - return Factory::InstanceElementText(parser->GetParseFrame()->element, data); -} - -void XMLNodeHandlerBody::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerBody.h b/libs/libRocket/Source/Core/XMLNodeHandlerBody.h deleted file mode 100644 index bbdf880da57..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerBody.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREXMLNODEHANDLERBODY_H -#define ROCKETCOREXMLNODEHANDLERBODY_H - -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Core { - -/** - Element Node handler that processes the HEAD tag - - @author Lloyd Weehuizen - */ - -class XMLNodeHandlerBody : public XMLNodeHandler -{ -public: - XMLNodeHandlerBody(); - ~XMLNodeHandlerBody(); - - /// Called when a new element start is opened - virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes); - /// Called when an element is closed - virtual bool ElementEnd(XMLParser* parser, const String& name); - /// Called for element data - virtual bool ElementData(XMLParser* parser, const String& data); - - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerDefault.cpp b/libs/libRocket/Source/Core/XMLNodeHandlerDefault.cpp deleted file mode 100644 index 4ae232a2011..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerDefault.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "XMLNodeHandlerDefault.h" -#include "XMLParseTools.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/Element.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/XMLParser.h" - -namespace Rocket { -namespace Core { - -XMLNodeHandlerDefault::XMLNodeHandlerDefault() -{ -} - -XMLNodeHandlerDefault::~XMLNodeHandlerDefault() -{ -} - -Element* XMLNodeHandlerDefault::ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) -{ - // Determine the parent - Element* parent = parser->GetParseFrame()->element; - - // Attempt to instance the element with the instancer - Element* element = Factory::InstanceElement(parent, name, name, attributes); - if (!element) - { - Log::Message(Log::LT_ERROR, "Failed to create element for tag %s, instancer returned NULL.", name.CString()); - return NULL; - } - - // Add the element to its parent and remove the reference - parent->AppendChild(element); - element->RemoveReference(); - - return element; -} - -bool XMLNodeHandlerDefault::ElementEnd(XMLParser* ROCKET_UNUSED_PARAMETER(parser), const String& ROCKET_UNUSED_PARAMETER(name)) -{ - ROCKET_UNUSED(parser); - ROCKET_UNUSED(name); - - return true; -} - -bool XMLNodeHandlerDefault::ElementData(XMLParser* parser, const String& data) -{ - // Determine the parent - Element* parent = parser->GetParseFrame()->element; - - // Parse the text into the element - return Factory::InstanceElementText(parent, data); -} - -void XMLNodeHandlerDefault::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerDefault.h b/libs/libRocket/Source/Core/XMLNodeHandlerDefault.h deleted file mode 100644 index a2acab726e1..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerDefault.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREXMLNODEHANDLERDEFAULT_H -#define ROCKETCOREXMLNODEHANDLERDEFAULT_H - -#include "../../Include/Rocket/Core/Types.h" -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Core { - -/** - Element Node handler that creates RKTElements - - @author Lloyd Weehuizen - */ - -class XMLNodeHandlerDefault : public XMLNodeHandler -{ -public: - XMLNodeHandlerDefault(); - ~XMLNodeHandlerDefault(); - - /// Called when a new element start is opened - virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes); - /// Called when an element is closed - virtual bool ElementEnd(XMLParser* parser, const String& name); - /// Called for element data - virtual bool ElementData(XMLParser* parser, const String& data); - - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerHead.cpp b/libs/libRocket/Source/Core/XMLNodeHandlerHead.cpp deleted file mode 100644 index fb74a80b86c..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerHead.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "XMLNodeHandlerHead.h" -#include "DocumentHeader.h" -#include "TemplateCache.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -XMLNodeHandlerHead::XMLNodeHandlerHead() -{ -} - -XMLNodeHandlerHead::~XMLNodeHandlerHead() -{ -} - -Element* XMLNodeHandlerHead::ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) -{ - if (name == "head") - { - // Process the head attribute - parser->GetDocumentHeader()->source = parser->GetSourceURL().GetURL(); - } - - // Is it a link tag? - else if (name == "link") - { - // Lookup the type and href - String type = attributes.Get("type", "").ToLower(); - String href = attributes.Get("href", ""); - - if (!type.Empty() && !href.Empty()) - { - // If its RCSS (... or CSS!), add to the RCSS fields. - if (type == "text/rcss" || - type == "text/css") - { - parser->GetDocumentHeader()->rcss_external.push_back(href); - } - - // If its an template, add to the template fields - else if (type == "text/template") - { - parser->GetDocumentHeader()->template_resources.push_back(href); - } - - else - { - Log::ParseError(parser->GetSourceURL().GetURL(), parser->GetLineNumber(), "Invalid link type '%s'", type.CString()); - } - } - else - { - Log::ParseError(parser->GetSourceURL().GetURL(), parser->GetLineNumber(), "Link tag requires type and href attributes"); - } - } - - // Process script tags - else if (name == "script") - { - // Check if its an external string - String src = attributes.Get("src", ""); - if (src.Length() > 0) - { - parser->GetDocumentHeader()->scripts_external.push_back(src); - } - } - - // No elements constructed - return NULL; -} - -bool XMLNodeHandlerHead::ElementEnd(XMLParser* parser, const String& name) -{ - // When the head tag closes, inject the header into the active document - if (name == "head") - { - Element* element = parser->GetParseFrame()->element; - if (!element) - return true; - - ElementDocument* document = element->GetOwnerDocument(); - if (document) - document->ProcessHeader(parser->GetDocumentHeader()); - } - return true; -} - -bool XMLNodeHandlerHead::ElementData(XMLParser* parser, const String& data) -{ - const String& tag = parser->GetParseFrame()->tag; - - // Store the title - if (tag == "title") - { - SystemInterface* system_interface = GetSystemInterface(); - if (system_interface != NULL) - system_interface->TranslateString(parser->GetDocumentHeader()->title, data); - } - - // Store an inline script - if (tag == "script" && data.Length() > 0) - parser->GetDocumentHeader()->scripts_inline.push_back(data); - - // Store an inline style - if (tag == "style" && data.Length() > 0) - parser->GetDocumentHeader()->rcss_inline.push_back(data); - - return true; -} - -void XMLNodeHandlerHead::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerHead.h b/libs/libRocket/Source/Core/XMLNodeHandlerHead.h deleted file mode 100644 index 4d613520f41..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerHead.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREXMLNODEHANDLERHEAD_H -#define ROCKETCOREXMLNODEHANDLERHEAD_H - -#include "../../Include/Rocket/Core/XMLNodeHandler.h" -#include - -namespace Rocket { -namespace Core { - -/** - Element Node handler that processes the HEAD tag - - @author Lloyd Weehuizen - */ - -class XMLNodeHandlerHead : public XMLNodeHandler -{ -public: - XMLNodeHandlerHead(); - ~XMLNodeHandlerHead(); - - /// Called when a new element start is opened - virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes); - /// Called when an element is closed - virtual bool ElementEnd(XMLParser* parser, const String& name); - /// Called for element data - virtual bool ElementData(XMLParser* parser, const String& data); - - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerTemplate.cpp b/libs/libRocket/Source/Core/XMLNodeHandlerTemplate.cpp deleted file mode 100644 index d823082a4e4..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerTemplate.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "XMLNodeHandlerTemplate.h" -#include "Template.h" -#include "TemplateCache.h" -#include "XMLParseTools.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Core { - -XMLNodeHandlerTemplate::XMLNodeHandlerTemplate() -{ -} - -XMLNodeHandlerTemplate::~XMLNodeHandlerTemplate() -{ -} - -Element* XMLNodeHandlerTemplate::ElementStart(XMLParser* parser, const String& ROCKET_UNUSED_ASSERT_PARAMETER(name), const XMLAttributes& attributes) -{ - ROCKET_UNUSED_ASSERT(name); - ROCKET_ASSERT(name == "template"); - - String template_name = attributes.Get("src", ""); - - // Tell the parser to use the element handler for all child nodes - parser->PushDefaultHandler(); - - return XMLParseTools::ParseTemplate(parser->GetParseFrame()->element, template_name); -} - -bool XMLNodeHandlerTemplate::ElementEnd(XMLParser* ROCKET_UNUSED_PARAMETER(parser), const String& ROCKET_UNUSED_PARAMETER(name)) -{ - ROCKET_UNUSED(parser); - ROCKET_UNUSED(name); - - return true; -} - -bool XMLNodeHandlerTemplate::ElementData(XMLParser* parser, const String& data) -{ - return Factory::InstanceElementText(parser->GetParseFrame()->element, data); -} - -void XMLNodeHandlerTemplate::Release() -{ - delete this; -} - -} -} diff --git a/libs/libRocket/Source/Core/XMLNodeHandlerTemplate.h b/libs/libRocket/Source/Core/XMLNodeHandlerTemplate.h deleted file mode 100644 index 5dda5c9c7f3..00000000000 --- a/libs/libRocket/Source/Core/XMLNodeHandlerTemplate.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREXMLNODEHANDLERTEMPLATE_H -#define ROCKETCOREXMLNODEHANDLERTEMPLATE_H - -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Core { - -/** - Element Node handler that processes the custom template tags - - @author Lloyd Weehuizen - */ - -class XMLNodeHandlerTemplate : public XMLNodeHandler -{ -public: - XMLNodeHandlerTemplate(); - virtual ~XMLNodeHandlerTemplate(); - - /// Called when a new element start is opened - virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes); - /// Called when an element is closed - virtual bool ElementEnd(XMLParser* parser, const String& name); - /// Called for element data - virtual bool ElementData(XMLParser* parser, const String& data); - - virtual void Release(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/XMLParseTools.cpp b/libs/libRocket/Source/Core/XMLParseTools.cpp deleted file mode 100644 index 33baa668ce2..00000000000 --- a/libs/libRocket/Source/Core/XMLParseTools.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "XMLParseTools.h" -#include "../../Include/Rocket/Core/StreamMemory.h" -#include "Template.h" -#include "TemplateCache.h" -#include "../../Include/Rocket/Core.h" -#include - -namespace Rocket { -namespace Core { - -// Searchs a string for the specified tag -// NOTE: tag *MUST* be in lowercase -const char* XMLParseTools::FindTag(const char* tag, const char* string, bool closing_tag) -{ - int length = (int)strlen(tag); - const char* ptr = string; - bool found_closing = false; - - while (*ptr) - { - // Check if the first character matches - if (tolower((*ptr)) == tag[0]) - { - // If it does, check the whole word - if (strncasecmp(ptr,tag,length) == 0) - { - // Check for opening <, loop back in the string skipping white space and forward slashes if - // we're looking for the closing tag - const char* tag_start = ptr - 1; - while (tag_start > string && (StringUtilities::IsWhitespace(*tag_start) || *tag_start == '/')) - { - if (*tag_start == '/') - found_closing = true; - tag_start--; - } - - // If the character we're looking at is a <, and found closing matches closing tag, - // its the tag we're looking for - if (*tag_start == '<' && found_closing == closing_tag) - return tag_start; - - // Otherwise, keep looking - } - } - ptr++; - } - - return NULL; -} - -bool XMLParseTools::ReadAttribute(const char* &string, String& name, String& value) -{ - const char* ptr = string; - - name = ""; - value = ""; - - // Skip whitespace - while (StringUtilities::IsWhitespace(*ptr)) - ptr++; - - // Look for the end of the attribute name - bool found_whitespace = false; - while (*ptr != '=' && *ptr != '>' && (!found_whitespace || StringUtilities::IsWhitespace(*ptr))) - { - if (StringUtilities::IsWhitespace(*ptr)) - found_whitespace = true; - else - name += *ptr; - ptr++; - } - if (*ptr == '>') - return false; - - // If we stopped on an equals, parse the value - if (*ptr == '=') - { - - // Skip over white space, ='s and quotes - bool quoted = false; - while (StringUtilities::IsWhitespace(*ptr) || *ptr == '\'' || *ptr == '"' || *ptr == '=') - { - if (*ptr == '\'' || *ptr == '"') - quoted = true; - ptr++; - } - if (*ptr == '>') - return false; - - // Store the value - while (*ptr != '\'' && *ptr != '"' && *ptr != '>' && (*ptr != ' ' || quoted)) - { - value += *ptr++; - } - if (*ptr == '>') - return false; - - // Advance passed the quote - if (quoted) - ptr++; - } - else - { - ptr--; - } - - // Update the string pointer - string = ptr; - - return true; -} - -Element* XMLParseTools::ParseTemplate(Element* element, const String& template_name) -{ - // Load the template, and parse it - Template* parse_template = TemplateCache::GetTemplate(template_name); - if (!parse_template) - { - Log::ParseError(element->GetOwnerDocument()->GetSourceURL(), -1, "Failed to find template '%s'.", template_name.CString()); - return element; - } - - return parse_template->ParseTemplate(element); -} - -} -} diff --git a/libs/libRocket/Source/Core/XMLParseTools.h b/libs/libRocket/Source/Core/XMLParseTools.h deleted file mode 100644 index 2d09c43e79a..00000000000 --- a/libs/libRocket/Source/Core/XMLParseTools.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREXMLPARSETOOLS_H -#define ROCKETCOREXMLPARSETOOLS_H - -#include "../../Include/Rocket/Core/XMLParser.h" - -namespace Rocket { -namespace Core { - -class Element; - -/** - Tools for aiding in parsing XML documents. - - @author Lloyd Weehuizen - */ - -class XMLParseTools -{ -public: - /// Searchs a string for the specified tag - /// @param tag Tag to find, *must* be in lower case - /// @param string String to search - /// @param closing_tag Is it the closing tag we're looking for? - static const char* FindTag(const char* tag, const char* string, bool closing_tag = false); - /// Reads the next attribute from the string, advancing the pointer - /// @param[in,out] string String to read the attribute from, pointer will be advanced passed the read - /// @param[out] name Name of the attribute read - /// @param[out] value Value of the attribute read - static bool ReadAttribute(const char* &string, String& name, String& value); - - /// Applies the named template to the specified element - /// @param element Element to apply the template to - /// @param template_name Name of the template to apply, in TEMPLATE:ELEMENT_ID form - /// @returns Element to continue the parse from - static Element* ParseTemplate(Element* element, const String& template_name); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Core/XMLParser.cpp b/libs/libRocket/Source/Core/XMLParser.cpp deleted file mode 100644 index 91e3517b4ef..00000000000 --- a/libs/libRocket/Source/Core/XMLParser.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "../../Include/Rocket/Core/XMLParser.h" -#include "DocumentHeader.h" -#include "../../Include/Rocket/Core/Log.h" -#include "../../Include/Rocket/Core/XMLNodeHandler.h" - -namespace Rocket { -namespace Core { - -typedef std::map< String, XMLNodeHandler* > NodeHandlers; -static NodeHandlers node_handlers; -static XMLNodeHandler* default_node_handler = NULL; - -XMLParser::XMLParser(Element* root) -{ - RegisterCDATATag("script"); - - // Add the first frame. - ParseFrame frame; - frame.node_handler = NULL; - frame.child_handler = NULL; - frame.element = root; - frame.tag = ""; - stack.push(frame); - - active_handler = NULL; - - header = new DocumentHeader(); -} - -XMLParser::~XMLParser() -{ - delete header; -} - -// Registers a custom node handler to be used to a given tag. -XMLNodeHandler* XMLParser::RegisterNodeHandler(const String& _tag, XMLNodeHandler* handler) -{ - String tag = _tag.ToLower(); - - // Check for a default node registration. - if (tag.Empty()) - { - if (default_node_handler != NULL) - default_node_handler->RemoveReference(); - - default_node_handler = handler; - default_node_handler->AddReference(); - return default_node_handler; - } - - NodeHandlers::iterator i = node_handlers.find(tag); - if (i != node_handlers.end()) - (*i).second->RemoveReference(); - - node_handlers[tag] = handler; - handler->AddReference(); - - return handler; -} - -// Releases all registered node handlers. This is called internally. -void XMLParser::ReleaseHandlers() -{ - if (default_node_handler != NULL) - { - default_node_handler->RemoveReference(); - default_node_handler = NULL; - } - - for (NodeHandlers::iterator i = node_handlers.begin(); i != node_handlers.end(); ++i) - (*i).second->RemoveReference(); - - node_handlers.clear(); -} - -DocumentHeader* XMLParser::GetDocumentHeader() -{ - return header; -} - -const URL& XMLParser::GetSourceURL() const -{ - return xml_source->GetSourceURL(); -} - -// Pushes the default element handler onto the parse stack. -void XMLParser::PushDefaultHandler() -{ - active_handler = default_node_handler; -} - -bool XMLParser::PushHandler(const String& tag) -{ - NodeHandlers::iterator i = node_handlers.find(tag.ToLower()); - if (i == node_handlers.end()) - return false; - - active_handler = (*i).second; - return true; -} - -/// Access the current parse frame -const XMLParser::ParseFrame* XMLParser::GetParseFrame() const -{ - return &stack.top(); -} - -/// Called when the parser finds the beginning of an element tag. -void XMLParser::HandleElementStart(const String& _name, const XMLAttributes& _attributes) -{ - String name = _name.ToLower(); - XMLAttributes attributes; - - String key; - Variant* value; - int pos = 0; - while (_attributes.Iterate(pos, key, value)) - { - attributes.Set(key.ToLower(), *value); - } - - // Check for a specific handler that will override the child handler. - NodeHandlers::iterator itr = node_handlers.find(name); - if (itr != node_handlers.end()) - active_handler = (*itr).second; - - // Store the current active handler, so we can use it through this function (as active handler may change) - XMLNodeHandler* node_handler = active_handler; - - Element* element = NULL; - - // Get the handler to handle the open tag - if (node_handler) - { - element = node_handler->ElementStart(this, name, attributes); - } - - // Push onto the stack - ParseFrame frame; - frame.node_handler = node_handler; - frame.child_handler = active_handler; - frame.element = element != NULL ? element : stack.top().element; - frame.tag = name; - stack.push(frame); -} - -/// Called when the parser finds the end of an element tag. -void XMLParser::HandleElementEnd(const String& _name) -{ - String name = _name.ToLower(); - - // Copy the top of the stack - ParseFrame frame = stack.top(); - // Pop the frame - stack.pop(); - // Restore active handler to the previous frame's child handler - active_handler = stack.top().child_handler; - - // Check frame names - if (name != frame.tag) - { - Log::Message(Log::LT_ERROR, "Closing tag '%s' mismatched on %s:%d was expecting '%s'.", name.CString(), GetSourceURL().GetURL().CString(), GetLineNumber(), frame.tag.CString()); - } - - // Call element end handler - if (frame.node_handler) - { - frame.node_handler->ElementEnd(this, name); - } -} - -/// Called when the parser encounters data. -void XMLParser::HandleData(const String& data) -{ - if (stack.top().node_handler) - stack.top().node_handler->ElementData(this, data); -} - -} -} diff --git a/libs/libRocket/Source/Core/precompiled.cpp b/libs/libRocket/Source/Core/precompiled.cpp deleted file mode 100644 index 75b0e6c6d24..00000000000 --- a/libs/libRocket/Source/Core/precompiled.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" - diff --git a/libs/libRocket/Source/Core/precompiled.h b/libs/libRocket/Source/Core/precompiled.h deleted file mode 100644 index 9a748259b47..00000000000 --- a/libs/libRocket/Source/Core/precompiled.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETCOREPRECOMPILED_H -#define ROCKETCOREPRECOMPILED_H - -#include "../../Include/Rocket/Core/Core.h" -#include "StringCache.h" - -#endif diff --git a/libs/libRocket/Source/Debugger/BeaconSource.h b/libs/libRocket/Source/Debugger/BeaconSource.h deleted file mode 100644 index 8aa5b5d2278..00000000000 --- a/libs/libRocket/Source/Debugger/BeaconSource.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -static const char* beacon_rcss = -"body\n" -"{\n" -" position: absolute;\n" -" top: 5px;\n" -" right: 33px;\n" -" z-index: top;\n" -" width: 20px;\n" -" font-family: Lacuna;\n" -" font-size: 12px;\n" -" color: black;\n" -" visibility: hidden;\n" -"}\n" -"button\n" -"{\n" -" display: block;\n" -" width: 18px;\n" -" height: 18px;\n" -" text-align: center;\n" -" border-width: 1px;\n" -" font-weight: bold;\n" -"}\n"; - -static const char* beacon_rml = -"\n"; diff --git a/libs/libRocket/Source/Debugger/CommonSource.h b/libs/libRocket/Source/Debugger/CommonSource.h deleted file mode 100644 index 978fd24e81d..00000000000 --- a/libs/libRocket/Source/Debugger/CommonSource.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -static const char* common_rcss = -"body\n" -"{\n" -" font-family: Lacuna;\n" -" z-index: top;\n" -" font-size: 12;\n" -" color: black;\n" -" padding-top: 30px;\n" -"}\n" -"div, h1, h2, h3, h4, p\n" -"{\n" -" display: block;\n" -"}\n" -"em\n" -"{\n" -" font-style: italic;\n" -"}\n" -"h1\n" -"{\n" -" position: absolute;\n" -" top: 0px;\n" -" height: 22px;\n" -" padding: 4px;\n" -" color: white;\n" -" background-color: #888;\n" -" font-size: 15px;\n" -"}\n" -"h2\n" -"{\n" -" background-color: #ddd;\n" -" border-width: 1px 0px;\n" -" border-color: #888;\n" -"}\n" -"h3\n" -"{\n" -" margin-top: 1em;\n" -" color: red;\n" -"}\n" -"h4\n" -"{\n" -" color: #cc0000;\n" -"}\n" -"handle#position_handle\n" -"{\n" -" height: 100%;\n" -" width: 100%;\n" -"}\n" -"div#close_button\n" -"{\n" -" margin-left: 10px;\n" -" float: right;\n" -" width: 18px;\n" -" color: black;\n" -" background-color: #ddd;\n" -" border-width: 1px;\n" -" border-color: #666;\n" -" text-align: center;\n" -"}\n" -"div#content\n" -"{\n" -" position: relative;\n" -" width: auto;\n" -" height: 100%;\n" -" overflow: auto;\n" -" background: white;\n" -" border-width: 2px;\n" -" border-color: #888;\n" -" border-width-top: 0px;\n" -"}\n" -".error\n" -"{\n" -" background: #d24040;\n" -" color: white;\n" -" border-color: #b74e4e;\n" -"}\n" -".warning\n" -"{\n" -" background: #e8d34e;\n" -" color: black;\n" -" border-color: #ca9466;\n" -"}\n" -".info\n" -"{\n" -" background: #2a9cdb;\n" -" color: white;\n" -" border-color: #3b70bb;\n" -"}\n" -".debug\n" -"{\n" -" background: #3fab2a;\n" -" color: white;\n" -" border-color: #226c13;\n" -"}\n" -"scrollbarvertical\n" -"{\n" -" width: 16px;\n" -" scrollbar-margin: 16px;\n" -"}\n" -"scrollbarhorizontal\n" -"{\n" -" height: 16px;\n" -" scrollbar-margin: 16px;\n" -"}\n" -"scrollbarvertical slidertrack,\n" -"scrollbarhorizontal slidertrack\n" -"{\n" -" background: #aaa;\n" -" border-color: #888;\n" -"}\n" -"scrollbarvertical slidertrack\n" -"{\n" -" border-left-width: 1px;\n" -"}\n" -"scrollbarhorizontal slidertrack\n" -"{\n" -" height: 15px;\n" -" border-top-width: 1px;\n" -"}\n" -"scrollbarvertical sliderbar,\n" -"scrollbarhorizontal sliderbar\n" -"{\n" -" background: #ddd;\n" -" border-color: #888;\n" -"}" -"scrollbarvertical sliderbar\n" -"{\n" -" border-width: 1px 0px;\n" -" margin-left: 1px;\n" -"}\n" -"scrollbarhorizontal sliderbar\n" -"{\n" -" height: 15px;\n" -" border-width: 0px 1px;\n" -" margin-top: 1px;\n" -"}\n" -"scrollbarcorner\n" -"{\n" -" background: #888;\n" -"}\n" -"handle#size_handle\n" -"{\n" -" position: absolute;\n" -" width: 16px;\n" -" height: 16px;\n" -" bottom: -2px;\n" -" right: 2px;\n" -" background-color: #888;\n" -"}\n"; diff --git a/libs/libRocket/Source/Debugger/Debugger.cpp b/libs/libRocket/Source/Debugger/Debugger.cpp deleted file mode 100644 index 53a9d2b280e..00000000000 --- a/libs/libRocket/Source/Debugger/Debugger.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "../../Include/Rocket/Debugger/Debugger.h" -#include "../../Include/Rocket/Core.h" -#include "Plugin.h" - -namespace Rocket { -namespace Debugger { - -// Initialises the debug plugin. The debugger will be loaded into the given context. -bool Initialise(Core::Context* context) -{ - if (Plugin::GetInstance() != NULL) - { - Core::Log::Message(Core::Log::LT_WARNING, "Unable to initialise debugger plugin, already initialised!"); - return false; - } - - Plugin* plugin = new Plugin(); - if (!plugin->Initialise(context)) - { - Core::Log::Message(Core::Log::LT_WARNING, "Unable to initialise debugger plugin."); - - delete plugin; - return false; - } - - SetContext(context); - Core::RegisterPlugin(plugin); - - return true; -} - -// Sets the context to be debugged. -bool SetContext(Core::Context* context) -{ - Plugin* plugin = Plugin::GetInstance(); - if (plugin == NULL) - return false; - - plugin->SetContext(context); - - return true; -} - -// Sets the visibility of the debugger. -void SetVisible(bool visibility) -{ - Plugin* plugin = Plugin::GetInstance(); - if (plugin != NULL) - plugin->SetVisible(visibility); -} - -// Returns the visibility of the debugger. -bool IsVisible() -{ - Plugin* plugin = Plugin::GetInstance(); - if (plugin == NULL) - return false; - - return plugin->IsVisible(); -} - -} -} diff --git a/libs/libRocket/Source/Debugger/ElementContextHook.cpp b/libs/libRocket/Source/Debugger/ElementContextHook.cpp deleted file mode 100644 index 271cfb0ed0d..00000000000 --- a/libs/libRocket/Source/Debugger/ElementContextHook.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "ElementContextHook.h" -#include "Plugin.h" - -namespace Rocket { -namespace Debugger { - -ElementContextHook::ElementContextHook(const Core::String& tag) : Core::ElementDocument(tag) -{ - debugger = NULL; -} - -ElementContextHook::~ElementContextHook() -{ -} - -void ElementContextHook::Initialise(Plugin* _debugger) -{ - SetId("rkt-debug-hook"); - debugger = _debugger; -} - -void ElementContextHook::OnRender() -{ - // Make sure we're in the front of the render queue for this context (at least next frame). - PullToFront(); - - // Render the debugging elements. - debugger->Render(); -} - -} -} diff --git a/libs/libRocket/Source/Debugger/ElementContextHook.h b/libs/libRocket/Source/Debugger/ElementContextHook.h deleted file mode 100644 index 8d7c1ef2edc..00000000000 --- a/libs/libRocket/Source/Debugger/ElementContextHook.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERELEMENTCONTEXTHOOK_H -#define ROCKETDEBUGGERELEMENTCONTEXTHOOK_H - -#include "../../Include/Rocket/Core/ElementDocument.h" - -namespace Rocket { -namespace Debugger { - -class Plugin; - -/** - An element that the debugger uses to render into a foreign context. - - @author Peter Curry - */ - -class ElementContextHook : public Core::ElementDocument -{ -public: - ElementContextHook(const Core::String& tag); - virtual ~ElementContextHook(); - - void Initialise(Plugin* debugger); - - virtual void OnRender(); - -private: - Plugin* debugger; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Debugger/ElementInfo.cpp b/libs/libRocket/Source/Debugger/ElementInfo.cpp deleted file mode 100644 index db0258ee036..00000000000 --- a/libs/libRocket/Source/Debugger/ElementInfo.cpp +++ /dev/null @@ -1,543 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "ElementInfo.h" -#include "../../Include/Rocket/Core/Property.h" -#include "../../Include/Rocket/Core/Factory.h" -#include "../../Include/Rocket/Core/StyleSheet.h" -#include "Geometry.h" -#include "CommonSource.h" -#include "InfoSource.h" -#include - -namespace Rocket { -namespace Debugger { - -ElementInfo::ElementInfo(const Core::String& tag) : Core::ElementDocument(tag) -{ - hover_element = NULL; - source_element = NULL; -} - -ElementInfo::~ElementInfo() -{ -} - -// Initialises the info element. -bool ElementInfo::Initialise() -{ - SetInnerRML(info_rml); - SetId("rkt-debug-info"); - - Core::StyleSheet* style_sheet = Core::Factory::InstanceStyleSheetString(Core::String(common_rcss) + Core::String(info_rcss)); - if (style_sheet == NULL) - return false; - - SetStyleSheet(style_sheet); - style_sheet->RemoveReference(); - - return true; -} - -// Clears the element references. -void ElementInfo::Reset() -{ - hover_element = NULL; - SetSourceElement(NULL); -} - -// Called when an element is destroyed. -void ElementInfo::OnElementDestroy(Core::Element* element) -{ - if (hover_element == element) - hover_element = NULL; - - if (source_element == element) - source_element = NULL; -} - -void ElementInfo::RenderHoverElement() -{ - if (hover_element) - { - for (int i = 0; i < hover_element->GetNumBoxes(); i++) - { - // Render the content area. - const Core::Box element_box = hover_element->GetBox(i); - Geometry::RenderOutline(hover_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::BORDER), element_box.GetSize(Core::Box::BORDER), Core::Colourb(255, 0, 0, 255), 1); - } - } -} - -void ElementInfo::RenderSourceElement() -{ - if (source_element) - { - for (int i = 0; i < source_element->GetNumBoxes(); i++) - { - const Core::Box element_box = source_element->GetBox(i); - - // Content area: - Geometry::RenderBox(source_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::CONTENT), element_box.GetSize(), Core::Colourb(158, 214, 237, 128)); - - // Padding area: - Geometry::RenderBox(source_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::PADDING), element_box.GetSize(Core::Box::PADDING), source_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::CONTENT), element_box.GetSize(), Core::Colourb(135, 122, 214, 128)); - - // Border area: - Geometry::RenderBox(source_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::BORDER), element_box.GetSize(Core::Box::BORDER), source_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::PADDING), element_box.GetSize(Core::Box::PADDING), Core::Colourb(133, 133, 133, 128)); - - // Border area: - Geometry::RenderBox(source_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::MARGIN), element_box.GetSize(Core::Box::MARGIN), source_element->GetAbsoluteOffset(Core::Box::BORDER) + element_box.GetPosition(Core::Box::BORDER), element_box.GetSize(Core::Box::BORDER), Core::Colourb(240, 255, 131, 128)); - } - } -} - -void ElementInfo::ProcessEvent(Core::Event& event) -{ - Core::ElementDocument::ProcessEvent(event); - - // Only process events if we're visible - if (IsVisible()) - { - if (event == "click") - { - Core::Element* target_element = event.GetTargetElement(); - - // Deal with clicks on our own elements differently. - if (target_element->GetOwnerDocument() == this) - { - // If it's a pane title, then we need to toggle the visibility of its sibling (the contents pane underneath it). - if (target_element->GetTagName() == "h2") - { - Core::Element* panel = target_element->GetNextSibling(); - if (panel->IsVisible()) - panel->SetProperty("display", "none"); - else - panel->SetProperty("display", "block"); - event.StopPropagation(); - } - else if (event.GetTargetElement()->GetId() == "close_button") - { - if (IsVisible()) - SetProperty("visibility", "hidden"); - } - // Check if the id is in the form "a %d" or "c %d" - these are the ancestor or child labels. - else - { - int element_index; - if (sscanf(target_element->GetId().CString(), "a %d", &element_index) == 1) - { - Core::Element* new_source_element = source_element; - for (int i = 0; i < element_index; i++) - { - if (new_source_element != NULL) - new_source_element = new_source_element->GetParentNode(); - } - SetSourceElement(new_source_element); - } - else if (sscanf(target_element->GetId().CString(), "c %d", &element_index) == 1) - { - if (source_element != NULL) - SetSourceElement(source_element->GetChild(element_index)); - } - event.StopPropagation(); - } - } - // Otherwise we just want to focus on the clicked element (unless it's on a debug element) - else if (target_element->GetOwnerDocument() != NULL && !IsDebuggerElement(target_element)) - { - Core::Element* new_source_element = target_element; - if (new_source_element != source_element) - { - SetSourceElement(new_source_element); - event.StopPropagation(); - } - } - } - else if (event == "mouseover") - { - Core::Element* target_element = event.GetTargetElement(); - - // Deal with clicks on our own elements differently. - Core::ElementDocument* owner_document = target_element->GetOwnerDocument(); - if (owner_document == this) - { - // Check if the id is in the form "a %d" or "c %d" - these are the ancestor or child labels. - int element_index; - if (sscanf(target_element->GetId().CString(), "a %d", &element_index) == 1) - { - hover_element = source_element; - for (int i = 0; i < element_index; i++) - { - if (hover_element != NULL) - hover_element = hover_element->GetParentNode(); - } - } - else if (sscanf(target_element->GetId().CString(), "c %d", &element_index) == 1) - { - if (source_element != NULL) - hover_element = source_element->GetChild(element_index); - } - } - // Otherwise we just want to focus on the clicked element (unless it's on a debug element) - else if (owner_document != NULL && owner_document->GetId().Find("rkt-debug-") != 0) - { - hover_element = target_element; - } - } - } -} - -void ElementInfo::SetSourceElement(Core::Element* new_source_element) -{ - source_element = new_source_element; - UpdateSourceElement(); -} - -void ElementInfo::UpdateSourceElement() -{ - // Set the title: - Core::Element* title_content = GetElementById("title-content"); - if (title_content != NULL) - { - if (source_element != NULL) - title_content->SetInnerRML(source_element->GetTagName()); - else - title_content->SetInnerRML("Element Information"); - } - - // Set the attributes: - Core::Element* attributes_content = GetElementById("attributes-content"); - if (attributes_content) - { - int index = 0; - Core::String name; - Core::String value; - Core::String attributes; - - if (source_element != NULL) - { - while (source_element->IterateAttributes(index, name, value)) - attributes.Append(Core::String(name.Length() + value.Length() + 32, "%s: %s
", name.CString(), value.CString())); - } - - if (attributes.Empty()) - { - while (attributes_content->HasChildNodes()) - attributes_content->RemoveChild(attributes_content->GetChild(0)); - } - else - attributes_content->SetInnerRML(attributes); - } - - // Set the properties: - Core::Element* properties_content = GetElementById("properties-content"); - if (properties_content) - { - Core::String properties; - if (source_element != NULL) - BuildElementPropertiesRML(properties, source_element, source_element); - - if (properties.Empty()) - { - while (properties_content->HasChildNodes()) - properties_content->RemoveChild(properties_content->GetChild(0)); - } - else - properties_content->SetInnerRML(properties); - } - - // Set the position: - Core::Element* position_content = GetElementById("position-content"); - if (position_content) - { - // left, top, width, height. - if (source_element != NULL) - { - Core::Vector2f element_offset = source_element->GetRelativeOffset(Core::Box::BORDER); - Core::Vector2f element_size = source_element->GetBox().GetSize(Core::Box::BORDER); - - Core::String positions; - positions.Append(Core::String(64, "left: %.0fpx
", element_offset.x)); - positions.Append(Core::String(64, "top: %.0fpx
", element_offset.y)); - positions.Append(Core::String(64, "width: %.0fpx
", element_size.x)); - positions.Append(Core::String(64, "height: %.0fpx
", element_size.y)); - - position_content->SetInnerRML(positions); - } - else - { - while (position_content->HasChildNodes()) - position_content->RemoveChild(position_content->GetFirstChild()); - } - } - - // Set the ancestors: - Core::Element* ancestors_content = GetElementById("ancestors-content"); - if (ancestors_content) - { - Core::String ancestors; - Core::Element* element_ancestor = NULL; - if (source_element != NULL) - element_ancestor = source_element->GetParentNode(); - - int ancestor_depth = 1; - while (element_ancestor) - { - Core::String ancestor_name = element_ancestor->GetTagName(); - const Core::String ancestor_id = element_ancestor->GetId(); - if (!ancestor_id.Empty()) - { - ancestor_name += "#"; - ancestor_name += ancestor_id; - } - - ancestors.Append(Core::String(ancestor_name.Length() + 32, "

%s

", ancestor_depth, ancestor_name.CString())); - element_ancestor = element_ancestor->GetParentNode(); - ancestor_depth++; - } - - if (ancestors.Empty()) - { - while (ancestors_content->HasChildNodes()) - ancestors_content->RemoveChild(ancestors_content->GetFirstChild()); - } - else - ancestors_content->SetInnerRML(ancestors); - } - - // Set the children: - Core::Element* children_content = GetElementById("children-content"); - if (children_content) - { - Core::String children; - if (source_element != NULL) - { - for (int i = 0; i < source_element->GetNumChildren(); i++) - { - Core::Element* child = source_element->GetChild(i); - - // If this is a debugger document, do not show it. - if (IsDebuggerElement(child)) - continue; - - Core::String child_name = child->GetTagName(); - const Core::String child_id = child->GetId(); - if (!child_id.Empty()) - { - child_name += "#"; - child_name += child_id; - } - - children.Append(Core::String(child_name.Length() + 32, "

%s

", i, child_name.CString())); - } - } - - if (children.Empty()) - { - while (children_content->HasChildNodes()) - children_content->RemoveChild(children_content->GetChild(0)); - } - else - children_content->SetInnerRML(children); - } -} - -void ElementInfo::BuildElementPropertiesRML(Core::String& property_rml, Core::Element* element, Core::Element* primary_element) -{ - NamedPropertyMap property_map; - - int property_index = 0; - Core::String property_name; - Core::PseudoClassList property_pseudo_classes; - const Core::Property* property; - - while (element->IterateProperties(property_index, property_pseudo_classes, property_name, property)) - { - // Check that this property isn't overridden or just not inherited. - if (primary_element->GetProperty(property_name) != property) - continue; - - NamedPropertyMap::iterator i = property_map.find(property_pseudo_classes); - if (i == property_map.end()) - property_map[property_pseudo_classes] = NamedPropertyList(1, NamedProperty(property_name, property)); - else - { - // Find a place in this list of properties to insert the new one. - NamedPropertyList& properties = (*i).second; - NamedPropertyList::iterator insert_iterator = properties.begin(); - while (insert_iterator != properties.end()) - { - int source_cmp = strcasecmp((*insert_iterator).second->source.CString(), property->source.CString()); - if (source_cmp > 0 || - (source_cmp == 0 && (*insert_iterator).second->source_line_number >= property->source_line_number)) - break; - - ++insert_iterator; - } - - (*i).second.insert(insert_iterator, NamedProperty(property_name, property)); - } - } - - if (!property_map.empty()) - { - // Print the 'inherited from ...' header if we're not the primary element. - if (element != primary_element) - property_rml += Core::String(element->GetTagName().Length() + 32, "

inherited from %s

", element->GetTagName().CString()); - - NamedPropertyMap::iterator base_properties = property_map.find(Core::PseudoClassList()); - if (base_properties != property_map.end()) - BuildPropertiesRML(property_rml, (*base_properties).second); - - for (NamedPropertyMap::iterator i = property_map.begin(); i != property_map.end(); ++i) - { - // Skip the base property list, we've already printed it. - if (i == base_properties) - continue; - - // Print the pseudo-class header. - property_rml.Append("

"); - - for (Core::PseudoClassList::const_iterator j = (*i).first.begin(); j != (*i).first.end(); ++j) - { - property_rml.Append(" :"); - property_rml.Append(*j); - } - - property_rml.Append("

"); - - BuildPropertiesRML(property_rml, (*i).second); - } - } - - if (element->GetParentNode() != NULL) - BuildElementPropertiesRML(property_rml, element->GetParentNode(), primary_element); -} - -void ElementInfo::BuildPropertiesRML(Core::String& property_rml, const NamedPropertyList& properties) -{ - Core::String last_source; - int last_source_line = -1; - - for (size_t i = 0; i < properties.size(); ++i) - { - if (i == 0 || - last_source != properties[i].second->source || - last_source_line != properties[i].second->source_line_number) - { - last_source = properties[i].second->source; - last_source_line = properties[i].second->source_line_number; - - property_rml.Append("

"); - - if (last_source.Empty() && - last_source_line == 0) - property_rml.Append("inline"); - else - property_rml.Append(Core::String(last_source.Length() + 32, "%s: %d", last_source.CString(), last_source_line)); - - property_rml.Append("

"); - } - - BuildPropertyRML(property_rml, properties[i].first, properties[i].second); - } -} - -void ElementInfo::BuildPropertyRML(Core::String& property_rml, const Core::String& name, const Core::Property* property) -{ - Core::String property_value = property->ToString(); - RemoveTrailingZeroes(property_value); - - property_rml += Core::String(name.Length() + property_value.Length() + 32, "%s: %s;
", name.CString(), property_value.CString()); -} - -void ElementInfo::RemoveTrailingZeroes(Core::String& string) -{ - if (string.Empty()) - { - return; - } - - // First, check for a decimal point. No point, no chance of trailing zeroes! - size_t decimal_point_position = string.Find("."); - if (decimal_point_position != Core::String::npos) - { - // Ok, so now we start at the back of the string and find the first - // numeral. If the character we find is a zero, then we start counting - // back till we find something that isn't a zero or a decimal point - - // and then remove all that we've counted. - size_t last_zero = string.Length() - 1; - while ((string[last_zero] < '0' || string[last_zero] > '9') && string[last_zero] != '.') - { - if (last_zero == 0) - { - return; - } - if (string[last_zero] == '.') - { - break; - } - last_zero--; - } - - if (!(string[last_zero] == '0' || string[last_zero] == '.')) - { - return; - } - - // Now find the first character that isn't a zero (unless we're just - // chopping off the dangling decimal point) - size_t first_zero = last_zero; - if (string[last_zero] == '0') - { - while (first_zero > 0 && string[first_zero - 1] == '0') - { - first_zero--; - } - - // Check for a preceeding decimal point - if it's all zeroes until the - // decimal, then we should remove it too. - if (string[first_zero - 1] == '.') - { - first_zero--; - } - } - - // Now remove everything between first_zero and last_zero, inclusive. - if (last_zero > first_zero) - string.Erase(first_zero, (last_zero - first_zero) + 1); - } -} - -bool ElementInfo::IsDebuggerElement(Core::Element* element) -{ - return element->GetOwnerDocument()->GetId().Find("rkt-debug-") == 0; -} - -} -} diff --git a/libs/libRocket/Source/Debugger/ElementInfo.h b/libs/libRocket/Source/Debugger/ElementInfo.h deleted file mode 100644 index 09e913b55f7..00000000000 --- a/libs/libRocket/Source/Debugger/ElementInfo.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERELEMENTINFO_H -#define ROCKETDEBUGGERELEMENTINFO_H - -#include "../../Include/Rocket/Core/ElementDocument.h" -#include "../../Include/Rocket/Core/EventListener.h" - -namespace Rocket { -namespace Debugger { - -typedef std::pair< Core::String, const Core::Property* > NamedProperty; -typedef std::vector< NamedProperty > NamedPropertyList; -typedef std::map< Core::PseudoClassList, NamedPropertyList > NamedPropertyMap; - -/** - @author Robert Curry - */ - -class ElementInfo : public Core::ElementDocument, public Core::EventListener -{ -public: - ElementInfo(const Core::String& tag); - virtual ~ElementInfo(); - - /// Initialises the info element. - /// @return True if the element initialised successfully, false otherwise. - bool Initialise(); - /// Clears the element references. - void Reset(); - - /// Called when an element is destroyed. - void OnElementDestroy(Core::Element* element); - - void RenderHoverElement(); - void RenderSourceElement(); - -protected: - virtual void ProcessEvent(Core::Event& event); - -private: - void SetSourceElement(Core::Element* new_source_element); - void UpdateSourceElement(); - - void BuildElementPropertiesRML(Core::String& property_rml, Core::Element* element, Core::Element* primary_element); - void BuildPropertiesRML(Core::String& property_rml, const NamedPropertyList& properties); - void BuildPropertyRML(Core::String& property_rml, const Core::String& name, const Core::Property* property); - - void RemoveTrailingZeroes(Core::String& string); - - bool IsDebuggerElement(Core::Element* element); - - Core::Element* hover_element; - Core::Element* source_element; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Debugger/ElementLog.cpp b/libs/libRocket/Source/Debugger/ElementLog.cpp deleted file mode 100644 index d05c9bcf280..00000000000 --- a/libs/libRocket/Source/Debugger/ElementLog.cpp +++ /dev/null @@ -1,298 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "ElementLog.h" -#include "../../Include/Rocket/Core.h" -#include "CommonSource.h" -#include "BeaconSource.h" -#include "LogSource.h" - -namespace Rocket { -namespace Debugger { - -const int MAX_LOG_MESSAGES = 50; - -ElementLog::ElementLog(const Core::String& tag) : Core::ElementDocument(tag) -{ - dirty_logs = false; - beacon = NULL; - current_beacon_level = Core::Log::LT_MAX; - auto_scroll = true; - message_content = NULL; - current_index = 0; - - // Set up the log type buttons. - log_types[Core::Log::LT_ALWAYS].visible = true; - log_types[Core::Log::LT_ALWAYS].class_name = "error"; - log_types[Core::Log::LT_ALWAYS].alert_contents = "A"; - - log_types[Core::Log::LT_ERROR].visible = true; - log_types[Core::Log::LT_ERROR].class_name = "error"; - log_types[Core::Log::LT_ERROR].alert_contents = "!"; - log_types[Core::Log::LT_ERROR].button_name = "error_button"; - - log_types[Core::Log::LT_ASSERT].visible = true; - log_types[Core::Log::LT_ASSERT].class_name = "error"; - log_types[Core::Log::LT_ASSERT].alert_contents = "!"; - - log_types[Core::Log::LT_WARNING].visible = true; - log_types[Core::Log::LT_WARNING].class_name = "warning"; - log_types[Core::Log::LT_WARNING].alert_contents = "!"; - log_types[Core::Log::LT_WARNING].button_name = "warning_button"; - - log_types[Core::Log::LT_INFO].visible = false; - log_types[Core::Log::LT_INFO].class_name = "info"; - log_types[Core::Log::LT_INFO].alert_contents = "i"; - log_types[Core::Log::LT_INFO].button_name = "info_button"; - - log_types[Core::Log::LT_DEBUG].visible = true; - log_types[Core::Log::LT_DEBUG].class_name = "debug"; - log_types[Core::Log::LT_DEBUG].alert_contents = "?"; - log_types[Core::Log::LT_DEBUG].button_name = "debug_button"; -} - -ElementLog::~ElementLog() -{ -} - -// Initialises the log element. -bool ElementLog::Initialise() -{ - SetInnerRML(log_rml); - SetId("rkt-debug-log"); - - message_content = GetElementById("content"); - if (message_content) - { - message_content->AddEventListener("resize", this); - } - - Core::StyleSheet* style_sheet = Core::Factory::InstanceStyleSheetString(Core::String(common_rcss) + Core::String(log_rcss)); - if (style_sheet == NULL) - return false; - - SetStyleSheet(style_sheet); - style_sheet->RemoveReference(); - - // Create the log beacon. - beacon = GetContext()->CreateDocument(); - if (beacon == NULL) - return false; - - beacon->SetId("rkt-debug-log-beacon"); - beacon->SetProperty("visibility", "hidden"); - beacon->SetInnerRML(beacon_rml); - - // Remove the initial reference on the beacon. - beacon->RemoveReference(); - - Core::Element* button = beacon->GetFirstChild(); - if (button != NULL) - beacon->GetFirstChild()->AddEventListener("click", this); - - style_sheet = Core::Factory::InstanceStyleSheetString(Core::String(common_rcss) + Core::String(beacon_rcss)); - if (style_sheet == NULL) - { - GetContext()->UnloadDocument(beacon); - beacon = NULL; - - return false; - } - - beacon->SetStyleSheet(style_sheet); - style_sheet->RemoveReference(); - - return true; -} - -// Adds a log message to the debug log. -void ElementLog::AddLogMessage(Core::Log::Type type, const Core::String& message) -{ - // Add the message to the list of messages for the specified log type. - LogMessage log_message; - log_message.index = current_index++; - log_message.message = Core::String(message).Replace("<", "<").Replace(">", ">"); - log_types[type].log_messages.push_back(log_message); - if (log_types[type].log_messages.size() >= MAX_LOG_MESSAGES) - { - log_types[type].log_messages.pop_front(); - } - - // If this log type is invisible, and there is a button for this log type, then change its text from - // "Off" to "Off*" to signal that there are unread logs. - if (!log_types[type].visible) - { - if (!log_types[type].button_name.Empty()) - { - Rocket::Core::Element* button = GetElementById(log_types[type].button_name); - if (button) - { - button->SetInnerRML("Off*"); - } - } - } - // Trigger the beacon if we're hidden. Override any lower-level log type if it is already visible. - else - { - if (!IsVisible()) - { - if (beacon != NULL) - { - if (type < current_beacon_level) - { - beacon->SetProperty("visibility", "visible"); - - current_beacon_level = type; - Rocket::Core::Element* beacon_button = beacon->GetFirstChild(); - if (beacon_button) - { - beacon_button->SetClassNames(log_types[type].class_name); - beacon_button->SetInnerRML(log_types[type].alert_contents); - } - } - } - } - } - - // Force a refresh of the RML. - dirty_logs = true; -} - -void ElementLog::OnRender() -{ - Core::ElementDocument::OnRender(); - - if (dirty_logs) - { - // Set the log content: - Core::String messages; - if (message_content) - { - unsigned int log_pointers[Core::Log::LT_MAX]; - for (int i = 0; i < Core::Log::LT_MAX; i++) - log_pointers[i] = 0; - int next_type = FindNextEarliestLogType(log_pointers); - int num_messages = 0; - while (next_type != -1 && num_messages < MAX_LOG_MESSAGES) - { - messages.Append(Core::String(128, "
%s

", log_types[next_type].class_name.CString(), log_types[next_type].alert_contents.CString())); - messages.Append(log_types[next_type].log_messages[log_pointers[next_type]].message); - messages.Append("

"); - - log_pointers[next_type]++; - next_type = FindNextEarliestLogType(log_pointers); - num_messages++; - } - - if (message_content->HasChildNodes()) - { - float last_element_top = message_content->GetLastChild()->GetAbsoluteTop(); - auto_scroll = message_content->GetAbsoluteTop() + message_content->GetAbsoluteTop() > last_element_top; - } - else - auto_scroll = true; - - message_content->SetInnerRML(messages); - - dirty_logs = false; - } - } -} - -void ElementLog::ProcessEvent(Core::Event& event) -{ - Core::Element::ProcessEvent(event); - - // Only process events if we're visible - if (beacon != NULL) - { - if (event == "click") - { - if (event.GetTargetElement() == beacon->GetFirstChild()) - { - if (!IsVisible()) - SetProperty("visibility", "visible"); - - beacon->SetProperty("visibility", "hidden"); - current_beacon_level = Core::Log::LT_MAX; - } - else if (event.GetTargetElement()->GetId() == "close_button") - { - if (IsVisible()) - SetProperty("visibility", "hidden"); - } - else - { - for (int i = 0; i < Core::Log::LT_MAX; i++) - { - if (!log_types[i].button_name.Empty() && event.GetTargetElement()->GetId() == log_types[i].button_name) - { - log_types[i].visible = !log_types[i].visible; - if (log_types[i].visible) - event.GetTargetElement()->SetInnerRML("On"); - else - event.GetTargetElement()->SetInnerRML("Off"); - dirty_logs = true; - } - } - } - } - } - - if (event == "resize" && auto_scroll) - { - if (message_content != NULL && - message_content->HasChildNodes()) - message_content->GetLastChild()->ScrollIntoView(); - } -} - -int ElementLog::FindNextEarliestLogType(unsigned int log_pointers[Core::Log::LT_MAX]) -{ - int log_channel = -1; - unsigned int index = UINT_MAX; - - for (int i = 0; i < Core::Log::LT_MAX; i++) - { - if (log_types[i].visible) - { - if (log_pointers[i] < log_types[i].log_messages.size()) - { - if (log_types[i].log_messages[log_pointers[i]].index < index) - { - index = log_types[i].log_messages[log_pointers[i]].index; - log_channel = i; - } - } - } - } - - return log_channel; -} - -} -} diff --git a/libs/libRocket/Source/Debugger/ElementLog.h b/libs/libRocket/Source/Debugger/ElementLog.h deleted file mode 100644 index 40b18b292ae..00000000000 --- a/libs/libRocket/Source/Debugger/ElementLog.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERELEMENTLOG_H -#define ROCKETDEBUGGERELEMENTLOG_H - -#include "../../Include/Rocket/Core/ElementDocument.h" -#include "../../Include/Rocket/Core/EventListener.h" -#include - -namespace Rocket { -namespace Debugger { - -class SystemInterface; - -/** - @author Robert Curry - */ - -class ElementLog : public Core::ElementDocument, public Core::EventListener -{ -public: - ElementLog(const Core::String& tag); - virtual ~ElementLog(); - - /// Initialises the log element. - /// @return True if the element initialised successfully, false otherwise. - bool Initialise(); - - /// Adds a log message to the debug log. - void AddLogMessage(Core::Log::Type type, const Core::String& message); - -protected: - virtual void OnRender(); - virtual void ProcessEvent(Core::Event& event); - -private: - struct LogMessage - { - unsigned int index; - Core::String message; - }; - typedef std::deque< LogMessage > LogMessageList; - - struct LogType - { - bool visible; - Core::String class_name; - Core::String alert_contents; - Core::String button_name; - LogMessageList log_messages; - }; - LogType log_types[Core::Log::LT_MAX]; - - int FindNextEarliestLogType(unsigned int log_pointers[Core::Log::LT_MAX]); - - unsigned int current_index; - bool dirty_logs; - bool auto_scroll; - Core::Element* message_content; - Core::ElementDocument* beacon; - int current_beacon_level; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Debugger/FontSource.h b/libs/libRocket/Source/Debugger/FontSource.h deleted file mode 100644 index 2663dee2980..00000000000 --- a/libs/libRocket/Source/Debugger/FontSource.h +++ /dev/null @@ -1,7299 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERFONTSOURCE_H -#define ROCKETDEBUGGERFONTSOURCE_H - -static unsigned char lacuna_regular[] = -{ - 0x0, 0x1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x30, 0x0, 0x3, 0x0, 0xc0, 0x4f, 0x53, 0x2f, 0x32, - 0x83, 0x9c, 0x3f, 0xd3, 0x0, 0x0, 0xdd, 0x4, 0x0, 0x0, 0x0, 0x4e, 0x63, 0x6d, 0x61, 0x70, - 0x9, 0x13, 0x6b, 0x2e, 0x0, 0x0, 0xa5, 0x50, 0x0, 0x0, 0x4, 0x82, 0x63, 0x76, 0x74, 0x20, - 0xea, 0xa, 0x94, 0x47, 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x5, 0x8e, 0x66, 0x70, 0x67, 0x6d, - 0x83, 0x33, 0xc2, 0x4f, 0x0, 0x0, 0x3, 0xe8, 0x0, 0x0, 0x0, 0x14, 0x67, 0x6c, 0x79, 0x66, - 0x9c, 0x3b, 0xbc, 0x67, 0x0, 0x0, 0x9, 0xc8, 0x0, 0x0, 0x92, 0x7e, 0x68, 0x64, 0x6d, 0x78, - 0x9d, 0x59, 0x94, 0xcb, 0x0, 0x0, 0xce, 0x7c, 0x0, 0x0, 0xe, 0x88, 0x68, 0x65, 0x61, 0x64, - 0xd9, 0x44, 0x80, 0x2e, 0x0, 0x0, 0xdd, 0x54, 0x0, 0x0, 0x0, 0x36, 0x68, 0x68, 0x65, 0x61, - 0x9, 0x29, 0x3, 0xd5, 0x0, 0x0, 0xdd, 0x8c, 0x0, 0x0, 0x0, 0x24, 0x68, 0x6d, 0x74, 0x78, - 0xe6, 0x99, 0x37, 0xef, 0x0, 0x0, 0x9f, 0xd8, 0x0, 0x0, 0x3, 0x8c, 0x6b, 0x65, 0x72, 0x6e, - 0x89, 0x37, 0x8e, 0x7c, 0x0, 0x0, 0xa9, 0xd4, 0x0, 0x0, 0x24, 0xa8, 0x6c, 0x6f, 0x63, 0x61, - 0x0, 0x3d, 0xab, 0xc, 0x0, 0x0, 0x9c, 0x48, 0x0, 0x0, 0x3, 0x90, 0x6d, 0x61, 0x78, 0x70, - 0x1, 0x98, 0x1, 0xe7, 0x0, 0x0, 0xdd, 0xb0, 0x0, 0x0, 0x0, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x66, 0x13, 0x7, 0x42, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x2, 0xeb, 0x70, 0x6f, 0x73, 0x74, - 0x35, 0x67, 0x77, 0xf0, 0x0, 0x0, 0xa3, 0x64, 0x0, 0x0, 0x1, 0xec, 0x70, 0x72, 0x65, 0x70, - 0x85, 0xee, 0xfc, 0x36, 0x0, 0x0, 0x9, 0x8c, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, 0x15, - 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x1f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0xe, 0x0, 0x8e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x58, - 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x1c, 0x0, 0xaa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x50, 0x1, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x0, 0x1a, 0x1, 0xcf, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xe, 0x0, 0x5d, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x7, 0x0, 0x87, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x2c, 0x0, 0xc6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xe, - 0x0, 0x9c, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x28, 0x1, 0x4a, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0xd, 0x1, 0xc2, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, - 0x0, 0x0, 0x0, 0x3e, 0x0, 0x1f, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x1, 0x0, 0x1c, - 0x0, 0x6b, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x2, 0x0, 0xe, 0x0, 0x8e, 0x0, 0x3, - 0x0, 0x1, 0x4, 0x9, 0x0, 0x3, 0x0, 0x58, 0x0, 0xf2, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, - 0x0, 0x4, 0x0, 0x1c, 0x0, 0xaa, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x5, 0x0, 0x50, - 0x1, 0x72, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x6, 0x0, 0x1a, 0x1, 0xcf, 0x4c, 0x61, - 0x63, 0x75, 0x6e, 0x61, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x62, 0x79, 0x20, 0x50, - 0x65, 0x74, 0x65, 0x72, 0x20, 0x48, 0x6f, 0x66, 0x66, 0x6d, 0x61, 0x6e, 0x6e, 0x0, 0x4c, 0x0, - 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x20, 0x10, 0x0, 0x20, 0x0, - 0x32, 0x0, 0x30, 0x0, 0x30, 0x0, 0x31, 0x0, 0x20, 0x0, 0x62, 0x0, 0x79, 0x0, 0x20, 0x0, - 0x50, 0x0, 0x65, 0x0, 0x74, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, 0x0, 0x48, 0x0, 0x6f, 0x0, - 0x66, 0x0, 0x66, 0x0, 0x6d, 0x0, 0x61, 0x0, 0x6e, 0x0, 0x6e, 0x4c, 0x61, 0x63, 0x75, 0x6e, - 0x61, 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, - 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, 0x75, 0x0, - 0x6c, 0x0, 0x61, 0x0, 0x72, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x52, 0x0, 0x65, - 0x0, 0x67, 0x0, 0x75, 0x0, 0x6c, 0x0, 0x61, 0x0, 0x72, 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, - 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, 0x75, - 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, 0x75, 0x0, 0x6c, - 0x0, 0x61, 0x0, 0x72, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x46, - 0x6f, 0x6e, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x65, 0x72, 0x20, 0x34, 0x2e, 0x31, 0x2e, - 0x32, 0x20, 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, - 0x0, 0x4d, 0x0, 0x61, 0x0, 0x63, 0x0, 0x72, 0x0, 0x6f, 0x0, 0x6d, 0x0, 0x65, 0x0, 0x64, - 0x0, 0x69, 0x0, 0x61, 0x0, 0x20, 0x0, 0x46, 0x0, 0x6f, 0x0, 0x6e, 0x0, 0x74, 0x0, 0x6f, - 0x0, 0x67, 0x0, 0x72, 0x0, 0x61, 0x0, 0x70, 0x0, 0x68, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, - 0x0, 0x34, 0x0, 0x2e, 0x0, 0x31, 0x0, 0x2e, 0x0, 0x32, 0x0, 0x20, 0x0, 0x4c, 0x0, 0x61, - 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, - 0x0, 0x75, 0x0, 0x6c, 0x0, 0x61, 0x0, 0x72, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x65, 0x72, 0x20, - 0x34, 0x2e, 0x31, 0x2e, 0x32, 0x20, 0x31, 0x37, 0x2e, 0x30, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x33, - 0x0, 0x4d, 0x0, 0x61, 0x0, 0x63, 0x0, 0x72, 0x0, 0x6f, 0x0, 0x6d, 0x0, 0x65, 0x0, 0x64, - 0x0, 0x69, 0x0, 0x61, 0x0, 0x20, 0x0, 0x46, 0x0, 0x6f, 0x0, 0x6e, 0x0, 0x74, 0x0, 0x6f, - 0x0, 0x67, 0x0, 0x72, 0x0, 0x61, 0x0, 0x70, 0x0, 0x68, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, - 0x0, 0x34, 0x0, 0x2e, 0x0, 0x31, 0x0, 0x2e, 0x0, 0x32, 0x0, 0x20, 0x0, 0x31, 0x0, 0x37, - 0x0, 0x2e, 0x0, 0x30, 0x0, 0x32, 0x0, 0x2e, 0x0, 0x32, 0x0, 0x30, 0x0, 0x30, 0x0, 0x33, - 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x4c, 0x0, - 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, - 0x75, 0x0, 0x6c, 0x0, 0x61, 0x0, 0x72, 0x0, 0x40, 0x1, 0x0, 0x2c, 0x76, 0x45, 0x20, 0xb0, - 0x3, 0x25, 0x45, 0x23, 0x61, 0x68, 0x18, 0x23, 0x68, 0x60, 0x44, 0x2d, 0xfe, 0xe8, 0xff, 0xfb, - 0x2, 0x16, 0x3, 0x10, 0x3, 0x32, 0x0, 0x56, 0x0, 0x6b, 0x0, 0x44, 0x0, 0x4b, 0x4a, 0x73, - 0x9c, 0x46, 0xec, 0x9a, 0x3a, 0xfa, 0x67, 0xb4, 0x9, 0x25, 0xac, 0x8f, 0xe, 0xbf, 0x2e, 0x4f, - 0xd1, 0x8f, 0x42, 0xac, 0xd, 0x5e, 0xb8, 0xf3, 0x33, 0x6d, 0x93, 0x54, 0x9c, 0xe4, 0x44, 0x32, - 0xaa, 0x12, 0xd8, 0xfb, 0x6a, 0x9a, 0xe7, 0x7c, 0x22, 0x3a, 0x43, 0xac, 0xe8, 0xa, 0x30, 0x26, - 0x51, 0xd5, 0xe7, 0x77, 0x27, 0xa2, 0x69, 0xc3, 0x2, 0x72, 0x89, 0xe1, 0x77, 0xc9, 0xc4, 0x68, - 0xb7, 0x1f, 0x59, 0xbe, 0x86, 0x90, 0xe7, 0x22, 0xd7, 0x72, 0x26, 0x52, 0x2a, 0xeb, 0x8b, 0x5b, - 0xae, 0x2f, 0x55, 0xbd, 0xb6, 0x9, 0xd9, 0xef, 0x43, 0x82, 0xed, 0x32, 0x83, 0xca, 0x5b, 0xca, - 0x6a, 0xfb, 0xb8, 0xc8, 0xf4, 0x1d, 0xc7, 0x41, 0x2, 0xcf, 0x2d, 0xa2, 0xcb, 0x6, 0x33, 0x26, - 0x52, 0xb6, 0xf4, 0x16, 0xa5, 0x35, 0x21, 0xd5, 0xc7, 0x48, 0x57, 0xf4, 0xb7, 0xdd, 0xf7, 0x6f, - 0x60, 0xb5, 0x4e, 0x99, 0xfd, 0x70, 0x77, 0xe3, 0x3, 0xc3, 0xc9, 0x45, 0x7e, 0x27, 0xf4, 0x8d, - 0xd4, 0xb0, 0x56, 0x53, 0x2b, 0xff, 0xa4, 0x91, 0x16, 0x2c, 0x4, 0xda, 0x87, 0x47, 0x40, 0xf2, - 0xe2, 0x9d, 0x89, 0x7d, 0x48, 0x33, 0xfd, 0xbf, 0x6b, 0x5c, 0xe, 0x98, 0xf0, 0x9f, 0x9e, 0x6f, - 0x19, 0xfd, 0xb3, 0x66, 0x2b, 0x1c, 0x8b, 0xf4, 0xaf, 0x2d, 0xf, 0x1c, 0x76, 0x67, 0xb8, 0xb7, - 0xf9, 0xd3, 0x95, 0x79, 0xc, 0x5d, 0x9d, 0xe4, 0x51, 0x62, 0xf0, 0xe7, 0x89, 0xd7, 0x27, 0x79, - 0xd4, 0xea, 0x68, 0x84, 0xe2, 0x16, 0x9d, 0xa2, 0x3b, 0x2e, 0xed, 0x8e, 0xd1, 0x8f, 0x7e, 0x63, - 0x5e, 0x29, 0xf7, 0xaa, 0x60, 0x40, 0x3, 0x88, 0xb1, 0xad, 0x45, 0x48, 0xdb, 0xe4, 0x79, 0x6c, - 0xaf, 0x2d, 0xcb, 0xc2, 0x76, 0x79, 0x56, 0xc2, 0xf7, 0xb7, 0x94, 0x58, 0xa, 0x86, 0xbb, 0xb5, - 0x1c, 0x58, 0x7c, 0xee, 0xf, 0x6f, 0x8b, 0xa, 0x3e, 0xb5, 0xb3, 0x5e, 0x13, 0xcf, 0x32, 0x2f, - 0xfb, 0x4b, 0x94, 0xf1, 0xf, 0xd5, 0x83, 0x6c, 0x50, 0xfa, 0xf2, 0x6f, 0x8f, 0x4f, 0x26, 0xe1, - 0xdb, 0x92, 0x6e, 0x1c, 0xe1, 0xae, 0x9f, 0x3a, 0x3a, 0xa6, 0xeb, 0x26, 0xf3, 0x26, 0xc2, 0x17, - 0x10, 0x64, 0x6d, 0xb9, 0xbc, 0x9d, 0x9b, 0x93, 0x85, 0x46, 0x20, 0xa2, 0x8a, 0x82, 0xaa, 0x52, - 0x4d, 0xb2, 0xde, 0xd1, 0x89, 0x79, 0x3c, 0xec, 0xce, 0x88, 0xf, 0x71, 0x0, 0xb, 0xf9, 0xd1, - 0x26, 0x75, 0x54, 0x1c, 0xee, 0xbf, 0x7b, 0x1f, 0xa6, 0x19, 0xc7, 0xcb, 0x6c, 0x29, 0xac, 0xc, - 0xc0, 0xe7, 0x6c, 0x96, 0xdf, 0x3d, 0xb8, 0xc8, 0x2b, 0x53, 0xc1, 0xb3, 0x0, 0xfd, 0x24, 0x75, - 0xd3, 0x16, 0x46, 0xe2, 0xa9, 0x53, 0xc5, 0x3a, 0x61, 0xdd, 0xaa, 0x2f, 0x9a, 0x7f, 0xea, 0x5f, - 0x68, 0xe6, 0x4d, 0x48, 0xe8, 0x1c, 0x97, 0xae, 0x78, 0x6, 0x17, 0xf0, 0x81, 0x91, 0x2f, 0x7, - 0xc1, 0xd7, 0x1d, 0xd7, 0x2c, 0xe6, 0x7b, 0x3b, 0xb6, 0x8, 0x89, 0x4e, 0xcc, 0xc0, 0x6f, 0xb1, - 0x15, 0x73, 0xf5, 0xd3, 0x94, 0xa3, 0x36, 0x63, 0xeb, 0x0, 0x63, 0xaa, 0x1, 0x5f, 0x99, 0xf9, - 0x7a, 0x20, 0x35, 0x58, 0xae, 0xa6, 0x10, 0x86, 0x23, 0x4f, 0xb5, 0xee, 0x4d, 0xd0, 0x8b, 0x56, - 0xbc, 0x38, 0x36, 0xfe, 0x96, 0xbf, 0xbb, 0x56, 0x37, 0xc9, 0xe8, 0x66, 0x7b, 0xc, 0x16, 0x83, - 0x8d, 0x3e, 0x3f, 0xae, 0xe0, 0xb, 0xae, 0x3c, 0x5a, 0xab, 0xc0, 0x4e, 0x3c, 0xb0, 0x1, 0xdc, - 0xeb, 0x68, 0x8a, 0xb0, 0x7e, 0x80, 0x4e, 0xd0, 0x8f, 0x72, 0xb6, 0x52, 0x18, 0xf7, 0xec, 0x92, - 0x7f, 0x7c, 0x37, 0x13, 0xa1, 0x8d, 0x43, 0x30, 0xf5, 0xdc, 0xa, 0x20, 0x3b, 0x11, 0xf, 0x62, - 0x5a, 0xb7, 0x95, 0x97, 0xf0, 0x99, 0x9a, 0x48, 0x39, 0xa8, 0xe1, 0x9c, 0x83, 0x6c, 0x22, 0xac, - 0xf7, 0xcf, 0x90, 0x63, 0x15, 0x16, 0xa5, 0x8e, 0x66, 0x6b, 0x29, 0x1, 0xd2, 0xdf, 0x3d, 0x4f, - 0x4f, 0x6, 0xd9, 0xb9, 0x52, 0x19, 0xbf, 0x1f, 0xd0, 0xf1, 0x5b, 0x37, 0x83, 0x6, 0xaf, 0xe1, - 0x5b, 0x90, 0xf7, 0x3f, 0x96, 0xd3, 0x35, 0x68, 0xa4, 0x1e, 0x55, 0xfe, 0xbc, 0xb0, 0xd0, 0x38, - 0x47, 0xa3, 0xfd, 0x19, 0xdd, 0x1c, 0x71, 0xf7, 0xfe, 0x66, 0xde, 0x5a, 0x2e, 0xaa, 0x7e, 0xea, - 0x1c, 0x93, 0xc1, 0x33, 0x64, 0xc7, 0x2, 0x55, 0xec, 0xd1, 0x83, 0x87, 0x3a, 0x2a, 0xa3, 0xda, - 0x4a, 0x22, 0x92, 0x22, 0xa3, 0x13, 0xf7, 0x60, 0xc2, 0xb5, 0x1d, 0x99, 0x78, 0x97, 0xe2, 0x4a, - 0x81, 0xae, 0x69, 0x9e, 0xb, 0x6e, 0xaa, 0xae, 0x7f, 0xcd, 0xe8, 0x7d, 0x9d, 0x10, 0x2d, 0x8c, - 0xee, 0x75, 0xa1, 0x7, 0x5a, 0xdd, 0x85, 0x71, 0xb7, 0x18, 0x41, 0xbb, 0xda, 0x1b, 0x7, 0x1d, - 0x28, 0xcf, 0xc3, 0x35, 0xb, 0x8, 0x27, 0xe3, 0xc3, 0x92, 0x7c, 0x3b, 0xf, 0xb7, 0x9d, 0x58, - 0x39, 0xc3, 0xb0, 0x65, 0x14, 0x5c, 0x1a, 0xf1, 0xd7, 0x64, 0x74, 0x13, 0x40, 0xfb, 0xf5, 0x97, - 0x9f, 0x13, 0x3e, 0xfb, 0x21, 0xdb, 0xe1, 0x74, 0x95, 0xf3, 0x24, 0x6a, 0xaf, 0x4, 0x5b, 0xf4, - 0x8b, 0xb7, 0xe5, 0x17, 0xc7, 0x67, 0x17, 0xb7, 0x6c, 0x97, 0xf6, 0xb2, 0x84, 0x55, 0xd, 0xcb, - 0xb7, 0x77, 0x17, 0x15, 0x2e, 0xf9, 0x80, 0x9c, 0x55, 0x3b, 0xe7, 0xe3, 0x4f, 0x8c, 0x36, 0x34, - 0xdb, 0xd9, 0x4a, 0x77, 0x92, 0x87, 0xa3, 0xb6, 0xf7, 0x8b, 0xc2, 0xd8, 0x1c, 0x3e, 0x7b, 0x70, - 0xe2, 0xe1, 0x81, 0xc3, 0x6a, 0x63, 0xb, 0xf3, 0xaa, 0xd3, 0x7e, 0x70, 0xe8, 0x1a, 0x9d, 0x8f, - 0x2e, 0x29, 0xee, 0x90, 0xa1, 0xa8, 0x59, 0x76, 0x85, 0xd6, 0xb7, 0xbf, 0x4e, 0x5e, 0xda, 0x80, - 0x7, 0x86, 0x27, 0x68, 0xc3, 0x4e, 0xb, 0xef, 0x27, 0x86, 0xcc, 0x39, 0x7f, 0xd4, 0xe1, 0x4a, - 0x8d, 0xd1, 0x2c, 0xa5, 0xdc, 0x65, 0x7, 0x2b, 0x28, 0xc7, 0xde, 0x44, 0x45, 0xb0, 0xa5, 0x85, - 0xca, 0x6c, 0x66, 0xf, 0xa6, 0x2e, 0x87, 0xf3, 0xa8, 0x83, 0x4e, 0x11, 0xd9, 0xb2, 0x72, 0x48, - 0xa2, 0x98, 0xe1, 0xf1, 0xc6, 0x33, 0x36, 0x3, 0x6, 0x58, 0x46, 0xfa, 0xe2, 0x71, 0x85, 0x12, - 0x3b, 0xb9, 0xa0, 0x61, 0x4a, 0x18, 0xaa, 0x8a, 0xce, 0x5e, 0x75, 0xec, 0x56, 0x58, 0xf9, 0x3e, - 0x63, 0xd3, 0xd, 0x45, 0xa3, 0x99, 0x3b, 0x99, 0xa, 0xa8, 0x58, 0xf9, 0x95, 0xce, 0xe7, 0x10, - 0x22, 0x1e, 0x4d, 0xf3, 0xeb, 0x31, 0xd3, 0x15, 0x72, 0xe5, 0x14, 0x25, 0x85, 0x46, 0x41, 0xe4, - 0xe4, 0x99, 0x77, 0x7, 0x57, 0xe2, 0xd8, 0x9e, 0x80, 0x64, 0x6e, 0xc8, 0x1c, 0x81, 0x97, 0x30, - 0x23, 0x92, 0xee, 0x94, 0x9e, 0x76, 0x14, 0xbc, 0xf4, 0x8d, 0x87, 0x7e, 0x22, 0xe1, 0xda, 0x84, - 0x50, 0x14, 0xf9, 0xf5, 0x67, 0x6b, 0x47, 0x56, 0xc9, 0xf7, 0xa2, 0x6e, 0x29, 0x15, 0x97, 0xf5, - 0xa4, 0x9a, 0x5b, 0x1d, 0xe9, 0xb4, 0x69, 0x2e, 0x1, 0x8e, 0xc1, 0x8d, 0x3b, 0x31, 0xa, 0x8, - 0x55, 0x5c, 0x85, 0xe5, 0xa8, 0x8c, 0x54, 0x3c, 0xff, 0xe0, 0xb8, 0x92, 0x26, 0x22, 0xc0, 0xab, - 0x72, 0x58, 0x58, 0xbe, 0xe4, 0xdb, 0x96, 0x4a, 0x3f, 0xe2, 0xda, 0x9e, 0x5, 0x3c, 0x3c, 0xe0, - 0xe4, 0x95, 0x63, 0x34, 0xfd, 0xd7, 0x22, 0x5b, 0x4b, 0x0, 0xe0, 0xa9, 0xf7, 0x35, 0xc6, 0x4, - 0x1c, 0x55, 0x69, 0xaa, 0xa0, 0xec, 0xe7, 0xa2, 0x89, 0x57, 0x2c, 0x9d, 0x8e, 0xb1, 0xae, 0x41, - 0x51, 0x81, 0xc2, 0xa2, 0x8d, 0x48, 0x38, 0xfd, 0xb2, 0x9b, 0x13, 0x46, 0x1c, 0xfa, 0xc5, 0xc0, - 0x2a, 0x64, 0x58, 0xed, 0xea, 0x8c, 0x67, 0x6e, 0xa2, 0x28, 0xc3, 0xda, 0x68, 0x18, 0xb0, 0x1d, - 0xdc, 0xf4, 0x69, 0x67, 0xc3, 0x2, 0x84, 0xb9, 0x27, 0x20, 0xc5, 0x82, 0xc, 0x8c, 0x20, 0x64, - 0xd7, 0xe7, 0x42, 0xdd, 0xad, 0x60, 0xc1, 0xb, 0x6d, 0xaa, 0xae, 0xcd, 0x8f, 0x4e, 0xa0, 0x20, - 0x47, 0xb2, 0xd1, 0x55, 0x49, 0xed, 0xaa, 0x25, 0xe9, 0x1c, 0xcd, 0x6c, 0x3d, 0xa0, 0xd, 0xfb, - 0x4d, 0x9f, 0xeb, 0x2c, 0x9a, 0xb5, 0x33, 0x5c, 0xaf, 0xbe, 0x4d, 0xc7, 0xb2, 0x67, 0xd7, 0xf3, - 0x72, 0x89, 0x5d, 0x25, 0xf2, 0xd3, 0x6b, 0x76, 0x12, 0xe6, 0xba, 0xf6, 0x42, 0xf6, 0x73, 0xc7, - 0x44, 0x12, 0x94, 0x6e, 0xe2, 0xae, 0x2f, 0xe0, 0x4e, 0x91, 0xf4, 0x53, 0xd6, 0xf3, 0x77, 0x83, - 0x19, 0x43, 0x8a, 0xe0, 0x44, 0x8a, 0xe0, 0x3f, 0x7a, 0xd9, 0x5b, 0x0, 0xd4, 0x38, 0x8d, 0x86, - 0x71, 0xa6, 0x0, 0x2f, 0x92, 0xce, 0x2f, 0x30, 0xea, 0x76, 0x9b, 0x18, 0x17, 0xde, 0xf8, 0x53, - 0x97, 0x9, 0x1e, 0xe0, 0xb2, 0x9f, 0x54, 0x2a, 0xf6, 0xb5, 0x75, 0x15, 0x5c, 0x1b, 0xf1, 0xd7, - 0x67, 0x74, 0x12, 0x40, 0xfc, 0x1d, 0xcf, 0x6d, 0x1f, 0xbf, 0x7f, 0x60, 0xef, 0xf1, 0x94, 0x6b, - 0x3b, 0x1d, 0xb7, 0x92, 0x18, 0x36, 0x21, 0x96, 0x97, 0xb3, 0x74, 0x52, 0xfc, 0x84, 0xbe, 0xb6, - 0x5e, 0x52, 0xc5, 0xf4, 0x6, 0x8, 0x37, 0x39, 0x7, 0xc, 0x57, 0x5c, 0xa1, 0x80, 0xe8, 0x8e, - 0x92, 0x63, 0x31, 0x41, 0x99, 0xe5, 0xbb, 0x75, 0x5a, 0x55, 0xcf, 0xf6, 0x87, 0x94, 0x2d, 0x9, - 0xbd, 0xb7, 0x1e, 0x12, 0x11, 0x2e, 0xca, 0xf4, 0x35, 0x58, 0x47, 0x31, 0xd1, 0xa0, 0x6a, 0x2, - 0xb7, 0x4, 0xd8, 0xe6, 0x52, 0xcc, 0xbb, 0x7c, 0xda, 0x1f, 0x69, 0xb1, 0xf3, 0x6d, 0xa1, 0x8, - 0x22, 0xa7, 0xc1, 0x26, 0x6b, 0x88, 0xae, 0x86, 0xde, 0x62, 0x49, 0xe9, 0xec, 0xd7, 0xcf, 0x6b, - 0x6e, 0x10, 0x5, 0xb8, 0x87, 0x64, 0x6a, 0x44, 0x46, 0xb4, 0x96, 0x85, 0xf6, 0x87, 0x8e, 0x67, - 0x20, 0x2, 0xb4, 0xa9, 0x47, 0x11, 0xef, 0x3e, 0x89, 0xa6, 0x3b, 0x47, 0xad, 0xe9, 0x31, 0xf5, - 0x7d, 0x94, 0x1d, 0x23, 0x8f, 0xaa, 0x70, 0x1, 0x50, 0x6b, 0xa0, 0xbb, 0xf1, 0x9b, 0x93, 0xa2, - 0x74, 0x4, 0x11, 0xd0, 0xbf, 0x6a, 0x1f, 0xc2, 0x30, 0xb4, 0xa9, 0x55, 0x54, 0xcb, 0xf9, 0x13, - 0x5, 0x13, 0x4d, 0x72, 0x3d, 0x4, 0xc4, 0xc4, 0x43, 0x76, 0xca, 0x1f, 0x60, 0xac, 0x59, 0x26, - 0xf6, 0xe6, 0x71, 0x89, 0xf7, 0x7b, 0x0, 0xc, 0x2, 0xbe, 0x0, 0x0, 0x40, 0xb, 0x4, 0x4, - 0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x0, 0x0, 0x1, 0x8d, 0xb8, 0x1, 0xff, 0x85, 0x45, 0x68, - 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0xb3, 0x6, 0x5, - 0x46, 0x0, 0x2b, 0xb3, 0x8, 0x7, 0x46, 0x0, 0x2b, 0xb1, 0x5, 0x5, 0x45, 0x68, 0x44, 0xb1, - 0x7, 0x7, 0x45, 0x68, 0x44, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x3f, 0x0, 0x0, 0x1, 0xb6, - 0x3, 0x20, 0x0, 0x3, 0x0, 0x7, 0x0, 0x56, 0x40, 0x20, 0x1, 0x8, 0x8, 0x40, 0x9, 0x2, - 0x7, 0x4, 0x5, 0x1, 0x0, 0x6, 0x5, 0x5, 0x3, 0x2, 0x5, 0x4, 0x7, 0x0, 0x7, 0x6, - 0x7, 0x1, 0x2, 0x1, 0x3, 0x0, 0x1, 0x1, 0x0, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x0, 0x0, 0x8, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x33, 0x11, - 0x21, 0x11, 0x25, 0x33, 0x11, 0x23, 0x3f, 0x1, 0x77, 0xfe, 0xc7, 0xfa, 0xfa, 0x3, 0x20, 0xfc, - 0xe0, 0x3f, 0x2, 0xa3, 0x0, 0x2, 0x0, 0x73, 0xff, 0xf2, 0x0, 0xf4, 0x3, 0xc, 0x0, 0x3, - 0x0, 0xf, 0x0, 0x45, 0x40, 0x16, 0x1, 0x10, 0x10, 0x40, 0x11, 0x4, 0x2, 0x1, 0xa, 0x4, - 0x3, 0x0, 0xd, 0x8, 0x7, 0x7, 0x3, 0x0, 0x3, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x3, 0x23, 0x3, 0x13, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xe2, 0xe, 0x44, 0xe, 0x72, 0x26, 0x1a, - 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x3, 0xc, 0xfd, 0xc8, 0x2, 0x38, 0xfd, 0x27, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, 0x0, 0x2, 0x0, 0x5, 0x2, 0x53, 0x1, 0x1f, 0x3, 0x32, - 0x0, 0x3, 0x0, 0x7, 0x0, 0x46, 0x40, 0x18, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x4, - 0x3, 0x0, 0x6, 0x5, 0x2, 0x3, 0x1, 0x7, 0x4, 0x3, 0x3, 0x0, 0x4, 0x1, 0x7, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x27, - 0x23, 0x7, 0x23, 0x27, 0x1, 0x1f, 0x16, 0x33, 0x13, 0x62, 0x16, 0x33, 0x13, 0x3, 0x32, 0xdf, - 0xdf, 0xdf, 0xdf, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x0, 0x0, 0x2, 0x83, 0x3, 0x56, 0x0, 0x1b, - 0x0, 0x1f, 0x0, 0x90, 0x40, 0x46, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1e, 0x1c, 0x1b, 0x1a, - 0x19, 0x16, 0x15, 0x12, 0x11, 0x10, 0xe, 0xd, 0xc, 0xb, 0x8, 0x7, 0x4, 0x3, 0x2, 0x0, - 0x1d, 0x1c, 0x11, 0x10, 0x1, 0x5, 0x0, 0x7, 0x1b, 0x1a, 0x17, 0x16, 0x13, 0x5, 0x12, 0x1f, - 0x1e, 0xf, 0xe, 0x3, 0x5, 0x2, 0x7, 0xd, 0xc, 0x9, 0x8, 0x5, 0x5, 0x4, 0x19, 0x18, - 0x15, 0x3, 0x14, 0xb, 0xa, 0x7, 0x3, 0x6, 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, 0x3c, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0xd, 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x7, 0x33, 0x15, 0x23, 0x3, 0x23, 0x13, 0x23, 0x3, 0x23, - 0x13, 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x33, 0x13, 0x33, 0x3, 0x33, 0x13, 0x33, 0x3, 0x33, - 0x7, 0x23, 0x7, 0x33, 0x2, 0x83, 0x6f, 0x14, 0x68, 0x71, 0x29, 0x45, 0x29, 0xcd, 0x29, 0x45, - 0x29, 0x65, 0x6e, 0x14, 0x68, 0x71, 0x29, 0x45, 0x29, 0xcd, 0x29, 0x45, 0x29, 0x66, 0xb4, 0xcd, - 0x14, 0xcd, 0x1, 0xf0, 0x8b, 0x40, 0xfe, 0xdb, 0x1, 0x25, 0xfe, 0xdb, 0x1, 0x25, 0x40, 0x8b, - 0x40, 0x1, 0x26, 0xfe, 0xda, 0x1, 0x26, 0xfe, 0xda, 0x40, 0x8b, 0x0, 0x0, 0x1, 0x0, 0x3c, - 0xff, 0x89, 0x2, 0x2b, 0x3, 0x8a, 0x0, 0x2e, 0x0, 0x59, 0x40, 0x1f, 0x1, 0x2f, 0x2f, 0x40, - 0x30, 0x0, 0x24, 0x22, 0xe, 0xa, 0x28, 0x21, 0x1f, 0x1e, 0x1d, 0x1c, 0x18, 0x12, 0x9, 0x7, - 0x6, 0x5, 0x4, 0x0, 0x1e, 0x1d, 0x6, 0x5, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, - 0x0, 0x2f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2f, 0xff, - 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, 0x27, 0x37, 0x16, 0x17, - 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, - 0x35, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x1e, 0x1, - 0x17, 0x16, 0x2, 0x2b, 0x41, 0x37, 0x56, 0x44, 0x77, 0x66, 0x2b, 0x25, 0x36, 0x3c, 0x36, 0x41, - 0x28, 0x34, 0x43, 0x1f, 0x5a, 0xcf, 0x3b, 0x37, 0x58, 0x43, 0x63, 0x61, 0x23, 0x5b, 0x55, 0x3e, - 0x2d, 0x38, 0x3e, 0x17, 0xc5, 0x2b, 0x45, 0xbc, 0x58, 0x34, 0x2b, 0xb, 0x71, 0x70, 0x7, 0x45, - 0x41, 0x1c, 0x13, 0x15, 0x18, 0x1f, 0x42, 0x3c, 0x35, 0x18, 0x30, 0x6e, 0x77, 0x4c, 0x32, 0x2f, - 0xb, 0x79, 0x77, 0x5, 0x3c, 0x44, 0x3a, 0x18, 0x1d, 0x38, 0x33, 0x2f, 0x11, 0x6d, 0x29, 0x43, - 0x0, 0x5, 0x0, 0x3b, 0xff, 0xec, 0x3, 0x59, 0x3, 0x4e, 0x0, 0xb, 0x0, 0xf, 0x0, 0x1b, - 0x0, 0x27, 0x0, 0x33, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x34, 0x34, 0x40, 0x35, 0x10, 0x2b, 0x19, - 0x2e, 0x28, 0x22, 0x1c, 0x16, 0x10, 0xe, 0xc, 0x6, 0x0, 0x3, 0x7, 0x25, 0x31, 0x7, 0x13, - 0x1f, 0x7, 0x9, 0xf, 0xc, 0xe, 0xd, 0x13, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x2f, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x6, 0x0, 0x34, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x34, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x25, 0x1, 0x23, 0x1, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x26, - 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0xa4, 0x69, 0x4c, 0x4b, 0x69, 0x69, - 0x4b, 0x4c, 0x69, 0x1, 0x4a, 0xfd, 0xfb, 0x4f, 0x2, 0x5, 0xba, 0x69, 0x4c, 0x4b, 0x69, 0x69, - 0x4b, 0x4c, 0x69, 0xfe, 0x8, 0x41, 0x31, 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0x1, 0xb5, 0x41, - 0x31, 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0x2, 0x98, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, - 0x6a, 0xfc, 0x9e, 0x3, 0x62, 0xfd, 0x63, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, 0x1, 0x9b, - 0x32, 0x3e, 0x3f, 0x31, 0x31, 0x3f, 0x3e, 0xfe, 0x4b, 0x32, 0x3f, 0x3f, 0x32, 0x31, 0x3f, 0x3e, - 0x0, 0x2, 0x0, 0x3b, 0xff, 0xf8, 0x2, 0x5d, 0x3, 0x12, 0x0, 0x22, 0x0, 0x2a, 0x0, 0x5a, - 0x40, 0x21, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x0, 0x29, 0x24, 0x20, 0x1f, 0x19, 0x17, 0x2, 0x26, - 0x23, 0x22, 0x21, 0x1c, 0x16, 0x11, 0xd, 0x9, 0x0, 0x14, 0x3, 0x6, 0x1, 0x1, 0x0, 0x1, - 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x6, 0x7, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x32, - 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x13, 0x37, 0x17, 0x7, 0x2f, 0x1, 0x6, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x2, 0x5d, 0x5c, 0x35, 0x32, 0x13, 0x36, 0x43, 0x5b, 0x78, 0x32, - 0x18, 0x4a, 0x34, 0xc, 0x1d, 0x6b, 0x4a, 0x59, 0x3d, 0x30, 0x2e, 0x39, 0x2b, 0x38, 0x54, 0xc6, - 0x41, 0x2b, 0x45, 0x60, 0xab, 0x6e, 0x4d, 0x36, 0x4b, 0x4d, 0x2b, 0xb, 0x1f, 0x71, 0x5f, 0x4b, - 0x40, 0x1e, 0x3e, 0x49, 0x15, 0x34, 0x30, 0x41, 0x5f, 0x1, 0x3f, 0x2e, 0x2e, 0x36, 0x29, 0x30, - 0x76, 0xfe, 0xe8, 0x40, 0x34, 0x43, 0x6, 0xef, 0x4e, 0x5e, 0x3f, 0x4e, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x53, 0x0, 0x97, 0x3, 0x32, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x3, 0x0, 0x2, 0x1, 0x3, 0x0, 0x4, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x3, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, - 0xff, 0xc0, 0x38, 0x59, 0x13, 0x7, 0x23, 0x27, 0x97, 0x16, 0x33, 0x13, 0x3, 0x32, 0xdf, 0xdf, - 0x0, 0x1, 0x0, 0x3b, 0xff, 0x23, 0x1, 0xb, 0x3, 0x47, 0x0, 0x9, 0x0, 0x39, 0x40, 0xf, - 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x8, 0x6, 0x3, 0x0, 0x5, 0x1, 0x1, 0x3, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x3, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x7, 0x26, 0x11, 0x10, 0x37, 0x17, 0x6, 0x15, - 0x14, 0x1, 0xb, 0x41, 0x8f, 0x8f, 0x3f, 0x7b, 0xba, 0x23, 0xfa, 0x1, 0x18, 0x1, 0x19, 0xf9, - 0x25, 0xf2, 0xfb, 0xfb, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x23, 0x1, 0xb, 0x3, 0x47, 0x0, 0x9, - 0x0, 0x39, 0x40, 0xf, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x7, 0x5, 0x3, 0x0, 0x8, 0x2, - 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x10, 0x7, 0x27, 0x36, - 0x35, 0x34, 0x27, 0x37, 0x16, 0x1, 0xb, 0x8f, 0x41, 0x7c, 0x7a, 0x3f, 0x8f, 0x1, 0x35, 0xfe, - 0xe8, 0xfa, 0x23, 0xf4, 0xfb, 0xfb, 0xf2, 0x25, 0xf9, 0x0, 0x0, 0x1, 0x0, 0x5f, 0x1, 0xc3, - 0x1, 0xb8, 0x3, 0x31, 0x0, 0x11, 0x0, 0x52, 0x40, 0x1c, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, - 0x11, 0x10, 0xd, 0xc, 0x8, 0x7, 0x4, 0x3, 0xb, 0xa, 0x9, 0x2, 0x1, 0x0, 0x6, 0x5, - 0xf, 0xe, 0x4, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x17, 0x7, 0x27, 0x7, - 0x23, 0x27, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x33, 0x17, 0x37, 0x1, 0xb8, 0x70, 0x6f, - 0x1b, 0x72, 0x3, 0x37, 0x3, 0x73, 0x1a, 0x6e, 0x6f, 0x1b, 0x73, 0x3, 0x37, 0x3, 0x73, 0x2, - 0xbe, 0x44, 0x44, 0x2f, 0x3e, 0x82, 0x82, 0x3d, 0x2d, 0x45, 0x44, 0x2f, 0x3e, 0x82, 0x82, 0x3e, - 0x0, 0x1, 0x0, 0x3b, 0x0, 0x5c, 0x1, 0xad, 0x1, 0xce, 0x0, 0xb, 0x0, 0x5e, 0x40, 0x24, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x1, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x5, 0x4, 0x1, 0x3, 0x0, 0x9, 0x8, 0x3, - 0x2, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x15, 0x23, - 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x1, 0xad, 0x99, 0x40, 0x99, 0x99, 0x40, 0x99, - 0xf5, 0x99, 0x99, 0x40, 0x99, 0x99, 0x0, 0x1, 0x0, 0x5f, 0xff, 0x8e, 0x0, 0xe0, 0x0, 0x76, - 0x0, 0xf, 0x0, 0x39, 0x40, 0xf, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xa, 0x6, 0x3, 0x0, - 0xd, 0x2, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x14, 0x7, - 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xe0, 0x4e, 0x18, - 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, 0x26, 0x31, 0x51, 0x52, 0x14, 0xa, 0x36, 0x10, 0xc, - 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x0, 0x1, 0x0, 0x3b, 0x0, 0xf5, 0x1, 0xb, 0x1, 0x35, - 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, - 0x59, 0x25, 0x23, 0x35, 0x33, 0x1, 0xb, 0xd0, 0xd0, 0xf5, 0x40, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0xff, 0xf2, 0x0, 0xbc, 0x0, 0x73, 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, - 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x37, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x33, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, 0x1, 0x0, 0x3b, - 0x0, 0x0, 0x1, 0x9d, 0x3, 0x56, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, - 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x23, 0x1, 0x1, 0x9d, 0xfe, 0xed, 0x4f, 0x1, 0x13, 0x3, - 0x56, 0xfc, 0xaa, 0x3, 0x56, 0x0, 0x0, 0x2, 0x0, 0x50, 0xff, 0xf2, 0x2, 0x4d, 0x2, 0x40, - 0x0, 0xf, 0x0, 0x1f, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1c, 0x14, - 0x18, 0x10, 0x8, 0x0, 0xc, 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, - 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x2, 0x4d, 0x54, 0x46, 0x65, 0x65, 0x45, 0x54, 0x54, 0x46, 0x64, 0x65, 0x46, - 0x54, 0x56, 0x1f, 0x2b, 0x5f, 0x5f, 0x2b, 0x1e, 0x1e, 0x2b, 0x5f, 0x5f, 0x2b, 0x1f, 0x1, 0x19, - 0x96, 0x50, 0x41, 0x41, 0x4f, 0x97, 0x96, 0x50, 0x41, 0x41, 0x4f, 0x97, 0x57, 0x39, 0x50, 0x50, - 0x39, 0x57, 0x57, 0x39, 0x50, 0x50, 0x39, 0x0, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x1, 0xb1, - 0x2, 0x3a, 0x0, 0xa, 0x0, 0x52, 0x40, 0x1c, 0x1, 0xb, 0xb, 0x40, 0xc, 0x0, 0xa, 0x9, - 0x5, 0x4, 0x3, 0x2, 0xa, 0x9, 0x8, 0x6, 0x3, 0x2, 0x1, 0x0, 0x8, 0x7, 0x1, 0x0, - 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xb, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0xb, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x35, 0x33, 0x3, 0x7, 0x27, 0x37, - 0x33, 0x11, 0x33, 0x1, 0xb1, 0xfe, 0xab, 0x88, 0x1, 0x7d, 0x16, 0x9b, 0x4d, 0x79, 0x48, 0x1, - 0x9b, 0x30, 0x3e, 0x49, 0xfe, 0xe, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x1, 0xf8, 0x2, 0x41, - 0x0, 0x18, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x19, 0x19, 0x40, 0x1a, 0x0, 0x18, 0x17, 0xb, 0x18, - 0x17, 0x14, 0xc, 0x7, 0x2, 0x1, 0x0, 0x9, 0x7, 0x10, 0x10, 0x1, 0x0, 0x1, 0x1, 0x1, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, - 0x0, 0x19, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x19, 0xff, - 0xc0, 0x38, 0x59, 0x29, 0x1, 0x35, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, - 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0xf, 0x1, 0x21, 0x1, 0xf8, 0xfe, 0x58, - 0xd2, 0x41, 0xc, 0x28, 0x7b, 0x54, 0x43, 0x32, 0x1e, 0x2f, 0x3d, 0x43, 0x63, 0x36, 0x33, 0x89, - 0xa2, 0x1, 0x37, 0x4e, 0xa1, 0x32, 0xc, 0x2b, 0x34, 0x6e, 0x4e, 0x31, 0x26, 0x1b, 0x23, 0x35, - 0x31, 0x51, 0x65, 0x65, 0x78, 0x0, 0x0, 0x1, 0x0, 0x50, 0xff, 0x1d, 0x2, 0x4, 0x2, 0x41, - 0x0, 0x2d, 0x0, 0x56, 0x40, 0x1e, 0x1, 0x2e, 0x2e, 0x40, 0x2f, 0x0, 0x1d, 0x12, 0x11, 0x10, - 0xf, 0x8, 0x6, 0x2a, 0x26, 0x1e, 0x16, 0x11, 0x10, 0xc, 0x5, 0x0, 0x19, 0x7, 0x22, 0x22, - 0x3, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x2e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2e, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x27, - 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x1, 0x35, 0x33, 0x32, 0x37, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x14, 0x7, 0x6, 0x7, 0x16, 0x17, 0x16, 0x2, 0x4, 0x7a, 0x63, 0x86, 0x51, 0x35, 0x45, - 0x56, 0x3a, 0x28, 0x2c, 0x52, 0x45, 0x33, 0x33, 0x49, 0x27, 0x22, 0x4a, 0x38, 0x2b, 0x2a, 0x25, - 0x13, 0x35, 0x1b, 0x2b, 0x3b, 0x40, 0x60, 0x3d, 0x3a, 0x22, 0x20, 0x2f, 0x2f, 0x22, 0x27, 0x3, - 0x64, 0x82, 0x67, 0x35, 0x55, 0x25, 0x29, 0x47, 0x4a, 0x5c, 0x4d, 0x2c, 0x27, 0x3e, 0x38, 0x45, - 0x17, 0x14, 0x1a, 0x2f, 0x21, 0x19, 0x23, 0x38, 0x36, 0x4f, 0x43, 0x37, 0x33, 0x12, 0xf, 0x32, - 0x38, 0x0, 0x0, 0x1, 0x0, 0x50, 0xff, 0x18, 0x2, 0x32, 0x2, 0x32, 0x0, 0xe, 0x0, 0x69, - 0x40, 0x2a, 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0xc, 0xb, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, - 0x8, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xe, 0xd, 0xa, 0x3, 0x9, 0x8, 0x0, 0x8, - 0x7, 0x3, 0x2, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x15, 0x23, 0x37, 0x21, 0x35, - 0x1, 0x33, 0x3, 0x33, 0x35, 0x33, 0x15, 0x33, 0x2, 0x32, 0x5d, 0x55, 0x1, 0xfe, 0xcf, 0x1, - 0x1, 0x58, 0xef, 0xc7, 0x54, 0x5d, 0xe8, 0xe8, 0x32, 0x2, 0x0, 0xfe, 0x17, 0xed, 0xed, 0x0, - 0x0, 0x1, 0x0, 0x50, 0xff, 0x1d, 0x1, 0xed, 0x2, 0x34, 0x0, 0x1e, 0x0, 0x59, 0x40, 0x20, - 0x1, 0x1f, 0x1f, 0x40, 0x20, 0x0, 0x19, 0x14, 0x13, 0xb, 0x7, 0x19, 0x18, 0x17, 0x16, 0x14, - 0xf, 0x6, 0x0, 0x18, 0x17, 0x8, 0x15, 0x11, 0x8, 0x1b, 0x16, 0x15, 0x4, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x6, 0x0, 0x1f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x1f, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x13, 0x21, 0x15, 0x23, - 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1, 0xed, 0x30, 0x38, 0x6d, 0x78, 0x50, 0x39, 0x23, 0x11, - 0x24, 0x30, 0x44, 0x23, 0x1e, 0x82, 0x35, 0x2a, 0x44, 0x1, 0x1, 0x4d, 0xf8, 0x2a, 0x37, 0x66, - 0x34, 0x2b, 0x26, 0x6d, 0x47, 0x55, 0x67, 0x30, 0x28, 0xd, 0x1b, 0x36, 0x30, 0x53, 0xbb, 0x20, - 0x1, 0x7c, 0x4a, 0xe0, 0x16, 0x53, 0x44, 0x0, 0x0, 0x2, 0x0, 0x50, 0xff, 0xf2, 0x2, 0x1e, - 0x2, 0xef, 0x0, 0x20, 0x0, 0x2e, 0x0, 0x4d, 0x40, 0x1a, 0x1, 0x2f, 0x2f, 0x40, 0x30, 0x0, - 0x2d, 0x19, 0x11, 0x29, 0x21, 0x19, 0x10, 0x8, 0x0, 0x15, 0x7, 0xc, 0x25, 0x7, 0x1d, 0xc, - 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x2f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x2f, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x7, 0x26, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x36, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, - 0x17, 0x16, 0x33, 0x32, 0x2, 0x1e, 0x51, 0x3d, 0x59, 0x59, 0x38, 0x56, 0x3f, 0x41, 0x7b, 0x2a, - 0x2e, 0x28, 0xe, 0x23, 0x14, 0x13, 0x1a, 0x26, 0x48, 0x30, 0x35, 0x1a, 0x35, 0x2a, 0x25, 0x4f, - 0x3e, 0x51, 0x55, 0x1d, 0x26, 0x51, 0x50, 0x25, 0x1b, 0x1e, 0x27, 0x4c, 0x93, 0xf0, 0x8a, 0x42, - 0x32, 0x35, 0x50, 0xc1, 0xcf, 0x72, 0x76, 0x15, 0x12, 0x13, 0x33, 0xe, 0xd, 0xe, 0x47, 0x4e, - 0x88, 0x26, 0x16, 0x12, 0x31, 0x3f, 0x80, 0x45, 0x2c, 0x39, 0x3e, 0x2d, 0x45, 0x40, 0x30, 0x3e, - 0x0, 0x1, 0x0, 0x50, 0xff, 0x20, 0x1, 0xd0, 0x2, 0x2e, 0x0, 0x6, 0x0, 0x48, 0x40, 0x17, - 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, 0x6, 0x5, 0x4, 0x3, 0x2, 0x0, 0x4, 0x3, 0x8, 0x5, - 0x6, 0x5, 0x2, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x13, 0x21, 0x35, 0x21, 0x1, 0xd0, 0xe7, - 0x58, 0xe9, 0xfe, 0xd6, 0x1, 0x80, 0x1, 0xfb, 0xfd, 0x25, 0x2, 0xc6, 0x48, 0x0, 0x0, 0x3, - 0x0, 0x50, 0xff, 0xf0, 0x2, 0x12, 0x2, 0xf8, 0x0, 0x15, 0x0, 0x25, 0x0, 0x35, 0x0, 0x53, - 0x40, 0x1d, 0x1, 0x36, 0x36, 0x40, 0x37, 0x0, 0x2a, 0x22, 0x2e, 0x26, 0x1e, 0x16, 0x14, 0x12, - 0xa, 0x8, 0x6, 0x0, 0x32, 0x8, 0x3, 0x1a, 0x8, 0xe, 0xe, 0x3, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, - 0x0, 0x36, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x36, 0xff, - 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x16, 0x27, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0x12, 0x7c, 0x65, 0x65, 0x7c, 0x6c, - 0x52, 0x3f, 0x37, 0x50, 0x51, 0x38, 0x3f, 0x56, 0x70, 0x65, 0x2c, 0x23, 0x2e, 0x2d, 0x23, 0x2b, - 0x2b, 0x25, 0x2c, 0x2c, 0x24, 0x2c, 0x19, 0x38, 0x27, 0x36, 0x36, 0x27, 0x38, 0x38, 0x28, 0x35, - 0x36, 0x27, 0x38, 0xce, 0x62, 0x7c, 0x7d, 0x62, 0x8a, 0x43, 0x37, 0x6d, 0x58, 0x33, 0x2d, 0x2d, - 0x33, 0x58, 0x60, 0x44, 0x3d, 0xdc, 0x3b, 0x20, 0x1a, 0x1a, 0x20, 0x3b, 0x3c, 0x23, 0x1e, 0x1e, - 0x24, 0xfe, 0xd4, 0x5b, 0x2a, 0x1e, 0x1d, 0x2a, 0x5b, 0x58, 0x28, 0x1d, 0x1d, 0x28, 0x0, 0x2, - 0x0, 0x50, 0xff, 0x1b, 0x2, 0x1e, 0x2, 0x41, 0x0, 0x18, 0x0, 0x24, 0x0, 0x50, 0x40, 0x1c, - 0x1, 0x25, 0x25, 0x40, 0x26, 0x0, 0xd, 0x7, 0x1f, 0x19, 0x13, 0xd, 0x6, 0x0, 0x9, 0x7, - 0x4, 0x21, 0x7, 0xf, 0x1d, 0x7, 0x17, 0x17, 0x4, 0x1, 0x13, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x2f, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x13, 0x0, 0x25, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, - 0x32, 0x37, 0x36, 0x2, 0x1e, 0x3a, 0x41, 0x83, 0x42, 0x3b, 0x20, 0x34, 0x25, 0x51, 0x30, 0x2e, - 0x32, 0x67, 0x53, 0x3f, 0x50, 0x43, 0x3c, 0x64, 0xeb, 0x55, 0x1e, 0x28, 0x4b, 0x93, 0x94, 0x50, - 0x25, 0x1b, 0xfa, 0xda, 0x7b, 0x8a, 0x25, 0x3c, 0x1d, 0x5c, 0x58, 0x85, 0x42, 0x33, 0x40, 0x79, - 0x81, 0x42, 0x3c, 0xf5, 0x40, 0x30, 0x3e, 0xb4, 0xaa, 0x3e, 0x2e, 0x0, 0x0, 0x2, 0x0, 0x3b, - 0xff, 0xf2, 0x0, 0xbc, 0x2, 0x1d, 0x0, 0xb, 0x0, 0x17, 0x0, 0x43, 0x40, 0x15, 0x1, 0x18, - 0x18, 0x40, 0x19, 0x0, 0x12, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x15, 0x8, 0xf, 0x9, 0xf, - 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x18, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x13, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x11, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x1, 0xdc, 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0xfe, 0x3c, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, 0x2, 0x0, 0x3b, 0xff, 0x8e, - 0x0, 0xbf, 0x2, 0x1d, 0x0, 0xb, 0x0, 0x1b, 0x0, 0x44, 0x40, 0x15, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0x0, 0x19, 0x16, 0x12, 0xf, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x9, 0xe, 0x1, 0x16, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x16, 0x0, 0x1c, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x3, 0x14, 0x7, 0x27, 0x3e, 0x1, - 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbf, 0x26, 0x1a, 0x1b, 0x26, 0x26, - 0x1b, 0x1a, 0x26, 0x3, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, 0x26, 0x1, 0xdc, - 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0xfe, 0x3a, 0x51, 0x52, 0x14, 0xa, 0x36, 0x10, 0xc, - 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x0, 0x1, 0x0, 0x19, 0xff, 0xf6, 0x2, 0x34, 0x2, 0x7f, - 0x0, 0x9, 0x0, 0x4a, 0x40, 0x18, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x1, 0x0, - 0x9, 0x8, 0x7, 0x5, 0x4, 0x2, 0x1, 0x0, 0x6, 0x3, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xa, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x21, - 0x17, 0x7, 0x3, 0x35, 0x13, 0x17, 0x7, 0x21, 0x2, 0x34, 0xfe, 0x58, 0x8c, 0x43, 0xbc, 0xbc, - 0x3d, 0x80, 0x1, 0xa2, 0x1, 0x13, 0xfb, 0x22, 0x1, 0x40, 0x14, 0x1, 0x35, 0x29, 0xef, 0x0, - 0x0, 0x2, 0x0, 0x69, 0x0, 0xec, 0x1, 0xde, 0x1, 0xc3, 0x0, 0x3, 0x0, 0x7, 0x0, 0x53, - 0x40, 0x1d, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, - 0x1, 0x0, 0x7, 0x2, 0x7, 0x6, 0x7, 0x4, 0x3, 0x2, 0x5, 0x4, 0x1, 0x1, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, - 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x1, 0xde, 0xfe, 0x8b, 0x1, - 0x75, 0xfe, 0x8b, 0x1, 0x75, 0x1, 0x83, 0x40, 0xd7, 0x40, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xf6, - 0x2, 0x56, 0x2, 0x7f, 0x0, 0x9, 0x0, 0x4a, 0x40, 0x18, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, - 0x6, 0x5, 0x4, 0x3, 0x9, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x0, 0x8, 0x1, 0x1, 0x1, - 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, - 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x3, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x13, 0x2, 0x56, 0xbc, 0x43, - 0x8c, 0xfe, 0x58, 0x1, 0xa2, 0x80, 0x3d, 0xbc, 0x1, 0x36, 0xfe, 0xc0, 0x22, 0xfb, 0x54, 0xef, - 0x29, 0xfe, 0xcb, 0x0, 0x0, 0x2, 0x0, 0x3e, 0xff, 0xf0, 0x1, 0xdd, 0x3, 0x13, 0x0, 0x18, - 0x0, 0x24, 0x0, 0x51, 0x40, 0x1c, 0x1, 0x25, 0x25, 0x40, 0x26, 0x0, 0x22, 0x13, 0x8, 0x7, - 0x1f, 0x19, 0x14, 0xf, 0x9, 0x8, 0x7, 0x6, 0x0, 0x11, 0x8, 0x16, 0x1c, 0x16, 0x3, 0x1, - 0x14, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x14, 0x0, 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x25, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0xe, 0x2, 0x1d, 0x1, 0x23, 0x35, 0x34, 0x37, - 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x3, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0xdd, 0x29, 0x2b, 0x55, 0x21, 0x50, - 0x5b, 0x22, 0x22, 0x20, 0x86, 0x49, 0x4a, 0x2b, 0x60, 0x61, 0x66, 0x78, 0xb6, 0x25, 0x1a, 0x1a, - 0x24, 0x25, 0x19, 0x1a, 0x25, 0x2, 0x53, 0x3f, 0x2b, 0x24, 0x4a, 0x3b, 0x27, 0x57, 0x5f, 0x64, - 0x4f, 0x1b, 0x1b, 0x20, 0x2f, 0x6c, 0x32, 0x41, 0x3f, 0x64, 0xfd, 0x7f, 0x1a, 0x24, 0x24, 0x1a, - 0x1a, 0x24, 0x24, 0x0, 0x0, 0x2, 0x0, 0x55, 0xff, 0x2c, 0x3, 0xb4, 0x2, 0xe0, 0x0, 0x3f, - 0x0, 0x48, 0x0, 0x7d, 0x40, 0x35, 0x1, 0x49, 0x49, 0x40, 0x4a, 0x28, 0x3d, 0x2f, 0x19, 0x9, - 0x8, 0x2, 0x48, 0x44, 0x40, 0x3e, 0x3d, 0x37, 0x28, 0x20, 0x1a, 0x13, 0xb, 0x8, 0x7, 0x3, - 0x0, 0x7, 0x5, 0xf, 0x7, 0x24, 0x17, 0x7, 0x1c, 0x46, 0x7, 0x33, 0x42, 0x7, 0x3b, 0x24, - 0x1c, 0x33, 0x1, 0x2d, 0x2c, 0x1, 0x5, 0x2, 0x1, 0x20, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3f, 0x3c, 0x3f, 0x2f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, 0x49, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x49, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x15, 0x11, 0x33, 0x36, 0x35, 0x34, 0x27, 0x26, - 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, 0x7, 0x23, 0x26, - 0x27, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, - 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0xb, 0x42, 0x30, 0x1b, 0x46, - 0x52, 0xad, 0x77, 0x2f, 0x5a, 0x5f, 0xa9, 0xa8, 0x61, 0x5b, 0x5b, 0x60, 0xa9, 0x2c, 0x25, 0x7, - 0x3c, 0x1c, 0xca, 0x76, 0x72, 0x72, 0x76, 0xca, 0xca, 0x74, 0x6f, 0x15, 0x17, 0x26, 0xe8, 0x7, - 0x4, 0x18, 0xa, 0x25, 0x37, 0x4f, 0x2f, 0x34, 0x3b, 0x36, 0x4d, 0x48, 0x2a, 0x25, 0x3e, 0x73, - 0x65, 0x3d, 0x34, 0x1, 0xd4, 0x20, 0x42, 0x24, 0xb1, 0xfe, 0xda, 0x5b, 0x68, 0xb4, 0x6d, 0x73, - 0x73, 0x6e, 0xb3, 0xb4, 0x6d, 0x73, 0x5, 0x44, 0x7, 0x85, 0x82, 0xd3, 0xd3, 0x82, 0x85, 0x85, - 0x81, 0xd4, 0x45, 0x47, 0x4e, 0x2c, 0xb, 0x1c, 0x15, 0x6, 0x15, 0x26, 0x2a, 0x51, 0x4d, 0x2e, - 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, - 0x2, 0x96, 0x3, 0x11, 0x0, 0x7, 0x0, 0xc, 0x0, 0x50, 0x40, 0x1d, 0x1, 0xd, 0xd, 0x40, - 0xe, 0x0, 0xa, 0x9, 0xc, 0x8, 0x5, 0x0, 0xc, 0x8, 0x7, 0x3, 0x2, 0x7, 0x6, 0x3, - 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, - 0x3c, 0x3f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xd, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xd, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x21, 0x7, 0x23, - 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x2, 0x96, 0x54, 0x56, 0xfe, 0xde, 0x57, 0x53, 0x1, - 0x13, 0x50, 0x52, 0x77, 0x7, 0xd, 0x6a, 0xf6, 0xf6, 0x3, 0x11, 0xfe, 0x2b, 0x1, 0x6c, 0x2f, - 0xfe, 0xc3, 0x0, 0x3, 0x0, 0x75, 0x0, 0x0, 0x2, 0x71, 0x3, 0xc, 0x0, 0xd, 0x0, 0x15, - 0x0, 0x1d, 0x0, 0x65, 0x40, 0x27, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x0, 0x1a, 0x19, 0x14, 0x13, - 0x1b, 0x1a, 0x16, 0x13, 0x12, 0xe, 0xc, 0xb, 0x9, 0x4, 0x3, 0x0, 0x1c, 0x1b, 0x8, 0x2, - 0x12, 0x11, 0x8, 0x4, 0x5, 0x4, 0x3, 0x3, 0x2, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x21, 0x23, 0x11, 0x21, 0x32, - 0x17, 0x16, 0x15, 0x14, 0x7, 0x15, 0x16, 0x27, 0x34, 0x26, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x17, - 0x34, 0x26, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x2, 0x71, 0xff, 0x0, 0xfc, 0x1, 0x7, 0x6b, 0x3e, - 0x3a, 0x73, 0x85, 0x67, 0x4e, 0x4c, 0xab, 0xa3, 0xa2, 0x10, 0x5c, 0x4b, 0xae, 0xc1, 0x94, 0xd3, - 0xd3, 0x3, 0xc, 0x3b, 0x35, 0x51, 0x83, 0x31, 0x6, 0x31, 0xe3, 0x3a, 0x44, 0xfe, 0xf0, 0xda, - 0x47, 0x51, 0xfe, 0xdc, 0x0, 0x1, 0x0, 0x57, 0xff, 0xf8, 0x2, 0x7b, 0x3, 0x14, 0x0, 0x1b, - 0x0, 0x43, 0x40, 0x15, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x1b, 0x19, 0x11, 0xf, 0x15, 0xe, - 0x8, 0x0, 0xc, 0x3, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x2, 0x7b, 0x2d, 0x35, 0x3f, 0x5a, 0x77, 0x53, 0x5f, 0x61, 0x51, 0x73, 0xa4, 0x56, 0x49, - 0x35, 0x73, 0x6b, 0x38, 0x31, 0x39, 0x3b, 0x64, 0x6e, 0x42, 0x8f, 0x4a, 0x24, 0x29, 0x5f, 0x6e, - 0xc0, 0xc8, 0x6d, 0x5a, 0x93, 0x24, 0x6c, 0x60, 0x56, 0x8e, 0x8e, 0x59, 0x5c, 0x71, 0x0, 0x2, - 0x0, 0x75, 0x0, 0x0, 0x2, 0x98, 0x3, 0xc, 0x0, 0xa, 0x0, 0x15, 0x0, 0x51, 0x40, 0x1d, - 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x11, 0x10, 0xb, 0x6, 0x5, 0x0, 0x12, 0x11, 0x8, 0x4, - 0x10, 0xf, 0x8, 0x6, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x16, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x14, 0x7, 0x6, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x2b, 0x1, - 0x11, 0x33, 0x32, 0x37, 0x36, 0x2, 0x98, 0x5d, 0x4f, 0x8b, 0xec, 0xef, 0x7e, 0x4f, 0x67, 0x5a, - 0x2e, 0x38, 0x87, 0x85, 0x85, 0x85, 0x3a, 0x2e, 0x1, 0x8b, 0xd1, 0x65, 0x55, 0x3, 0xc, 0x4a, - 0x62, 0xd5, 0x96, 0x49, 0x59, 0xfd, 0x85, 0x60, 0x4e, 0x0, 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, - 0x2, 0x3f, 0x3, 0xc, 0x0, 0xb, 0x0, 0x64, 0x40, 0x27, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x0, 0x5, 0x4, 0x8, 0x2, 0x9, - 0x8, 0x8, 0x7, 0x6, 0xb, 0xa, 0x8, 0x0, 0x3, 0x2, 0x3, 0x1, 0x0, 0x1, 0x1, 0x2, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, - 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x3, 0x21, - 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x2, 0x3f, 0xfe, 0x37, 0x1, 0x1, 0xb9, 0xfe, - 0x9e, 0x1, 0x3b, 0xfe, 0xc5, 0x1, 0x73, 0x3, 0xc, 0x48, 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0x0, - 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x36, 0x3, 0xc, 0x0, 0x9, 0x0, 0x5b, 0x40, 0x22, - 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, - 0x5, 0x4, 0x8, 0x3, 0x2, 0x1, 0x0, 0x8, 0x8, 0x9, 0x8, 0x3, 0x7, 0x6, 0x1, 0x1, - 0x7, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, - 0x23, 0x11, 0x21, 0x2, 0x36, 0xfe, 0x99, 0x1, 0x3b, 0xfe, 0xc5, 0x5a, 0x1, 0xc1, 0x2, 0xc4, - 0xfe, 0xf1, 0x48, 0xfe, 0x93, 0x3, 0xc, 0x0, 0x0, 0x1, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xb3, - 0x3, 0x12, 0x0, 0x23, 0x0, 0x62, 0x40, 0x26, 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x1b, 0x11, - 0x2, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x17, 0x10, 0xa, 0x2, 0x1, 0x0, 0x13, 0x8, 0xe, 0x23, - 0x22, 0x8, 0x21, 0x20, 0xe, 0x3, 0x6, 0x1, 0x1, 0x0, 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x35, 0x6, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, - 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x1, 0x23, 0x35, 0x21, 0x2, 0xb3, 0x40, 0x17, - 0x33, 0x41, 0x4f, 0x7e, 0x5a, 0x6a, 0x6d, 0x58, 0x7e, 0xa5, 0x55, 0x48, 0x39, 0x76, 0x75, 0x3f, - 0x37, 0x3c, 0x41, 0x6d, 0x5c, 0x35, 0x30, 0xbb, 0x1, 0x11, 0x61, 0x27, 0x1e, 0x24, 0x5b, 0x6d, - 0xc3, 0xcb, 0x6c, 0x58, 0x94, 0x24, 0x6f, 0x65, 0x59, 0x88, 0x87, 0x5a, 0x61, 0x3d, 0x37, 0x53, - 0x42, 0x48, 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x83, 0x3, 0xc, 0x0, 0xb, 0x0, 0x60, - 0x40, 0x26, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, - 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x8, 0x9, 0x8, 0xb, 0xa, 0x7, 0x3, 0x6, 0x3, 0x5, - 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, - 0x21, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x2, 0x83, 0x56, 0xfe, - 0x9f, 0x57, 0x57, 0x1, 0x61, 0x56, 0x1, 0x6b, 0xfe, 0x95, 0x3, 0xc, 0xfe, 0xab, 0x1, 0x55, - 0x0, 0x1, 0x0, 0x39, 0x0, 0x0, 0x1, 0x7, 0x3, 0xc, 0x0, 0xb, 0x0, 0x63, 0x40, 0x28, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x0, 0x9, 0x8, 0x5, 0x3, 0x4, 0x7, 0x6, 0xb, 0xa, 0x3, 0x3, 0x2, 0x7, 0x0, 0x7, - 0x6, 0x3, 0x1, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, - 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0xc, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, - 0x59, 0x21, 0x23, 0x27, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x1, 0x7, 0xcd, - 0x1, 0x3c, 0x3c, 0xce, 0x3c, 0x3c, 0x38, 0x2, 0x9c, 0x38, 0x38, 0xfd, 0x64, 0x0, 0x0, 0x1, - 0x0, 0x30, 0xff, 0x40, 0x0, 0xf3, 0x3, 0xc, 0x0, 0x9, 0x0, 0x3e, 0x40, 0x12, 0x1, 0xa, - 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x7, 0x5, 0x0, 0x4, 0x9, 0x8, 0x3, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x14, 0x7, 0x6, 0x7, 0x27, - 0x36, 0x35, 0x11, 0x33, 0xf3, 0x2b, 0x2f, 0x58, 0x11, 0x70, 0x53, 0x38, 0x63, 0x41, 0x46, 0xe, - 0x46, 0x11, 0x97, 0x2, 0xde, 0x0, 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x93, 0x3, 0xc, - 0x0, 0xb, 0x0, 0x55, 0x40, 0x20, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, - 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x0, 0xa, 0x9, 0x7, 0x3, 0x6, 0x3, 0x5, 0x4, 0x1, - 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x1, 0x7, 0x11, 0x23, 0x11, - 0x33, 0x11, 0x1, 0x33, 0x3, 0x2, 0x93, 0x60, 0xfe, 0xfd, 0x64, 0x57, 0x57, 0x1, 0x36, 0x62, - 0xff, 0x1, 0x90, 0x7d, 0xfe, 0xed, 0x3, 0xc, 0xfe, 0x7f, 0x1, 0x81, 0xfe, 0xc4, 0x0, 0x1, - 0x0, 0x75, 0x0, 0x0, 0x2, 0x1c, 0x3, 0xc, 0x0, 0x5, 0x0, 0x48, 0x40, 0x18, 0x1, 0x6, - 0x6, 0x40, 0x7, 0x0, 0x5, 0x4, 0x3, 0x2, 0x0, 0x5, 0x4, 0x8, 0x0, 0x3, 0x2, 0x3, - 0x1, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x2, 0x0, 0x6, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x6, - 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x3, 0x33, 0x11, 0x21, 0x2, 0x1c, 0xfe, 0x5a, 0x1, 0x57, - 0x1, 0x50, 0x3, 0xc, 0xfd, 0x3c, 0x0, 0x1, 0x0, 0x75, 0xff, 0xfb, 0x2, 0xf7, 0x3, 0xc, - 0x0, 0xf, 0x0, 0x60, 0x40, 0x26, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xd, 0xc, 0x7, 0x6, - 0x3, 0x2, 0xf, 0xa, 0x9, 0x8, 0x7, 0x2, 0x1, 0x0, 0xf, 0xe, 0xb, 0x3, 0xa, 0x3, - 0x5, 0x4, 0x1, 0x9, 0x8, 0x1, 0x3, 0x0, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x9, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, - 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, 0x23, 0x3, 0x23, 0x3, 0x23, 0x11, 0x23, 0x11, 0x33, - 0x13, 0x33, 0x13, 0x33, 0x2, 0xf7, 0x4c, 0x6, 0xd1, 0x3c, 0xd1, 0x6, 0x4c, 0x7e, 0xc0, 0x6, - 0xc1, 0x7d, 0x2, 0xb3, 0xfd, 0x48, 0x2, 0xbf, 0xfd, 0x46, 0x3, 0xc, 0xfd, 0x6b, 0x2, 0x95, - 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x2, 0x85, 0x3, 0xc, 0x0, 0xb, 0x0, 0x57, 0x40, 0x21, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x9, 0x8, 0x3, 0x2, 0xb, 0xa, 0x9, 0x6, 0x5, 0x4, - 0x3, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x3, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x1, 0x33, 0x11, - 0x33, 0x2, 0x85, 0x6e, 0xfe, 0xb2, 0x8, 0x4c, 0x7a, 0x1, 0x44, 0x7, 0x4b, 0x2, 0xb1, 0xfd, - 0x4f, 0x3, 0xc, 0xfd, 0x5b, 0x2, 0xa5, 0x0, 0x0, 0x2, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xe7, - 0x3, 0x14, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x42, 0x40, 0x15, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, - 0x14, 0x18, 0x10, 0x8, 0x0, 0x1c, 0x8, 0x4, 0xc, 0x3, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0xe7, 0x69, 0x5a, 0x84, 0x85, - 0x5a, 0x6a, 0x6a, 0x5a, 0x85, 0x84, 0x5a, 0x69, 0x5a, 0x39, 0x40, 0x75, 0x75, 0x40, 0x39, 0x39, - 0x40, 0x75, 0x75, 0x40, 0x39, 0x1, 0x86, 0xc6, 0x6c, 0x5c, 0x5c, 0x6b, 0xc7, 0xc7, 0x6b, 0x5c, - 0x5c, 0x6b, 0xc7, 0x87, 0x58, 0x64, 0x64, 0x58, 0x87, 0x87, 0x58, 0x65, 0x65, 0x58, 0x0, 0x2, - 0x0, 0x76, 0x0, 0x0, 0x2, 0x60, 0x3, 0xc, 0x0, 0xc, 0x0, 0x17, 0x0, 0x56, 0x40, 0x1f, - 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x14, 0x13, 0x5, 0x4, 0x13, 0x12, 0xd, 0x8, 0x7, 0x6, - 0x5, 0x0, 0x12, 0x11, 0x8, 0x8, 0x9, 0x8, 0x3, 0x7, 0x6, 0x1, 0x1, 0x7, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x7, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x2b, 0x1, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x2b, 0x1, 0x11, 0x33, 0x32, 0x37, 0x36, 0x2, 0x60, 0x3f, 0x41, - 0x77, 0x9d, 0x56, 0x1, 0x2, 0x70, 0x3f, 0x39, 0x55, 0x25, 0x2a, 0x4a, 0xa6, 0xa3, 0x4e, 0x29, - 0x25, 0x2, 0x32, 0x68, 0x3b, 0x3e, 0xfe, 0xaf, 0x3, 0xc, 0x42, 0x3c, 0x5c, 0x3c, 0x29, 0x2d, - 0xfe, 0xd5, 0x2d, 0x29, 0x0, 0x2, 0x0, 0x57, 0xff, 0xc9, 0x3, 0x8, 0x3, 0x13, 0x0, 0x12, - 0x0, 0x25, 0x0, 0x52, 0x40, 0x1d, 0x1, 0x26, 0x26, 0x40, 0x27, 0x0, 0x24, 0x23, 0x17, 0x2, - 0x22, 0x21, 0x1b, 0x13, 0x12, 0x10, 0x8, 0x0, 0x1f, 0x8, 0x4, 0x1, 0xc, 0x3, 0x4, 0x1, - 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x8, 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x26, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x7, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x3, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x3, 0x8, 0x39, 0x70, - 0x54, 0x6b, 0x85, 0x5a, 0x6a, 0x6a, 0x5a, 0x85, 0x84, 0x5a, 0x69, 0x50, 0xa, 0x39, 0x40, 0x75, - 0x75, 0x40, 0x39, 0x39, 0x40, 0x75, 0x4b, 0x3b, 0x6f, 0x39, 0x6a, 0x34, 0x1, 0x38, 0x6f, 0x40, - 0x5c, 0x6b, 0xc7, 0xc6, 0x6c, 0x5b, 0x5b, 0x6c, 0xc6, 0xad, 0x68, 0x1, 0x15, 0x87, 0x58, 0x63, - 0x63, 0x58, 0x87, 0x87, 0x58, 0x65, 0x2e, 0x6e, 0x38, 0x69, 0x5a, 0x0, 0x0, 0x2, 0x0, 0x75, - 0x0, 0x0, 0x2, 0x77, 0x3, 0xc, 0x0, 0xd, 0x0, 0x16, 0x0, 0x5e, 0x40, 0x24, 0x1, 0x17, - 0x17, 0x40, 0x18, 0x0, 0x15, 0x14, 0x3, 0x2, 0x14, 0x13, 0xe, 0xd, 0xb, 0x6, 0x5, 0x4, - 0x3, 0x0, 0x13, 0x12, 0x8, 0x6, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, - 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x17, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x17, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x3, 0x23, 0x11, 0x23, - 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x37, 0x34, 0x27, 0x26, 0x2b, 0x1, 0x11, 0x33, - 0x32, 0x2, 0x77, 0x56, 0xb5, 0xa0, 0x57, 0x1, 0x6, 0x6b, 0x3e, 0x3a, 0xa1, 0x49, 0x25, 0x29, - 0x4b, 0xa1, 0xa4, 0x96, 0x1, 0x5b, 0xfe, 0xa5, 0x3, 0xc, 0x3e, 0x39, 0x5a, 0xa8, 0x2e, 0xd3, - 0x3c, 0x26, 0x2a, 0xfe, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x3e, 0xff, 0xf8, 0x2, 0x2d, 0x3, 0x14, - 0x0, 0x28, 0x0, 0x4a, 0x40, 0x19, 0x1, 0x29, 0x29, 0x40, 0x2a, 0x0, 0x1c, 0xb, 0x7, 0x22, - 0x1b, 0x15, 0xf, 0x6, 0x0, 0x1e, 0x8, 0x19, 0x19, 0x3, 0x4, 0x1, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x29, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x29, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, - 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, - 0x15, 0x14, 0x17, 0x1e, 0x1, 0x17, 0x16, 0x2, 0x2d, 0x52, 0x45, 0x62, 0x84, 0x72, 0x2b, 0x25, - 0x36, 0x3c, 0x36, 0x41, 0x28, 0x34, 0x43, 0x1f, 0x5a, 0xcf, 0x4c, 0x46, 0x69, 0x6b, 0x6b, 0x23, - 0x5b, 0x55, 0x3e, 0x2d, 0x38, 0x3e, 0x17, 0xc5, 0x2b, 0x45, 0xbc, 0x64, 0x34, 0x2c, 0x4d, 0x41, - 0x1c, 0x13, 0x15, 0x18, 0x1f, 0x42, 0x3c, 0x35, 0x18, 0x30, 0x6e, 0x77, 0x57, 0x34, 0x30, 0x42, - 0x44, 0x3a, 0x18, 0x1d, 0x38, 0x33, 0x2f, 0x11, 0x6d, 0x29, 0x43, 0x0, 0x0, 0x1, 0x0, 0x2f, - 0x0, 0x0, 0x2, 0x4e, 0x3, 0xc, 0x0, 0x7, 0x0, 0x52, 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, - 0x9, 0x0, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x5, 0x4, 0x1, 0x3, 0x0, 0x8, - 0x6, 0x7, 0x6, 0x3, 0x3, 0x2, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x11, 0x23, - 0x11, 0x23, 0x35, 0x21, 0x2, 0x4e, 0xe4, 0x56, 0xe5, 0x2, 0x1f, 0x2, 0xc4, 0xfd, 0x3c, 0x2, - 0xc4, 0x48, 0x0, 0x1, 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xc, 0x0, 0x15, 0x0, 0x4b, - 0x40, 0x1a, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0xf, 0x15, 0x14, 0x13, 0xb, 0xa, 0x9, 0x8, - 0x0, 0x15, 0x14, 0xa, 0x3, 0x9, 0x3, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, - 0x33, 0x2, 0x7e, 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, 0x3d, - 0x57, 0x1, 0x14, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xf8, 0xfe, 0x9, 0x72, 0x36, 0x2c, - 0x2a, 0x37, 0x73, 0x1, 0xf7, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, 0x0, 0x2, 0x5d, 0x3, 0xc, - 0x0, 0x8, 0x0, 0x43, 0x40, 0x16, 0x1, 0x9, 0x9, 0x40, 0xa, 0x0, 0x6, 0x5, 0x3, 0x0, - 0x2, 0x1, 0x1, 0x8, 0x4, 0x3, 0x3, 0x0, 0x3, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x3, 0x0, 0x9, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x9, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x33, 0x13, 0x33, 0x37, 0x13, - 0x2, 0x5d, 0xed, 0x67, 0xed, 0x5b, 0xc2, 0x8, 0x14, 0xaf, 0x3, 0xc, 0xfc, 0xf4, 0x3, 0xc, - 0xfd, 0x5b, 0x4d, 0x2, 0x58, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, 0x0, 0x3, 0x99, 0x3, 0xc, - 0x0, 0x12, 0x0, 0x51, 0x40, 0x1f, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x10, 0xf, 0xb, 0xa, - 0x4, 0x3, 0x8, 0x0, 0x7, 0x6, 0x2, 0x3, 0x1, 0x1, 0x12, 0xe, 0xd, 0x9, 0x8, 0x5, - 0x0, 0x3, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, - 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x23, 0x7, 0x3, 0x23, 0x3, 0x33, 0x13, - 0x33, 0x37, 0x13, 0x33, 0x13, 0x33, 0x37, 0x13, 0x3, 0x99, 0xb3, 0x60, 0xa8, 0x6, 0xd, 0x9b, - 0x61, 0xb3, 0x53, 0x96, 0x6, 0xa, 0x9b, 0x55, 0xa6, 0x6, 0xa, 0x8c, 0x3, 0xc, 0xfc, 0xf4, - 0x2, 0x92, 0x3d, 0xfd, 0xab, 0x3, 0xc, 0xfd, 0x66, 0x38, 0x2, 0x62, 0xfd, 0x66, 0x38, 0x2, - 0x62, 0x0, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x2, 0x6f, 0x3, 0xc, 0x0, 0xb, 0x0, 0x4f, - 0x40, 0x1d, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, 0x6, 0x5, 0x4, 0x0, - 0xa, 0x9, 0x7, 0x3, 0x6, 0x3, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x1, 0x4, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xc, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, - 0x23, 0xb, 0x1, 0x23, 0x13, 0x3, 0x33, 0x1b, 0x1, 0x33, 0x3, 0x2, 0x6f, 0x5f, 0xc6, 0xc9, - 0x5f, 0xfc, 0xe8, 0x5e, 0xbb, 0xab, 0x5e, 0xdf, 0x1, 0x52, 0xfe, 0xae, 0x1, 0x9e, 0x1, 0x6e, - 0xfe, 0xd7, 0x1, 0x29, 0xfe, 0x92, 0x0, 0x1, 0x0, 0x1d, 0x0, 0x0, 0x2, 0x79, 0x3, 0xc, - 0x0, 0x9, 0x0, 0x4b, 0x40, 0x1a, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x8, 0x7, 0x5, 0x4, - 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x1, 0x9, 0x6, 0x5, 0x3, 0x0, 0x3, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xa, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x9, - 0x1, 0x11, 0x23, 0x11, 0x1, 0x33, 0x13, 0x33, 0x13, 0x2, 0x79, 0xfe, 0xfd, 0x57, 0xfe, 0xfe, - 0x63, 0xc7, 0x7, 0xc7, 0x3, 0xc, 0xfe, 0x36, 0xfe, 0xbe, 0x1, 0x42, 0x1, 0xca, 0xfe, 0x97, - 0x1, 0x69, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x2, 0x38, 0x3, 0xc, 0x0, 0x9, 0x0, 0x57, - 0x40, 0x20, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x0, 0x4, 0x3, 0x8, 0x5, 0x9, 0x8, 0x8, 0x0, 0x6, 0x5, 0x3, 0x1, 0x0, 0x1, 0x1, - 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x2, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x27, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, - 0x21, 0x2, 0x38, 0xfd, 0xee, 0x1, 0x1, 0x9c, 0xfe, 0x75, 0x1, 0xfb, 0xfe, 0x5b, 0x1, 0xac, - 0x43, 0x2, 0x81, 0x48, 0x3a, 0xfd, 0x76, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x39, 0x1, 0x13, - 0x3, 0x32, 0x0, 0x7, 0x0, 0x54, 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, - 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x7, 0x0, 0x5, 0x4, 0x7, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x4, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, - 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x23, 0x11, 0x33, 0x15, 0x23, - 0x11, 0x33, 0x1, 0x13, 0xd8, 0xd8, 0x83, 0x83, 0xc7, 0x3, 0xf9, 0x46, 0xfc, 0x93, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0x0, 0x1, 0x9d, 0x3, 0x56, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, - 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x1, 0x33, 0x1, 0x9d, 0x4f, 0xfe, 0xed, 0x4f, - 0x3, 0x56, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x39, 0x1, 0x13, 0x3, 0x32, 0x0, 0x7, 0x0, 0x54, - 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x7, 0x0, 0x5, 0x4, 0x7, 0x6, 0x1, 0x0, 0x7, 0x6, 0x4, 0x1, 0x1, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x1, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, - 0xff, 0xc0, 0x38, 0x59, 0x5, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x1, 0x13, 0xd8, 0x83, - 0x83, 0xd8, 0xc7, 0x46, 0x3, 0x6d, 0x46, 0x0, 0x0, 0x1, 0x0, 0x5, 0x2, 0x73, 0x1, 0x19, - 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, 0x2, 0x4, - 0x0, 0x6, 0x5, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x19, 0x47, 0x43, - 0x43, 0x47, 0x6a, 0x40, 0x2, 0x73, 0x56, 0x56, 0x92, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xc0, - 0x1, 0xc9, 0x0, 0x0, 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, - 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x4, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x21, 0x35, 0x21, 0x1, 0xc9, 0xfe, 0x72, 0x1, 0x8e, 0x40, - 0x40, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x6d, 0x0, 0xbb, 0x3, 0x7, 0x0, 0x3, 0x0, 0x3c, - 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x8, 0x0, 0x2, 0x1, 0x0, - 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x23, 0x27, 0x17, - 0xbb, 0x42, 0x3e, 0x4b, 0x2, 0x6d, 0x9a, 0x1, 0x0, 0x2, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, - 0x2, 0x1a, 0x0, 0x1d, 0x0, 0x26, 0x0, 0x61, 0x40, 0x26, 0x1, 0x27, 0x27, 0x40, 0x28, 0x0, - 0x14, 0xf, 0x3, 0x23, 0x1f, 0x1e, 0x1a, 0x19, 0x15, 0x10, 0xf, 0x9, 0x0, 0x12, 0x7, 0x17, - 0x25, 0x7, 0x5, 0x21, 0x7, 0xd, 0x17, 0x2, 0x5, 0x1, 0x1, 0x0, 0x1, 0x1, 0x9, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, - 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x27, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, - 0x1, 0xc1, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x62, - 0x43, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0x59, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0xd, 0x1a, - 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, - 0x14, 0x4, 0x51, 0x78, 0x11, 0x68, 0x57, 0x0, 0x0, 0x2, 0x0, 0x5a, 0xff, 0xf8, 0x1, 0xf9, - 0x3, 0x32, 0x0, 0x10, 0x0, 0x1b, 0x0, 0x54, 0x40, 0x1f, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, - 0xb, 0x16, 0x15, 0x11, 0xb, 0xa, 0x9, 0x8, 0x0, 0x18, 0x7, 0x4, 0x13, 0x7, 0xd, 0xd, - 0x2, 0xa, 0x9, 0x4, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3c, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, - 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, - 0x22, 0x7, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x1, 0xf9, 0x48, 0x37, 0x59, 0x54, 0x32, 0x41, - 0x55, 0x32, 0x53, 0x52, 0x32, 0x41, 0x5b, 0x77, 0x51, 0x27, 0x72, 0x3b, 0x1c, 0x26, 0x1, 0xe, - 0x9b, 0x46, 0x35, 0x2e, 0x3a, 0x7f, 0x2, 0x53, 0xfe, 0xb8, 0x30, 0x35, 0x44, 0x97, 0xc9, 0x3a, - 0xc1, 0x9d, 0x24, 0x2f, 0x0, 0x1, 0x0, 0x32, 0xff, 0xf7, 0x1, 0xa3, 0x2, 0x1a, 0x0, 0x15, - 0x0, 0x49, 0x40, 0x19, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x15, 0xd, 0x11, 0xc, 0x6, 0x0, - 0x13, 0x7, 0x2, 0xf, 0x7, 0xa, 0xa, 0x2, 0x2, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, - 0x37, 0x1, 0xa3, 0x3f, 0x60, 0x5c, 0x37, 0x3f, 0x3c, 0x36, 0x60, 0x56, 0x38, 0x31, 0x28, 0x35, - 0x78, 0x78, 0x44, 0x2a, 0x3f, 0x48, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x40, 0x3e, 0x31, 0x29, 0xcd, - 0xcb, 0x34, 0x0, 0x2, 0x0, 0x32, 0xff, 0xf9, 0x1, 0xd1, 0x3, 0x32, 0x0, 0x10, 0x0, 0x1b, - 0x0, 0x5c, 0x40, 0x23, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x1a, 0xe, 0x2, 0x16, 0x12, 0x11, - 0x10, 0xf, 0xe, 0x8, 0x2, 0x1, 0x0, 0x14, 0x8, 0xc, 0x10, 0xf, 0x4, 0xc, 0x2, 0x4, - 0x1, 0x1, 0x0, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, - 0x3f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, - 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x3, - 0x11, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x1, 0xd1, 0x55, 0x2c, 0x57, 0x53, - 0x34, 0x40, 0x40, 0x36, 0x4c, 0x55, 0x33, 0x55, 0x55, 0x2c, 0x4f, 0x75, 0x24, 0x1f, 0x3d, 0x4c, - 0x27, 0x2e, 0x3b, 0x48, 0x92, 0x84, 0x4a, 0x3e, 0x32, 0x1, 0x4a, 0xfd, 0x49, 0x1, 0x16, 0x40, - 0xc7, 0x71, 0x30, 0x29, 0x0, 0x2, 0x0, 0x32, 0xff, 0xf7, 0x1, 0xcd, 0x2, 0x1b, 0x0, 0x16, - 0x0, 0x1c, 0x0, 0x56, 0x40, 0x20, 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0x0, 0x7, 0x1c, 0x17, 0x16, - 0xe, 0x8, 0x1, 0x0, 0x1, 0x0, 0x7, 0x1c, 0x17, 0x5, 0x8, 0xa, 0x1a, 0x7, 0x12, 0x12, - 0x2, 0xa, 0x1, 0x1, 0xe, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x10, - 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xe, 0x0, 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x16, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0x7, 0x1, 0xcd, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, - 0x30, 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, - 0x35, 0x6f, 0xd, 0xf7, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, 0x89, 0x8b, 0x4a, 0x41, - 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x1, 0x0, 0x2d, 0x0, 0x0, 0x1, 0x2e, - 0x3, 0x31, 0x0, 0x15, 0x0, 0x7a, 0x40, 0x34, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x9, 0x8, - 0x1, 0x0, 0x15, 0x14, 0x13, 0x11, 0x10, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, - 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x3, 0x3, 0x2, 0x7, 0x4, 0x11, 0x7, 0x10, 0x10, 0x4, - 0x15, 0x14, 0xb, 0x3, 0xa, 0x2, 0x5, 0x4, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x3f, 0x17, 0x3c, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x16, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x23, 0x11, 0x33, 0x15, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x15, 0x22, 0x1d, 0x1, 0x33, 0x1, 0x2e, 0x64, 0x4a, 0xd3, 0x34, 0x48, 0x48, 0x3a, 0x30, - 0x4f, 0x64, 0x64, 0x1, 0xcf, 0xfe, 0x71, 0x40, 0x40, 0x1, 0x8f, 0x43, 0x87, 0x50, 0x28, 0x20, - 0x44, 0x52, 0x89, 0x0, 0x0, 0x3, 0x0, 0x32, 0xfe, 0xe3, 0x2, 0x5, 0x2, 0x68, 0x0, 0x2d, - 0x0, 0x35, 0x0, 0x3d, 0x0, 0x65, 0x40, 0x26, 0x1, 0x3e, 0x3e, 0x40, 0x3f, 0x0, 0x3c, 0x38, - 0x34, 0x30, 0x2a, 0x28, 0x24, 0x22, 0x15, 0x3a, 0x36, 0x32, 0x2e, 0x26, 0x1f, 0x1d, 0x1a, 0x19, - 0x10, 0xe, 0xc, 0xa, 0x8, 0x0, 0x19, 0x13, 0x2, 0x4, 0x0, 0x1, 0x8, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x3e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x3e, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x14, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x36, 0x37, 0x36, 0x37, 0x15, 0x22, 0x6, 0x7, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, - 0x6, 0x15, 0x14, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x3, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, - 0x32, 0x13, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x2, 0x5, 0x48, 0x3d, 0x64, 0x65, 0x3d, - 0x48, 0x41, 0x20, 0x24, 0x35, 0x73, 0x5a, 0x37, 0x2c, 0x10, 0x12, 0x21, 0x3d, 0x1e, 0x31, 0x3, - 0x3e, 0x75, 0x5a, 0x34, 0x2b, 0x14, 0x1c, 0x2f, 0x35, 0x64, 0x3d, 0x48, 0x7b, 0x7b, 0x7a, 0x7a, - 0x7b, 0x2e, 0x9c, 0x9d, 0x9d, 0x9c, 0x78, 0x56, 0x2b, 0x24, 0x24, 0x2b, 0x55, 0x51, 0x2b, 0x30, - 0x32, 0x38, 0x2a, 0x37, 0x54, 0x58, 0x6f, 0x16, 0x26, 0x12, 0x23, 0xa, 0x4a, 0x26, 0x14, 0x35, - 0x5d, 0x57, 0x6f, 0x14, 0x1a, 0x1f, 0x2b, 0x1c, 0xc, 0x24, 0x2b, 0x1, 0x75, 0x87, 0x87, 0x86, - 0xfe, 0xbc, 0x63, 0x64, 0x63, 0x0, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x1, 0xf8, 0x3, 0x32, - 0x0, 0x13, 0x0, 0x59, 0x40, 0x22, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0xd, 0x13, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x2, 0x1, 0x0, 0x6, 0x8, 0xf, 0xf, 0x2, 0xc, 0xb, 0x4, 0xa, - 0x9, 0x1, 0x3, 0x0, 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, - 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x1, 0xf8, 0x55, 0x13, 0x17, 0x39, 0x4c, 0x40, 0x55, 0x55, 0x42, 0x53, 0x50, 0x29, 0x36, - 0x1, 0x54, 0x3e, 0x1d, 0x22, 0x47, 0xfe, 0x76, 0x3, 0x32, 0xfe, 0xab, 0x3d, 0x25, 0x31, 0x75, - 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x0, 0xf8, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x13, 0x0, 0x5d, - 0x40, 0x24, 0x1, 0x14, 0x14, 0x40, 0x15, 0xc, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, - 0x6, 0x0, 0x3, 0x8, 0x9, 0x13, 0x12, 0xf, 0x3, 0xe, 0x7, 0xc, 0x9, 0x11, 0x10, 0x2, - 0xd, 0xc, 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, - 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0xc3, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x35, 0xd0, 0x3b, 0x55, 0x40, 0x2, - 0xa2, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0xfd, 0x47, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, - 0x0, 0x2, 0x0, 0x0, 0xfe, 0xf1, 0x0, 0xb4, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x15, 0x0, 0x47, - 0x40, 0x17, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x3, 0x15, 0x14, 0x13, 0xf, 0xc, 0x6, 0x0, - 0x9, 0x15, 0x14, 0x2, 0xe, 0x0, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xf, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x3, 0x14, 0x7, 0x27, 0x36, 0x37, 0x36, 0x35, 0x11, 0x33, 0xb4, 0x20, 0x16, - 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xd, 0x81, 0x26, 0x33, 0x10, 0x10, 0x54, 0x2, 0xa2, 0x16, - 0x1f, 0x1f, 0x16, 0x16, 0x20, 0x1f, 0xfd, 0x2f, 0xc9, 0x2e, 0x3f, 0x18, 0x2a, 0x27, 0x5f, 0x2, - 0x19, 0x0, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x2, 0x1, 0x3, 0x32, 0x0, 0xb, 0x0, 0x56, - 0x40, 0x20, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, 0x8, 0x7, 0x6, 0x5, - 0x4, 0x3, 0x0, 0xa, 0x9, 0x2, 0x7, 0x6, 0x4, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, - 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x3, 0x7, 0x15, 0x23, 0x11, 0x33, 0x11, 0x37, - 0x33, 0x7, 0x2, 0x1, 0x5c, 0xa8, 0x49, 0x55, 0x55, 0xce, 0x68, 0xb5, 0x1, 0x23, 0x48, 0xdb, - 0x3, 0x32, 0xfe, 0x10, 0xcf, 0xb5, 0x0, 0x1, 0x0, 0x5a, 0xff, 0xf5, 0x0, 0xe6, 0x3, 0x32, - 0x0, 0x9, 0x0, 0x46, 0x40, 0x17, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x5, 0x4, 0x3, - 0x2, 0x0, 0x9, 0x8, 0x0, 0x4, 0x3, 0x4, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x17, 0x22, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x17, 0x16, 0x17, 0xe6, 0x8c, 0x55, 0x8, 0xb, 0x24, 0xb, 0x94, 0x2, 0xa9, 0xfd, 0x6c, - 0x34, 0x11, 0x15, 0x3, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x16, 0x2, 0x1a, 0x0, 0x1c, - 0x0, 0x69, 0x40, 0x2b, 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0x0, 0x16, 0x12, 0x1c, 0x12, 0x11, 0x10, - 0xf, 0xe, 0xd, 0x9, 0x8, 0x7, 0x6, 0x2, 0x1, 0x0, 0xb, 0x4, 0x8, 0x14, 0x18, 0x14, - 0x2, 0x11, 0x10, 0x2, 0xf, 0xe, 0x8, 0x7, 0x1, 0x5, 0x0, 0x1, 0x1, 0xf, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, 0x34, 0x23, - 0x22, 0x7, 0x11, 0x23, 0x11, 0x34, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, - 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x3, 0x16, 0x55, 0x63, 0x4d, 0x2c, 0x55, 0x62, - 0x47, 0x33, 0x55, 0x55, 0x36, 0x55, 0x5e, 0x30, 0x3d, 0x60, 0x49, 0x2e, 0x35, 0x1, 0x4d, 0x84, - 0x4f, 0xfe, 0x7e, 0x1, 0x4d, 0x84, 0x47, 0xfe, 0x76, 0x2, 0x12, 0x35, 0x3d, 0x49, 0x49, 0x2b, - 0x32, 0x60, 0x0, 0x1, 0x0, 0x5f, 0x0, 0x0, 0x1, 0xf8, 0x2, 0x1a, 0x0, 0x13, 0x0, 0x59, - 0x40, 0x22, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0xd, 0x13, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, - 0x2, 0x1, 0x0, 0x6, 0x8, 0xf, 0xf, 0x2, 0xc, 0xb, 0x2, 0xa, 0x9, 0x1, 0x3, 0x0, - 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x10, - 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, - 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x1, 0xf8, 0x55, - 0x12, 0x16, 0x39, 0x4c, 0x42, 0x55, 0x55, 0x42, 0x53, 0x51, 0x28, 0x36, 0x1, 0x54, 0x3f, 0x1c, - 0x22, 0x47, 0xfe, 0x76, 0x2, 0x11, 0x34, 0x3d, 0x23, 0x2e, 0x75, 0x0, 0x0, 0x2, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x2, 0x1a, 0x0, 0xf, 0x0, 0x17, 0x0, 0x45, 0x40, 0x17, 0x1, 0x18, - 0x18, 0x40, 0x19, 0x0, 0x14, 0x10, 0x8, 0x0, 0x16, 0x7, 0x4, 0x12, 0x7, 0xc, 0xc, 0x2, - 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x18, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0xe1, 0x41, 0x38, 0x5e, 0x62, 0x37, - 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x1, 0x8, 0x8d, 0x46, - 0x3d, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x0, 0x2, - 0x0, 0x5f, 0xfe, 0xe4, 0x1, 0xfe, 0x2, 0x1a, 0x0, 0x10, 0x0, 0x1b, 0x0, 0x5c, 0x40, 0x23, - 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x13, 0xb, 0x6, 0x16, 0x15, 0x11, 0xb, 0xa, 0x9, 0x8, - 0x7, 0x6, 0x0, 0x18, 0x7, 0x4, 0xd, 0x2, 0xa, 0x9, 0x2, 0x8, 0x7, 0x0, 0x4, 0x1, - 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, 0x3c, 0x3f, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x7, - 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x1, 0xfe, 0x3f, 0x34, 0x53, 0x4f, 0x35, 0x55, 0x55, 0x35, - 0x51, 0x4b, 0x35, 0x44, 0x5b, 0x72, 0x54, 0x29, 0x24, 0x4e, 0x3d, 0x1d, 0x23, 0x1, 0xf, 0x92, - 0x48, 0x3b, 0x29, 0xfe, 0xc1, 0x3, 0x2e, 0x2e, 0x36, 0x38, 0x48, 0x8f, 0xc7, 0x41, 0xfe, 0xe3, - 0x34, 0x29, 0x30, 0x0, 0x0, 0x2, 0x0, 0x32, 0xfe, 0xe3, 0x1, 0xd1, 0x2, 0x1a, 0x0, 0x10, - 0x0, 0x19, 0x0, 0x5c, 0x40, 0x23, 0x1, 0x1a, 0x1a, 0x40, 0x1b, 0x0, 0x14, 0xe, 0x2, 0x16, - 0x12, 0x11, 0x10, 0xf, 0xe, 0x8, 0x2, 0x1, 0x0, 0x18, 0x7, 0x4, 0x10, 0xf, 0x2, 0xc, - 0x2, 0x4, 0x1, 0x1, 0x0, 0x0, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3f, 0x3f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x1a, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1a, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, - 0x33, 0x3, 0x11, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0xd1, 0x55, 0x2d, 0x5a, 0x52, - 0x33, 0x3e, 0x40, 0x36, 0x4c, 0x60, 0x28, 0x55, 0x55, 0x2b, 0x4e, 0x76, 0x7b, 0x4d, 0xfe, 0xe3, - 0x1, 0x45, 0x2e, 0x3f, 0x4b, 0x93, 0x83, 0x46, 0x3a, 0x37, 0x2e, 0xfe, 0x6c, 0x1, 0x14, 0x41, - 0xbf, 0xd3, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x0, 0x1, 0x92, 0x2, 0x1a, 0x0, 0x11, 0x0, 0x61, - 0x40, 0x26, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, 0xe, 0x3, 0x1, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x6, 0x5, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x8, 0x10, 0x2, 0xd, - 0xc, 0x2, 0x9, 0x8, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, - 0x3c, 0x3f, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x12, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x33, 0x15, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, - 0x36, 0x33, 0x32, 0x1, 0x92, 0x24, 0x23, 0x21, 0x3d, 0x2a, 0x4b, 0xd3, 0x33, 0x55, 0x2f, 0x40, - 0x34, 0x1, 0xfe, 0x3e, 0x11, 0x3e, 0xfe, 0xad, 0x40, 0x40, 0x1, 0xd2, 0x2b, 0x33, 0x0, 0x1, - 0x0, 0x28, 0xff, 0xf8, 0x1, 0x8b, 0x2, 0x1b, 0x0, 0x29, 0x0, 0x4a, 0x40, 0x19, 0x1, 0x2a, - 0x2a, 0x40, 0x2b, 0x0, 0x1c, 0xb, 0x9, 0x22, 0x1b, 0x15, 0xd, 0x8, 0x0, 0x1e, 0x7, 0x19, - 0x19, 0x2, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x8, 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, - 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, - 0x1, 0x8b, 0x39, 0x32, 0x4c, 0x38, 0x2e, 0x14, 0x32, 0x28, 0x41, 0x40, 0x62, 0x21, 0x13, 0x3d, - 0x43, 0x1a, 0x33, 0x37, 0x30, 0x48, 0x53, 0x4c, 0x21, 0x46, 0x30, 0x26, 0x19, 0x1e, 0x21, 0xf, - 0x3f, 0x47, 0x18, 0x31, 0x88, 0x48, 0x26, 0x22, 0x13, 0x8, 0x1e, 0x3f, 0x2f, 0x42, 0x26, 0x1b, - 0x10, 0x1f, 0x22, 0x16, 0x2b, 0x38, 0x45, 0x26, 0x22, 0x2c, 0x3e, 0x23, 0xf, 0x12, 0x21, 0x1e, - 0x1a, 0xb, 0x23, 0x27, 0x16, 0x2c, 0x0, 0x1, 0x0, 0x26, 0xff, 0xf8, 0x1, 0x27, 0x2, 0x8c, - 0x0, 0x12, 0x0, 0x66, 0x40, 0x28, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0xe, 0xd, 0x6, 0x5, - 0x12, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x0, 0x12, 0x8, - 0x0, 0xa, 0x9, 0xc, 0xb, 0x8, 0x3, 0x7, 0x2, 0x0, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x22, 0x27, 0x26, 0x35, 0x11, - 0x23, 0x35, 0x17, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x1, 0x27, 0x4f, - 0x31, 0x39, 0x48, 0x48, 0x55, 0x64, 0x64, 0x33, 0x31, 0x8, 0x27, 0x2c, 0x52, 0x1, 0x33, 0x42, - 0x1, 0x7b, 0x7a, 0x42, 0xfe, 0xcc, 0x28, 0x34, 0x0, 0x1, 0x0, 0x5f, 0xff, 0xf8, 0x1, 0xec, - 0x2, 0x12, 0x0, 0x13, 0x0, 0x59, 0x40, 0x22, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0x2, 0x13, - 0x12, 0x11, 0xb, 0xa, 0x9, 0x8, 0x2, 0x1, 0x0, 0xf, 0x8, 0x4, 0x13, 0x12, 0xa, 0x3, - 0x9, 0x2, 0x4, 0x1, 0x1, 0x0, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x14, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x21, - 0x23, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x11, 0x33, 0x1, 0xec, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, 0x3a, 0x4d, - 0x35, 0x55, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, - 0x90, 0x0, 0x0, 0x1, 0x0, 0x14, 0x0, 0x0, 0x1, 0xdc, 0x2, 0x12, 0x0, 0x9, 0x0, 0x43, - 0x40, 0x16, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x7, 0x6, 0x3, 0x0, 0x2, 0x1, 0x1, 0x9, - 0x4, 0x3, 0x3, 0x0, 0x2, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, - 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x33, 0x13, 0x17, 0x33, 0x37, 0x13, 0x1, 0xdc, 0xb8, - 0x58, 0xb8, 0x5b, 0x77, 0x10, 0x4, 0x12, 0x77, 0x2, 0x12, 0xfd, 0xee, 0x2, 0x12, 0xfe, 0x95, - 0x41, 0x41, 0x1, 0x6b, 0x0, 0x1, 0x0, 0x20, 0x0, 0x0, 0x2, 0xe9, 0x2, 0x12, 0x0, 0x12, - 0x0, 0x51, 0x40, 0x1f, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x10, 0xf, 0xb, 0xa, 0x4, 0x3, - 0x8, 0x0, 0x7, 0x6, 0x2, 0x3, 0x1, 0x1, 0x12, 0xe, 0xd, 0x9, 0x8, 0x5, 0x0, 0x2, - 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, - 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x23, 0x7, 0x3, 0x23, 0x3, 0x33, 0x13, 0x33, 0x37, - 0x13, 0x33, 0x13, 0x33, 0x37, 0x13, 0x2, 0xe9, 0x9e, 0x52, 0x71, 0x4, 0x12, 0x5f, 0x51, 0xa2, - 0x57, 0x72, 0x3, 0xf, 0x63, 0x50, 0x72, 0x3, 0xf, 0x63, 0x2, 0x12, 0xfd, 0xee, 0x1, 0x8c, - 0x46, 0xfe, 0xba, 0x2, 0x12, 0xfe, 0x54, 0x42, 0x1, 0x6a, 0xfe, 0x54, 0x42, 0x1, 0x6a, 0x0, - 0x0, 0x1, 0x0, 0xf, 0x0, 0x0, 0x1, 0xd6, 0x2, 0x12, 0x0, 0xb, 0x0, 0x4f, 0x40, 0x1d, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x2, 0xb, 0xa, 0x6, 0x5, 0x4, 0x0, 0xa, 0x9, - 0x7, 0x3, 0x6, 0x2, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, - 0x7, 0x23, 0x13, 0x27, 0x33, 0x17, 0x37, 0x33, 0x7, 0x1, 0xd6, 0x64, 0x83, 0x80, 0x60, 0xb0, - 0x9a, 0x63, 0x6f, 0x6a, 0x5f, 0x99, 0xd6, 0xd6, 0x1, 0x1c, 0xf6, 0xb6, 0xb6, 0xfd, 0x0, 0x1, - 0x0, 0x14, 0xfe, 0xdf, 0x1, 0xcd, 0x2, 0x11, 0x0, 0xe, 0x0, 0x4a, 0x40, 0x1a, 0x1, 0xf, - 0xf, 0x40, 0x10, 0x0, 0xd, 0xc, 0xa, 0x9, 0x4, 0x0, 0x4, 0x7, 0x3, 0x3, 0x0, 0xe, - 0xb, 0xa, 0x3, 0x0, 0x2, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0xa, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x3f, 0x1, - 0x3, 0x33, 0x13, 0x33, 0x13, 0x1, 0xcd, 0xcf, 0x3f, 0x9d, 0x8, 0x3d, 0x24, 0x23, 0x19, 0xf, - 0xb2, 0x5b, 0x7d, 0x4, 0x87, 0x2, 0x11, 0xfd, 0x98, 0xbd, 0xd, 0x42, 0x6, 0x28, 0x25, 0x52, - 0x31, 0x2, 0x1a, 0xfe, 0x59, 0x1, 0xa7, 0x0, 0x0, 0x1, 0x0, 0x32, 0x0, 0x0, 0x1, 0x9c, - 0x2, 0x12, 0x0, 0x9, 0x0, 0x59, 0x40, 0x21, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, - 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x9, 0x8, 0x7, 0x0, 0x4, 0x3, 0x7, 0x5, - 0x6, 0x5, 0x2, 0x1, 0x0, 0x1, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0xa, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x29, - 0x1, 0x35, 0x1, 0x23, 0x35, 0x21, 0x15, 0x1, 0x21, 0x1, 0x9c, 0xfe, 0x96, 0x1, 0x3, 0xef, - 0x1, 0x56, 0xfe, 0xf7, 0x1, 0x9, 0x3c, 0x1, 0x94, 0x42, 0x33, 0xfe, 0x64, 0x0, 0x0, 0x1, - 0x0, 0x3b, 0xff, 0x39, 0x1, 0x1e, 0x3, 0x32, 0x0, 0x1b, 0x0, 0x69, 0x40, 0x29, 0x1, 0x1c, - 0x1c, 0x40, 0x1d, 0x0, 0x1b, 0x18, 0x17, 0x15, 0x14, 0x12, 0x11, 0xe, 0xd, 0xa, 0x9, 0x7, - 0x6, 0x4, 0x3, 0x0, 0x1b, 0x1a, 0x7, 0x0, 0x6, 0x7, 0x7, 0xf, 0xe, 0x7, 0xc, 0x1, - 0x0, 0xd, 0xc, 0x4, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x6, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x23, 0x22, 0x35, 0x11, 0x34, 0x23, 0x35, 0x32, 0x35, 0x11, - 0x34, 0x3b, 0x1, 0x15, 0x23, 0x22, 0x15, 0x11, 0x14, 0x7, 0x15, 0x16, 0x15, 0x11, 0x14, 0x3b, - 0x1, 0x1, 0x1e, 0x48, 0x5d, 0x3e, 0x3e, 0x5d, 0x48, 0x26, 0x2d, 0x4a, 0x4a, 0x2d, 0x26, 0xc7, - 0x6e, 0x1, 0x35, 0x4e, 0x34, 0x4e, 0x1, 0x18, 0x6e, 0x39, 0x38, 0xfe, 0xd3, 0x43, 0xc, 0x2, - 0xc, 0x43, 0xfe, 0xb6, 0x38, 0x0, 0x0, 0x1, 0x0, 0x69, 0xff, 0x38, 0x0, 0xad, 0x3, 0x56, - 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, - 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, - 0x59, 0x17, 0x23, 0x11, 0x33, 0xad, 0x44, 0x44, 0xc8, 0x4, 0x1e, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0xff, 0x39, 0x1, 0x1e, 0x3, 0x32, 0x0, 0x1b, 0x0, 0x5e, 0x40, 0x22, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0x0, 0x14, 0x13, 0x8, 0x7, 0x1b, 0x19, 0x18, 0x15, 0x14, 0x11, 0x10, 0xe, 0xd, 0xb, - 0xa, 0x7, 0x6, 0x3, 0x2, 0x0, 0x6, 0x5, 0x16, 0x15, 0x4, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x22, 0x15, 0x11, 0x14, 0x2b, 0x1, 0x35, - 0x33, 0x32, 0x35, 0x11, 0x34, 0x37, 0x35, 0x26, 0x35, 0x11, 0x34, 0x2b, 0x1, 0x35, 0x33, 0x32, - 0x15, 0x11, 0x14, 0x33, 0x1, 0x1e, 0x3e, 0x5d, 0x48, 0x26, 0x2d, 0x4a, 0x4a, 0x2d, 0x26, 0x48, - 0x5d, 0x3e, 0x1, 0x2a, 0x4e, 0xfe, 0xcb, 0x6e, 0x39, 0x38, 0x1, 0x4a, 0x43, 0xc, 0x2, 0xc, - 0x43, 0x1, 0x2d, 0x38, 0x39, 0x6e, 0xfe, 0xe8, 0x4e, 0x0, 0x0, 0x1, 0x0, 0xb, 0x2, 0x7c, - 0x1, 0x3c, 0x2, 0xdf, 0x0, 0x11, 0x0, 0x40, 0x40, 0x13, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, - 0x11, 0xd, 0x7, 0x8, 0x0, 0x5, 0x7, 0xa, 0xa, 0x2, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, - 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x1, 0x3c, 0x31, 0x2f, 0x16, 0x46, - 0x15, 0x22, 0x1c, 0x22, 0x30, 0x35, 0x17, 0x47, 0xd, 0x13, 0x6, 0xf, 0x1a, 0x2, 0xa2, 0x26, - 0x1f, 0x19, 0x34, 0x29, 0x21, 0x2, 0x4, 0x14, 0x0, 0x1, 0x0, 0x3d, 0x0, 0x0, 0x1, 0xed, - 0x3, 0x32, 0x0, 0xb, 0x0, 0x60, 0x40, 0x26, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x5, 0x4, 0x1, 0x3, 0x0, 0x7, - 0xb, 0xa, 0x7, 0x3, 0x6, 0x9, 0x8, 0x4, 0x3, 0x2, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x1, 0xed, 0xb0, 0x50, 0xb0, 0xb0, 0x50, 0xb0, 0x1, 0xce, 0xfe, 0x32, 0x1, 0xce, - 0x42, 0x1, 0x22, 0xfe, 0xde, 0x0, 0x0, 0x1, 0x0, 0x32, 0xff, 0x93, 0x1, 0xa3, 0x2, 0x7b, - 0x0, 0x1b, 0x0, 0x55, 0x40, 0x1d, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x1b, 0x19, 0x15, 0x13, - 0x17, 0x12, 0x10, 0xf, 0xe, 0xd, 0x9, 0x5, 0x4, 0x3, 0x2, 0x0, 0xf, 0xe, 0x4, 0x3, - 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, - 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0xa3, 0x33, 0x47, 0x3d, 0x53, 0x30, 0x37, 0x35, 0x2f, 0x56, - 0x3d, 0x3e, 0x2b, 0x31, 0x26, 0x37, 0x78, 0x78, 0x46, 0x28, 0x3f, 0x3a, 0xb, 0x67, 0x65, 0x9, - 0x3e, 0x47, 0x81, 0x82, 0x47, 0x41, 0x8, 0x62, 0x64, 0xb, 0x30, 0x31, 0x27, 0xcb, 0xc8, 0x31, - 0x0, 0x1, 0x0, 0x3d, 0xff, 0xf6, 0x2, 0x4a, 0x2, 0xdc, 0x0, 0x2b, 0x0, 0x75, 0x40, 0x31, - 0x1, 0x2c, 0x2c, 0x40, 0x2d, 0x0, 0x2b, 0x28, 0x19, 0x6, 0x26, 0x24, 0x23, 0x22, 0x21, 0x20, - 0x1f, 0x18, 0xe, 0xd, 0xc, 0xb, 0x9, 0x8, 0x0, 0x9, 0x7, 0x8, 0x21, 0x20, 0xf, 0x3, - 0xe, 0x7, 0x23, 0x22, 0xd, 0x3, 0xc, 0x1d, 0x7, 0x14, 0x14, 0x8, 0x2, 0x1, 0x1, 0x8, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, - 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, - 0x0, 0x2c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2c, 0xff, - 0xc0, 0x38, 0x59, 0x25, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x6, 0x7, 0x35, 0x36, 0x3d, 0x1, - 0x23, 0x35, 0x33, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x7, 0x26, 0x27, 0x26, - 0x23, 0x22, 0x1d, 0x1, 0x33, 0x15, 0x23, 0x15, 0x14, 0x7, 0x16, 0x33, 0x32, 0x36, 0x37, 0x2, - 0x4a, 0x1e, 0xa2, 0x35, 0x2a, 0x18, 0x3e, 0x2f, 0x69, 0x65, 0x5e, 0x5e, 0x1, 0x1, 0x28, 0x2f, - 0x5d, 0x39, 0x2a, 0x22, 0x27, 0x2f, 0x24, 0xe, 0x1c, 0x2b, 0x6a, 0x63, 0x63, 0x2, 0x52, 0x3b, - 0x42, 0x3e, 0xd, 0xa5, 0xaf, 0x11, 0x9, 0x23, 0x39, 0x2, 0x40, 0x1, 0x54, 0xbd, 0x3d, 0x7b, - 0x5a, 0x3a, 0x46, 0x1a, 0x16, 0x32, 0x2e, 0x2d, 0xb, 0x16, 0x95, 0x7e, 0x3d, 0xb6, 0x10, 0xa, - 0x3c, 0x34, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x3d, 0xff, 0x7c, 0x1, 0x9d, 0x2, 0xff, 0x0, 0x33, - 0x0, 0x43, 0x0, 0x5b, 0x40, 0x21, 0x1, 0x44, 0x44, 0x40, 0x45, 0x0, 0x40, 0x38, 0x20, 0x9, - 0x3c, 0x34, 0x32, 0x2e, 0x26, 0x1f, 0x19, 0x17, 0x15, 0xd, 0x8, 0x0, 0xb, 0x7, 0x4, 0x22, - 0x7, 0x1d, 0x1d, 0x4, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x44, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x44, 0xff, 0xc0, 0x38, 0x59, 0x25, - 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, - 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, - 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x7, - 0x6, 0x7, 0x16, 0x27, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x1, 0x9d, 0x38, 0x32, 0x4c, 0x32, 0x27, 0x1f, 0x30, 0x26, 0x3f, 0x40, 0x65, - 0x26, 0x9, 0x3e, 0x53, 0x21, 0x2b, 0x7b, 0x6a, 0x35, 0x2f, 0x47, 0x52, 0x4a, 0x1f, 0x46, 0x2e, - 0x27, 0x1a, 0x1f, 0x2b, 0x23, 0x23, 0x3e, 0x1d, 0x2f, 0x18, 0x1c, 0x34, 0x68, 0x4c, 0x1e, 0x1a, - 0x28, 0x29, 0x1c, 0x20, 0x20, 0x1c, 0x29, 0x28, 0x1a, 0x1e, 0xa, 0x46, 0x27, 0x21, 0xe, 0xc, - 0x1e, 0x3a, 0x2d, 0x45, 0x28, 0x1e, 0x8, 0x24, 0x30, 0x27, 0x31, 0x47, 0x7a, 0x2b, 0x3a, 0x4d, - 0x44, 0x26, 0x22, 0x2b, 0x3a, 0x23, 0x10, 0x13, 0x23, 0x20, 0x1e, 0x15, 0x15, 0x28, 0x21, 0x37, - 0x46, 0x34, 0x2c, 0x33, 0x1c, 0x36, 0xdf, 0x3b, 0x20, 0x1c, 0x1c, 0x20, 0x3b, 0x3b, 0x20, 0x1c, - 0x1c, 0x20, 0x0, 0x1, 0x0, 0x3b, 0x0, 0xda, 0x1, 0x47, 0x1, 0xe6, 0x0, 0xb, 0x0, 0x35, - 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x1, 0x47, 0x4e, 0x38, 0x37, 0x4f, 0x4f, 0x37, 0x38, 0x4e, 0x1, 0x60, 0x37, 0x4f, 0x4f, - 0x37, 0x38, 0x4e, 0x4e, 0x0, 0x2, 0x0, 0x55, 0xff, 0xa9, 0x1, 0xfd, 0x3, 0x31, 0x0, 0x8, - 0x0, 0xe, 0x0, 0x55, 0x40, 0x1f, 0x1, 0xf, 0xf, 0x40, 0x10, 0x9, 0x1, 0x0, 0xe, 0xd, - 0xb, 0xa, 0x9, 0x8, 0x4, 0x0, 0x9, 0xa, 0x7, 0x7, 0xc, 0xb, 0xe, 0xd, 0x8, 0x3, - 0x7, 0x4, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x3b, 0x1, 0x17, 0x7, 0x11, 0x23, 0x3, 0x33, 0x1, 0xb, 0x9, 0x48, 0x65, 0x65, 0x48, 0x9, - 0xf2, 0x58, 0x54, 0x1, 0xad, 0x1, 0xd7, 0x65, 0x48, 0x48, 0x65, 0x43, 0x1, 0xfc, 0xbc, 0x3, - 0x88, 0x0, 0x0, 0x1, 0x0, 0x5f, 0xff, 0x39, 0x2, 0x0, 0x3, 0x2c, 0x0, 0x2a, 0x0, 0x55, - 0x40, 0x1e, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x0, 0x8, 0x6, 0x28, 0x25, 0x1e, 0x1d, 0x1c, 0x1b, - 0x14, 0x11, 0xb, 0x5, 0x0, 0x17, 0x7, 0x21, 0x21, 0x1d, 0x1c, 0x3, 0x1, 0x1, 0x1d, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1d, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x6, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x6, 0x15, 0x14, 0x16, - 0x2, 0x0, 0x5d, 0x47, 0x3f, 0x33, 0x27, 0x1d, 0x27, 0x23, 0x30, 0x21, 0x1f, 0x1f, 0x21, 0x4c, - 0x2e, 0x2b, 0x32, 0x1c, 0x19, 0x55, 0x64, 0x53, 0x62, 0x33, 0x28, 0x4f, 0x7c, 0xae, 0x51, 0x65, - 0x1d, 0x3f, 0x13, 0x38, 0x2b, 0x26, 0x2b, 0x27, 0x26, 0x31, 0x31, 0x38, 0x7b, 0x30, 0x28, 0x39, - 0x25, 0x20, 0x2b, 0xfc, 0xc1, 0x3, 0x3d, 0x57, 0x5f, 0x39, 0x2d, 0x37, 0x42, 0x84, 0x1c, 0x2d, - 0x98, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x6d, 0x0, 0xbb, 0x3, 0x7, 0x0, 0x3, 0x0, 0x37, - 0x40, 0xe, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x0, 0x2, 0x1, 0x1, 0x2, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x7, 0x23, 0x37, 0xbb, 0x3e, 0x42, 0x35, 0x3, - 0x7, 0x9a, 0x99, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x2, 0x6b, 0x1, 0x63, 0x2, 0xd7, 0x0, 0xb, - 0x0, 0x17, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x12, 0xc, 0x6, 0x0, - 0x15, 0x9, 0xf, 0x3, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x18, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x63, 0x20, 0x16, 0x16, 0x1f, 0x1f, - 0x16, 0x17, 0x1f, 0xbc, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x2, 0xa1, 0x16, 0x20, - 0x20, 0x16, 0x16, 0x20, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x0, 0x0, 0x2, - 0x0, 0x20, 0x0, 0x0, 0x3, 0x75, 0x3, 0xc, 0x0, 0xf, 0x0, 0x12, 0x0, 0x7d, 0x40, 0x35, - 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x11, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x5, 0x2, 0x1, 0x0, 0x9, 0x8, 0x8, 0x6, 0xd, 0xc, 0x8, 0xb, 0xa, - 0xf, 0xe, 0x8, 0x0, 0x12, 0x10, 0x7, 0x3, 0x2, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x3, - 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x2f, - 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x35, 0x23, 0x7, - 0x23, 0x1, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x25, 0x11, 0x3, 0x3, 0x75, - 0xfe, 0x6e, 0xdd, 0x8e, 0x58, 0x1, 0xb8, 0x1, 0x8c, 0xfe, 0xd5, 0x1, 0x5, 0xfe, 0xfb, 0x1, - 0x3c, 0xfe, 0x6e, 0xb9, 0xf6, 0xf6, 0x3, 0xc, 0x48, 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0xf4, 0x1, - 0x49, 0xfe, 0xb7, 0x0, 0x0, 0x3, 0x0, 0x57, 0xff, 0xc5, 0x2, 0xe7, 0x3, 0x48, 0x0, 0x15, - 0x0, 0x1e, 0x0, 0x27, 0x0, 0x5e, 0x40, 0x23, 0x1, 0x28, 0x28, 0x40, 0x29, 0x0, 0x27, 0x21, - 0x18, 0x11, 0x6, 0x25, 0x1f, 0x19, 0x16, 0x14, 0x13, 0xb, 0x9, 0x8, 0x0, 0x1b, 0x8, 0x4, - 0x13, 0x12, 0x8, 0x7, 0xf, 0x3, 0x4, 0x1, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0xb, 0x0, 0x28, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x28, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x7, 0x34, 0x27, 0x1, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x3, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x2, 0xe7, 0x69, 0x5a, - 0x84, 0x4a, 0x41, 0x27, 0x4f, 0x39, 0x81, 0x6a, 0x5a, 0x85, 0x43, 0x3d, 0x25, 0x4f, 0x36, 0x89, - 0x5a, 0x53, 0xfe, 0xfb, 0x2f, 0x3b, 0x75, 0x40, 0x39, 0x8e, 0x2b, 0x35, 0x75, 0x40, 0x39, 0x4c, - 0x1, 0x86, 0xc6, 0x6c, 0x5c, 0x20, 0x53, 0x7a, 0x6a, 0xdd, 0xc7, 0x6b, 0x5c, 0x1b, 0x4f, 0x73, - 0x6a, 0xe5, 0xa8, 0x59, 0xfd, 0xd6, 0x1b, 0x64, 0x59, 0x1, 0xb4, 0x16, 0x64, 0x58, 0x87, 0x9f, - 0x5a, 0x0, 0x0, 0x1, 0x0, 0x1d, 0x0, 0x0, 0x2, 0x79, 0x3, 0xc, 0x0, 0xf, 0x0, 0x68, - 0x40, 0x2b, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xe, 0xd, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, - 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xa, 0x9, 0x2, 0x3, 0x1, 0x7, 0x8, 0x7, 0x4, 0x3, - 0x3, 0x6, 0x5, 0x1, 0xf, 0xc, 0xb, 0x3, 0x0, 0x3, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, - 0x23, 0x35, 0x33, 0x3, 0x33, 0x13, 0x33, 0x13, 0x2, 0x79, 0xf5, 0x8a, 0x98, 0x57, 0x90, 0x83, - 0xf5, 0x63, 0xc7, 0x7, 0xc7, 0x3, 0xc, 0xfe, 0x4e, 0x3f, 0xfe, 0xe5, 0x1, 0x1b, 0x3f, 0x1, - 0xb2, 0xfe, 0x97, 0x1, 0x69, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xb6, 0x1, 0x74, 0x3, 0x35, - 0x0, 0x1d, 0x0, 0x26, 0x0, 0x5b, 0x40, 0x21, 0x1, 0x27, 0x27, 0x40, 0x28, 0xc, 0x24, 0x1b, - 0xf, 0xd, 0xc, 0x2, 0x26, 0x22, 0x1e, 0x1c, 0x1b, 0x15, 0xc, 0x8, 0x7, 0x3, 0x0, 0x7, - 0x5, 0x20, 0x7, 0x19, 0x5, 0x11, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x2f, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x27, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, - 0x59, 0x13, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, - 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, - 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0xd7, 0x31, 0x28, 0x13, 0x34, 0x40, 0x85, 0x5, - 0x6, 0x5, 0x43, 0x7, 0x5, 0x34, 0x34, 0x38, 0x23, 0x27, 0x2f, 0x29, 0x38, 0x32, 0x27, 0x25, - 0x2b, 0x57, 0x4b, 0x35, 0x27, 0x2, 0xff, 0x18, 0x34, 0x1a, 0x7d, 0xa0, 0x29, 0x14, 0x10, 0xf, - 0x9, 0x16, 0x25, 0x1b, 0x1d, 0x39, 0x35, 0x21, 0x1d, 0xe, 0x30, 0x43, 0xa7, 0xe, 0x43, 0x39, - 0x2e, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xb5, 0x1, 0x87, 0x3, 0x33, 0x0, 0xf, 0x0, 0x1f, - 0x0, 0x40, 0x40, 0x13, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1c, 0x18, 0x10, 0x8, 0x0, 0x14, - 0x7, 0xc, 0xc, 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, - 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, - 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x36, 0x1, 0x87, 0x35, 0x2d, 0x44, 0x46, 0x2c, 0x34, 0x34, 0x2c, 0x46, 0x44, 0x2d, 0x35, - 0x3e, 0x1f, 0x1b, 0x2e, 0x2e, 0x1b, 0x1f, 0x1f, 0x1b, 0x2e, 0x2e, 0x1b, 0x1f, 0x2, 0x73, 0x61, - 0x33, 0x2a, 0x2c, 0x32, 0x60, 0x60, 0x33, 0x2d, 0x2b, 0x33, 0x62, 0x48, 0x26, 0x22, 0x22, 0x26, - 0x48, 0x48, 0x25, 0x22, 0x22, 0x25, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x2, 0xda, 0x2, 0x1b, - 0x0, 0x27, 0x0, 0x2e, 0x0, 0x36, 0x0, 0x74, 0x40, 0x31, 0x1, 0x37, 0x37, 0x40, 0x38, 0x0, - 0x21, 0x1c, 0xc, 0x7, 0x3, 0x32, 0x2f, 0x2e, 0x28, 0x27, 0x1d, 0x17, 0x12, 0x8, 0x1, 0x0, - 0x30, 0x2f, 0x1, 0x3, 0x0, 0x7, 0x2e, 0x28, 0x17, 0x3, 0x16, 0x34, 0x7, 0xa, 0x2c, 0x1a, - 0x7, 0x1f, 0x23, 0x1f, 0x2, 0xe, 0xa, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x37, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x37, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x14, 0x33, - 0x32, 0x37, 0x36, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x3b, 0x1, 0x27, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0xf, 0x1, 0x23, 0x22, 0x15, 0x14, - 0x33, 0x32, 0x37, 0x2, 0xda, 0xfe, 0xc9, 0x7f, 0x26, 0x26, 0x20, 0x13, 0x30, 0x4b, 0x64, 0x6c, - 0x32, 0x37, 0x6e, 0x4f, 0x2f, 0x34, 0x41, 0x38, 0x50, 0x5e, 0x1, 0x2, 0x61, 0x42, 0x30, 0x1c, - 0x46, 0x52, 0x6e, 0x29, 0x32, 0x5e, 0x54, 0x30, 0x35, 0x57, 0x6, 0x13, 0x16, 0x33, 0x6f, 0xd, - 0x52, 0x4e, 0x7e, 0x66, 0x3d, 0x28, 0xf7, 0xb8, 0x13, 0x10, 0x16, 0x31, 0x50, 0x4d, 0x4d, 0x26, - 0x2a, 0x51, 0x4b, 0x2b, 0x25, 0x3a, 0x67, 0x20, 0x42, 0x24, 0x4d, 0x4e, 0x3c, 0x42, 0x7b, 0x11, - 0x56, 0x23, 0x28, 0xa1, 0x3c, 0x65, 0x57, 0x36, 0x0, 0x3, 0x0, 0x32, 0xff, 0xc4, 0x1, 0xe1, - 0x2, 0x48, 0x0, 0x15, 0x0, 0x1c, 0x0, 0x23, 0x0, 0x61, 0x40, 0x25, 0x1, 0x24, 0x24, 0x40, - 0x25, 0x0, 0x23, 0x18, 0x11, 0x6, 0x21, 0x1d, 0x19, 0x16, 0x14, 0x13, 0xb, 0x9, 0x8, 0x0, - 0x1b, 0x7, 0x4, 0x1f, 0x7, 0xf, 0x13, 0x12, 0x8, 0x7, 0xf, 0x2, 0x4, 0x1, 0x1, 0xb, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, - 0x16, 0x7, 0x34, 0x27, 0x3, 0x16, 0x33, 0x32, 0x3, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x1, - 0xe1, 0x41, 0x38, 0x5e, 0x2c, 0x25, 0x20, 0x4a, 0x31, 0x4e, 0x3f, 0x38, 0x61, 0x37, 0x2c, 0x22, - 0x4a, 0x37, 0x3f, 0x58, 0x11, 0x9f, 0x16, 0x1b, 0x7f, 0x3c, 0x1c, 0x27, 0x80, 0x1c, 0x1, 0x8, - 0x8d, 0x46, 0x3d, 0xd, 0x41, 0x63, 0x45, 0x9c, 0x8c, 0x47, 0x3f, 0x17, 0x45, 0x6e, 0x48, 0x8a, - 0x4c, 0x30, 0xfe, 0xc1, 0x9, 0x1, 0x86, 0x14, 0xce, 0x62, 0x32, 0x0, 0x0, 0x2, 0x0, 0x3d, - 0xff, 0xf0, 0x1, 0xdc, 0x3, 0x14, 0x0, 0xb, 0x0, 0x25, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x26, - 0x26, 0x40, 0x27, 0xc, 0x25, 0x23, 0x1a, 0x19, 0x21, 0x1b, 0x19, 0x18, 0x11, 0xc, 0x6, 0x0, - 0x3, 0x8, 0x9, 0xe, 0x9, 0x3, 0x1, 0x11, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x11, 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x26, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x37, 0x3e, 0x1, 0x3d, 0x1, 0x33, 0x17, 0x16, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, - 0x37, 0x1, 0x70, 0x24, 0x1a, 0x1a, 0x24, 0x25, 0x19, 0x1a, 0x24, 0x6c, 0x5f, 0x62, 0x66, 0x78, - 0x29, 0x2b, 0x2c, 0x29, 0x21, 0x50, 0x1, 0x1, 0x5d, 0x22, 0x22, 0x20, 0x86, 0x4a, 0x4a, 0x2, - 0xd6, 0x1a, 0x25, 0x25, 0x1a, 0x1a, 0x24, 0x24, 0xfd, 0x3e, 0x3e, 0x64, 0x5b, 0x3f, 0x2b, 0x25, - 0x25, 0x24, 0x3c, 0x27, 0x56, 0x5f, 0x62, 0x51, 0x1b, 0x1b, 0x1f, 0x2f, 0x6d, 0x32, 0x0, 0x2, - 0x0, 0x73, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x13, 0x0, 0xb, 0x0, 0xf, 0x0, 0x46, 0x40, 0x17, - 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xf, 0xe, 0xd, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0xd, - 0xc, 0x1, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x10, - 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x6, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, - 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x3, 0x23, 0x13, 0x33, 0xf4, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0xf, 0x60, 0xe, - 0x44, 0x2, 0xd2, 0x1b, 0x25, 0x25, 0x1b, 0x1b, 0x26, 0x26, 0xfd, 0x13, 0x2, 0x48, 0x0, 0x1, - 0x0, 0x3b, 0xff, 0x61, 0x1, 0x97, 0x3, 0x32, 0x0, 0x1d, 0x0, 0x6d, 0x40, 0x2d, 0x1, 0x1e, - 0x1e, 0x40, 0x1f, 0x0, 0x1, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x11, 0x10, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x0, 0x3, 0x7, 0x1c, 0x15, 0x14, 0xb, 0x3, 0xa, 0x7, 0x17, 0x16, 0x9, - 0x3, 0x8, 0x11, 0x7, 0x10, 0x10, 0x1c, 0x4, 0x1, 0x10, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x2f, 0x10, 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x10, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, - 0x1d, 0x1, 0x33, 0x15, 0x23, 0x11, 0x14, 0x7, 0x6, 0x23, 0x35, 0x32, 0x35, 0x11, 0x23, 0x35, - 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x1, 0x97, 0x1b, 0x22, 0x2b, 0x26, 0xc, 0x8, 0x64, - 0x64, 0x3a, 0x30, 0x50, 0x65, 0x48, 0x48, 0x24, 0x1e, 0x43, 0x40, 0x3, 0xe, 0x42, 0x20, 0x1d, - 0x15, 0x38, 0xaf, 0x42, 0xfe, 0x68, 0x50, 0x28, 0x20, 0x44, 0x52, 0x1, 0x9a, 0x42, 0xad, 0x65, - 0x2a, 0x23, 0x0, 0x2, 0x0, 0x3b, 0x0, 0x3c, 0x2, 0x5a, 0x2, 0x12, 0x0, 0x6, 0x0, 0xd, - 0x0, 0x50, 0x40, 0x1d, 0x1, 0xe, 0xe, 0x40, 0xf, 0x0, 0xd, 0xc, 0xa, 0x9, 0x7, 0x6, - 0x5, 0x2, 0x0, 0x8, 0x7, 0x1, 0x3, 0x0, 0xc, 0xb, 0x5, 0x3, 0x4, 0x2, 0x1, 0x9, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, - 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, 0xff, 0xc0, - 0x38, 0x59, 0x25, 0x23, 0x27, 0x3f, 0x1, 0x33, 0xf, 0x1, 0x23, 0x27, 0x35, 0x37, 0x33, 0x7, - 0x2, 0x5a, 0x5d, 0xcf, 0x1, 0xce, 0x5d, 0xce, 0x25, 0x5d, 0xcf, 0xcf, 0x5d, 0xce, 0x3c, 0xe4, - 0x11, 0xe1, 0xe8, 0xee, 0xe4, 0x11, 0xe1, 0xe8, 0x0, 0x2, 0x0, 0x3b, 0x0, 0x3c, 0x2, 0x5a, - 0x2, 0x12, 0x0, 0x6, 0x0, 0xd, 0x0, 0x52, 0x40, 0x1e, 0x1, 0xe, 0xe, 0x40, 0xf, 0x0, - 0xd, 0xb, 0xa, 0x9, 0x7, 0x6, 0x4, 0x3, 0x2, 0x0, 0x9, 0x8, 0x2, 0x3, 0x1, 0xc, - 0xb, 0x5, 0x3, 0x4, 0x2, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x27, 0x33, - 0x17, 0xf, 0x1, 0x23, 0x37, 0x27, 0x33, 0x17, 0x2, 0x5a, 0xcf, 0x5d, 0xce, 0xce, 0x5d, 0xcf, - 0xf4, 0xce, 0x5d, 0xce, 0xce, 0x5d, 0xce, 0x1, 0x20, 0xe4, 0xee, 0xe8, 0xe1, 0x11, 0xe4, 0xee, - 0xe8, 0xe1, 0x0, 0x3, 0x0, 0x55, 0xff, 0xf2, 0x2, 0xcd, 0x0, 0x73, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x23, 0x0, 0x45, 0x40, 0x15, 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x1e, 0x18, 0x12, 0xc, - 0x6, 0x0, 0x21, 0x15, 0x9, 0x1b, 0xf, 0x3, 0x1, 0x1e, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x3c, 0x2f, 0x3c, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1e, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x2, 0xcd, 0x26, - 0x1b, 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, 0xfb, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0xfc, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x33, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, - 0x26, 0x0, 0x0, 0x2, 0x0, 0x57, 0xff, 0xf7, 0x4, 0x3, 0x3, 0x13, 0x0, 0x1a, 0x0, 0x2a, - 0x0, 0x7e, 0x40, 0x35, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x0, 0x27, 0x1f, 0x10, 0x2, 0x23, 0x1b, - 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x8, 0x2, 0x1, 0x0, 0x14, - 0x13, 0x8, 0x11, 0x18, 0x17, 0x8, 0x16, 0x15, 0x1a, 0x19, 0x8, 0x0, 0x12, 0x11, 0x3, 0xc, - 0x3, 0x4, 0x1, 0x1, 0x0, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3f, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x2b, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, - 0x29, 0x1, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x17, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x1, 0x34, 0x27, 0x26, 0x23, - 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x4, 0x3, 0xfe, 0x37, 0x51, - 0x75, 0x76, 0x50, 0x57, 0x57, 0x4f, 0x75, 0x3a, 0x34, 0x38, 0x22, 0x1, 0xb8, 0xfe, 0x9e, 0x1, - 0x3b, 0xfe, 0xc5, 0x1, 0x73, 0xfe, 0x3b, 0x2a, 0x37, 0x6b, 0x69, 0x33, 0x25, 0x25, 0x33, 0x69, - 0x6b, 0x37, 0x2a, 0x6a, 0x73, 0x64, 0x6e, 0xbc, 0xbc, 0x6e, 0x64, 0x1e, 0x21, 0x3a, 0x72, 0x48, - 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0x1, 0x3d, 0x76, 0x59, 0x74, 0x74, 0x55, 0x7a, 0x7a, 0x55, 0x74, - 0x73, 0x59, 0x0, 0x3, 0x0, 0x32, 0xff, 0xf7, 0x3, 0x19, 0x2, 0x1b, 0x0, 0x1e, 0x0, 0x24, - 0x0, 0x2c, 0x0, 0x66, 0x40, 0x28, 0x1, 0x2d, 0x2d, 0x40, 0x2e, 0x0, 0x18, 0xc, 0x7, 0x5, - 0x29, 0x25, 0x24, 0x1f, 0x1e, 0x12, 0x8, 0x1, 0x0, 0x1, 0x0, 0x7, 0x24, 0x1f, 0x2b, 0x7, - 0xe, 0x27, 0x22, 0x7, 0x1a, 0x1a, 0x16, 0x2, 0xe, 0xa, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x2d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x16, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0xf, 0x1, - 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x3, 0x19, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x4b, - 0x2e, 0x31, 0x4e, 0x5c, 0x77, 0x3e, 0x39, 0x6f, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x6e, 0x39, - 0x3c, 0x6a, 0x55, 0x34, 0x39, 0x56, 0x5, 0x32, 0x35, 0x70, 0xd, 0x51, 0x7f, 0x80, 0x80, 0x7f, - 0xf7, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x5d, 0x5c, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x5c, - 0x5d, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x2b, 0xce, 0xce, 0xcc, 0x0, 0x1, 0x0, 0x3b, - 0x0, 0xf4, 0x1, 0xc9, 0x1, 0x34, 0x0, 0x3, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x35, 0x21, 0x1, 0xc9, 0xfe, 0x72, 0x1, - 0x8e, 0xf4, 0x40, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x0, 0xf4, 0x2, 0x4a, 0x1, 0x34, 0x0, 0x3, - 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, - 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x25, - 0x21, 0x35, 0x21, 0x2, 0x4a, 0xfd, 0xf1, 0x2, 0xf, 0xf4, 0x40, 0x0, 0x0, 0x2, 0x0, 0x3b, - 0x2, 0x4b, 0x1, 0x74, 0x3, 0x33, 0x0, 0x10, 0x0, 0x21, 0x0, 0x45, 0x40, 0x15, 0x1, 0x22, - 0x22, 0x40, 0x23, 0x0, 0x1d, 0x1a, 0x17, 0x11, 0xc, 0x9, 0x6, 0x0, 0x19, 0x8, 0x14, 0x3, - 0x1, 0x17, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x17, 0x0, 0x22, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x17, 0xe, 0x1, 0x15, 0x14, 0x17, - 0x1e, 0x1, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x17, 0xe, 0x1, 0x15, 0x14, - 0x17, 0x1e, 0x1, 0x1, 0x74, 0x25, 0x1c, 0x1b, 0x26, 0x4f, 0x17, 0xb, 0x1a, 0x9, 0x18, 0x20, - 0xb8, 0x25, 0x1b, 0x1b, 0x26, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, 0x2, 0x87, 0x1b, 0x21, - 0x2b, 0x1b, 0x50, 0x52, 0x13, 0xa, 0x36, 0xf, 0xd, 0x1, 0x3, 0x21, 0x18, 0x1a, 0x22, 0x2b, - 0x1b, 0x51, 0x51, 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x21, 0x0, 0x0, 0x2, 0x0, 0x3b, - 0x2, 0x4c, 0x1, 0x7a, 0x3, 0x34, 0x0, 0x10, 0x0, 0x21, 0x0, 0x45, 0x40, 0x15, 0x1, 0x22, - 0x22, 0x40, 0x23, 0x0, 0x1c, 0x17, 0x14, 0x11, 0xb, 0x6, 0x3, 0x0, 0x1f, 0xe, 0x13, 0x2, - 0x1, 0x1c, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1c, 0x0, 0x22, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x2e, 0x1, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x7, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x2e, 0x1, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x1, 0x7a, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, 0x26, 0x1b, 0x1a, 0x26, - 0xbe, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, 0x26, 0x1b, 0x1a, 0x26, 0x2, 0xee, 0x51, 0x51, - 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x22, 0x18, 0x1a, 0x21, 0x2b, 0x1b, 0x51, 0x51, 0x13, - 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x22, 0x18, 0x1a, 0x21, 0x2b, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x4b, 0x0, 0xbc, 0x3, 0x33, 0x0, 0x10, 0x0, 0x39, 0x40, 0xf, 0x1, 0x11, 0x11, 0x40, - 0x12, 0x0, 0xc, 0x9, 0x6, 0x0, 0x8, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, - 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x11, 0xff, - 0xc0, 0x38, 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x17, 0xe, 0x1, 0x15, - 0x14, 0x17, 0x1e, 0x1, 0xbc, 0x25, 0x1b, 0x1b, 0x26, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, - 0x2, 0x87, 0x1a, 0x22, 0x2b, 0x1b, 0x51, 0x51, 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x21, - 0x0, 0x1, 0x0, 0x3b, 0x2, 0x4c, 0x0, 0xbc, 0x3, 0x34, 0x0, 0x10, 0x0, 0x39, 0x40, 0xf, - 0x1, 0x11, 0x11, 0x40, 0x12, 0x0, 0xb, 0x6, 0x3, 0x0, 0xe, 0x2, 0x1, 0xb, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xb, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x11, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, - 0x2e, 0x1, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x18, 0x20, - 0x26, 0x1b, 0x1a, 0x26, 0x2, 0xee, 0x51, 0x51, 0x13, 0xa, 0x36, 0x10, 0xc, 0x1, 0x3, 0x22, - 0x18, 0x1a, 0x21, 0x2b, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x0, 0x1, 0x9d, 0x3, 0x56, 0x0, 0x3, - 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, - 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x23, 0x1, - 0x1, 0x9d, 0xfe, 0xed, 0x4f, 0x1, 0x13, 0x3, 0x56, 0xfc, 0xaa, 0x3, 0x56, 0x0, 0x0, 0x1, - 0x0, 0x3d, 0xff, 0xf8, 0x2, 0x78, 0x3, 0x13, 0x0, 0x2e, 0x0, 0x82, 0x40, 0x3a, 0x1, 0x2f, - 0x2f, 0x40, 0x30, 0x0, 0x2e, 0x2a, 0x1c, 0x1a, 0x28, 0x27, 0x26, 0x23, 0x20, 0x1f, 0x1e, 0x19, - 0x11, 0x10, 0xf, 0xd, 0xb, 0xa, 0x9, 0x0, 0x26, 0x25, 0xb, 0x3, 0xa, 0x7, 0x28, 0x27, - 0x9, 0x3, 0x8, 0x21, 0x20, 0x10, 0x3, 0xf, 0x7, 0x1f, 0x1e, 0x12, 0x3, 0x11, 0x6, 0x8, - 0x4, 0x16, 0x3, 0x4, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x10, - 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x2f, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2f, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x26, 0x35, 0x34, 0x37, 0x23, 0x35, - 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x21, 0x15, 0x21, - 0x6, 0x15, 0x14, 0x17, 0x21, 0x15, 0x21, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x2, 0x78, 0x2e, - 0x2f, 0x3b, 0x59, 0x65, 0x4a, 0x52, 0x17, 0x32, 0x2c, 0x1, 0x2, 0x2d, 0x34, 0x19, 0x53, 0x48, - 0x5e, 0x53, 0x6f, 0x2d, 0x48, 0x38, 0x67, 0x98, 0x28, 0x1, 0x4f, 0xfe, 0xaa, 0x2, 0x1, 0x1, - 0x57, 0xfe, 0xaf, 0x2a, 0x9c, 0x44, 0x2f, 0x15, 0x1f, 0x8f, 0x4c, 0x22, 0x29, 0x49, 0x50, 0x94, - 0x3a, 0xe, 0x18, 0xe, 0x26, 0x3a, 0x92, 0x4c, 0x42, 0x46, 0x4d, 0x24, 0x6c, 0xd5, 0x3a, 0x13, - 0x21, 0x18, 0xe, 0x3a, 0xe3, 0x2b, 0x14, 0x32, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x3c, 0x1, 0x67, - 0x2, 0x12, 0x0, 0x6, 0x0, 0x40, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, 0x6, 0x5, - 0x3, 0x2, 0x0, 0x1, 0x0, 0x5, 0x4, 0x2, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x2, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x27, 0x35, 0x37, 0x33, 0x7, 0x1, 0x67, 0x5d, - 0xcf, 0xcf, 0x5d, 0xce, 0x3c, 0xe4, 0x11, 0xe1, 0xe8, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x3c, - 0x1, 0x66, 0x2, 0x12, 0x0, 0x6, 0x0, 0x40, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, - 0x6, 0x4, 0x3, 0x2, 0x0, 0x2, 0x1, 0x5, 0x4, 0x2, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x27, 0x33, 0x17, 0x1, - 0x66, 0xce, 0x5d, 0xce, 0xce, 0x5d, 0xce, 0x1, 0x20, 0xe4, 0xee, 0xe8, 0xe1, 0x0, 0x0, 0x3, - 0x0, 0x2d, 0x0, 0x0, 0x2, 0x57, 0x3, 0x31, 0x0, 0xb, 0x0, 0x13, 0x0, 0x29, 0x0, 0x9d, - 0x40, 0x4a, 0x1, 0x2a, 0x2a, 0x40, 0x2b, 0xc, 0x1d, 0x1c, 0x15, 0x14, 0x29, 0x28, 0x27, 0x25, - 0x24, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, - 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x1b, 0x1a, 0x17, 0x16, 0x13, - 0x12, 0xf, 0x7, 0xe, 0x7, 0xc, 0x25, 0x7, 0x24, 0x24, 0x4, 0x29, 0x28, 0x1f, 0x1e, 0x11, - 0x5, 0x10, 0x2, 0x19, 0x18, 0xd, 0x3, 0xc, 0x1, 0x1, 0x1d, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x3f, 0x10, 0xfd, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1d, 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x1, 0x23, 0x11, 0x33, 0x15, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x15, 0x22, 0x1d, 0x1, 0x33, 0x2, 0x22, 0x1f, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, - 0x1f, 0x35, 0xd0, 0x3c, 0x55, 0x3f, 0xfe, 0xd7, 0x64, 0x4a, 0xd3, 0x34, 0x48, 0x48, 0x3a, 0x30, - 0x4f, 0x64, 0x64, 0x2, 0xa2, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x20, 0xfd, 0x48, 0x40, 0x1, - 0xd1, 0xfe, 0x2f, 0x1, 0x8f, 0xfe, 0x71, 0x40, 0x40, 0x1, 0x8f, 0x43, 0x87, 0x50, 0x28, 0x20, - 0x44, 0x52, 0x89, 0x0, 0x0, 0x2, 0x0, 0x2d, 0xff, 0xf5, 0x2, 0x43, 0x3, 0x32, 0x0, 0x9, - 0x0, 0x1f, 0x0, 0x8e, 0x40, 0x3f, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x13, 0x12, 0xb, 0xa, - 0x1f, 0x1e, 0x1d, 0x1b, 0x1a, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x5, 0x4, 0x3, 0x2, 0x0, 0x11, 0x10, 0xd, 0x9, 0x4, 0xc, 0x7, 0xe, - 0x1b, 0x7, 0x1a, 0x1f, 0x1e, 0x15, 0x3, 0x14, 0x2, 0xf, 0xe, 0x1, 0x1a, 0x4, 0x3, 0x4, - 0x0, 0x1, 0x1, 0x13, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3c, 0x3f, 0x3c, - 0x3f, 0x17, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x13, 0x0, - 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, - 0x38, 0x59, 0x5, 0x22, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x1, 0x23, 0x11, 0x33, - 0x15, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x15, 0x22, 0x1d, - 0x1, 0x33, 0x2, 0x43, 0x8c, 0x55, 0x8, 0xb, 0x24, 0xfe, 0xeb, 0x64, 0x4a, 0xd3, 0x34, 0x48, - 0x48, 0x3a, 0x30, 0x4f, 0x64, 0x64, 0xb, 0x94, 0x2, 0xa9, 0xfd, 0x6c, 0x34, 0x11, 0x15, 0x3, - 0x1, 0x8e, 0xfe, 0x71, 0x40, 0x40, 0x1, 0x8f, 0x43, 0x87, 0x50, 0x28, 0x20, 0x44, 0x52, 0x89, - 0x0, 0x1, 0x0, 0x57, 0xff, 0x38, 0x2, 0x7, 0x3, 0x32, 0x0, 0x13, 0x0, 0x7f, 0x40, 0x35, - 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0x13, 0x12, 0x7, 0x6, 0x5, 0x4, 0x1, 0x0, 0x13, 0x12, - 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, - 0x1, 0x0, 0x11, 0x10, 0x9, 0x3, 0x8, 0x7, 0xf, 0xe, 0xb, 0x3, 0xa, 0x3, 0x2, 0xd, - 0xc, 0x4, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x17, - 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x11, - 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, - 0x33, 0x2, 0x7, 0xb0, 0x50, 0xb0, 0xb0, 0xb0, 0xb0, 0x50, 0xb0, 0xb0, 0xb0, 0x7f, 0xfe, 0xb9, - 0x1, 0x47, 0x41, 0x1, 0xe, 0x42, 0x1, 0x22, 0xfe, 0xde, 0x42, 0xfe, 0xf2, 0x0, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0xe1, 0x0, 0xbc, 0x1, 0x62, 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, - 0xc, 0x40, 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, - 0x59, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, - 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x1, 0x22, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0x0, - 0x0, 0x1, 0x0, 0x3b, 0xff, 0x8d, 0x0, 0xbc, 0x0, 0x75, 0x0, 0xf, 0x0, 0x39, 0x40, 0xf, - 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xa, 0x6, 0x3, 0x0, 0xd, 0x2, 0x1, 0xa, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, - 0x1a, 0x26, 0x30, 0x51, 0x52, 0x14, 0xa, 0x36, 0x10, 0xc, 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, - 0x0, 0x2, 0x0, 0x5f, 0xff, 0x8d, 0x1, 0x9e, 0x0, 0x75, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x45, - 0x40, 0x15, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1a, 0x16, 0x13, 0x10, 0xa, 0x6, 0x3, 0x0, - 0x1d, 0xd, 0x12, 0x2, 0x1, 0x1a, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1a, 0x0, 0x20, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x20, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x9e, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, - 0x26, 0xbe, 0x4e, 0x18, 0xb, 0x1b, 0x9, 0x38, 0x26, 0x1b, 0x1a, 0x26, 0x30, 0x51, 0x52, 0x14, - 0xa, 0x36, 0x10, 0xc, 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x1b, 0x51, 0x52, 0x14, 0xa, 0x36, - 0x10, 0xc, 0x1, 0x8, 0x34, 0x1a, 0x21, 0x2a, 0x0, 0x7, 0x0, 0x55, 0xff, 0xec, 0x5, 0x43, - 0x3, 0x4e, 0x0, 0xb, 0x0, 0x17, 0x0, 0x1b, 0x0, 0x27, 0x0, 0x33, 0x0, 0x3f, 0x0, 0x4b, - 0x0, 0x6f, 0x40, 0x2c, 0x1, 0x4c, 0x4c, 0x40, 0x4d, 0x0, 0x43, 0x2b, 0x25, 0x9, 0x46, 0x40, - 0x3a, 0x34, 0x2e, 0x28, 0x22, 0x1c, 0x1a, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x7, 0x3d, 0x49, - 0x31, 0x7, 0x3, 0x37, 0x7, 0x15, 0x1b, 0x18, 0x1a, 0x19, 0x1f, 0x3, 0x1, 0x1, 0x12, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, - 0x2f, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x4c, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4c, 0xff, 0xc0, 0x38, - 0x59, 0x25, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x1, 0x23, 0x1, 0x13, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x5, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x5, 0x43, 0x69, - 0x4b, 0x4c, 0x69, 0x69, 0x4c, 0x4b, 0x69, 0xfc, 0x7b, 0x69, 0x4c, 0x4b, 0x69, 0x69, 0x4b, 0x4c, - 0x69, 0x1, 0x4a, 0xfd, 0xfb, 0x4f, 0x2, 0x5, 0xba, 0x69, 0x4c, 0x4b, 0x69, 0x69, 0x4b, 0x4c, - 0x69, 0x1, 0x8d, 0x41, 0x30, 0x31, 0x41, 0x41, 0x31, 0x30, 0x41, 0xfc, 0x7b, 0x41, 0x31, 0x30, - 0x41, 0x41, 0x30, 0x31, 0x41, 0x1, 0xb5, 0x41, 0x31, 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0xb1, - 0x4b, 0x68, 0x67, 0x4c, 0x4c, 0x67, 0x67, 0x1, 0x9b, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, - 0x6a, 0xfc, 0x9e, 0x3, 0x62, 0xfd, 0x63, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, 0x4c, 0x32, - 0x3f, 0x3f, 0x32, 0x32, 0x3e, 0x3f, 0x2, 0x18, 0x32, 0x3e, 0x3f, 0x31, 0x31, 0x3f, 0x3e, 0xfe, - 0x4b, 0x32, 0x3f, 0x3f, 0x32, 0x31, 0x3f, 0x3e, 0x0, 0x1, 0x0, 0x28, 0x0, 0x0, 0x0, 0xf8, - 0x2, 0x11, 0x0, 0x7, 0x0, 0x52, 0x40, 0x1e, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x6, - 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x3, 0x3, 0x2, 0x7, 0x0, 0x5, 0x4, 0x2, - 0x1, 0x0, 0x1, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x33, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, - 0xf8, 0xd0, 0x3b, 0x55, 0x40, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x73, - 0x1, 0x4f, 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, - 0x2, 0x4, 0x0, 0x6, 0x5, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x4f, - 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x2, 0x73, 0x56, 0x56, 0x92, 0x0, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x7c, 0x1, 0x6c, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x40, 0x40, 0x13, 0x1, 0x10, 0x10, 0x40, - 0x11, 0x0, 0xf, 0xd, 0x7, 0x8, 0x0, 0x5, 0x7, 0xa, 0xa, 0x2, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, - 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x1, 0x6c, 0x31, 0x30, 0x15, 0x46, - 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, 0xd, 0x1f, 0x23, 0x2, 0xa2, 0x26, 0x1f, 0x19, - 0x34, 0x29, 0x21, 0x1a, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x97, 0x1, 0x33, 0x2, 0xd7, 0x0, 0x3, - 0x0, 0x3d, 0x40, 0x11, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, - 0x1, 0x0, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x4, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x23, 0x35, 0x33, 0x1, 0x33, 0xf8, 0xf8, 0x2, 0x97, 0x40, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x7b, - 0x1, 0x86, 0x3, 0x8, 0x0, 0xd, 0x0, 0x3c, 0x40, 0x11, 0x1, 0xe, 0xe, 0x40, 0xf, 0x0, - 0x6, 0x0, 0xa, 0x7, 0x3, 0xd, 0x7, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x6, 0x0, 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0xe, 0x1, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x1, 0x33, 0x32, - 0x36, 0x37, 0x1, 0x86, 0x10, 0x5e, 0x38, 0x38, 0x58, 0x15, 0x33, 0xe, 0x40, 0x24, 0x23, 0x40, - 0xe, 0x2, 0xf4, 0x34, 0x45, 0x3f, 0x3a, 0x14, 0x26, 0x2e, 0x2e, 0x26, 0x0, 0x1, 0x0, 0x3b, - 0x2, 0x7c, 0x0, 0xbc, 0x2, 0xfd, 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, - 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x13, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xbc, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x2, 0xbc, 0x1b, 0x25, 0x25, 0x1b, 0x1b, 0x26, 0x26, 0x0, 0x0, 0x2, - 0x0, 0x3b, 0x2, 0x41, 0x1, 0x2, 0x3, 0x9, 0x0, 0xb, 0x0, 0x17, 0x0, 0x40, 0x40, 0x13, - 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x15, 0x12, 0xc, 0x6, 0x0, 0xf, 0x7, 0x9, 0x9, 0x3, - 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x18, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x34, 0x26, 0x23, 0x22, 0x6, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x2, 0x3a, 0x29, 0x29, 0x3b, 0x3b, 0x29, 0x29, 0x3a, - 0x2f, 0x1e, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x1e, 0x2, 0xa5, 0x29, 0x3b, 0x3b, 0x29, 0x29, - 0x3b, 0x3b, 0x29, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x1e, 0x1e, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x7, - 0x0, 0xdf, 0x0, 0x1a, 0x0, 0x13, 0x0, 0x4a, 0x40, 0x18, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, - 0xf, 0xd, 0x6, 0x12, 0x11, 0xf, 0xb, 0x5, 0x0, 0x8, 0x7, 0x3, 0x11, 0x10, 0x3, 0x1, - 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, - 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, - 0x38, 0x59, 0x17, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, - 0x26, 0x7, 0x37, 0x33, 0x7, 0x16, 0xdf, 0x35, 0x2b, 0x25, 0x1f, 0x1d, 0x13, 0x14, 0x19, 0x1d, - 0x2c, 0x12, 0x17, 0x22, 0x32, 0x19, 0x44, 0x8f, 0x2d, 0x3d, 0x1d, 0x1e, 0x11, 0x25, 0x1b, 0x36, - 0xa, 0x4, 0x4, 0x69, 0x47, 0x13, 0x0, 0x2, 0x0, 0x3b, 0x2, 0x62, 0x1, 0xbf, 0x3, 0x32, - 0x0, 0x3, 0x0, 0x7, 0x0, 0x46, 0x40, 0x18, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x6, 0x4, - 0x2, 0x0, 0x6, 0x5, 0x2, 0x3, 0x1, 0x7, 0x4, 0x3, 0x3, 0x0, 0x4, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, - 0x23, 0x7, 0x23, 0x37, 0x1, 0xbf, 0xa9, 0x33, 0x81, 0x4d, 0xa9, 0x33, 0x81, 0x3, 0x32, 0xd0, - 0xd0, 0xd0, 0xd0, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x7, 0x0, 0xdf, 0x0, 0x1a, 0x0, 0x12, - 0x0, 0x47, 0x40, 0x16, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x12, 0x10, 0xc, 0xa, 0xe, 0xa, - 0x8, 0x7, 0x5, 0x0, 0x9, 0x8, 0x2, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, - 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x17, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x37, 0x27, 0x33, 0x17, 0x26, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0xdf, 0x1f, 0x25, 0x2b, - 0x35, 0x44, 0x19, 0x32, 0x21, 0x16, 0x12, 0x2c, 0x36, 0x15, 0x11, 0xdc, 0x1d, 0x3d, 0x2d, 0x4f, - 0x13, 0x47, 0x69, 0x4, 0x4, 0xa, 0x36, 0x40, 0x11, 0x0, 0x0, 0x1, 0x0, 0x3b, 0x2, 0x73, - 0x1, 0x4f, 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, - 0x5, 0x3, 0x0, 0x6, 0x4, 0x3, 0x3, 0x0, 0x2, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x3, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x27, 0x33, 0x17, 0x37, 0x1, 0x4f, - 0x6a, 0x40, 0x6a, 0x47, 0x43, 0x43, 0x3, 0x5, 0x92, 0x92, 0x56, 0x56, 0x0, 0x2, 0x0, 0x3b, - 0x0, 0x0, 0x2, 0xb7, 0x2, 0xec, 0x0, 0x7, 0x0, 0xc, 0x0, 0x4f, 0x40, 0x1c, 0x1, 0xd, - 0xd, 0x40, 0xe, 0x0, 0xa, 0x9, 0xc, 0x8, 0x5, 0x0, 0xc, 0x8, 0x8, 0x3, 0x2, 0x7, - 0x6, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xd, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xd, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x21, 0x7, - 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x2, 0xb7, 0x5e, 0x49, 0xfe, 0xd1, 0x47, 0x5f, - 0x1, 0xf, 0x5e, 0x50, 0x7e, 0x3, 0x10, 0x6e, 0xd3, 0xd3, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, - 0x2e, 0xfe, 0xbb, 0x0, 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0x85, 0x0, 0xb, - 0x0, 0x17, 0x0, 0x1f, 0x0, 0x24, 0x0, 0x62, 0x40, 0x26, 0x1, 0x25, 0x25, 0x40, 0x26, 0x18, - 0x22, 0x21, 0x1f, 0x1e, 0x24, 0x20, 0x1d, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, - 0x24, 0x20, 0x8, 0x1b, 0x1a, 0x15, 0x9, 0x1d, 0x1c, 0x19, 0x3, 0x18, 0x1, 0x1, 0x1d, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1d, 0x0, 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x1, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x2, - 0x1, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0xde, 0x1f, 0x16, 0x16, 0x20, 0x20, 0x16, - 0x16, 0x1f, 0x1, 0x78, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, - 0x10, 0x6e, 0x3, 0x4f, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, - 0x17, 0x1f, 0x20, 0xfc, 0x9b, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, 0xfe, 0xbb, - 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0xe3, 0x0, 0xb, 0x0, 0x13, 0x0, 0x1f, - 0x0, 0x24, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x25, 0x25, 0x40, 0x26, 0xc, 0x22, 0x21, 0x1d, 0x17, - 0x13, 0x12, 0x3, 0x24, 0x20, 0x1a, 0x14, 0x11, 0xc, 0x6, 0x0, 0x24, 0x20, 0x8, 0xf, 0xe, - 0x9, 0x11, 0x10, 0xd, 0x3, 0xc, 0x1, 0x1, 0x11, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x17, 0x3c, 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x11, - 0x0, 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, - 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x37, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xc2, 0x3b, 0x29, 0x29, 0x3a, 0x3a, 0x29, - 0x29, 0x3b, 0xd9, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x7, 0x1f, 0x16, 0x16, - 0x1e, 0x1e, 0x16, 0x16, 0x1f, 0x49, 0x7d, 0x3, 0x10, 0x6e, 0x3, 0x7f, 0x29, 0x3b, 0x3b, 0x29, - 0x29, 0x3b, 0x3b, 0xfc, 0x58, 0xd8, 0xd8, 0x2, 0xec, 0x93, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, - 0x1e, 0xfd, 0xb7, 0x1, 0x73, 0x2e, 0xfe, 0xbb, 0x0, 0x1, 0x0, 0x57, 0xfe, 0xf8, 0x2, 0x7b, - 0x3, 0x14, 0x0, 0x2c, 0x0, 0x56, 0x40, 0x1e, 0x1, 0x2d, 0x2d, 0x40, 0x2e, 0x0, 0x2c, 0x2a, - 0x22, 0x20, 0x14, 0x12, 0xd, 0xb, 0x26, 0x1f, 0x19, 0x15, 0x14, 0xf, 0xa, 0x5, 0x3, 0x0, - 0x8, 0x1d, 0x3, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x2d, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0xf, 0x1, - 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x27, 0x26, - 0x7, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x2, 0x7b, 0x54, 0x8a, 0x13, 0x44, 0x36, - 0x2b, 0x24, 0x1f, 0x1d, 0x14, 0x12, 0x37, 0x19, 0x13, 0x13, 0x16, 0x1c, 0x71, 0x4c, 0x57, 0x61, - 0x51, 0x73, 0xa4, 0x56, 0x49, 0x35, 0x73, 0x6b, 0x38, 0x31, 0x39, 0x3b, 0x64, 0x6e, 0x42, 0x8f, - 0x8b, 0xb, 0x36, 0x12, 0x4f, 0x2d, 0x3d, 0x1d, 0x1d, 0x11, 0x41, 0x17, 0x25, 0x4, 0x4, 0x5, - 0x58, 0x9, 0x5f, 0x6c, 0xb8, 0xc8, 0x6d, 0x5a, 0x93, 0x24, 0x6c, 0x60, 0x56, 0x8e, 0x8e, 0x59, - 0x5c, 0x71, 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, 0x2, 0x3f, 0x3, 0xb9, 0x0, 0x3, 0x0, 0xf, - 0x0, 0x6f, 0x40, 0x2c, 0x1, 0x10, 0x10, 0x40, 0x11, 0x4, 0x2, 0x1, 0xf, 0xe, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, 0xf, 0xe, 0x7, 0x4, 0x9, 0x8, - 0x8, 0x7, 0x6, 0xb, 0xa, 0x8, 0xd, 0xc, 0x3, 0x0, 0x5, 0x4, 0x1, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, - 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x10, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, - 0x21, 0x1, 0xbe, 0x3f, 0x42, 0x36, 0xcc, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, - 0xca, 0x1, 0x6e, 0x3, 0xb9, 0x99, 0x99, 0xfc, 0x47, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, - 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, 0x2, 0x8a, 0x3, 0x7b, 0x0, 0x11, 0x0, 0x1d, 0x0, 0x69, - 0x40, 0x29, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x12, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x15, 0x14, - 0x11, 0xd, 0x7, 0x2, 0x1d, 0x1c, 0x1b, 0x18, 0x17, 0x16, 0x15, 0x12, 0x8, 0x0, 0x5, 0x7, - 0xa, 0xa, 0x17, 0x16, 0x13, 0x3, 0x12, 0x1, 0x1, 0x17, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x17, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, - 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x23, 0x1, 0x23, 0x11, - 0x23, 0x11, 0x33, 0x1, 0x33, 0x11, 0x33, 0x2, 0x1f, 0x2f, 0x31, 0x16, 0x46, 0x15, 0x22, 0x1c, - 0x22, 0x30, 0x34, 0x17, 0x48, 0xd, 0x13, 0x6, 0xf, 0x1a, 0x8a, 0x74, 0xfe, 0xae, 0x3, 0x4c, - 0x73, 0x1, 0x55, 0x3, 0x4a, 0x3, 0x3e, 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x2, 0x4, 0x14, - 0xfc, 0x8c, 0x2, 0x7b, 0xfd, 0x85, 0x2, 0xda, 0xfd, 0x7c, 0x2, 0x84, 0x0, 0x4, 0x0, 0x57, - 0xff, 0xf8, 0x2, 0xce, 0x3, 0x8a, 0x0, 0xb, 0x0, 0x17, 0x0, 0x27, 0x0, 0x37, 0x0, 0x52, - 0x40, 0x1d, 0x1, 0x38, 0x38, 0x40, 0x39, 0x18, 0x34, 0x30, 0x28, 0x20, 0x18, 0x12, 0xc, 0x6, - 0x0, 0xf, 0x3, 0x8, 0x9, 0x2c, 0x8, 0x24, 0x15, 0x9, 0x1c, 0x1, 0x1, 0x20, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, - 0x38, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x38, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0x38, 0x1f, 0x17, 0x16, 0x20, - 0x20, 0x16, 0x17, 0x1f, 0xe5, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1, 0x7b, 0x5c, - 0x57, 0x89, 0x88, 0x57, 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, - 0x3c, 0x2d, 0x2d, 0x3c, 0x73, 0x74, 0x3c, 0x2d, 0x3, 0x54, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, - 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0xfd, 0xfe, 0xab, 0x66, 0x60, 0x61, 0x66, - 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x69, 0x52, 0x6c, - 0x6b, 0x52, 0x0, 0x3, 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0x84, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x2d, 0x0, 0x5d, 0x40, 0x22, 0x1, 0x2e, 0x2e, 0x40, 0x2f, 0x18, 0x2d, 0x2c, 0x27, 0x22, - 0x21, 0x2d, 0x2c, 0x2b, 0x23, 0x22, 0x21, 0x20, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, - 0x9, 0x15, 0x9, 0x1c, 0x1, 0x1, 0x20, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, 0x2e, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2e, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x2, - 0x4, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbe, 0x1f, 0x16, 0x16, 0x20, 0x20, 0x16, - 0x16, 0x1f, 0x1, 0x38, 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, - 0x3d, 0x57, 0x3, 0x4e, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, - 0x17, 0x1f, 0x20, 0xfd, 0xb0, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xe3, 0xfe, 0x1e, 0x72, - 0x36, 0x2c, 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, - 0x3, 0x7, 0x0, 0x3, 0x0, 0x21, 0x0, 0x2a, 0x0, 0x6e, 0x40, 0x2d, 0x1, 0x2b, 0x2b, 0x40, - 0x2c, 0x10, 0x1f, 0x13, 0x6, 0x2a, 0x26, 0x22, 0x20, 0x1f, 0x19, 0x10, 0xc, 0xb, 0x7, 0x2, - 0x0, 0x2, 0x1, 0x8, 0x0, 0x4, 0x7, 0x9, 0x28, 0x7, 0x15, 0x1d, 0x7, 0x24, 0x0, 0x15, - 0x1, 0x11, 0x10, 0x1, 0x9, 0x2, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3c, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x3, 0x22, 0x7, 0x27, - 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, - 0x33, 0x32, 0x37, 0x1, 0x62, 0x3e, 0x42, 0x35, 0x1d, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, - 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, - 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x3, 0x7, 0x9a, 0x99, 0xfe, 0xce, 0x20, 0x42, 0x24, 0xb1, 0xf4, - 0x3d, 0x14, 0x4, 0x20, 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, - 0xeb, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x3, 0x6, - 0x0, 0x3, 0x0, 0x21, 0x0, 0x2a, 0x0, 0x70, 0x40, 0x2e, 0x1, 0x2b, 0x2b, 0x40, 0x2c, 0x10, - 0x1f, 0x13, 0x6, 0x2a, 0x26, 0x22, 0x20, 0x1f, 0x19, 0x10, 0xc, 0xb, 0x7, 0x2, 0x0, 0x1, - 0x0, 0x8, 0x2, 0x4, 0x7, 0x9, 0x28, 0x7, 0x15, 0x1d, 0x7, 0x24, 0x3, 0x2, 0x15, 0x1, - 0x11, 0x10, 0x1, 0x9, 0x2, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, - 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x2b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x2b, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x33, 0x13, 0x22, 0x7, 0x27, - 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, - 0x33, 0x32, 0x37, 0x1, 0x2b, 0x42, 0x3e, 0x4b, 0x4, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, - 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, - 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0x6d, 0x99, 0xfe, 0xce, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, - 0x14, 0x4, 0x20, 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, - 0x11, 0x68, 0x57, 0x36, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x3, 0x5, 0x0, 0x6, - 0x0, 0x24, 0x0, 0x2d, 0x0, 0x73, 0x40, 0x2f, 0x1, 0x2e, 0x2e, 0x40, 0x2f, 0x13, 0x22, 0x16, - 0x9, 0x4, 0x3, 0x2, 0x1, 0x0, 0x2d, 0x29, 0x25, 0x23, 0x22, 0x1c, 0x13, 0xf, 0xe, 0xa, - 0x4, 0x0, 0x7, 0x7, 0xc, 0x2b, 0x7, 0x18, 0x20, 0x7, 0x27, 0x6, 0x5, 0x18, 0x1, 0x14, - 0x13, 0x1, 0xc, 0x2, 0x1, 0x1c, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, - 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1c, 0x0, 0x2e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x2e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, - 0x3, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, - 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, - 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0x89, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x25, - 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, - 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0x73, 0x56, 0x56, - 0x92, 0xfe, 0xcf, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, 0x20, 0xd, 0x1a, 0x30, 0x26, - 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x4, - 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x2, 0xd7, 0x0, 0xb, 0x0, 0x17, 0x0, 0x35, 0x0, 0x3e, - 0x0, 0x74, 0x40, 0x30, 0x1, 0x3f, 0x3f, 0x40, 0x40, 0x24, 0x33, 0x27, 0x1a, 0x3e, 0x3a, 0x36, - 0x34, 0x33, 0x2d, 0x24, 0x20, 0x1f, 0x1b, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x18, - 0x7, 0x1d, 0x3c, 0x7, 0x29, 0x31, 0x7, 0x38, 0x15, 0x9, 0x29, 0x1, 0x25, 0x24, 0x1, 0x1d, - 0x2, 0x1, 0x2d, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, 0x2f, 0x3c, 0x2f, - 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x2d, 0x0, 0x3f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x3f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x22, - 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, - 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0x9b, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbd, - 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x1c, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, - 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, - 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0xa1, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, - 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0xe4, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, 0x20, - 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, 0x57, - 0x36, 0x0, 0x0, 0x3, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x2d, - 0x0, 0x36, 0x0, 0x74, 0x40, 0x30, 0x1, 0x37, 0x37, 0x40, 0x38, 0x1c, 0x2b, 0x1f, 0x12, 0xf, - 0xd, 0x7, 0x2, 0x36, 0x32, 0x2e, 0x2c, 0x2b, 0x25, 0x1c, 0x18, 0x17, 0x13, 0x8, 0x0, 0x10, - 0x7, 0x15, 0x34, 0x7, 0x21, 0x29, 0x7, 0x30, 0x5, 0x7, 0xa, 0xa, 0x21, 0x1, 0x1d, 0x1c, - 0x1, 0x15, 0x2, 0x1, 0x25, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, 0x2f, - 0x10, 0xfd, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x25, 0x0, 0x37, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x37, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, - 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x3, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, - 0x1, 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x35, 0x34, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, - 0x94, 0x31, 0x30, 0x15, 0x46, 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, 0xd, 0x1f, 0x23, - 0x7b, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0xb, 0x58, 0xa, 0x2, 0x30, 0x4e, 0x4f, - 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0xa2, 0x26, - 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1a, 0xfe, 0xfc, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, - 0x20, 0xd, 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xeb, 0x11, 0x68, - 0x57, 0x36, 0x0, 0x4, 0x0, 0x2d, 0xff, 0xf7, 0x1, 0xc1, 0x3, 0x13, 0x0, 0xb, 0x0, 0x29, - 0x0, 0x35, 0x0, 0x3e, 0x0, 0x75, 0x40, 0x31, 0x1, 0x3f, 0x3f, 0x40, 0x40, 0x18, 0x33, 0x27, - 0x1b, 0xe, 0x3, 0x3e, 0x3a, 0x36, 0x30, 0x2a, 0x28, 0x27, 0x21, 0x18, 0x14, 0x13, 0xf, 0x6, - 0x0, 0x2d, 0x7, 0x9, 0xc, 0x7, 0x11, 0x3c, 0x7, 0x1d, 0x25, 0x7, 0x38, 0x1d, 0x1, 0x19, - 0x18, 0x1, 0x11, 0x2, 0x9, 0x3, 0x1, 0x21, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x3f, 0x3c, 0x3f, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x21, 0x0, 0x3f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x3f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x3, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x1d, 0x1, - 0x14, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x35, 0x34, 0x27, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x13, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0x6a, 0x3b, 0x29, 0x29, 0x3a, - 0x3a, 0x29, 0x29, 0x3b, 0x70, 0x42, 0x30, 0x1c, 0x46, 0x52, 0xae, 0x3, 0x1, 0xb, 0x58, 0xa, - 0x2, 0x30, 0x4e, 0x4f, 0x2f, 0x34, 0x3c, 0x36, 0x4d, 0x48, 0x29, 0x22, 0x1f, 0x16, 0x16, 0x1e, - 0x1e, 0x16, 0x16, 0x1f, 0x22, 0x25, 0x3e, 0x73, 0x66, 0x3d, 0x33, 0x2, 0xaf, 0x29, 0x3b, 0x3b, - 0x29, 0x29, 0x3b, 0x3b, 0xfe, 0xfc, 0x20, 0x42, 0x24, 0xb1, 0xf4, 0x3d, 0x14, 0x4, 0x20, 0xd, - 0x1a, 0x30, 0x26, 0x2a, 0x51, 0x4d, 0x2e, 0x2a, 0x12, 0x42, 0x67, 0xdb, 0x16, 0x1f, 0x1f, 0x16, - 0x16, 0x1e, 0x1e, 0xfe, 0x50, 0x11, 0x68, 0x57, 0x36, 0x0, 0x0, 0x1, 0x0, 0x32, 0xfe, 0xf9, - 0x1, 0xa3, 0x2, 0x1a, 0x0, 0x28, 0x0, 0x59, 0x40, 0x20, 0x1, 0x29, 0x29, 0x40, 0x2a, 0x0, - 0x28, 0x26, 0x20, 0x14, 0x12, 0xd, 0xb, 0x24, 0x1f, 0x19, 0x15, 0x14, 0xf, 0xa, 0x5, 0x3, - 0x0, 0x22, 0x8, 0x1d, 0x8, 0x1d, 0x2, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x29, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x29, 0xff, 0xc0, 0x38, - 0x59, 0x25, 0x6, 0xf, 0x1, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, - 0x35, 0x34, 0x26, 0x27, 0x26, 0x7, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, - 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0xa3, 0x35, 0x4b, 0x13, 0x44, - 0x35, 0x2b, 0x25, 0x1f, 0x1e, 0x13, 0x13, 0x37, 0x1a, 0x13, 0x16, 0x12, 0x1b, 0x55, 0x32, 0x38, - 0x3c, 0x36, 0x60, 0x56, 0x38, 0x31, 0x26, 0x37, 0x78, 0x78, 0x46, 0x28, 0x3f, 0x3d, 0x9, 0x35, - 0x12, 0x4f, 0x2d, 0x3d, 0x1d, 0x1d, 0x11, 0x41, 0x17, 0x24, 0x4, 0x5, 0x5, 0x56, 0x6, 0x3f, - 0x47, 0x83, 0x8c, 0x47, 0x40, 0x3e, 0x31, 0x27, 0xcb, 0xc8, 0x31, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf7, 0x1, 0xcd, 0x3, 0x7, 0x0, 0x3, 0x0, 0x1a, 0x0, 0x20, 0x0, 0x63, 0x40, 0x27, - 0x1, 0x21, 0x21, 0x40, 0x22, 0x4, 0xb, 0x20, 0x1b, 0x1a, 0x12, 0xc, 0x5, 0x4, 0x2, 0x0, - 0x2, 0x1, 0x8, 0x0, 0x20, 0x1b, 0x7, 0x5, 0x4, 0x9, 0x8, 0xe, 0x1e, 0x7, 0x16, 0x0, - 0x16, 0x2, 0xe, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, - 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x21, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, - 0x22, 0x7, 0x1, 0x76, 0x3e, 0x42, 0x35, 0xa2, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, - 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, - 0x6f, 0xd, 0x3, 0x7, 0x9a, 0x99, 0xfd, 0xf1, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, - 0x89, 0x8b, 0x4a, 0x41, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf7, 0x1, 0xcd, 0x3, 0x7, 0x0, 0x3, 0x0, 0x1a, 0x0, 0x20, 0x0, 0x63, 0x40, 0x27, - 0x1, 0x21, 0x21, 0x40, 0x22, 0x4, 0xb, 0x20, 0x1b, 0x1a, 0x12, 0xc, 0x5, 0x4, 0x2, 0x0, - 0x1, 0x0, 0x8, 0x3, 0x20, 0x1b, 0x7, 0x5, 0x4, 0x9, 0x8, 0xe, 0x1e, 0x7, 0x16, 0x2, - 0x16, 0x2, 0xe, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, - 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x21, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x23, 0x27, 0x17, 0x13, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, - 0x22, 0x7, 0x1, 0x3a, 0x42, 0x3e, 0x4b, 0xc8, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, - 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, - 0x6f, 0xd, 0x2, 0x6d, 0x9a, 0x1, 0xfd, 0xf1, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, - 0x89, 0x8b, 0x4a, 0x41, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf7, 0x1, 0xcd, 0x3, 0x5, 0x0, 0x6, 0x0, 0x1d, 0x0, 0x23, 0x0, 0x68, 0x40, 0x29, - 0x1, 0x24, 0x24, 0x40, 0x25, 0x7, 0xe, 0x4, 0x3, 0x2, 0x1, 0x0, 0x23, 0x1e, 0x1d, 0x15, - 0xf, 0x8, 0x7, 0x4, 0x0, 0x23, 0x1e, 0x7, 0x8, 0x7, 0xc, 0x8, 0x11, 0x21, 0x7, 0x19, - 0x6, 0x5, 0x19, 0x2, 0x11, 0x1, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x15, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x21, 0x16, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0x7, 0x1, 0x9a, 0x47, 0x43, 0x43, 0x47, - 0x6a, 0x40, 0x9d, 0xfe, 0xc0, 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, 0x30, 0x4b, 0x5f, 0x63, 0x3e, - 0x47, 0x42, 0x3a, 0x5c, 0x55, 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, 0x6f, 0xd, 0x2, 0x73, 0x56, - 0x56, 0x92, 0xfd, 0xf2, 0x5b, 0x31, 0x2c, 0x39, 0x31, 0x50, 0x3e, 0x47, 0x89, 0x8b, 0x4a, 0x41, - 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x0, 0x4, 0x0, 0x32, 0xff, 0xf7, 0x1, 0xcd, - 0x2, 0xd7, 0x0, 0xb, 0x0, 0x17, 0x0, 0x2e, 0x0, 0x34, 0x0, 0x69, 0x40, 0x2a, 0x1, 0x35, - 0x35, 0x40, 0x36, 0x18, 0x1f, 0x34, 0x2f, 0x2e, 0x26, 0x20, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, - 0xf, 0x3, 0x8, 0x9, 0x34, 0x2f, 0x7, 0x19, 0x18, 0x1d, 0x8, 0x22, 0x32, 0x7, 0x2a, 0x15, - 0x9, 0x2a, 0x2, 0x22, 0x1, 0x1, 0x26, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, - 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x26, 0x0, 0x35, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x35, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x21, 0x16, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x27, 0x2e, 0x1, 0x23, 0x22, 0x7, 0x1, 0xa9, 0x20, 0x16, 0x16, 0x20, - 0x20, 0x16, 0x17, 0x1f, 0xbd, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xe1, 0xfe, 0xc0, - 0x1, 0x29, 0x26, 0x3e, 0x49, 0x30, 0x30, 0x4b, 0x5f, 0x63, 0x3e, 0x47, 0x42, 0x3a, 0x5c, 0x55, - 0x35, 0x39, 0x57, 0x5, 0x32, 0x35, 0x6f, 0xd, 0x2, 0xa1, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, - 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0xfe, 0x3f, 0x5b, 0x31, 0x2c, 0x39, 0x31, - 0x50, 0x3e, 0x47, 0x89, 0x8b, 0x4a, 0x41, 0x3c, 0x43, 0x7a, 0x11, 0x53, 0x4e, 0xa1, 0x0, 0x2, - 0x0, 0x3b, 0x0, 0x0, 0x1, 0xb, 0x3, 0x7, 0x0, 0x3, 0x0, 0xb, 0x0, 0x5f, 0x40, 0x25, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x4, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, - 0x2, 0x1, 0x8, 0x0, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x4, 0x0, 0x9, 0x8, 0x2, 0x5, - 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, - 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, - 0x37, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1, 0x4, 0x3e, 0x42, 0x35, 0x52, 0xd0, - 0x3b, 0x55, 0x40, 0x3, 0x7, 0x9a, 0x99, 0xfc, 0xfa, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x2, - 0x0, 0x3b, 0x0, 0x0, 0x1, 0xb, 0x3, 0x7, 0x0, 0x3, 0x0, 0xb, 0x0, 0x5f, 0x40, 0x25, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x4, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, - 0x1, 0x0, 0x8, 0x3, 0xb, 0xa, 0x7, 0x3, 0x6, 0x7, 0x4, 0x2, 0x9, 0x8, 0x2, 0x5, - 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, - 0xfd, 0x17, 0x3c, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x23, 0x27, - 0x17, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0xc3, 0x42, 0x3f, 0x4c, 0x7d, 0xd0, 0x3b, - 0x55, 0x40, 0x2, 0x6d, 0x9a, 0x1, 0xfc, 0xfa, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x0, 0x2, - 0x0, 0x41, 0x0, 0x0, 0x1, 0x55, 0x3, 0x5, 0x0, 0x6, 0x0, 0xe, 0x0, 0x64, 0x40, 0x27, - 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0x4, 0x3, 0x2, 0x1, 0x0, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x4, 0x0, 0xe, 0xd, 0xa, 0x3, 0x9, 0x7, 0x7, 0x6, 0x5, 0xc, 0xb, - 0x2, 0x8, 0x7, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, - 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, - 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x1, 0x55, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x46, 0xd1, 0x3c, 0x55, 0x40, 0x2, 0x73, - 0x56, 0x56, 0x92, 0xfc, 0xfb, 0x40, 0x1, 0xd1, 0xfe, 0x2f, 0x0, 0x3, 0x0, 0x1b, 0x0, 0x0, - 0x1, 0x22, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x17, 0x0, 0x1f, 0x0, 0x65, 0x40, 0x28, 0x1, 0x20, - 0x20, 0x40, 0x21, 0x0, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, - 0xf, 0x3, 0x8, 0x9, 0x1f, 0x1e, 0x1b, 0x3, 0x1a, 0x7, 0x18, 0x15, 0x9, 0x1d, 0x1c, 0x2, - 0x19, 0x18, 0x1, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, - 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x20, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x1, 0x22, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x9b, 0x20, 0x16, 0x16, 0x20, - 0x20, 0x16, 0x17, 0x1f, 0x82, 0xd1, 0x3c, 0x55, 0x40, 0x2, 0xa2, 0x16, 0x20, 0x20, 0x16, 0x17, - 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0xfd, 0x47, 0x40, 0x1, 0xd1, 0xfe, - 0x2f, 0x0, 0x0, 0x2, 0x0, 0x5f, 0x0, 0x0, 0x1, 0xf8, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x23, - 0x0, 0x6c, 0x40, 0x2c, 0x1, 0x24, 0x24, 0x40, 0x25, 0x10, 0x1d, 0xf, 0xd, 0x7, 0x2, 0x23, - 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0x11, 0x10, 0x8, 0x0, 0x16, 0x8, 0x1f, 0x5, 0x7, - 0xa, 0xa, 0x1f, 0x2, 0x1c, 0x1b, 0x2, 0x1a, 0x19, 0x11, 0x3, 0x10, 0x1, 0x1, 0x1a, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1a, 0x0, 0x24, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, - 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x13, 0x23, - 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x15, 0x1, 0xc4, 0x31, 0x30, 0x15, 0x46, 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, - 0xd, 0x1f, 0x23, 0x53, 0x55, 0x12, 0x16, 0x39, 0x4c, 0x42, 0x55, 0x55, 0x42, 0x53, 0x51, 0x28, - 0x36, 0x2, 0xa2, 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1a, 0xfd, 0x28, 0x1, 0x54, 0x3f, 0x1c, - 0x22, 0x47, 0xfe, 0x76, 0x2, 0x11, 0x34, 0x3d, 0x23, 0x2e, 0x75, 0x0, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x3, 0x7, 0x0, 0x3, 0x0, 0x13, 0x0, 0x1b, 0x0, 0x52, 0x40, 0x1e, - 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x4, 0x18, 0x14, 0xc, 0x4, 0x2, 0x0, 0x2, 0x1, 0x8, 0x0, - 0x1a, 0x7, 0x8, 0x16, 0x7, 0x10, 0x0, 0x10, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x1c, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x23, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x76, 0x3e, 0x42, - 0x35, 0xb6, 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, - 0x80, 0x80, 0x7f, 0x3, 0x7, 0x9a, 0x99, 0xfe, 0x2, 0x8d, 0x46, 0x3d, 0x3f, 0x46, 0x8b, 0x8c, - 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x3, 0x0, 0x32, 0xff, 0xf8, 0x1, 0xe1, - 0x3, 0x7, 0x0, 0x3, 0x0, 0x13, 0x0, 0x1b, 0x0, 0x52, 0x40, 0x1e, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0x4, 0x18, 0x14, 0xc, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, 0x3, 0x1a, 0x7, 0x8, 0x16, - 0x7, 0x10, 0x2, 0x10, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x17, - 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x3f, 0x41, 0x3f, 0x4b, 0xd7, 0x41, 0x38, - 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x2, - 0x6d, 0x9a, 0x1, 0xfe, 0x2, 0x8d, 0x46, 0x3d, 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, - 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x3, 0x0, 0x32, 0xff, 0xf8, 0x1, 0xe1, 0x3, 0x5, 0x0, 0x6, - 0x0, 0x16, 0x0, 0x1e, 0x0, 0x57, 0x40, 0x20, 0x1, 0x1f, 0x1f, 0x40, 0x20, 0x7, 0x4, 0x3, - 0x2, 0x1, 0x0, 0x1b, 0x17, 0xf, 0x7, 0x4, 0x0, 0x1d, 0x7, 0xb, 0x19, 0x7, 0x13, 0x6, - 0x5, 0x13, 0x2, 0xb, 0x1, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, - 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x1f, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, - 0x7, 0x23, 0x37, 0x33, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x90, 0x47, 0x43, - 0x43, 0x47, 0x6a, 0x40, 0xbb, 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, - 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x2, 0x73, 0x56, 0x56, 0x92, 0xfe, 0x3, 0x8d, 0x46, 0x3d, - 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x4, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x2, 0xd8, 0x0, 0xb, 0x0, 0x17, 0x0, 0x27, 0x0, 0x2f, 0x0, 0x55, - 0x40, 0x1f, 0x1, 0x30, 0x30, 0x40, 0x31, 0x18, 0xf, 0x3, 0x2c, 0x28, 0x20, 0x18, 0x12, 0xc, - 0x6, 0x0, 0x2e, 0x7, 0x1c, 0x2a, 0x7, 0x24, 0x15, 0x9, 0x24, 0x2, 0x1c, 0x1, 0x1, 0x20, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x20, 0x0, 0x30, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x30, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x14, 0x7, - 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, - 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0xaa, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbd, - 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xf4, 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, - 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, 0x7f, 0x2, 0xa2, 0x16, 0x1f, 0x1f, 0x16, - 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x20, 0x1f, 0xfe, 0x4f, 0x8d, 0x46, 0x3d, - 0x3f, 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x3, 0x0, 0x32, - 0xff, 0xf8, 0x1, 0xe1, 0x2, 0xdf, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x27, 0x0, 0x58, 0x40, 0x21, - 0x1, 0x28, 0x28, 0x40, 0x29, 0x10, 0xf, 0xd, 0x7, 0x2, 0x24, 0x20, 0x18, 0x10, 0x8, 0x0, - 0x26, 0x7, 0x14, 0x22, 0x7, 0x1c, 0x5, 0x7, 0xa, 0xa, 0x1c, 0x2, 0x14, 0x1, 0x1, 0x18, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x18, 0x0, 0x28, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x28, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, - 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x9e, - 0x31, 0x30, 0x15, 0x46, 0x16, 0x21, 0x1c, 0x22, 0x2f, 0x35, 0x17, 0x48, 0xd, 0x1f, 0x23, 0x62, - 0x41, 0x38, 0x5e, 0x62, 0x37, 0x3f, 0x3f, 0x38, 0x61, 0x5e, 0x38, 0x41, 0x58, 0x7f, 0x80, 0x80, - 0x7f, 0x2, 0xa2, 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1a, 0xfe, 0x30, 0x8d, 0x46, 0x3d, 0x3f, - 0x46, 0x8b, 0x8c, 0x47, 0x3f, 0x3e, 0x47, 0x8d, 0xce, 0xce, 0xcc, 0x0, 0x0, 0x2, 0x0, 0x5f, - 0xff, 0xf8, 0x1, 0xec, 0x3, 0x7, 0x0, 0x3, 0x0, 0x17, 0x0, 0x66, 0x40, 0x29, 0x1, 0x18, - 0x18, 0x40, 0x19, 0x4, 0x6, 0x17, 0x16, 0x15, 0xf, 0xe, 0xd, 0xc, 0x6, 0x5, 0x4, 0x2, - 0x0, 0x2, 0x1, 0x8, 0x0, 0x13, 0x8, 0x8, 0x0, 0x17, 0x16, 0xe, 0x3, 0xd, 0x2, 0x8, - 0x1, 0x5, 0x4, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, - 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, - 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x23, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x1, 0x7f, 0x3e, 0x42, 0x35, 0xb8, - 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, 0x3a, 0x4d, 0x35, 0x55, 0x3, 0x7, 0x9a, - 0x99, 0xfc, 0xfa, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, - 0x1, 0x90, 0x0, 0x2, 0x0, 0x5f, 0xff, 0xf8, 0x1, 0xec, 0x3, 0x7, 0x0, 0x3, 0x0, 0x17, - 0x0, 0x66, 0x40, 0x29, 0x1, 0x18, 0x18, 0x40, 0x19, 0x4, 0x6, 0x17, 0x16, 0x15, 0xf, 0xe, - 0xd, 0xc, 0x6, 0x5, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, 0x3, 0x13, 0x8, 0x8, 0x2, 0x17, - 0x16, 0xe, 0x3, 0xd, 0x2, 0x8, 0x1, 0x5, 0x4, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x2f, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x17, 0x13, 0x23, 0x35, 0x6, - 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, - 0x1, 0x4d, 0x42, 0x3e, 0x4b, 0xd4, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, 0x3a, - 0x4d, 0x35, 0x55, 0x2, 0x6d, 0x9a, 0x1, 0xfc, 0xfa, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, - 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, 0x90, 0x0, 0x2, 0x0, 0x5f, 0xff, 0xf8, 0x1, 0xec, - 0x3, 0x5, 0x0, 0x6, 0x0, 0x1a, 0x0, 0x6b, 0x40, 0x2b, 0x1, 0x1b, 0x1b, 0x40, 0x1c, 0x7, - 0x9, 0x4, 0x3, 0x2, 0x1, 0x0, 0x1a, 0x19, 0x18, 0x12, 0x11, 0x10, 0xf, 0x9, 0x8, 0x7, - 0x4, 0x0, 0x16, 0x8, 0xb, 0x6, 0x5, 0x1a, 0x19, 0x11, 0x3, 0x10, 0x2, 0xb, 0x1, 0x8, - 0x7, 0x1, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x17, 0x3c, - 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, - 0x0, 0x1b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1b, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x35, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x1, 0xae, - 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0xa8, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, 0x15, - 0x3a, 0x4d, 0x35, 0x55, 0x2, 0x73, 0x56, 0x56, 0x92, 0xfc, 0xfb, 0x2f, 0x37, 0x25, 0x31, 0x75, - 0x1, 0x4f, 0xfe, 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, 0x90, 0x0, 0x3, 0x0, 0x5f, 0xff, 0xf8, - 0x1, 0xec, 0x2, 0xd6, 0x0, 0xb, 0x0, 0x17, 0x0, 0x2b, 0x0, 0x6c, 0x40, 0x2c, 0x1, 0x2c, - 0x2c, 0x40, 0x2d, 0x18, 0x1a, 0x2b, 0x2a, 0x29, 0x23, 0x22, 0x21, 0x20, 0x1a, 0x19, 0x18, 0x12, - 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x27, 0x8, 0x1c, 0x15, 0x9, 0x2b, 0x2a, 0x22, 0x3, - 0x21, 0x2, 0x1c, 0x1, 0x19, 0x18, 0x1, 0x1, 0x20, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x20, 0x0, 0x2c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x2c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x13, 0x23, 0x35, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x11, 0x33, 0x1, 0xbe, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xbc, 0x20, - 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xea, 0x55, 0x38, 0x53, 0x50, 0x28, 0x35, 0x55, 0x12, - 0x15, 0x3a, 0x4d, 0x35, 0x55, 0x2, 0xa0, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0x17, 0x16, - 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0xfd, 0x49, 0x2f, 0x37, 0x25, 0x31, 0x75, 0x1, 0x4f, 0xfe, - 0xac, 0x45, 0x1a, 0x1e, 0x41, 0x1, 0x90, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xe5, 0x1, 0xa4, - 0x3, 0x4b, 0x0, 0xb, 0x0, 0x17, 0x0, 0x43, 0x40, 0x15, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, - 0x12, 0xc, 0x6, 0x0, 0x15, 0x7, 0x3, 0xf, 0x7, 0x9, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x1, 0xa4, 0x69, 0x4c, 0x4b, 0x69, 0x69, 0x4b, 0x4c, 0x69, 0x43, 0x41, 0x31, - 0x30, 0x41, 0x41, 0x30, 0x31, 0x41, 0x2, 0x98, 0x4c, 0x67, 0x68, 0x4b, 0x4c, 0x67, 0x67, 0x4c, - 0x32, 0x3e, 0x3f, 0x31, 0x31, 0x3f, 0x3e, 0x0, 0x0, 0x4, 0x0, 0x3b, 0xff, 0x29, 0x3, 0x9f, - 0x2, 0xdd, 0x0, 0xf, 0x0, 0x1f, 0x0, 0x2b, 0x0, 0x34, 0x0, 0x75, 0x40, 0x31, 0x1, 0x35, - 0x35, 0x40, 0x36, 0x0, 0x30, 0x2f, 0x2c, 0x2b, 0x29, 0x26, 0x25, 0x24, 0x23, 0x20, 0x18, 0x10, - 0x8, 0x0, 0x1c, 0x8, 0x4, 0x14, 0x8, 0xc, 0x31, 0x30, 0x8, 0x23, 0x22, 0x2f, 0x2e, 0x8, - 0x26, 0xc, 0x4, 0x27, 0x26, 0x2, 0x25, 0x24, 0x21, 0x3, 0x20, 0x1, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x2f, 0x2f, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x35, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x35, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x7, 0x23, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x32, 0x15, 0x14, 0x7, 0x37, 0x34, 0x2b, - 0x1, 0x15, 0x33, 0x32, 0x37, 0x36, 0x3, 0x9f, 0x71, 0x76, 0xcb, 0xca, 0x76, 0x72, 0x72, 0x76, - 0xca, 0xcb, 0x76, 0x71, 0x53, 0x58, 0x5e, 0xa9, 0xa8, 0x5e, 0x59, 0x59, 0x5d, 0xa9, 0xa9, 0x5e, - 0x58, 0x8f, 0x5b, 0x58, 0x7d, 0x52, 0xb2, 0xcb, 0x61, 0xe, 0x6d, 0x6b, 0x68, 0x38, 0x19, 0x1f, - 0x1, 0x3, 0xd4, 0x81, 0x85, 0x85, 0x82, 0xd3, 0xd3, 0x82, 0x85, 0x85, 0x81, 0xd4, 0xb4, 0x6b, - 0x70, 0x71, 0x6b, 0xb3, 0xb4, 0x6b, 0x70, 0x71, 0x6b, 0x50, 0xca, 0xca, 0x2, 0x11, 0xa3, 0x6b, - 0x2e, 0x9a, 0x58, 0xb3, 0x11, 0x14, 0x0, 0x3, 0x0, 0x3b, 0xff, 0x29, 0x3, 0x9f, 0x2, 0xdd, - 0x0, 0xf, 0x0, 0x1f, 0x0, 0x35, 0x0, 0x5f, 0x40, 0x25, 0x1, 0x36, 0x36, 0x40, 0x37, 0x0, - 0x35, 0x2d, 0x31, 0x2c, 0x26, 0x20, 0x18, 0x10, 0x8, 0x0, 0x1c, 0x8, 0x4, 0x14, 0x8, 0xc, - 0x33, 0x8, 0x22, 0x2f, 0x8, 0x2a, 0xc, 0x4, 0x2a, 0x2, 0x22, 0x1, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x8, 0x0, 0x36, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x36, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, - 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x3, 0x9f, 0x71, - 0x76, 0xcb, 0xca, 0x76, 0x72, 0x72, 0x76, 0xca, 0xcb, 0x76, 0x71, 0x53, 0x58, 0x5e, 0xa9, 0xa8, - 0x5e, 0x59, 0x59, 0x5d, 0xa9, 0xa9, 0x5e, 0x58, 0xb8, 0x3f, 0x60, 0x5c, 0x37, 0x3f, 0x3c, 0x36, - 0x60, 0x56, 0x38, 0x31, 0x24, 0x39, 0x78, 0x78, 0x46, 0x28, 0x1, 0x3, 0xd4, 0x81, 0x85, 0x85, - 0x82, 0xd3, 0xd3, 0x82, 0x85, 0x85, 0x81, 0xd4, 0xb4, 0x6b, 0x70, 0x71, 0x6b, 0xb3, 0xb4, 0x6b, - 0x70, 0x71, 0x6b, 0x14, 0x47, 0x3e, 0x47, 0x8a, 0x8c, 0x47, 0x40, 0x3e, 0x31, 0x27, 0xcb, 0xc7, - 0x30, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x1, 0xae, 0x3, 0x3e, 0x3, 0x32, 0x0, 0xf, 0x0, 0x17, - 0x0, 0x7d, 0x40, 0x34, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, - 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, 0x1, 0x0, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, - 0xf, 0xa, 0x9, 0x8, 0x7, 0x2, 0x1, 0x0, 0x5, 0x4, 0xd, 0xc, 0x2, 0x17, 0x16, 0xf, - 0xe, 0xb, 0x5, 0xa, 0x4, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x18, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x23, 0x35, 0x23, 0x7, 0x23, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x13, 0x33, 0x13, 0x33, 0x5, - 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x3, 0x3e, 0x43, 0x3, 0x6b, 0x23, 0x6b, 0x4, 0x43, - 0x49, 0x79, 0x4, 0x7b, 0x45, 0xfe, 0x4f, 0x8a, 0x43, 0x85, 0x1, 0x52, 0x1, 0xb1, 0xf6, 0xf9, - 0xfb, 0xf8, 0x1, 0x81, 0xfe, 0xe6, 0x1, 0x1a, 0x3b, 0xfe, 0xba, 0x1, 0x46, 0x3b, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0x8a, 0x1, 0xb5, 0x2, 0x2c, 0x0, 0x13, 0x0, 0x73, 0x40, 0x31, 0x1, 0x14, - 0x14, 0x40, 0x15, 0x0, 0x13, 0x12, 0x10, 0xf, 0xe, 0xd, 0xa, 0x9, 0x8, 0x6, 0x5, 0x4, - 0x3, 0x0, 0x13, 0x12, 0x7, 0x3, 0x6, 0x7, 0x5, 0x4, 0x1, 0x3, 0x0, 0x11, 0x10, 0x9, - 0x3, 0x8, 0x7, 0xf, 0xe, 0xb, 0x3, 0xa, 0xd, 0xc, 0x3, 0x2, 0x1, 0x5, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, - 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x14, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x25, - 0x23, 0x7, 0x23, 0x37, 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x33, 0x37, 0x33, 0x7, 0x33, 0x15, - 0x23, 0x7, 0x33, 0x1, 0xb5, 0xd2, 0x23, 0x3d, 0x23, 0x6b, 0x83, 0x20, 0xa3, 0xba, 0x27, 0x3d, - 0x27, 0x83, 0x9a, 0x20, 0xba, 0xec, 0x62, 0x62, 0x40, 0x57, 0x40, 0x69, 0x69, 0x40, 0x57, 0x0, - 0x0, 0x2, 0x0, 0x3b, 0x0, 0x61, 0x1, 0xae, 0x2, 0x3a, 0x0, 0xb, 0x0, 0xf, 0x0, 0x71, - 0x40, 0x2e, 0x1, 0x10, 0x10, 0x40, 0x11, 0xc, 0x3, 0x2, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, - 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x5, 0x4, 0x1, 0x3, 0x0, 0x7, - 0xb, 0xa, 0x7, 0x3, 0x6, 0xf, 0xe, 0x7, 0xc, 0x9, 0x8, 0xd, 0xc, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, - 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x10, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x13, 0x21, 0x35, - 0x21, 0x1, 0xad, 0x99, 0x40, 0x99, 0x99, 0x40, 0x99, 0x1, 0xfe, 0x8e, 0x1, 0x72, 0x1, 0x61, - 0x99, 0x99, 0x40, 0x99, 0x99, 0xfe, 0xc0, 0x40, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xfc, 0x2, 0xc4, - 0x2, 0x17, 0x0, 0x9, 0x0, 0x4b, 0x40, 0x19, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x6, 0x5, - 0x2, 0x1, 0x7, 0x5, 0x4, 0x3, 0x2, 0x0, 0x9, 0x8, 0x2, 0x4, 0x3, 0x1, 0x1, 0x7, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0xa, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x27, 0x11, 0x23, 0x11, 0x7, 0x27, 0x25, 0x33, 0x2, 0xc4, 0x23, 0xfb, 0x53, - 0xef, 0x29, 0x1, 0x34, 0x14, 0x1, 0x5b, 0x43, 0x8b, 0xfe, 0x59, 0x1, 0xa2, 0x81, 0x3e, 0xbc, - 0x0, 0x1, 0x0, 0x3b, 0xff, 0xf9, 0x2, 0xc4, 0x2, 0x15, 0x0, 0x9, 0x0, 0x4b, 0x40, 0x19, - 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x8, 0x5, 0x4, 0x8, 0x7, 0x6, 0x5, 0x3, 0x0, - 0x7, 0x6, 0x2, 0x2, 0x1, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x5, 0x23, 0x25, 0x37, 0x17, 0x11, - 0x33, 0x11, 0x37, 0x2, 0xc4, 0xfe, 0xcb, 0x13, 0xfe, 0xbf, 0x22, 0xfc, 0x53, 0xef, 0xb6, 0xbd, - 0xbd, 0x42, 0x8b, 0x1, 0xa8, 0xfe, 0x5d, 0x81, 0x0, 0x1, 0x0, 0x5f, 0xfe, 0xd8, 0x1, 0xfe, - 0x2, 0x12, 0x0, 0x17, 0x0, 0x61, 0x40, 0x26, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x7, 0x3, - 0x15, 0x14, 0x13, 0x12, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x0, 0x10, 0x8, 0x5, 0x9, 0x8, - 0x14, 0x13, 0xb, 0x3, 0xa, 0x2, 0x5, 0x1, 0x1, 0x0, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x9, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, 0x11, - 0x23, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x14, 0x16, 0x1, - 0xfe, 0x58, 0xa, 0x5, 0x38, 0x53, 0x35, 0x23, 0x55, 0x55, 0x14, 0x16, 0x37, 0x4d, 0x35, 0x55, - 0xb, 0xd, 0x22, 0x37, 0x10, 0xfe, 0xd0, 0x3, 0x3a, 0xfe, 0x9d, 0x3b, 0x18, 0x1b, 0x41, 0x1, - 0x90, 0xfe, 0x63, 0x3c, 0x27, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xe6, 0x2, 0xde, 0x3, 0xc, - 0x0, 0x11, 0x0, 0x62, 0x40, 0x27, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, 0x11, 0xf, 0xe, 0xd, - 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x0, 0xe, 0xd, 0xa, 0x9, 0x5, 0x5, - 0x6, 0x8, 0xb, 0x0, 0xc, 0xb, 0x3, 0x8, 0x7, 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0xa, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x22, 0x27, 0x26, 0x35, 0x11, 0x25, 0x11, 0x23, 0x11, - 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x14, 0x33, 0x2, 0xde, 0x5d, 0x37, 0x3f, 0xfe, 0xf9, 0x5c, - 0x6d, 0x2, 0xa3, 0x78, 0x78, 0x1a, 0x2e, 0x34, 0x6b, 0x2, 0x6, 0x1, 0xfd, 0x46, 0x2, 0xba, - 0x52, 0x52, 0xfe, 0xe, 0x92, 0x0, 0x0, 0x1, 0x0, 0x3b, 0xff, 0xe6, 0x2, 0x31, 0x2, 0x12, - 0x0, 0x11, 0x0, 0x67, 0x40, 0x2a, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, 0x11, 0x10, 0xf, 0xe, - 0xd, 0xc, 0xb, 0xa, 0x9, 0x7, 0x6, 0x2, 0x1, 0x0, 0x6, 0x8, 0x7, 0xf, 0xe, 0xb, - 0xa, 0x1, 0x5, 0x0, 0x7, 0x10, 0x7, 0x11, 0x10, 0x2, 0xd, 0xc, 0x1, 0x1, 0xf, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x11, 0x14, 0x17, - 0x16, 0x17, 0x15, 0x22, 0x35, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x2, 0x31, 0x43, - 0x8, 0xb, 0x24, 0x8c, 0xc4, 0x55, 0x45, 0x1, 0xf6, 0x1, 0xd2, 0xfe, 0xbd, 0x34, 0x11, 0x15, - 0x3, 0x4c, 0x94, 0x1, 0x58, 0xfe, 0x2e, 0x1, 0xd2, 0x40, 0x0, 0x1, 0x0, 0x3b, 0xff, 0x61, - 0x1, 0x97, 0x3, 0x32, 0x0, 0x15, 0x0, 0x4c, 0x40, 0x1a, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, - 0x1, 0x10, 0xf, 0xd, 0xc, 0x8, 0x7, 0x0, 0x3, 0x7, 0x14, 0xd, 0x7, 0xc, 0xc, 0x14, - 0x4, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0xc, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x11, 0x14, 0x7, 0x6, - 0x23, 0x35, 0x32, 0x35, 0x11, 0x34, 0x37, 0x36, 0x33, 0x32, 0x1, 0x97, 0x1b, 0x22, 0x2b, 0x26, - 0xc, 0x8, 0x3a, 0x30, 0x50, 0x65, 0x24, 0x1e, 0x43, 0x40, 0x3, 0xe, 0x42, 0x20, 0x1d, 0x15, - 0x38, 0xfd, 0x77, 0x50, 0x28, 0x20, 0x44, 0x52, 0x2, 0x89, 0x65, 0x2a, 0x23, 0x0, 0x0, 0x1, - 0x0, 0x3b, 0x0, 0xae, 0x1, 0xb7, 0x1, 0x66, 0x0, 0x5, 0x0, 0x48, 0x40, 0x17, 0x1, 0x6, - 0x6, 0x40, 0x7, 0x0, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x3, 0x2, 0x7, 0x4, 0x5, 0x4, - 0x1, 0x0, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x3, 0x0, 0x6, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x6, - 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x35, 0x21, 0x35, 0x21, 0x1, 0xb7, 0x40, 0xfe, 0xc4, 0x1, - 0x7c, 0xae, 0x78, 0x40, 0x0, 0x5, 0x0, 0x55, 0xff, 0xfb, 0x3, 0x62, 0x3, 0x28, 0x0, 0xb, - 0x0, 0x1a, 0x0, 0x26, 0x0, 0x32, 0x0, 0x3e, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x3f, 0x3f, 0x40, - 0x40, 0x0, 0x38, 0x34, 0x17, 0x39, 0x33, 0x2d, 0x27, 0x21, 0x1b, 0x13, 0xc, 0x6, 0x0, 0x2a, - 0x1e, 0x8, 0x30, 0x24, 0x10, 0x7, 0x9, 0x3b, 0x7, 0x36, 0x9, 0x3, 0x1, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x3f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x3f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x16, - 0x33, 0x32, 0x37, 0x36, 0x3, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x7, 0x26, 0x23, - 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x3, 0x62, 0xe2, 0xa5, 0xa4, 0xe2, 0xe2, 0xa4, - 0xa5, 0xe2, 0x4e, 0x57, 0x5a, 0x88, 0x87, 0xb1, 0x57, 0x5a, 0x87, 0x88, 0x5a, 0x57, 0xa7, 0x1e, - 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0xae, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x15, 0x16, 0x1e, - 0x1, 0xb, 0x2b, 0x57, 0x68, 0x67, 0x56, 0x2d, 0x79, 0x71, 0x4a, 0x45, 0x24, 0x1, 0x91, 0xa8, - 0xee, 0xee, 0xa8, 0xa8, 0xef, 0xef, 0xa8, 0x8c, 0x61, 0x64, 0xc5, 0x8c, 0x8c, 0x61, 0x64, 0x64, - 0x61, 0x1, 0xd, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, - 0x1e, 0x1e, 0xfe, 0xe5, 0x2d, 0x5a, 0x5c, 0x2d, 0x70, 0x28, 0x15, 0x0, 0x0, 0x1c, 0x0, 0x64, - 0xff, 0x50, 0x4, 0xb7, 0x3, 0x8e, 0x0, 0xd, 0x0, 0x14, 0x0, 0x19, 0x0, 0x1d, 0x0, 0x21, - 0x0, 0x25, 0x0, 0x29, 0x0, 0x2d, 0x0, 0x33, 0x0, 0x37, 0x0, 0x3b, 0x0, 0x40, 0x0, 0x45, - 0x0, 0x49, 0x0, 0x4d, 0x0, 0x51, 0x0, 0x55, 0x0, 0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x68, - 0x0, 0x6c, 0x0, 0x71, 0x0, 0x76, 0x0, 0x7a, 0x0, 0x7e, 0x0, 0x83, 0x0, 0x87, 0x1, 0x1c, - 0x40, 0x81, 0x1, 0x88, 0x88, 0x40, 0x89, 0x0, 0x86, 0x84, 0x82, 0x80, 0x7d, 0x7b, 0x7a, 0x78, - 0x76, 0x73, 0x70, 0x6e, 0x6b, 0x69, 0x68, 0x66, 0x64, 0x62, 0x5d, 0x5a, 0x57, 0x55, 0x53, 0x51, - 0x4f, 0x4d, 0x4b, 0x48, 0x46, 0x44, 0x41, 0x3f, 0x3c, 0x3b, 0x39, 0x37, 0x35, 0x32, 0x2f, 0x2d, - 0x2b, 0x28, 0x26, 0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x18, 0x16, 0x14, 0x10, 0x9, 0x8, 0x86, - 0x84, 0x80, 0x7f, 0x7d, 0x7b, 0x79, 0x77, 0x74, 0x72, 0x70, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x62, - 0x61, 0x5f, 0x5c, 0x59, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x43, 0x41, 0x3e, - 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x31, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, - 0x1a, 0x18, 0x15, 0x13, 0x12, 0xe, 0xb, 0x8, 0x7, 0x3, 0x2, 0x0, 0xc, 0x6, 0x5f, 0x1, - 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x88, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x88, 0xff, 0xc0, 0x38, 0x59, 0x1, 0xf, 0x1, 0x17, - 0x3, 0x1, 0x7, 0x27, 0x37, 0x7, 0x27, 0x3, 0x25, 0x5, 0x7, 0x2f, 0x1, 0xf, 0x1, 0x15, - 0x17, 0x37, 0x27, 0xf, 0x1, 0x37, 0x2f, 0x1, 0x7, 0x1f, 0x1, 0x27, 0x7, 0x17, 0x3, 0x27, - 0x7, 0x17, 0x5, 0xf, 0x1, 0x37, 0x3, 0x27, 0x7, 0x17, 0x5, 0x27, 0xf, 0x1, 0x17, 0x37, - 0x1, 0x27, 0x7, 0x17, 0x5, 0x27, 0x7, 0x1f, 0x1, 0xf, 0x1, 0x17, 0x3f, 0x1, 0xf, 0x1, - 0x17, 0x37, 0x3, 0xf, 0x1, 0x37, 0x3, 0x27, 0x7, 0x17, 0x2f, 0x1, 0x7, 0x17, 0x1, 0x27, - 0x7, 0x17, 0x37, 0x27, 0xf, 0x1, 0x17, 0x37, 0x2f, 0x1, 0xf, 0x1, 0x37, 0x1, 0x27, 0x1f, - 0x2, 0x27, 0x7, 0x17, 0x1, 0x2f, 0x1, 0x17, 0x1, 0x27, 0xf, 0x1, 0x37, 0x1, 0x27, 0x7, - 0x1f, 0x2, 0x27, 0x7, 0x17, 0x1, 0x2f, 0x1, 0x17, 0x5, 0x27, 0x1f, 0x1, 0x37, 0x2f, 0x2, - 0x17, 0x4, 0xb7, 0x3d, 0x1c, 0x10, 0x73, 0xfe, 0xe1, 0x19, 0xad, 0x1, 0x30, 0xfe, 0x85, 0x2, - 0x5c, 0x1, 0xe1, 0x10, 0x8, 0x7e, 0x8, 0x3e, 0x8b, 0x4b, 0x2, 0x49, 0x3a, 0x4a, 0x69, 0x95, - 0x75, 0xa3, 0xb3, 0xac, 0x83, 0xc0, 0x86, 0x8e, 0x83, 0x9b, 0x1, 0x65, 0x66, 0x33, 0x5e, 0x81, - 0xa6, 0x96, 0xb7, 0x1, 0x54, 0xb, 0x33, 0x2a, 0xb, 0x2f, 0xfe, 0xa4, 0x9d, 0xa8, 0xac, 0x1, - 0x97, 0xc4, 0xaf, 0xdd, 0xd1, 0x60, 0x29, 0xf, 0x47, 0x50, 0x45, 0x27, 0xb, 0x2a, 0x21, 0x83, - 0x29, 0x78, 0xa9, 0xb9, 0xc7, 0xcf, 0x20, 0xae, 0xdd, 0xc1, 0x1, 0xd3, 0xd9, 0x7, 0xbb, 0xc3, - 0xc, 0x46, 0x1f, 0xf, 0x42, 0x19, 0x7, 0x6a, 0x1f, 0x65, 0xfe, 0xd4, 0xcd, 0x16, 0xb3, 0xcc, - 0xb7, 0x7, 0xa2, 0xfe, 0x88, 0x18, 0xbe, 0x2b, 0x2, 0x9d, 0xa, 0x58, 0x14, 0x58, 0xfe, 0xf4, - 0x84, 0x27, 0xa, 0x9d, 0xb1, 0xa0, 0x4, 0x93, 0xfe, 0xb2, 0x12, 0xa9, 0x25, 0x1, 0x43, 0x9a, - 0xd, 0x4d, 0x3f, 0x9b, 0xf, 0x96, 0x1d, 0x2, 0x8e, 0x95, 0x1b, 0xb, 0xfe, 0xb9, 0xfe, 0xc6, - 0x2, 0x5c, 0x34, 0x19, 0x8d, 0x2, 0x81, 0xb9, 0xc7, 0x26, 0x18, 0x36, 0x5, 0x24, 0x1e, 0x3b, - 0x1a, 0x6, 0x3c, 0x9e, 0x48, 0xfc, 0x3c, 0x31, 0x45, 0x5b, 0x49, 0x4c, 0x54, 0x1, 0x30, 0x3a, - 0x29, 0x41, 0xca, 0x55, 0xb0, 0x62, 0x1, 0x17, 0x46, 0x40, 0x51, 0xa2, 0x7, 0x35, 0x77, 0x7, - 0x30, 0x1, 0xb8, 0x42, 0x35, 0x4c, 0xc8, 0x57, 0x66, 0x67, 0x1, 0x61, 0x81, 0x8, 0x52, 0x46, - 0x4d, 0x7c, 0x5, 0x31, 0x1, 0x44, 0x6c, 0xc6, 0x7b, 0x1, 0x3b, 0x52, 0x54, 0x62, 0xc1, 0x4d, - 0x45, 0x5a, 0xff, 0x0, 0x67, 0xce, 0x60, 0x12, 0x9, 0x54, 0x68, 0x9, 0x4e, 0xb0, 0x6, 0x6e, - 0x99, 0x71, 0x1, 0x76, 0x62, 0xd6, 0x5c, 0x81, 0x5f, 0xa6, 0x57, 0x1, 0x87, 0xd5, 0x5a, 0xd8, - 0xfe, 0x6f, 0x7, 0x62, 0x71, 0x63, 0x1, 0x23, 0x44, 0x26, 0x6f, 0x55, 0x72, 0x56, 0x7b, 0x4f, - 0x1, 0x44, 0xad, 0x57, 0xb5, 0xc0, 0x54, 0x81, 0x29, 0x22, 0xf, 0x82, 0x51, 0x87, 0x0, 0x2, - 0x0, 0x59, 0x0, 0x1, 0x2, 0xc3, 0x3, 0x20, 0x0, 0x5, 0x0, 0xe, 0x0, 0x4a, 0x40, 0x18, - 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0xc, 0x9, 0x6, 0xc, 0x6, 0x3, 0x0, 0xe, 0xd, 0x8, - 0x1, 0x5, 0x4, 0x2, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, - 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x7, 0x21, 0x27, 0x1, 0x33, 0x13, 0x27, - 0x3, 0x27, 0x7, 0x3, 0x7, 0x37, 0x21, 0x2, 0xc3, 0xa, 0xfd, 0xaa, 0xa, 0x1, 0x2a, 0x16, - 0xc4, 0x16, 0xa6, 0x13, 0x12, 0xa5, 0x17, 0x33, 0x1, 0x37, 0xd, 0xc, 0xc, 0x3, 0x13, 0xfd, - 0x23, 0x2b, 0x1, 0xcd, 0x46, 0x46, 0xfe, 0x33, 0x2b, 0x8, 0x0, 0x3, 0x0, 0x20, 0x0, 0x0, - 0x2, 0x9b, 0x3, 0xbb, 0x0, 0x3, 0x0, 0xb, 0x0, 0x10, 0x0, 0x5e, 0x40, 0x24, 0x1, 0x11, - 0x11, 0x40, 0x12, 0x4, 0xe, 0xd, 0xb, 0xa, 0x10, 0xc, 0x9, 0x4, 0x2, 0x0, 0x1, 0x0, - 0x8, 0x2, 0x10, 0xc, 0x8, 0x7, 0x6, 0x3, 0x2, 0x9, 0x8, 0x5, 0x3, 0x4, 0x1, 0x1, - 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x11, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x33, 0x1, 0x23, - 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0x7c, 0x42, 0x3e, 0x4b, - 0x1, 0x54, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, - 0x3, 0x22, 0x99, 0xfc, 0x45, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, 0xfe, 0xbb, - 0x0, 0x3, 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0x7e, 0x0, 0xf, 0x0, 0x17, 0x0, 0x1c, - 0x0, 0x5f, 0x40, 0x24, 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0x10, 0x1a, 0x19, 0x17, 0x16, 0xf, 0xd, - 0x7, 0x5, 0x2, 0x1c, 0x18, 0x15, 0x10, 0x8, 0x0, 0x1c, 0x18, 0x8, 0x13, 0x12, 0xa, 0x15, - 0x14, 0x11, 0x3, 0x10, 0x1, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x1d, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, - 0x37, 0x13, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xf6, - 0x31, 0x2f, 0x16, 0x46, 0x15, 0x20, 0x1e, 0x22, 0x30, 0x35, 0x17, 0x47, 0xd, 0x1e, 0x24, 0xc4, - 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, 0x3, 0x41, - 0x26, 0x20, 0x19, 0x33, 0x29, 0x21, 0x1a, 0xfc, 0x89, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, - 0x73, 0x2e, 0xfe, 0xbb, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xce, 0x3, 0x60, 0x0, 0x11, - 0x0, 0x21, 0x0, 0x31, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x32, 0x32, 0x40, 0x33, 0x12, 0x2e, 0x11, - 0xd, 0x7, 0x5, 0x2, 0x2a, 0x22, 0x1a, 0x12, 0x8, 0x0, 0x26, 0x8, 0x1e, 0xa, 0x16, 0x1, - 0x1, 0x1a, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1a, 0x0, 0x32, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x32, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, - 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, - 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0x2b, 0x30, 0x30, 0x16, 0x46, 0x15, 0x20, 0x1e, - 0x22, 0x30, 0x35, 0x17, 0x47, 0xd, 0x13, 0x6, 0xf, 0x1a, 0xc2, 0x5c, 0x57, 0x89, 0x88, 0x57, - 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, 0x2d, 0x3c, - 0x73, 0x74, 0x3c, 0x2d, 0x3, 0x23, 0x25, 0x1f, 0x19, 0x33, 0x29, 0x20, 0x2, 0x4, 0x14, 0xfe, - 0xf, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, - 0x6b, 0x52, 0x69, 0x69, 0x52, 0x6c, 0x6b, 0x52, 0x0, 0x3, 0x0, 0x3b, 0x0, 0x38, 0x1, 0x97, - 0x1, 0xf4, 0x0, 0xb, 0x0, 0xf, 0x0, 0x1b, 0x0, 0x54, 0x40, 0x1e, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0xc, 0x16, 0x10, 0xf, 0xe, 0xd, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x19, 0x8, 0x13, - 0xf, 0xe, 0x7, 0xd, 0xc, 0x9, 0x13, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, - 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x1c, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x21, 0x35, 0x21, 0x7, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x2a, 0x26, 0x1a, 0x1b, 0x26, - 0x26, 0x1b, 0x1a, 0x26, 0x6d, 0xfe, 0xa4, 0x1, 0x5c, 0x6d, 0x26, 0x1a, 0x1b, 0x26, 0x26, 0x1b, - 0x1a, 0x26, 0x1, 0xb4, 0x1b, 0x26, 0x26, 0x1b, 0x1a, 0x26, 0x26, 0xda, 0x40, 0xbc, 0x1b, 0x25, - 0x25, 0x1b, 0x1b, 0x26, 0x26, 0x0, 0x0, 0x3, 0x0, 0x14, 0xfe, 0xdf, 0x1, 0xcd, 0x2, 0xd7, - 0x0, 0xb, 0x0, 0x17, 0x0, 0x26, 0x0, 0x5d, 0x40, 0x24, 0x1, 0x27, 0x27, 0x40, 0x28, 0x18, - 0x25, 0x24, 0x22, 0x21, 0x1c, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x1c, 0x7, - 0x1b, 0x15, 0x9, 0x1b, 0x0, 0x26, 0x23, 0x22, 0x3, 0x18, 0x2, 0x1, 0x22, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x22, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x27, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x5, 0x3, 0x6, - 0x7, 0x27, 0x36, 0x37, 0x36, 0x3f, 0x1, 0x3, 0x33, 0x13, 0x33, 0x13, 0x1, 0x86, 0x20, 0x16, - 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xbd, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x1, - 0x4, 0xcf, 0x3f, 0x9d, 0x8, 0x3d, 0x24, 0x23, 0x19, 0xf, 0xb2, 0x5b, 0x7d, 0x4, 0x87, 0x2, - 0xa1, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, - 0xa7, 0xfd, 0x98, 0xbd, 0xd, 0x42, 0x6, 0x28, 0x25, 0x52, 0x31, 0x2, 0x1a, 0xfe, 0x59, 0x1, - 0xa7, 0x0, 0x0, 0x3, 0x0, 0x1d, 0x0, 0x0, 0x2, 0x79, 0x3, 0x82, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x21, 0x0, 0x5b, 0x40, 0x22, 0x1, 0x22, 0x22, 0x40, 0x23, 0x18, 0x20, 0x1f, 0xf, 0x3, - 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, 0x15, 0x9, 0x1b, 0x1a, 0x1, 0x21, - 0x1e, 0x1d, 0x3, 0x18, 0x3, 0x1, 0x1d, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1d, 0x0, 0x22, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x5, 0x1, 0x11, 0x23, 0x11, 0x1, 0x33, 0x13, 0x33, - 0x13, 0x1, 0xd3, 0x1e, 0x16, 0x15, 0x1e, 0x1e, 0x15, 0x16, 0x1e, 0xaa, 0x1e, 0x15, 0x15, 0x1e, - 0x1e, 0x15, 0x15, 0x1e, 0x1, 0x50, 0xfe, 0xfd, 0x57, 0xfe, 0xfe, 0x63, 0xc7, 0x7, 0xc7, 0x3, - 0x4e, 0x16, 0x1e, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x15, 0x16, 0x1e, 0x1e, 0x16, 0x15, 0x1f, 0x1f, - 0x57, 0xfe, 0x36, 0xfe, 0xbe, 0x1, 0x42, 0x1, 0xca, 0xfe, 0x97, 0x1, 0x69, 0x0, 0x0, 0x3, - 0x0, 0x20, 0x0, 0x0, 0x2, 0x9b, 0x3, 0xab, 0x0, 0x6, 0x0, 0xe, 0x0, 0x13, 0x0, 0x61, - 0x40, 0x25, 0x1, 0x14, 0x14, 0x40, 0x15, 0x7, 0x11, 0x10, 0xe, 0xd, 0x4, 0x3, 0x2, 0x1, - 0x0, 0x13, 0xf, 0xc, 0x7, 0x4, 0x0, 0x13, 0xf, 0x8, 0xa, 0x9, 0x6, 0x5, 0xc, 0xb, - 0x8, 0x3, 0x7, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, - 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x14, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, - 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xea, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x1, 0x1b, 0x5d, - 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, 0x3, 0x19, 0x56, - 0x56, 0x92, 0xfc, 0x55, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, 0xfe, 0xbb, 0x0, - 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, 0x2, 0x3f, 0x3, 0xb2, 0x0, 0x6, 0x0, 0x12, 0x0, 0x75, - 0x40, 0x2f, 0x1, 0x13, 0x13, 0x40, 0x14, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x12, 0x11, 0x10, - 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x4, 0x0, 0x12, 0x11, 0x7, 0x7, 0xc, - 0xb, 0x8, 0xa, 0x9, 0xe, 0xd, 0x8, 0x10, 0xf, 0x6, 0x5, 0x8, 0x7, 0x1, 0x1, 0x8, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x8, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, 0x21, 0x11, 0x21, - 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x1, 0xe5, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, - 0xc4, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, 0xca, 0x1, 0x6e, 0x3, 0x20, 0x56, - 0x56, 0x92, 0xfc, 0x4e, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, 0x0, 0x0, 0x3, 0x0, 0x20, - 0x0, 0x0, 0x2, 0x9b, 0x3, 0xb8, 0x0, 0x3, 0x0, 0xb, 0x0, 0x10, 0x0, 0x5c, 0x40, 0x23, - 0x1, 0x11, 0x11, 0x40, 0x12, 0x4, 0xe, 0xd, 0xb, 0xa, 0x10, 0xc, 0x9, 0x4, 0x2, 0x0, - 0x2, 0x1, 0x8, 0x0, 0x10, 0xc, 0x8, 0x7, 0x6, 0x0, 0x9, 0x8, 0x5, 0x3, 0x4, 0x1, - 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x11, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x27, 0x37, 0x1, 0x23, - 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x13, 0x3, 0x23, 0x7, 0x3, 0x1, 0xbb, 0x3e, 0x42, 0x35, - 0x1, 0x2b, 0x5d, 0x4b, 0xfe, 0xd4, 0x49, 0x5e, 0x1, 0xf, 0x5d, 0x50, 0x7d, 0x3, 0x10, 0x6e, - 0x3, 0xb8, 0x9a, 0x1, 0x98, 0xfc, 0x49, 0xd8, 0xd8, 0x2, 0xec, 0xfe, 0x34, 0x1, 0x73, 0x2e, - 0xfe, 0xbb, 0x0, 0x3, 0x0, 0x75, 0x0, 0x0, 0x2, 0x3f, 0x3, 0x86, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x23, 0x0, 0x76, 0x40, 0x30, 0x1, 0x24, 0x24, 0x40, 0x25, 0x18, 0x23, 0x22, 0x21, 0x20, - 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, - 0x23, 0x22, 0x7, 0x18, 0x1d, 0x1c, 0x8, 0x1b, 0x1a, 0x1f, 0x1e, 0x8, 0x21, 0x20, 0x15, 0x9, - 0x19, 0x18, 0x1, 0x1, 0x19, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, - 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x19, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x1, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x1, 0xf3, - 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xc9, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, - 0x1f, 0x1, 0x15, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, 0xca, 0x1, 0x6e, 0x3, - 0x50, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, - 0xfc, 0x99, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, 0x0, 0x0, 0x2, 0x0, 0x75, 0x0, 0x0, - 0x2, 0x3f, 0x3, 0xb9, 0x0, 0xb, 0x0, 0xf, 0x0, 0x6a, 0x40, 0x28, 0x1, 0x10, 0x10, 0x40, - 0x11, 0x0, 0xe, 0xd, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0xe, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xf, 0xc, 0x1, 0x0, - 0x1, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x1, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, - 0xff, 0xc0, 0x38, 0x59, 0x29, 0x1, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, - 0x1, 0x17, 0x33, 0x27, 0x2, 0x3f, 0xfe, 0x36, 0x1, 0xb8, 0xfe, 0xa4, 0x1, 0x36, 0xfe, 0xca, - 0x1, 0x6e, 0xfe, 0xd6, 0x3e, 0x42, 0x36, 0x2, 0xd6, 0x48, 0xf0, 0x48, 0xfe, 0xf1, 0x3, 0x72, - 0x99, 0x99, 0x0, 0x2, 0x0, 0x39, 0x0, 0x0, 0x1, 0x7, 0x3, 0xb9, 0x0, 0x3, 0x0, 0xf, - 0x0, 0x6e, 0x40, 0x2d, 0x1, 0x10, 0x10, 0x40, 0x11, 0x4, 0x2, 0x1, 0xf, 0xe, 0xd, 0xc, - 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x2, 0x0, 0xd, 0xc, 0x9, 0x3, 0x8, 0x7, - 0xb, 0xa, 0xf, 0xe, 0x7, 0x3, 0x6, 0x7, 0x4, 0x3, 0x0, 0x5, 0x4, 0x1, 0x1, 0x5, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, - 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x10, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, - 0x13, 0x7, 0x23, 0x37, 0x13, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, - 0xfd, 0x3e, 0x42, 0x35, 0x55, 0xce, 0x3c, 0x3c, 0xce, 0x3c, 0x3c, 0x3, 0xb9, 0x99, 0x99, 0xfc, - 0x47, 0x38, 0x2, 0x66, 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x2, 0x0, 0x33, 0x0, 0x0, 0x1, 0x47, - 0x3, 0xb2, 0x0, 0x6, 0x0, 0x12, 0x0, 0x74, 0x40, 0x30, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, - 0x4, 0x3, 0x2, 0x1, 0x0, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, - 0x7, 0x4, 0x0, 0x10, 0xf, 0xc, 0x3, 0xb, 0x7, 0xe, 0xd, 0x12, 0x11, 0xa, 0x3, 0x9, - 0x7, 0x7, 0x6, 0x5, 0x8, 0x7, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, - 0x23, 0x37, 0x33, 0x13, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x1, - 0x47, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x47, 0xcd, 0x3c, 0x3c, 0xcd, 0x3b, 0x3b, 0x3, 0x20, - 0x56, 0x56, 0x92, 0xfc, 0x4e, 0x38, 0x2, 0x66, 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x3, 0x0, 0x23, - 0x0, 0x0, 0x1, 0x56, 0x3, 0x85, 0x0, 0xb, 0x0, 0x17, 0x0, 0x23, 0x0, 0x75, 0x40, 0x31, - 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, - 0x19, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x21, 0x20, 0x1d, 0x3, 0x1c, 0x7, - 0x1f, 0x1e, 0x23, 0x22, 0x1b, 0x3, 0x1a, 0x7, 0x18, 0x15, 0x9, 0x19, 0x18, 0x1, 0x1, 0x12, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, - 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, - 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x23, 0x35, 0x33, 0x11, - 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x1, 0x56, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, - 0x20, 0xc7, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x95, 0xcd, 0x3c, 0x3c, 0xcd, 0x3b, - 0x3b, 0x3, 0x4f, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, - 0x20, 0x20, 0xfc, 0x9b, 0x38, 0x2, 0x66, 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x0, 0x2, 0x0, 0x4d, - 0x0, 0x0, 0x1, 0x1e, 0x3, 0xb9, 0x0, 0x3, 0x0, 0xf, 0x0, 0x71, 0x40, 0x2f, 0x1, 0x10, - 0x10, 0x40, 0x11, 0x4, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, - 0x2, 0x0, 0x1, 0x0, 0x8, 0x2, 0xd, 0xc, 0x9, 0x3, 0x8, 0x7, 0xb, 0xa, 0xf, 0xe, - 0x7, 0x3, 0x6, 0x7, 0x4, 0x3, 0x2, 0x5, 0x4, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x2f, 0x3c, 0xfd, 0x17, 0x3c, 0x10, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x23, 0x27, - 0x33, 0x13, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0xce, 0x42, 0x3f, - 0x4c, 0x85, 0xcd, 0x3c, 0x3c, 0xcd, 0x3b, 0x3b, 0x3, 0x20, 0x99, 0xfc, 0x47, 0x38, 0x2, 0x66, - 0x38, 0x38, 0xfd, 0x9a, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xce, 0x3, 0xba, 0x0, 0x3, - 0x0, 0x13, 0x0, 0x23, 0x0, 0x4c, 0x40, 0x1a, 0x1, 0x24, 0x24, 0x40, 0x25, 0x4, 0x20, 0x1c, - 0x14, 0xc, 0x4, 0x2, 0x0, 0x2, 0x1, 0x8, 0x0, 0x18, 0x8, 0x10, 0x0, 0x8, 0x1, 0x1, - 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, - 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x1, 0xe6, 0x3f, 0x41, 0x35, 0x1, 0x33, 0x5c, 0x57, 0x89, - 0x88, 0x57, 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, - 0x2d, 0x3c, 0x73, 0x74, 0x3c, 0x2d, 0x3, 0xba, 0x9a, 0x99, 0xfd, 0xb0, 0xab, 0x66, 0x60, 0x61, - 0x66, 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x69, 0x52, - 0x6c, 0x6b, 0x52, 0x0, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, 0x2, 0xce, 0x3, 0xb2, 0x0, 0x6, - 0x0, 0x16, 0x0, 0x26, 0x0, 0x54, 0x40, 0x1e, 0x1, 0x27, 0x27, 0x40, 0x28, 0x7, 0x4, 0x3, - 0x2, 0x1, 0x0, 0x1f, 0x17, 0xf, 0x7, 0x4, 0x0, 0x23, 0x8, 0xb, 0x1b, 0x8, 0x13, 0x6, - 0x5, 0xb, 0x1, 0x1, 0xf, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, - 0x33, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x2, 0x1b, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0x1, 0x1d, 0x5c, 0x57, 0x89, 0x88, 0x57, - 0x5c, 0x5c, 0x57, 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, 0x2d, 0x3c, - 0x73, 0x74, 0x3c, 0x2d, 0x3, 0x20, 0x56, 0x56, 0x92, 0xfd, 0xb7, 0xab, 0x66, 0x60, 0x61, 0x66, - 0xab, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x6a, 0x52, 0x6c, - 0x6c, 0x51, 0x0, 0x5, 0x0, 0x55, 0xff, 0xf6, 0x3, 0x62, 0x3, 0x28, 0x0, 0xb, 0x0, 0x19, - 0x0, 0x25, 0x0, 0x31, 0x0, 0x3f, 0x0, 0x5f, 0x40, 0x24, 0x1, 0x40, 0x40, 0x40, 0x41, 0x0, - 0x3f, 0x3b, 0x16, 0x3a, 0x32, 0x2c, 0x26, 0x20, 0x1a, 0x13, 0xc, 0x6, 0x0, 0x29, 0x1d, 0x8, - 0x2f, 0x23, 0x10, 0x7, 0x9, 0x3d, 0x7, 0x36, 0x9, 0x3, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x6, 0x0, 0x40, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x40, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x3, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x3, 0x62, 0xe2, 0xa5, 0xa4, 0xe2, 0xe2, 0xa4, 0xa5, - 0xe2, 0x4e, 0x57, 0x5a, 0x88, 0x87, 0xb1, 0xb1, 0x87, 0x87, 0x5b, 0x57, 0xa7, 0x1e, 0x16, 0x16, - 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0xae, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x15, 0x16, 0x1e, 0xff, 0x1d, - 0x1a, 0x3f, 0x68, 0x69, 0x40, 0x25, 0x10, 0x3a, 0x2c, 0x78, 0x78, 0x2a, 0x1, 0x91, 0xa8, 0xf3, - 0xf3, 0xa8, 0xa8, 0xef, 0xef, 0xa8, 0x8c, 0x61, 0x64, 0xc5, 0x8c, 0x8c, 0xca, 0x66, 0x64, 0x1, - 0xd, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, 0x16, 0x16, 0x1e, 0x1e, - 0xc0, 0x4d, 0x23, 0x52, 0x52, 0x30, 0x40, 0x18, 0x99, 0x98, 0x0, 0x3, 0x0, 0x57, 0xff, 0xf8, - 0x2, 0xce, 0x3, 0xb9, 0x0, 0x3, 0x0, 0x13, 0x0, 0x23, 0x0, 0x51, 0x40, 0x1d, 0x1, 0x24, - 0x24, 0x40, 0x25, 0x4, 0x1c, 0x14, 0xc, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, 0x2, 0x20, 0x8, - 0x8, 0x18, 0x8, 0x10, 0x3, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x2f, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, - 0x33, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, - 0x16, 0x7, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x1, 0xb9, 0x42, 0x3e, 0x4b, 0x1, 0x4a, 0x5c, 0x57, 0x89, 0x88, 0x57, 0x5c, 0x5c, 0x57, - 0x88, 0x89, 0x57, 0x5c, 0x5f, 0x2d, 0x3c, 0x74, 0x73, 0x3c, 0x2d, 0x2d, 0x3c, 0x73, 0x74, 0x3c, - 0x2d, 0x3, 0x20, 0x99, 0xfd, 0xb0, 0xab, 0x66, 0x60, 0x61, 0x66, 0xab, 0xab, 0x66, 0x60, 0x61, - 0x66, 0xab, 0x6a, 0x51, 0x6c, 0x6b, 0x52, 0x69, 0x6a, 0x52, 0x6c, 0x6c, 0x51, 0x0, 0x0, 0x2, - 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xba, 0x0, 0x3, 0x0, 0x19, 0x0, 0x57, 0x40, 0x1f, - 0x1, 0x1a, 0x1a, 0x40, 0x1b, 0x4, 0x19, 0x18, 0x13, 0xe, 0xd, 0x19, 0x18, 0x17, 0xf, 0xe, - 0xd, 0xc, 0x4, 0x2, 0x0, 0x2, 0x1, 0x8, 0x0, 0x0, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0xc, 0x0, 0x1a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x1a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x13, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x1, - 0xcd, 0x3f, 0x41, 0x35, 0xfc, 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, - 0x2f, 0x3d, 0x57, 0x3, 0xba, 0x9a, 0x99, 0xfd, 0x5b, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, - 0xe3, 0xfe, 0x1e, 0x72, 0x36, 0x2c, 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x2, 0x0, 0x62, - 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xb2, 0x0, 0x6, 0x0, 0x1c, 0x0, 0x5c, 0x40, 0x21, 0x1, 0x1d, - 0x1d, 0x40, 0x1e, 0x7, 0x1c, 0x1b, 0x16, 0x11, 0x10, 0x4, 0x3, 0x2, 0x1, 0x0, 0x1c, 0x1b, - 0x1a, 0x12, 0x11, 0x10, 0xf, 0x7, 0x4, 0x0, 0x6, 0x5, 0xb, 0x1, 0x1, 0xf, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x13, - 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x36, 0x35, 0x11, 0x33, 0x2, 0x1, 0x47, 0x43, 0x43, 0x47, 0x6a, 0x40, 0xe7, 0x58, 0x48, - 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, 0x3d, 0x57, 0x3, 0x20, 0x56, 0x56, - 0x92, 0xfd, 0x62, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xe3, 0xfe, 0x1e, 0x72, 0x36, 0x2c, - 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x2, 0x0, 0x62, 0xff, 0xf8, 0x2, 0x7e, 0x3, 0xb9, - 0x0, 0x3, 0x0, 0x19, 0x0, 0x59, 0x40, 0x20, 0x1, 0x1a, 0x1a, 0x40, 0x1b, 0x4, 0x19, 0x18, - 0x13, 0xe, 0xd, 0x19, 0x18, 0x17, 0xf, 0xe, 0xd, 0xc, 0x4, 0x2, 0x0, 0x1, 0x0, 0x8, - 0x2, 0x3, 0x2, 0x8, 0x1, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x1a, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1a, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x23, 0x27, 0x33, 0x1, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, - 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x1, 0x96, 0x42, 0x3e, 0x4b, 0x1, 0x1d, - 0x58, 0x48, 0x6e, 0x70, 0x47, 0x57, 0x56, 0x3b, 0x30, 0x4d, 0x4b, 0x2f, 0x3d, 0x57, 0x3, 0x20, - 0x99, 0xfd, 0x5b, 0x95, 0x4b, 0x3c, 0x3c, 0x4a, 0x96, 0x1, 0xe3, 0xfe, 0x1e, 0x72, 0x36, 0x2c, - 0x2a, 0x37, 0x73, 0x1, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0xfe, - 0x0, 0x0, 0x1, 0x6c, 0x0, 0x0, 0x2, 0x64, 0x0, 0x0, 0x3, 0x48, 0x0, 0x0, 0x4, 0x48, - 0x0, 0x0, 0x5, 0x24, 0x0, 0x0, 0x5, 0x78, 0x0, 0x0, 0x5, 0xdc, 0x0, 0x0, 0x6, 0x42, - 0x0, 0x0, 0x6, 0xd8, 0x0, 0x0, 0x7, 0x5e, 0x0, 0x0, 0x7, 0xce, 0x0, 0x0, 0x8, 0x24, - 0x0, 0x0, 0x8, 0x84, 0x0, 0x0, 0x8, 0xde, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x9, 0xfe, - 0x0, 0x0, 0xa, 0x9e, 0x0, 0x0, 0xb, 0x7a, 0x0, 0x0, 0xc, 0x18, 0x0, 0x0, 0xc, 0xd0, - 0x0, 0x0, 0xd, 0xa8, 0x0, 0x0, 0xe, 0x16, 0x0, 0x0, 0xf, 0x6, 0x0, 0x0, 0xf, 0xc4, - 0x0, 0x0, 0x10, 0x52, 0x0, 0x0, 0x10, 0xee, 0x0, 0x0, 0x11, 0x68, 0x0, 0x0, 0x11, 0xe2, - 0x0, 0x0, 0x12, 0x5c, 0x0, 0x0, 0x13, 0x1c, 0x0, 0x0, 0x14, 0x62, 0x0, 0x0, 0x14, 0xea, - 0x0, 0x0, 0x15, 0xac, 0x0, 0x0, 0x16, 0x46, 0x0, 0x0, 0x16, 0xe2, 0x0, 0x0, 0x17, 0x78, - 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x18, 0xca, 0x0, 0x0, 0x19, 0x58, 0x0, 0x0, 0x19, 0xe6, - 0x0, 0x0, 0x1a, 0x4e, 0x0, 0x0, 0x1a, 0xd6, 0x0, 0x0, 0x1b, 0x3e, 0x0, 0x0, 0x1b, 0xd8, - 0x0, 0x0, 0x1c, 0x60, 0x0, 0x0, 0x1d, 0x6, 0x0, 0x0, 0x1d, 0xac, 0x0, 0x0, 0x1e, 0x74, - 0x0, 0x0, 0x1f, 0x1e, 0x0, 0x0, 0x1f, 0xe4, 0x0, 0x0, 0x20, 0x5a, 0x0, 0x0, 0x20, 0xee, - 0x0, 0x0, 0x21, 0x5e, 0x0, 0x0, 0x21, 0xfa, 0x0, 0x0, 0x22, 0x7e, 0x0, 0x0, 0x22, 0xfa, - 0x0, 0x0, 0x23, 0x80, 0x0, 0x0, 0x23, 0xf6, 0x0, 0x0, 0x24, 0x4a, 0x0, 0x0, 0x24, 0xc0, - 0x0, 0x0, 0x25, 0x22, 0x0, 0x0, 0x25, 0x7a, 0x0, 0x0, 0x25, 0xd0, 0x0, 0x0, 0x26, 0xa0, - 0x0, 0x0, 0x27, 0x4c, 0x0, 0x0, 0x27, 0xda, 0x0, 0x0, 0x28, 0x8c, 0x0, 0x0, 0x29, 0x40, - 0x0, 0x0, 0x29, 0xfc, 0x0, 0x0, 0x2b, 0xe, 0x0, 0x0, 0x2b, 0xa8, 0x0, 0x0, 0x2c, 0x48, - 0x0, 0x0, 0x2c, 0xda, 0x0, 0x0, 0x2d, 0x5e, 0x0, 0x0, 0x2d, 0xcc, 0x0, 0x0, 0x2e, 0x8a, - 0x0, 0x0, 0x2f, 0x24, 0x0, 0x0, 0x2f, 0xb6, 0x0, 0x0, 0x30, 0x6c, 0x0, 0x0, 0x31, 0x1a, - 0x0, 0x0, 0x31, 0xb6, 0x0, 0x0, 0x32, 0x7e, 0x0, 0x0, 0x33, 0x20, 0x0, 0x0, 0x33, 0xba, - 0x0, 0x0, 0x34, 0x2c, 0x0, 0x0, 0x34, 0xc8, 0x0, 0x0, 0x35, 0x46, 0x0, 0x0, 0x35, 0xd0, - 0x0, 0x0, 0x36, 0x56, 0x0, 0x0, 0x37, 0xe, 0x0, 0x0, 0x37, 0x64, 0x0, 0x0, 0x38, 0x12, - 0x0, 0x0, 0x38, 0x90, 0x0, 0x0, 0x39, 0x1e, 0x0, 0x0, 0x39, 0xc8, 0x0, 0x0, 0x3a, 0xbc, - 0x0, 0x0, 0x3b, 0xda, 0x0, 0x0, 0x3c, 0x3c, 0x0, 0x0, 0x3c, 0xca, 0x0, 0x0, 0x3d, 0x9a, - 0x0, 0x0, 0x3d, 0xec, 0x0, 0x0, 0x3e, 0x76, 0x0, 0x0, 0x3f, 0x3c, 0x0, 0x0, 0x40, 0x1a, - 0x0, 0x0, 0x40, 0xbe, 0x0, 0x0, 0x41, 0x8a, 0x0, 0x0, 0x42, 0x2e, 0x0, 0x0, 0x43, 0x40, - 0x0, 0x0, 0x44, 0x14, 0x0, 0x0, 0x44, 0xd6, 0x0, 0x0, 0x45, 0x56, 0x0, 0x0, 0x46, 0x1a, - 0x0, 0x0, 0x46, 0xa0, 0x0, 0x0, 0x47, 0x2a, 0x0, 0x0, 0x47, 0xda, 0x0, 0x0, 0x48, 0xda, - 0x0, 0x0, 0x49, 0xc4, 0x0, 0x0, 0x4a, 0x1c, 0x0, 0x0, 0x4a, 0x74, 0x0, 0x0, 0x4b, 0x24, - 0x0, 0x0, 0x4b, 0xd4, 0x0, 0x0, 0x4c, 0x48, 0x0, 0x0, 0x4c, 0xbc, 0x0, 0x0, 0x4d, 0x16, - 0x0, 0x0, 0x4e, 0x20, 0x0, 0x0, 0x4e, 0x82, 0x0, 0x0, 0x4e, 0xe6, 0x0, 0x0, 0x4f, 0xfc, - 0x0, 0x0, 0x50, 0xe8, 0x0, 0x0, 0x51, 0xa6, 0x0, 0x0, 0x52, 0x8, 0x0, 0x0, 0x52, 0x78, - 0x0, 0x0, 0x53, 0x20, 0x0, 0x0, 0x54, 0x70, 0x0, 0x0, 0x54, 0xe2, 0x0, 0x0, 0x55, 0x44, - 0x0, 0x0, 0x55, 0xbc, 0x0, 0x0, 0x56, 0x12, 0x0, 0x0, 0x56, 0x84, 0x0, 0x0, 0x56, 0xe6, - 0x0, 0x0, 0x57, 0x72, 0x0, 0x0, 0x57, 0xfe, 0x0, 0x0, 0x58, 0x6c, 0x0, 0x0, 0x58, 0xf2, - 0x0, 0x0, 0x59, 0x54, 0x0, 0x0, 0x59, 0xdc, 0x0, 0x0, 0x5a, 0xb8, 0x0, 0x0, 0x5b, 0x90, - 0x0, 0x0, 0x5c, 0x6a, 0x0, 0x0, 0x5d, 0x18, 0x0, 0x0, 0x5d, 0xe4, 0x0, 0x0, 0x5e, 0xda, - 0x0, 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x60, 0xae, 0x0, 0x0, 0x61, 0x9c, 0x0, 0x0, 0x62, 0x96, - 0x0, 0x0, 0x63, 0xba, 0x0, 0x0, 0x64, 0xca, 0x0, 0x0, 0x65, 0xf2, 0x0, 0x0, 0x66, 0xc4, - 0x0, 0x0, 0x67, 0x94, 0x0, 0x0, 0x68, 0x64, 0x0, 0x0, 0x69, 0x40, 0x0, 0x0, 0x6a, 0x46, - 0x0, 0x0, 0x6a, 0xd6, 0x0, 0x0, 0x6b, 0x66, 0x0, 0x0, 0x6c, 0x2, 0x0, 0x0, 0x6c, 0xca, - 0x0, 0x0, 0x6d, 0xa4, 0x0, 0x0, 0x6e, 0x50, 0x0, 0x0, 0x6e, 0xfc, 0x0, 0x0, 0x6f, 0xb4, - 0x0, 0x0, 0x70, 0x94, 0x0, 0x0, 0x71, 0x64, 0x0, 0x0, 0x72, 0x1a, 0x0, 0x0, 0x72, 0xd0, - 0x0, 0x0, 0x73, 0x92, 0x0, 0x0, 0x74, 0x80, 0x0, 0x0, 0x75, 0x10, 0x0, 0x0, 0x76, 0x1e, - 0x0, 0x0, 0x77, 0x1a, 0x0, 0x0, 0x77, 0xe6, 0x0, 0x0, 0x78, 0x98, 0x0, 0x0, 0x78, 0x98, - 0x0, 0x0, 0x79, 0x40, 0x0, 0x0, 0x79, 0xb8, 0x0, 0x0, 0x7a, 0x30, 0x0, 0x0, 0x7a, 0xde, - 0x0, 0x0, 0x7a, 0xde, 0x0, 0x0, 0x7a, 0xde, 0x0, 0x0, 0x7b, 0x7e, 0x0, 0x0, 0x7c, 0x22, - 0x0, 0x0, 0x7c, 0xb6, 0x0, 0x0, 0x7c, 0xb6, 0x0, 0x0, 0x7d, 0x1c, 0x0, 0x0, 0x7e, 0x34, - 0x0, 0x0, 0x81, 0x46, 0x0, 0x0, 0x81, 0xd2, 0x0, 0x0, 0x81, 0xd2, 0x0, 0x0, 0x82, 0x78, - 0x0, 0x0, 0x83, 0x3c, 0x0, 0x0, 0x84, 0x20, 0x0, 0x0, 0x84, 0xce, 0x0, 0x0, 0x84, 0xce, - 0x0, 0x0, 0x85, 0xaa, 0x0, 0x0, 0x86, 0x76, 0x0, 0x0, 0x87, 0x28, 0x0, 0x0, 0x87, 0xe4, - 0x0, 0x0, 0x88, 0x8a, 0x0, 0x0, 0x89, 0x72, 0x0, 0x0, 0x8a, 0x1a, 0x0, 0x0, 0x8a, 0xc0, - 0x0, 0x0, 0x8b, 0x74, 0x0, 0x0, 0x8c, 0x54, 0x0, 0x0, 0x8c, 0xfc, 0x0, 0x0, 0x8d, 0xbc, - 0x0, 0x0, 0x8e, 0x8a, 0x0, 0x0, 0x8f, 0xa2, 0x0, 0x0, 0x90, 0x66, 0x0, 0x0, 0x91, 0x14, - 0x0, 0x0, 0x91, 0xce, 0x0, 0x0, 0x92, 0x7e, 0x1, 0xf4, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd2, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x1, 0x67, 0x0, 0x73, 0x1, 0x4c, 0x0, 0x5, - 0x2, 0xbe, 0x0, 0x3b, 0x2, 0x67, 0x0, 0x3c, 0x3, 0x94, 0x0, 0x3b, 0x2, 0x98, 0x0, 0x3b, - 0x0, 0xd2, 0x0, 0x3b, 0x1, 0x46, 0x0, 0x3b, 0x1, 0x46, 0x0, 0x3b, 0x2, 0x17, 0x0, 0x5f, - 0x1, 0xe8, 0x0, 0x3b, 0x1, 0x3f, 0x0, 0x5f, 0x1, 0x46, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, - 0x1, 0xa2, 0x0, 0x3b, 0x2, 0x93, 0x0, 0x50, 0x1, 0xf7, 0x0, 0x50, 0x2, 0x3e, 0x0, 0x50, - 0x2, 0x4a, 0x0, 0x50, 0x2, 0x78, 0x0, 0x50, 0x2, 0x33, 0x0, 0x50, 0x2, 0x64, 0x0, 0x50, - 0x2, 0x16, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x64, 0x0, 0x50, 0x0, 0xf7, 0x0, 0x3b, - 0x0, 0xfa, 0x0, 0x3b, 0x2, 0x91, 0x0, 0x19, 0x2, 0x47, 0x0, 0x69, 0x2, 0x91, 0x0, 0x3b, - 0x2, 0x1a, 0x0, 0x3e, 0x4, 0x9, 0x0, 0x55, 0x2, 0xc4, 0x0, 0x20, 0x2, 0xba, 0x0, 0x75, - 0x2, 0xac, 0x0, 0x57, 0x2, 0xe6, 0x0, 0x75, 0x2, 0x82, 0x0, 0x75, 0x2, 0x48, 0x0, 0x75, - 0x3, 0x1f, 0x0, 0x57, 0x2, 0xf9, 0x0, 0x75, 0x1, 0x40, 0x0, 0x39, 0x1, 0x68, 0x0, 0x30, - 0x2, 0x9d, 0x0, 0x75, 0x2, 0x37, 0x0, 0x75, 0x3, 0x6c, 0x0, 0x75, 0x2, 0xfb, 0x0, 0x75, - 0x3, 0x3e, 0x0, 0x57, 0x2, 0x7c, 0x0, 0x76, 0x3, 0x4d, 0x0, 0x57, 0x2, 0x9e, 0x0, 0x75, - 0x2, 0x66, 0x0, 0x3e, 0x2, 0xf, 0x0, 0x2f, 0x2, 0xdf, 0x0, 0x62, 0x2, 0x79, 0x0, 0x1c, - 0x3, 0xb5, 0x0, 0x1c, 0x2, 0x91, 0x0, 0x22, 0x2, 0x50, 0x0, 0x1d, 0x2, 0x5d, 0x0, 0x25, - 0x1, 0x4e, 0x0, 0x3b, 0x1, 0x38, 0x0, 0x3b, 0x1, 0x4e, 0x0, 0x3b, 0x1, 0x8a, 0x0, 0x5, - 0x2, 0x4, 0x0, 0x3b, 0x0, 0xf6, 0x0, 0x3b, 0x2, 0x11, 0x0, 0x2d, 0x2, 0x3f, 0x0, 0x5a, - 0x1, 0xc6, 0x0, 0x32, 0x2, 0x30, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, 0x1, 0x56, 0x0, 0x2d, - 0x2, 0x28, 0x0, 0x32, 0x2, 0x57, 0x0, 0x5f, 0x1, 0x20, 0x0, 0x28, 0x1, 0x4, 0x0, 0x0, - 0x2, 0x10, 0x0, 0x5f, 0x1, 0x1d, 0x0, 0x5a, 0x3, 0x75, 0x0, 0x5f, 0x2, 0x57, 0x0, 0x5f, - 0x2, 0x13, 0x0, 0x32, 0x2, 0x35, 0x0, 0x5f, 0x2, 0x30, 0x0, 0x32, 0x1, 0xa1, 0x0, 0x3b, - 0x1, 0xb3, 0x0, 0x28, 0x1, 0x5e, 0x0, 0x26, 0x2, 0x4b, 0x0, 0x5f, 0x1, 0xf0, 0x0, 0x14, - 0x3, 0x8, 0x0, 0x20, 0x1, 0xe5, 0x0, 0xf, 0x1, 0xe1, 0x0, 0x14, 0x1, 0xce, 0x0, 0x32, - 0x1, 0x59, 0x0, 0x3b, 0x1, 0x16, 0x0, 0x69, 0x1, 0x59, 0x0, 0x3b, 0x1, 0xa7, 0x0, 0xb, - 0x2, 0x2a, 0x0, 0x3d, 0x1, 0xc6, 0x0, 0x32, 0x2, 0x88, 0x0, 0x3d, 0x1, 0xdb, 0x0, 0x3d, - 0x1, 0x82, 0x0, 0x3b, 0x2, 0x52, 0x0, 0x55, 0x2, 0x2d, 0x0, 0x5f, 0x1, 0x38, 0x0, 0x3b, - 0x1, 0x9e, 0x0, 0x3b, 0x3, 0xb9, 0x0, 0x20, 0x3, 0x3e, 0x0, 0x57, 0x2, 0x50, 0x0, 0x1d, - 0x1, 0xaf, 0x0, 0x3b, 0x1, 0xc2, 0x0, 0x3b, 0x3, 0xc, 0x0, 0x2d, 0x2, 0x13, 0x0, 0x32, - 0x2, 0x1a, 0x0, 0x3d, 0x1, 0x67, 0x0, 0x73, 0x1, 0xd2, 0x0, 0x3b, 0x2, 0x95, 0x0, 0x3b, - 0x2, 0x95, 0x0, 0x3b, 0x3, 0x22, 0x0, 0x55, 0x4, 0x46, 0x0, 0x57, 0x3, 0x5a, 0x0, 0x32, - 0x2, 0x4, 0x0, 0x3b, 0x2, 0x85, 0x0, 0x3b, 0x1, 0xaf, 0x0, 0x3b, 0x1, 0xb5, 0x0, 0x3b, - 0x0, 0xf7, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, 0x1, 0xa2, 0x0, 0x3b, 0x2, 0xca, 0x0, 0x3d, - 0x1, 0xa2, 0x0, 0x3b, 0x1, 0xa1, 0x0, 0x3b, 0x2, 0x7f, 0x0, 0x2d, 0x2, 0x7a, 0x0, 0x2d, - 0x2, 0x5e, 0x0, 0x57, 0x0, 0xf7, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, 0x1, 0xd9, 0x0, 0x5f, - 0x5, 0x98, 0x0, 0x55, 0x1, 0x20, 0x0, 0x28, 0x1, 0x8a, 0x0, 0x3b, 0x1, 0xa7, 0x0, 0x3b, - 0x1, 0x6e, 0x0, 0x3b, 0x1, 0xc1, 0x0, 0x3b, 0x0, 0xf7, 0x0, 0x3b, 0x1, 0x3d, 0x0, 0x3b, - 0x1, 0x1a, 0x0, 0x3b, 0x1, 0xfa, 0x0, 0x3b, 0x1, 0x1a, 0x0, 0x3b, 0x1, 0x8a, 0x0, 0x3b, - 0x1, 0x38, 0x0, 0x3b, 0x2, 0xc9, 0x0, 0x20, 0x2, 0xc9, 0x0, 0x20, 0x2, 0xac, 0x0, 0x57, - 0x2, 0x83, 0x0, 0x75, 0x3, 0x0, 0x0, 0x75, 0x3, 0x25, 0x0, 0x57, 0x2, 0xe4, 0x0, 0x62, - 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, - 0x2, 0x11, 0x0, 0x2d, 0x2, 0x11, 0x0, 0x2d, 0x1, 0xc6, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, - 0x2, 0xe, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, 0x2, 0xe, 0x0, 0x32, 0x1, 0x20, 0x0, 0x3b, - 0x1, 0x20, 0x0, 0x3b, 0x1, 0x20, 0x0, 0x41, 0x1, 0x20, 0x0, 0x1b, 0x2, 0x57, 0x0, 0x5f, - 0x2, 0x13, 0x0, 0x32, 0x2, 0x13, 0x0, 0x32, 0x2, 0x13, 0x0, 0x32, 0x2, 0x13, 0x0, 0x32, - 0x2, 0x13, 0x0, 0x32, 0x2, 0x4b, 0x0, 0x5f, 0x2, 0x4b, 0x0, 0x5f, 0x2, 0x4b, 0x0, 0x5f, - 0x2, 0x4b, 0x0, 0x5f, 0x1, 0xdf, 0x0, 0x3b, 0x3, 0xda, 0x0, 0x3b, 0x3, 0xda, 0x0, 0x3b, - 0x3, 0x79, 0x0, 0x3b, 0x1, 0xf0, 0x0, 0x3b, 0x1, 0x38, 0x0, 0x0, 0x1, 0xe9, 0x0, 0x3b, - 0x2, 0xff, 0x0, 0x3b, 0x2, 0xff, 0x0, 0x3b, 0x2, 0x5d, 0x0, 0x5f, 0x1, 0x38, 0x0, 0x0, - 0x1, 0x38, 0x0, 0x0, 0x3, 0x19, 0x0, 0x3b, 0x2, 0x6c, 0x0, 0x3b, 0x1, 0xd2, 0x0, 0x3b, - 0x1, 0x38, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x3b, 0x3, 0xb7, 0x0, 0x55, 0x5, 0x2f, 0x0, 0x64, - 0x3, 0x1d, 0x0, 0x59, 0x1, 0x38, 0x0, 0x0, 0x2, 0xc9, 0x0, 0x20, 0x2, 0xc9, 0x0, 0x20, - 0x3, 0x25, 0x0, 0x57, 0x1, 0xd2, 0x0, 0x3b, 0x1, 0x38, 0x0, 0x0, 0x1, 0xe1, 0x0, 0x14, - 0x2, 0x50, 0x0, 0x1d, 0x2, 0xc9, 0x0, 0x20, 0x2, 0x83, 0x0, 0x75, 0x2, 0xc9, 0x0, 0x20, - 0x2, 0x83, 0x0, 0x75, 0x2, 0x83, 0x0, 0x75, 0x1, 0x40, 0x0, 0x39, 0x1, 0x82, 0x0, 0x33, - 0x1, 0x79, 0x0, 0x23, 0x1, 0x58, 0x0, 0x4d, 0x3, 0x25, 0x0, 0x57, 0x3, 0x25, 0x0, 0x57, - 0x3, 0xb7, 0x0, 0x55, 0x3, 0x25, 0x0, 0x57, 0x2, 0xe4, 0x0, 0x62, 0x2, 0xe4, 0x0, 0x62, - 0x2, 0xe4, 0x0, 0x62, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x7b, 0x0, 0x14, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, - 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, - 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, - 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, - 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, - 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, - 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, - 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, - 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, - 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, 0x0, 0x49, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, - 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, - 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, - 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x82, 0x0, 0x84, 0x0, 0x85, - 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x90, 0x0, 0x91, - 0x0, 0x96, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa6, - 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, - 0x0, 0xb5, 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, - 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xd7, 0x0, 0xd8, - 0x0, 0xd9, 0x0, 0xda, 0x0, 0xdb, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, - 0x0, 0xe1, 0x1, 0x2, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, - 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x6d, 0x0, 0x6e, 0x0, 0x6f, - 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, - 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, - 0x0, 0x80, 0x0, 0x81, 0x0, 0x83, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8f, 0x0, 0x92, - 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, - 0x0, 0x9c, 0x0, 0x9f, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xac, 0x0, 0xad, - 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xc7, 0x0, 0xc8, - 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, - 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x3, 0x44, 0x45, 0x4c, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x24, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0x3, 0x0, 0x1, 0x0, 0x0, 0x1, 0x24, 0x0, 0x0, 0x1, 0x6, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x7f, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, - 0x41, 0x42, 0x7e, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, - 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x73, 0x63, 0x64, 0x80, 0x6d, 0x74, 0x65, 0x81, 0xa, 0x7c, 0x75, 0x82, 0x83, - 0x84, 0x85, 0x0, 0x7a, 0x62, 0x86, 0x87, 0x0, 0x67, 0x66, 0x88, 0x89, 0x7d, 0x76, 0x77, 0x8a, - 0x0, 0x72, 0x0, 0x43, 0x69, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x6a, 0x0, 0x91, 0x92, 0x0, 0x93, - 0x94, 0x95, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6b, 0x0, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x78, 0x6f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x71, 0x79, 0x68, 0x96, 0x97, - 0x98, 0x99, 0x0, 0x0, 0x0, 0x4, 0x3, 0x5e, 0x0, 0x0, 0x0, 0x60, 0x0, 0x40, 0x0, 0x5, - 0x0, 0x20, 0x0, 0x7e, 0x0, 0xa5, 0x0, 0xac, 0x0, 0xb1, 0x0, 0xb8, 0x0, 0xbb, 0x0, 0xcf, - 0x0, 0xd6, 0x0, 0xdc, 0x0, 0xef, 0x0, 0xfc, 0x0, 0xff, 0x1, 0x31, 0x1, 0x53, 0x1, 0x78, - 0x1, 0x92, 0x2, 0xc7, 0x2, 0xc9, 0x2, 0xdd, 0x3, 0x94, 0x3, 0xa9, 0x3, 0xbc, 0x3, 0xc0, - 0x20, 0x10, 0x20, 0x14, 0x20, 0x1a, 0x20, 0x1e, 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x3a, - 0x20, 0x44, 0x21, 0x22, 0x21, 0x26, 0x22, 0x2, 0x22, 0x6, 0x22, 0xf, 0x22, 0x11, 0x22, 0x1a, - 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x65, 0x22, 0xf2, 0x25, 0xca, 0xf0, 0x2, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x20, 0x0, 0xa0, 0x0, 0xa7, 0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, - 0x0, 0xbf, 0x0, 0xd1, 0x0, 0xd8, 0x0, 0xdf, 0x0, 0xf1, 0x0, 0xff, 0x1, 0x31, 0x1, 0x52, - 0x1, 0x78, 0x1, 0x92, 0x2, 0xc6, 0x2, 0xc9, 0x2, 0xd8, 0x3, 0x94, 0x3, 0xa9, 0x3, 0xbc, - 0x3, 0xc0, 0x20, 0x10, 0x20, 0x13, 0x20, 0x18, 0x20, 0x1c, 0x20, 0x20, 0x20, 0x26, 0x20, 0x30, - 0x20, 0x39, 0x20, 0x44, 0x21, 0x22, 0x21, 0x26, 0x22, 0x2, 0x22, 0x6, 0x22, 0xf, 0x22, 0x11, - 0x22, 0x19, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, 0x22, 0xf2, 0x25, 0xca, - 0xf0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x60, 0x1, 0x1c, 0x1, 0x26, 0x1, 0x30, 0x1, 0x36, 0x1, 0x3e, - 0x1, 0x40, 0x1, 0x60, 0x1, 0x6a, 0x1, 0x72, 0x1, 0x92, 0x1, 0xa8, 0x1, 0xa8, 0x1, 0xa8, - 0x1, 0xaa, 0x1, 0xaa, 0x1, 0xaa, 0x1, 0xac, 0x1, 0xac, 0x1, 0xb6, 0x1, 0xb6, 0x1, 0xb6, - 0x1, 0xb6, 0x1, 0xb6, 0x1, 0xb6, 0x1, 0xb8, 0x1, 0xbc, 0x1, 0xc0, 0x1, 0xc4, 0x1, 0xc4, - 0x1, 0xc4, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, 0x1, 0xc6, - 0x1, 0xc6, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xc8, 0x1, 0xca, 0x1, 0xca, - 0x1, 0xca, 0xff, 0xff, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, - 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, - 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, - 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, - 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, - 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, - 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, - 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, - 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, - 0x0, 0x49, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, - 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, - 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, - 0x0, 0x61, 0x0, 0xcb, 0x0, 0x73, 0x0, 0x63, 0x0, 0x64, 0x0, 0x81, 0x0, 0x6d, 0x0, 0x65, - 0x0, 0x6a, 0x0, 0xb9, 0x0, 0x6e, 0x0, 0x75, 0x0, 0xc7, 0x0, 0xb8, 0x0, 0x8e, 0x0, 0xb7, - 0x0, 0xbd, 0x0, 0x69, 0x0, 0xc0, 0x0, 0x67, 0x0, 0x87, 0x0, 0x92, 0x0, 0x6f, 0x0, 0x76, - 0x0, 0x72, 0x0, 0xcc, 0x0, 0xd5, 0x0, 0xd3, 0x0, 0xcd, 0x0, 0x97, 0x0, 0x98, 0x0, 0x6b, - 0x0, 0x99, 0x0, 0xd7, 0x0, 0x9a, 0x0, 0xd4, 0x0, 0xd6, 0x0, 0xdb, 0x0, 0xd8, 0x0, 0xd9, - 0x0, 0xda, 0x0, 0x9b, 0x0, 0xdf, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xce, 0x0, 0x9c, 0x0, 0x6c, - 0x0, 0xe2, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x9d, 0x0, 0x68, 0x0, 0x9f, 0x0, 0x9e, 0x0, 0xa0, - 0x0, 0xa2, 0x0, 0xa1, 0x0, 0xa3, 0x0, 0x70, 0x0, 0xa4, 0x0, 0xa6, 0x0, 0xa5, 0x0, 0xa7, - 0x0, 0xa8, 0x0, 0xaa, 0x0, 0xa9, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xaf, 0x0, 0xae, - 0x0, 0xb0, 0x0, 0xb2, 0x0, 0xb1, 0x0, 0xcf, 0x0, 0x71, 0x0, 0xb4, 0x0, 0xb3, 0x0, 0xb5, - 0x0, 0xb6, 0x0, 0xd1, 0x0, 0x8b, 0x0, 0x78, 0x0, 0x79, 0x0, 0xd2, 0x0, 0x74, 0x0, 0x8c, - 0x0, 0x95, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x91, 0x0, 0x94, 0x0, 0x8d, 0x0, 0x93, - 0x0, 0xca, 0x0, 0xc6, 0x0, 0xc0, 0x0, 0xc4, 0x0, 0x10, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7e, - 0x0, 0x7f, 0x0, 0x88, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x89, 0x0, 0x62, 0x0, 0x86, 0x0, 0x66, - 0x0, 0x77, 0x0, 0x8a, 0x0, 0x82, 0x0, 0x83, 0x0, 0x80, 0x0, 0xba, 0x0, 0xc6, 0x0, 0xc1, - 0x0, 0xca, 0x0, 0xc3, 0x0, 0xc2, 0x0, 0x87, 0x0, 0xc8, 0x0, 0xbc, 0x0, 0xc5, 0x0, 0xc9, - 0x0, 0xbb, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc9, 0x0, 0xd0, 0x0, 0xde, 0x0, 0x84, 0x0, 0x85, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x24, 0xa4, 0x0, 0x1, 0x6, 0x19, - 0x0, 0x3c, 0x0, 0xa, 0x24, 0x5a, 0x0, 0x3, 0x0, 0x6d, 0x0, 0x96, 0x0, 0x5, 0x0, 0x24, - 0xff, 0xce, 0x0, 0x5, 0x0, 0x2c, 0x0, 0x32, 0x0, 0x5, 0x0, 0x37, 0x0, 0x32, 0x0, 0x5, - 0x0, 0x39, 0x0, 0x32, 0x0, 0x5, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x5, 0x0, 0x3b, 0x0, 0x1e, - 0x0, 0x5, 0x0, 0x3c, 0x0, 0x32, 0x0, 0x5, 0x0, 0x97, 0xff, 0xce, 0x0, 0x5, 0x0, 0x98, - 0xff, 0xce, 0x0, 0x5, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x5, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x5, - 0x0, 0xd2, 0x0, 0x32, 0x0, 0x5, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x5, 0x0, 0xd5, 0xff, 0xce, - 0x0, 0x5, 0x0, 0xd8, 0x0, 0x32, 0x0, 0x5, 0x0, 0xd9, 0x0, 0x32, 0x0, 0x5, 0x0, 0xda, - 0x0, 0x32, 0x0, 0x5, 0x0, 0xdb, 0x0, 0x32, 0x0, 0x9, 0x0, 0x37, 0xff, 0xa6, 0x0, 0x9, - 0x0, 0x3c, 0xff, 0xa6, 0x0, 0x9, 0x0, 0xd2, 0xff, 0xa6, 0x0, 0xa, 0x0, 0x24, 0xff, 0xce, - 0x0, 0x10, 0x0, 0x37, 0xff, 0x9c, 0x0, 0x10, 0x0, 0x3c, 0xff, 0xb0, 0x0, 0x10, 0x0, 0xd2, - 0xff, 0xb0, 0x0, 0x12, 0x0, 0x24, 0xff, 0xba, 0x0, 0x12, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x12, - 0x0, 0x3c, 0x0, 0x32, 0x0, 0x12, 0x0, 0x46, 0xff, 0xd8, 0x0, 0x12, 0x0, 0x47, 0xff, 0xd8, - 0x0, 0x12, 0x0, 0x48, 0xff, 0xd8, 0x0, 0x12, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x12, 0x0, 0x54, - 0xff, 0xd8, 0x0, 0x12, 0x0, 0x55, 0xff, 0xe2, 0x0, 0x12, 0x0, 0x56, 0xff, 0xe2, 0x0, 0x12, - 0x0, 0x5d, 0xff, 0xe2, 0x0, 0x12, 0x0, 0xa4, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xa5, 0xff, 0xd8, - 0x0, 0x12, 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xa7, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xa8, - 0xff, 0xd8, 0x0, 0x12, 0x0, 0xae, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xaf, 0xff, 0xd8, 0x0, 0x12, - 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xb1, 0xff, 0xd8, 0x0, 0x12, 0x0, 0xb2, 0xff, 0xd8, - 0x0, 0x13, 0x0, 0x13, 0x0, 0x14, 0x0, 0x13, 0x0, 0x16, 0xff, 0xf6, 0x0, 0x13, 0x0, 0x17, - 0xff, 0xec, 0x0, 0x13, 0x0, 0x19, 0x0, 0x14, 0x0, 0x13, 0x0, 0x1a, 0xff, 0xe2, 0x0, 0x13, - 0x0, 0x1b, 0x0, 0x14, 0x0, 0x13, 0x0, 0x1c, 0x0, 0x14, 0x0, 0x14, 0x0, 0x15, 0x0, 0x14, - 0x0, 0x14, 0x0, 0x17, 0x0, 0x14, 0x0, 0x14, 0x0, 0x18, 0x0, 0xa, 0x0, 0x14, 0x0, 0x1a, - 0xff, 0xd8, 0x0, 0x14, 0x0, 0x1c, 0xff, 0xec, 0x0, 0x15, 0x0, 0x16, 0xff, 0xec, 0x0, 0x15, - 0x0, 0x17, 0xff, 0xf6, 0x0, 0x15, 0x0, 0x18, 0xff, 0xf6, 0x0, 0x15, 0x0, 0x19, 0x0, 0xa, - 0x0, 0x15, 0x0, 0x1a, 0xff, 0xec, 0x0, 0x16, 0x0, 0x1a, 0xff, 0xec, 0x0, 0x17, 0x0, 0x13, - 0xff, 0xec, 0x0, 0x17, 0x0, 0x16, 0xff, 0xec, 0x0, 0x17, 0x0, 0x18, 0xff, 0xd8, 0x0, 0x17, - 0x0, 0x19, 0xff, 0xe2, 0x0, 0x17, 0x0, 0x1a, 0xff, 0xc4, 0x0, 0x17, 0x0, 0x1b, 0xff, 0xe2, - 0x0, 0x17, 0x0, 0x1c, 0xff, 0xce, 0x0, 0x18, 0x0, 0x18, 0xff, 0xf6, 0x0, 0x18, 0x0, 0x1a, - 0xff, 0xec, 0x0, 0x18, 0x0, 0x1c, 0xff, 0xe2, 0x0, 0x19, 0x0, 0x5, 0x0, 0x32, 0x0, 0x19, - 0x0, 0x13, 0x0, 0x1e, 0x0, 0x19, 0x0, 0x16, 0xff, 0xec, 0x0, 0x19, 0x0, 0x18, 0x0, 0xa, - 0x0, 0x19, 0x0, 0x19, 0x0, 0x1e, 0x0, 0x19, 0x0, 0x1a, 0xff, 0xd8, 0x0, 0x19, 0x0, 0x1b, - 0x0, 0x1e, 0x0, 0x19, 0x0, 0x1c, 0x0, 0x14, 0x0, 0x1a, 0x0, 0x5, 0x0, 0x32, 0x0, 0x1a, - 0x0, 0xf, 0xff, 0xce, 0x0, 0x1a, 0x0, 0x15, 0xff, 0xec, 0x0, 0x1a, 0x0, 0x17, 0xff, 0xb0, - 0x0, 0x1a, 0x0, 0x1b, 0xff, 0xec, 0x0, 0x1a, 0x0, 0x1c, 0xff, 0xec, 0x0, 0x1b, 0x0, 0x5, - 0x0, 0x32, 0x0, 0x1b, 0x0, 0x16, 0xff, 0xe2, 0x0, 0x1b, 0x0, 0x17, 0xff, 0xe2, 0x0, 0x1b, - 0x0, 0x18, 0xff, 0xec, 0x0, 0x1b, 0x0, 0x19, 0x0, 0xa, 0x0, 0x1b, 0x0, 0x1a, 0xff, 0xe2, - 0x0, 0x1c, 0x0, 0x13, 0x0, 0xa, 0x0, 0x1c, 0x0, 0x19, 0x0, 0x14, 0x0, 0x1c, 0x0, 0x1a, - 0xff, 0xe2, 0x0, 0x1c, 0x0, 0x1b, 0x0, 0xa, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0xa, 0x0, 0x23, - 0x0, 0x37, 0xff, 0xb0, 0x0, 0x23, 0x0, 0x3c, 0xff, 0xba, 0x0, 0x23, 0x0, 0xd2, 0xff, 0xba, - 0x0, 0x24, 0x0, 0x5, 0xff, 0xce, 0x0, 0x24, 0x0, 0x26, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0x24, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x24, 0x0, 0x32, 0xff, 0xdd, 0x0, 0x24, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x37, 0xff, 0xa1, 0x0, 0x24, 0x0, 0x39, 0xff, 0xce, - 0x0, 0x24, 0x0, 0x3a, 0xff, 0xec, 0x0, 0x24, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x24, 0x0, 0x45, - 0xff, 0xf1, 0x0, 0x24, 0x0, 0x57, 0xff, 0xe7, 0x0, 0x24, 0x0, 0x58, 0xff, 0xec, 0x0, 0x24, - 0x0, 0x59, 0xff, 0xe2, 0x0, 0x24, 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x24, 0x0, 0x5b, 0x0, 0xa, - 0x0, 0x24, 0x0, 0x5c, 0xff, 0xe2, 0x0, 0x24, 0x0, 0x6c, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x78, - 0xff, 0xdd, 0x0, 0x24, 0x0, 0x99, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0x24, - 0x0, 0xb3, 0xff, 0xec, 0x0, 0x24, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x24, 0x0, 0xb5, 0xff, 0xec, - 0x0, 0x24, 0x0, 0xb6, 0xff, 0xec, 0x0, 0x24, 0x0, 0xce, 0xff, 0xdd, 0x0, 0x24, 0x0, 0xd1, - 0xff, 0xe2, 0x0, 0x24, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x24, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0x24, - 0x0, 0xdd, 0xff, 0xdd, 0x0, 0x24, 0x0, 0xdf, 0xff, 0xdd, 0x0, 0x25, 0x0, 0x5, 0x0, 0x1e, - 0x0, 0x25, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x25, 0x0, 0x37, 0xff, 0xec, 0x0, 0x25, 0x0, 0x3c, - 0xff, 0xec, 0x0, 0x25, 0x0, 0x5b, 0xff, 0xf1, 0x0, 0x25, 0x0, 0xd2, 0xff, 0xec, 0x0, 0x26, - 0x0, 0x5, 0x0, 0x32, 0x0, 0x26, 0x0, 0x25, 0x0, 0x14, 0x0, 0x26, 0x0, 0x27, 0x0, 0x14, - 0x0, 0x26, 0x0, 0x28, 0x0, 0x14, 0x0, 0x26, 0x0, 0x29, 0x0, 0x14, 0x0, 0x26, 0x0, 0x2b, - 0x0, 0x14, 0x0, 0x26, 0x0, 0x2e, 0x0, 0x14, 0x0, 0x26, 0x0, 0x2f, 0x0, 0x14, 0x0, 0x26, - 0x0, 0x30, 0x0, 0x14, 0x0, 0x26, 0x0, 0x31, 0x0, 0x14, 0x0, 0x26, 0x0, 0x33, 0x0, 0x14, - 0x0, 0x26, 0x0, 0x35, 0x0, 0x14, 0x0, 0x26, 0x0, 0x3d, 0x0, 0x1e, 0x0, 0x26, 0x0, 0x59, - 0xff, 0xf6, 0x0, 0x26, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x26, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0x26, - 0x0, 0x9a, 0x0, 0x14, 0x0, 0x26, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x26, 0x0, 0xd4, 0x0, 0x14, - 0x0, 0x26, 0x0, 0xd6, 0x0, 0x14, 0x0, 0x26, 0x0, 0xd7, 0x0, 0x14, 0x0, 0x27, 0x0, 0xf, - 0xff, 0xce, 0x0, 0x27, 0x0, 0x24, 0xff, 0xd8, 0x0, 0x27, 0x0, 0x2d, 0xff, 0xd8, 0x0, 0x27, - 0x0, 0x37, 0xff, 0xd8, 0x0, 0x27, 0x0, 0x3c, 0xff, 0xd3, 0x0, 0x27, 0x0, 0x3d, 0xff, 0xec, - 0x0, 0x27, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x27, 0x0, 0x55, 0xff, 0xf6, 0x0, 0x27, 0x0, 0x5b, - 0xff, 0xf1, 0x0, 0x27, 0x0, 0x5d, 0xff, 0xf6, 0x0, 0x27, 0x0, 0x97, 0xff, 0xd8, 0x0, 0x27, - 0x0, 0x98, 0xff, 0xd8, 0x0, 0x27, 0x0, 0xcc, 0xff, 0xd8, 0x0, 0x27, 0x0, 0xcd, 0xff, 0xd8, - 0x0, 0x27, 0x0, 0xd2, 0xff, 0xd3, 0x0, 0x27, 0x0, 0xd3, 0xff, 0xd8, 0x0, 0x27, 0x0, 0xd5, - 0xff, 0xd8, 0x0, 0x28, 0x0, 0x5, 0x0, 0x3c, 0x0, 0x28, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x28, - 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x2d, 0xff, 0xec, 0x0, 0x28, 0x0, 0x32, 0xff, 0xe2, - 0x0, 0x28, 0x0, 0x34, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x45, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x57, - 0xff, 0xf1, 0x0, 0x28, 0x0, 0x58, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x28, - 0x0, 0x78, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x28, 0x0, 0x9c, 0xff, 0xe2, - 0x0, 0x28, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb5, - 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb6, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x28, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x28, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x28, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0x29, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x29, 0x0, 0xf, 0xff, 0xc4, 0x0, 0x29, 0x0, 0x22, - 0x0, 0x32, 0x0, 0x29, 0x0, 0x24, 0xff, 0xce, 0x0, 0x29, 0x0, 0x25, 0x0, 0x1e, 0x0, 0x29, - 0x0, 0x27, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x28, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x29, 0x0, 0x1e, - 0x0, 0x29, 0x0, 0x2b, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x2c, 0x0, 0x32, 0x0, 0x29, 0x0, 0x2e, - 0x0, 0x1e, 0x0, 0x29, 0x0, 0x2f, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x30, 0x0, 0x1e, 0x0, 0x29, - 0x0, 0x31, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x33, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x35, 0x0, 0x1e, - 0x0, 0x29, 0x0, 0x36, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x37, 0x0, 0x28, 0x0, 0x29, 0x0, 0x38, - 0x0, 0x14, 0x0, 0x29, 0x0, 0x39, 0x0, 0x32, 0x0, 0x29, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x29, - 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x3c, 0x0, 0x32, 0x0, 0x29, 0x0, 0x3d, 0x0, 0x32, - 0x0, 0x29, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x29, 0x0, 0x44, 0xff, 0xf1, 0x0, 0x29, 0x0, 0x58, - 0xff, 0xf1, 0x0, 0x29, 0x0, 0x5b, 0xff, 0xf6, 0x0, 0x29, 0x0, 0x70, 0xff, 0xf1, 0x0, 0x29, - 0x0, 0x7d, 0x0, 0x50, 0x0, 0x29, 0x0, 0x7f, 0x0, 0x32, 0x0, 0x29, 0x0, 0x97, 0xff, 0xce, - 0x0, 0x29, 0x0, 0x98, 0xff, 0xce, 0x0, 0x29, 0x0, 0x9a, 0x0, 0x1e, 0x0, 0x29, 0x0, 0x9d, - 0x0, 0x14, 0x0, 0x29, 0x0, 0x9e, 0xff, 0xf1, 0x0, 0x29, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x29, - 0x0, 0xa0, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xa2, 0xff, 0xf1, - 0x0, 0x29, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb4, - 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb5, 0xff, 0xf1, 0x0, 0x29, 0x0, 0xb6, 0xff, 0xf1, 0x0, 0x29, - 0x0, 0xcc, 0xff, 0xce, 0x0, 0x29, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x29, 0x0, 0xd2, 0x0, 0x32, - 0x0, 0x29, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x29, 0x0, 0xd4, 0x0, 0x1e, 0x0, 0x29, 0x0, 0xd5, - 0xff, 0xce, 0x0, 0x29, 0x0, 0xd6, 0x0, 0x1e, 0x0, 0x29, 0x0, 0xd7, 0x0, 0x1e, 0x0, 0x29, - 0x0, 0xd8, 0x0, 0x32, 0x0, 0x29, 0x0, 0xd9, 0x0, 0x32, 0x0, 0x29, 0x0, 0xda, 0x0, 0x32, - 0x0, 0x29, 0x0, 0xdb, 0x0, 0x32, 0x0, 0x29, 0x0, 0xe0, 0x0, 0x14, 0x0, 0x29, 0x0, 0xe1, - 0x0, 0x14, 0x0, 0x29, 0x0, 0xe2, 0x0, 0x14, 0x0, 0x2a, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x2a, - 0x0, 0x37, 0xff, 0xd8, 0x0, 0x2a, 0x0, 0x3c, 0xff, 0xe2, 0x0, 0x2a, 0x0, 0x46, 0xff, 0xf2, - 0x0, 0x2a, 0x0, 0x47, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0x48, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0x52, - 0xff, 0xf2, 0x0, 0x2a, 0x0, 0x54, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xa4, 0xff, 0xf2, 0x0, 0x2a, - 0x0, 0xa5, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xa6, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xa7, 0xff, 0xf2, - 0x0, 0x2a, 0x0, 0xa8, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xae, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xaf, - 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xb0, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xb1, 0xff, 0xf2, 0x0, 0x2a, - 0x0, 0xb2, 0xff, 0xf2, 0x0, 0x2a, 0x0, 0xd2, 0xff, 0xe2, 0x0, 0x2b, 0x0, 0x2d, 0xff, 0xd8, - 0x0, 0x2c, 0x0, 0x5, 0x0, 0x3c, 0x0, 0x2c, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x2c, 0x0, 0x3c, - 0x0, 0x1e, 0x0, 0x2c, 0x0, 0x3d, 0x0, 0x28, 0x0, 0x2c, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0x2d, - 0x0, 0x24, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0x26, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x2a, 0xff, 0xec, - 0x0, 0x2d, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0x32, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x34, - 0xff, 0xec, 0x0, 0x2d, 0x0, 0x37, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x3b, 0xff, 0xec, 0x0, 0x2d, - 0x0, 0x3c, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x58, 0xff, 0xf6, 0x0, 0x2d, 0x0, 0x59, 0xff, 0xf1, - 0x0, 0x2d, 0x0, 0x5a, 0xff, 0xf1, 0x0, 0x2d, 0x0, 0x5c, 0xff, 0xf1, 0x0, 0x2d, 0x0, 0x6c, - 0xff, 0xec, 0x0, 0x2d, 0x0, 0x78, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x97, 0xff, 0xe2, 0x0, 0x2d, - 0x0, 0x98, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0x99, 0xff, 0xec, 0x0, 0x2d, 0x0, 0x9c, 0xff, 0xec, - 0x0, 0x2d, 0x0, 0xcc, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xce, - 0xff, 0xec, 0x0, 0x2d, 0x0, 0xd1, 0xff, 0xf1, 0x0, 0x2d, 0x0, 0xd2, 0xff, 0xec, 0x0, 0x2d, - 0x0, 0xd3, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0x2d, 0x0, 0xdc, 0xff, 0xec, - 0x0, 0x2d, 0x0, 0xdd, 0xff, 0xec, 0x0, 0x2d, 0x0, 0xdf, 0xff, 0xec, 0x0, 0x2e, 0x0, 0x5, - 0x0, 0x3c, 0x0, 0x2e, 0x0, 0x24, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x26, 0xff, 0xd8, 0x0, 0x2e, - 0x0, 0x2a, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x2c, 0x0, 0x1e, 0x0, 0x2e, 0x0, 0x32, 0xff, 0xd8, - 0x0, 0x2e, 0x0, 0x34, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x3b, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x3d, - 0x0, 0x32, 0x0, 0x2e, 0x0, 0x44, 0x0, 0xf, 0x0, 0x2e, 0x0, 0x4c, 0x0, 0x14, 0x0, 0x2e, - 0x0, 0x57, 0xff, 0xf1, 0x0, 0x2e, 0x0, 0x59, 0xff, 0xec, 0x0, 0x2e, 0x0, 0x5a, 0xff, 0xec, - 0x0, 0x2e, 0x0, 0x5b, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x5c, 0xff, 0xec, 0x0, 0x2e, 0x0, 0x5d, - 0x0, 0x19, 0x0, 0x2e, 0x0, 0x6c, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x78, 0xff, 0xd8, 0x0, 0x2e, - 0x0, 0x8b, 0x0, 0x14, 0x0, 0x2e, 0x0, 0x97, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x98, 0x0, 0x28, - 0x0, 0x2e, 0x0, 0x99, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x9c, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x9e, - 0x0, 0xf, 0x0, 0x2e, 0x0, 0x9f, 0x0, 0xf, 0x0, 0x2e, 0x0, 0xa0, 0x0, 0xf, 0x0, 0x2e, - 0x0, 0xa1, 0x0, 0xf, 0x0, 0x2e, 0x0, 0xa2, 0x0, 0xf, 0x0, 0x2e, 0x0, 0xa3, 0x0, 0xf, - 0x0, 0x2e, 0x0, 0xa9, 0x0, 0x14, 0x0, 0x2e, 0x0, 0xaa, 0x0, 0x14, 0x0, 0x2e, 0x0, 0xab, - 0x0, 0x14, 0x0, 0x2e, 0x0, 0xac, 0x0, 0x14, 0x0, 0x2e, 0x0, 0xcc, 0x0, 0x28, 0x0, 0x2e, - 0x0, 0xcd, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xce, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0xd1, 0xff, 0xec, - 0x0, 0x2e, 0x0, 0xd3, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xd5, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xd8, - 0x0, 0x1e, 0x0, 0x2e, 0x0, 0xd9, 0x0, 0x1e, 0x0, 0x2e, 0x0, 0xda, 0x0, 0x1e, 0x0, 0x2e, - 0x0, 0xdb, 0x0, 0x1e, 0x0, 0x2e, 0x0, 0xdc, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0xdd, 0xff, 0xd8, - 0x0, 0x2e, 0x0, 0xdf, 0xff, 0xd8, 0x0, 0x2f, 0x0, 0x5, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x24, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x26, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x2a, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0x2c, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x32, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x34, 0xff, 0xce, - 0x0, 0x2f, 0x0, 0x37, 0xff, 0x9c, 0x0, 0x2f, 0x0, 0x38, 0xff, 0xec, 0x0, 0x2f, 0x0, 0x39, - 0xff, 0xba, 0x0, 0x2f, 0x0, 0x3a, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x2f, - 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x2f, 0x0, 0x3d, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x4c, 0x0, 0xf, - 0x0, 0x2f, 0x0, 0x56, 0x0, 0x14, 0x0, 0x2f, 0x0, 0x57, 0xff, 0xec, 0x0, 0x2f, 0x0, 0x59, - 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x2f, - 0x0, 0x5c, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0x6c, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x78, 0xff, 0xce, - 0x0, 0x2f, 0x0, 0x8b, 0x0, 0xf, 0x0, 0x2f, 0x0, 0x97, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x98, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0x99, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x9c, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0x9d, 0xff, 0xec, 0x0, 0x2f, 0x0, 0xa9, 0x0, 0xf, 0x0, 0x2f, 0x0, 0xaa, 0x0, 0xf, - 0x0, 0x2f, 0x0, 0xab, 0xff, 0xf1, 0x0, 0x2f, 0x0, 0xac, 0x0, 0xf, 0x0, 0x2f, 0x0, 0xcc, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xcd, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xce, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0xd1, 0xff, 0xe2, 0x0, 0x2f, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x2f, 0x0, 0xd3, 0x0, 0x1e, - 0x0, 0x2f, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xd8, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xd9, - 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xda, 0x0, 0x1e, 0x0, 0x2f, 0x0, 0xdb, 0x0, 0x1e, 0x0, 0x2f, - 0x0, 0xdc, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xdd, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xdf, 0xff, 0xce, - 0x0, 0x2f, 0x0, 0xe0, 0xff, 0xec, 0x0, 0x2f, 0x0, 0xe1, 0xff, 0xec, 0x0, 0x2f, 0x0, 0xe2, - 0xff, 0xec, 0x0, 0x30, 0x0, 0x2d, 0xff, 0xd8, 0x0, 0x31, 0x0, 0x2d, 0xff, 0xd8, 0x0, 0x32, - 0x0, 0xf, 0xff, 0xce, 0x0, 0x32, 0x0, 0x12, 0xff, 0xce, 0x0, 0x32, 0x0, 0x24, 0xff, 0xce, - 0x0, 0x32, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x32, 0x0, 0x37, 0xff, 0xba, 0x0, 0x32, 0x0, 0x3b, - 0xff, 0xd8, 0x0, 0x32, 0x0, 0x3c, 0xff, 0xce, 0x0, 0x32, 0x0, 0x3d, 0xff, 0xec, 0x0, 0x32, - 0x0, 0x42, 0xff, 0xb0, 0x0, 0x32, 0x0, 0x5b, 0xff, 0xf1, 0x0, 0x32, 0x0, 0x5d, 0xff, 0xf1, - 0x0, 0x32, 0x0, 0x97, 0xff, 0xce, 0x0, 0x32, 0x0, 0x98, 0xff, 0xce, 0x0, 0x32, 0x0, 0xcc, - 0xff, 0xce, 0x0, 0x32, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x32, 0x0, 0xd2, 0xff, 0xce, 0x0, 0x32, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0x32, 0x0, 0xd5, 0xff, 0xce, 0x0, 0x33, 0x0, 0x5, 0x0, 0x5a, - 0x0, 0x33, 0x0, 0x8, 0x0, 0x1e, 0x0, 0x33, 0x0, 0xf, 0xff, 0x9c, 0x0, 0x33, 0x0, 0x12, - 0xff, 0xce, 0x0, 0x33, 0x0, 0x24, 0xff, 0xce, 0x0, 0x33, 0x0, 0x25, 0x0, 0x19, 0x0, 0x33, - 0x0, 0x27, 0x0, 0x19, 0x0, 0x33, 0x0, 0x28, 0x0, 0x19, 0x0, 0x33, 0x0, 0x29, 0x0, 0x19, - 0x0, 0x33, 0x0, 0x2b, 0x0, 0x19, 0x0, 0x33, 0x0, 0x2c, 0x0, 0x14, 0x0, 0x33, 0x0, 0x2e, - 0x0, 0x19, 0x0, 0x33, 0x0, 0x2f, 0x0, 0x19, 0x0, 0x33, 0x0, 0x30, 0x0, 0x19, 0x0, 0x33, - 0x0, 0x31, 0x0, 0x19, 0x0, 0x33, 0x0, 0x33, 0x0, 0x19, 0x0, 0x33, 0x0, 0x35, 0x0, 0x19, - 0x0, 0x33, 0x0, 0x39, 0x0, 0x1e, 0x0, 0x33, 0x0, 0x3a, 0x0, 0x1e, 0x0, 0x33, 0x0, 0x42, - 0xff, 0x9c, 0x0, 0x33, 0x0, 0x44, 0xff, 0xec, 0x0, 0x33, 0x0, 0x49, 0x0, 0xa, 0x0, 0x33, - 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x33, 0x0, 0x55, 0xff, 0xf1, 0x0, 0x33, 0x0, 0x57, 0x0, 0xf, - 0x0, 0x33, 0x0, 0x59, 0x0, 0xf, 0x0, 0x33, 0x0, 0x5a, 0x0, 0xf, 0x0, 0x33, 0x0, 0x5c, - 0x0, 0xf, 0x0, 0x33, 0x0, 0x84, 0x0, 0xa, 0x0, 0x33, 0x0, 0x85, 0x0, 0xa, 0x0, 0x33, - 0x0, 0x97, 0xff, 0xce, 0x0, 0x33, 0x0, 0x98, 0xff, 0xce, 0x0, 0x33, 0x0, 0x9a, 0x0, 0x19, - 0x0, 0x33, 0x0, 0x9e, 0xff, 0xec, 0x0, 0x33, 0x0, 0x9f, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa0, - 0xff, 0xec, 0x0, 0x33, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x33, - 0x0, 0xa3, 0xff, 0xec, 0x0, 0x33, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x33, 0x0, 0xcd, 0xff, 0xce, - 0x0, 0x33, 0x0, 0xd1, 0x0, 0xf, 0x0, 0x33, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x33, 0x0, 0xd4, - 0x0, 0x19, 0x0, 0x33, 0x0, 0xd5, 0xff, 0xce, 0x0, 0x33, 0x0, 0xd6, 0x0, 0x19, 0x0, 0x33, - 0x0, 0xd7, 0x0, 0x19, 0x0, 0x33, 0x0, 0xd8, 0x0, 0x14, 0x0, 0x33, 0x0, 0xd9, 0x0, 0x14, - 0x0, 0x33, 0x0, 0xda, 0x0, 0x14, 0x0, 0x33, 0x0, 0xdb, 0x0, 0x14, 0x0, 0x34, 0x0, 0x37, - 0xff, 0xba, 0x0, 0x34, 0x0, 0x39, 0xff, 0xe2, 0x0, 0x34, 0x0, 0x3c, 0xff, 0xba, 0x0, 0x34, - 0x0, 0xd2, 0xff, 0xba, 0x0, 0x35, 0x0, 0x5, 0x0, 0x46, 0x0, 0x35, 0x0, 0x2d, 0xff, 0xec, - 0x0, 0x35, 0x0, 0x37, 0xff, 0xec, 0x0, 0x35, 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x35, 0x0, 0x3c, - 0xff, 0xf1, 0x0, 0x35, 0x0, 0x3d, 0x0, 0x1e, 0x0, 0x35, 0x0, 0x5b, 0x0, 0x19, 0x0, 0x35, - 0x0, 0xd2, 0xff, 0xf1, 0x0, 0x36, 0x0, 0x5, 0x0, 0x32, 0x0, 0x36, 0x0, 0x24, 0xff, 0xf1, - 0x0, 0x36, 0x0, 0x26, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x2a, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x2d, - 0xff, 0xe2, 0x0, 0x36, 0x0, 0x32, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x34, 0xff, 0xf6, 0x0, 0x36, - 0x0, 0x59, 0xff, 0xec, 0x0, 0x36, 0x0, 0x5a, 0xff, 0xec, 0x0, 0x36, 0x0, 0x5c, 0xff, 0xec, - 0x0, 0x36, 0x0, 0x6c, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x78, 0xff, 0xf6, 0x0, 0x36, 0x0, 0x97, - 0xff, 0xf1, 0x0, 0x36, 0x0, 0x98, 0xff, 0xf1, 0x0, 0x36, 0x0, 0x99, 0xff, 0xf6, 0x0, 0x36, - 0x0, 0x9c, 0xff, 0xf6, 0x0, 0x36, 0x0, 0xcc, 0xff, 0xf1, 0x0, 0x36, 0x0, 0xcd, 0xff, 0xf1, - 0x0, 0x36, 0x0, 0xce, 0xff, 0xf6, 0x0, 0x36, 0x0, 0xd1, 0xff, 0xec, 0x0, 0x36, 0x0, 0xd3, - 0xff, 0xf1, 0x0, 0x36, 0x0, 0xd5, 0xff, 0xf1, 0x0, 0x36, 0x0, 0xdc, 0xff, 0xf6, 0x0, 0x36, - 0x0, 0xdd, 0xff, 0xf6, 0x0, 0x36, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x37, 0x0, 0x4, 0x0, 0x5a, - 0x0, 0x37, 0x0, 0x5, 0x0, 0xbe, 0x0, 0x37, 0x0, 0x7, 0x0, 0x50, 0x0, 0x37, 0x0, 0x8, - 0x0, 0x5a, 0x0, 0x37, 0x0, 0x9, 0x0, 0x46, 0x0, 0x37, 0x0, 0xc, 0x0, 0x5a, 0x0, 0x37, - 0x0, 0xd, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x22, 0x0, 0x78, 0x0, 0x37, 0x0, 0x25, 0x0, 0x6e, - 0x0, 0x37, 0x0, 0x26, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x27, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x28, - 0x0, 0x6e, 0x0, 0x37, 0x0, 0x29, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0x37, - 0x0, 0x2b, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x2c, 0x0, 0x82, 0x0, 0x37, 0x0, 0x2d, 0x0, 0x3c, - 0x0, 0x37, 0x0, 0x2e, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x2f, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x30, - 0x0, 0x6e, 0x0, 0x37, 0x0, 0x31, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x32, 0x0, 0x1e, 0x0, 0x37, - 0x0, 0x33, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x34, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x35, 0x0, 0x6e, - 0x0, 0x37, 0x0, 0x36, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x37, 0x0, 0x82, 0x0, 0x37, 0x0, 0x38, - 0x0, 0x50, 0x0, 0x37, 0x0, 0x39, 0x0, 0x82, 0x0, 0x37, 0x0, 0x3a, 0x0, 0x82, 0x0, 0x37, - 0x0, 0x3b, 0x0, 0x78, 0x0, 0x37, 0x0, 0x3c, 0x0, 0x78, 0x0, 0x37, 0x0, 0x3d, 0x0, 0x78, - 0x0, 0x37, 0x0, 0x40, 0x0, 0x78, 0x0, 0x37, 0x0, 0x44, 0xff, 0xf1, 0x0, 0x37, 0x0, 0x45, - 0x0, 0x46, 0x0, 0x37, 0x0, 0x46, 0xff, 0xec, 0x0, 0x37, 0x0, 0x47, 0xff, 0xec, 0x0, 0x37, - 0x0, 0x48, 0xff, 0xec, 0x0, 0x37, 0x0, 0x49, 0x0, 0x32, 0x0, 0x37, 0x0, 0x4a, 0xff, 0xf1, - 0x0, 0x37, 0x0, 0x4b, 0x0, 0x46, 0x0, 0x37, 0x0, 0x4c, 0x0, 0x32, 0x0, 0x37, 0x0, 0x4d, - 0x0, 0x3c, 0x0, 0x37, 0x0, 0x4e, 0x0, 0x46, 0x0, 0x37, 0x0, 0x4f, 0x0, 0x46, 0x0, 0x37, - 0x0, 0x52, 0xff, 0xec, 0x0, 0x37, 0x0, 0x54, 0xff, 0xec, 0x0, 0x37, 0x0, 0x57, 0x0, 0xa, - 0x0, 0x37, 0x0, 0x5f, 0x0, 0x50, 0x0, 0x37, 0x0, 0x60, 0x0, 0x64, 0x0, 0x37, 0x0, 0x62, - 0x0, 0x32, 0x0, 0x37, 0x0, 0x65, 0x0, 0x32, 0x0, 0x37, 0x0, 0x67, 0x0, 0x50, 0x0, 0x37, - 0x0, 0x68, 0x0, 0x32, 0x0, 0x37, 0x0, 0x6c, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x6e, 0x0, 0x50, - 0x0, 0x37, 0x0, 0x6f, 0x0, 0x50, 0x0, 0x37, 0x0, 0x73, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x78, - 0x0, 0x1e, 0x0, 0x37, 0x0, 0x7d, 0x0, 0x64, 0x0, 0x37, 0x0, 0x7f, 0x0, 0x64, 0x0, 0x37, - 0x0, 0x84, 0x0, 0x32, 0x0, 0x37, 0x0, 0x85, 0x0, 0x32, 0x0, 0x37, 0x0, 0x99, 0x0, 0x1e, - 0x0, 0x37, 0x0, 0x9a, 0x0, 0x6e, 0x0, 0x37, 0x0, 0x9c, 0x0, 0x1e, 0x0, 0x37, 0x0, 0x9d, - 0x0, 0x50, 0x0, 0x37, 0x0, 0x9e, 0xff, 0xf1, 0x0, 0x37, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x37, - 0x0, 0xa4, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa6, 0xff, 0xec, - 0x0, 0x37, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa8, 0xff, 0xec, 0x0, 0x37, 0x0, 0xa9, - 0x0, 0x1e, 0x0, 0x37, 0x0, 0xaa, 0x0, 0x46, 0x0, 0x37, 0x0, 0xab, 0x0, 0x32, 0x0, 0x37, - 0x0, 0xac, 0x0, 0x64, 0x0, 0x37, 0x0, 0xae, 0xff, 0xec, 0x0, 0x37, 0x0, 0xaf, 0xff, 0xec, - 0x0, 0x37, 0x0, 0xb0, 0xff, 0xec, 0x0, 0x37, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x37, 0x0, 0xb2, - 0xff, 0xec, 0x0, 0x37, 0x0, 0xba, 0x0, 0x96, 0x0, 0x37, 0x0, 0xce, 0x0, 0x1e, 0x0, 0x37, - 0x0, 0xd2, 0x0, 0x78, 0x0, 0x37, 0x0, 0xd4, 0x0, 0x6e, 0x0, 0x37, 0x0, 0xd6, 0x0, 0x6e, - 0x0, 0x37, 0x0, 0xd7, 0x0, 0x6e, 0x0, 0x37, 0x0, 0xd8, 0x0, 0x82, 0x0, 0x37, 0x0, 0xd9, - 0x0, 0x82, 0x0, 0x37, 0x0, 0xda, 0x0, 0x82, 0x0, 0x37, 0x0, 0xdb, 0x0, 0x82, 0x0, 0x37, - 0x0, 0xdc, 0x0, 0x1e, 0x0, 0x37, 0x0, 0xdd, 0x0, 0x1e, 0x0, 0x37, 0x0, 0xdf, 0x0, 0x1e, - 0x0, 0x37, 0x0, 0xe0, 0x0, 0x50, 0x0, 0x37, 0x0, 0xe1, 0x0, 0x50, 0x0, 0x37, 0x0, 0xe2, - 0x0, 0x50, 0x0, 0x38, 0x0, 0x5, 0x0, 0x32, 0x0, 0x38, 0x0, 0x24, 0xff, 0xe2, 0x0, 0x38, - 0x0, 0x2d, 0xff, 0xec, 0x0, 0x38, 0x0, 0x59, 0xff, 0xf1, 0x0, 0x38, 0x0, 0x5a, 0xff, 0xf1, - 0x0, 0x38, 0x0, 0x5b, 0xff, 0xf1, 0x0, 0x38, 0x0, 0x5c, 0xff, 0xf1, 0x0, 0x38, 0x0, 0x5d, - 0xff, 0xf1, 0x0, 0x38, 0x0, 0x97, 0xff, 0xe2, 0x0, 0x38, 0x0, 0x98, 0xff, 0xe2, 0x0, 0x38, - 0x0, 0xcc, 0xff, 0xe2, 0x0, 0x38, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0x38, 0x0, 0xd1, 0xff, 0xf1, - 0x0, 0x38, 0x0, 0xd3, 0xff, 0xe2, 0x0, 0x38, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x5, - 0x0, 0x50, 0x0, 0x39, 0x0, 0xf, 0xff, 0xa6, 0x0, 0x39, 0x0, 0x24, 0xff, 0xb0, 0x0, 0x39, - 0x0, 0x26, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x2c, 0x0, 0x1e, - 0x0, 0x39, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x34, - 0xff, 0xe2, 0x0, 0x39, 0x0, 0x37, 0x0, 0x1e, 0x0, 0x39, 0x0, 0x39, 0x0, 0x1e, 0x0, 0x39, - 0x0, 0x3a, 0x0, 0x1e, 0x0, 0x39, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x14, - 0x0, 0x39, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x39, 0x0, 0x44, 0xff, 0xba, 0x0, 0x39, 0x0, 0x46, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0x47, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x48, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0x4a, 0xff, 0xce, 0x0, 0x39, 0x0, 0x50, 0xff, 0xec, 0x0, 0x39, 0x0, 0x51, 0xff, 0xec, - 0x0, 0x39, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x53, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x54, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0x55, 0xff, 0xce, 0x0, 0x39, 0x0, 0x56, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0x58, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x5b, 0xff, 0xec, 0x0, 0x39, 0x0, 0x5d, 0xff, 0xd8, - 0x0, 0x39, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x97, - 0xff, 0xb0, 0x0, 0x39, 0x0, 0x98, 0xff, 0xb0, 0x0, 0x39, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x39, - 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x9e, 0xff, 0xba, 0x0, 0x39, 0x0, 0x9f, 0xff, 0xba, - 0x0, 0x39, 0x0, 0xa0, 0xff, 0xba, 0x0, 0x39, 0x0, 0xa1, 0xff, 0xba, 0x0, 0x39, 0x0, 0xa2, - 0xff, 0xba, 0x0, 0x39, 0x0, 0xa3, 0xff, 0xba, 0x0, 0x39, 0x0, 0xa4, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0xa5, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xa7, 0xff, 0xd8, - 0x0, 0x39, 0x0, 0xa8, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xad, 0xff, 0xec, 0x0, 0x39, 0x0, 0xae, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0xaf, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x39, - 0x0, 0xb1, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb2, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb3, 0xff, 0xd8, - 0x0, 0x39, 0x0, 0xb4, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb5, 0xff, 0xd8, 0x0, 0x39, 0x0, 0xb6, - 0xff, 0xd8, 0x0, 0x39, 0x0, 0xcc, 0xff, 0xb0, 0x0, 0x39, 0x0, 0xcd, 0xff, 0xb0, 0x0, 0x39, - 0x0, 0xce, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0x39, 0x0, 0xd3, 0xff, 0xb0, - 0x0, 0x39, 0x0, 0xd5, 0xff, 0xb0, 0x0, 0x39, 0x0, 0xd8, 0x0, 0x1e, 0x0, 0x39, 0x0, 0xd9, - 0x0, 0x1e, 0x0, 0x39, 0x0, 0xda, 0x0, 0x1e, 0x0, 0x39, 0x0, 0xdb, 0x0, 0x1e, 0x0, 0x39, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0x5, 0x0, 0x50, 0x0, 0x3a, 0x0, 0xf, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x24, - 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x3a, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x34, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0x37, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x39, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x3a, - 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x3a, - 0x0, 0x44, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x46, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x47, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0x48, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x52, - 0xff, 0xec, 0x0, 0x3a, 0x0, 0x54, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x56, 0xff, 0xec, 0x0, 0x3a, - 0x0, 0x58, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x5d, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x6c, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x97, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x98, - 0xff, 0xc4, 0x0, 0x3a, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x3a, - 0x0, 0x9e, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x9f, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa0, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa3, - 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x3a, - 0x0, 0xa6, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xa8, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0xae, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xaf, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xb0, - 0xff, 0xec, 0x0, 0x3a, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xb2, 0xff, 0xec, 0x0, 0x3a, - 0x0, 0xcc, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xcd, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xce, 0xff, 0xe2, - 0x0, 0x3a, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0x3a, 0x0, 0xd3, 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xd5, - 0xff, 0xc4, 0x0, 0x3a, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x3a, - 0x0, 0xdf, 0xff, 0xe2, 0x0, 0x3b, 0x0, 0x5, 0x0, 0x32, 0x0, 0x3b, 0x0, 0x26, 0xff, 0xc4, - 0x0, 0x3b, 0x0, 0x2a, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x32, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x34, - 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x57, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x59, 0xff, 0xe2, 0x0, 0x3b, - 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x3b, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x3b, 0x0, 0x5c, 0xff, 0xe2, - 0x0, 0x3b, 0x0, 0x6c, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x78, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x99, - 0xff, 0xc4, 0x0, 0x3b, 0x0, 0x9c, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0xce, 0xff, 0xc4, 0x0, 0x3b, - 0x0, 0xd1, 0xff, 0xe2, 0x0, 0x3b, 0x0, 0xdc, 0xff, 0xc4, 0x0, 0x3b, 0x0, 0xdd, 0xff, 0xc4, - 0x0, 0x3b, 0x0, 0xdf, 0xff, 0xc4, 0x0, 0x3c, 0x0, 0x5, 0x0, 0x96, 0x0, 0x3c, 0x0, 0x7, - 0x0, 0x28, 0x0, 0x3c, 0x0, 0x8, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x9, 0x0, 0x3c, 0x0, 0x3c, - 0x0, 0xc, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0xd, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xf, 0xff, 0xc4, - 0x0, 0x3c, 0x0, 0x22, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x24, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x25, - 0x0, 0x46, 0x0, 0x3c, 0x0, 0x27, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x28, 0x0, 0x46, 0x0, 0x3c, - 0x0, 0x29, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x2b, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x2c, 0x0, 0x46, - 0x0, 0x3c, 0x0, 0x2e, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x2f, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x30, - 0x0, 0x46, 0x0, 0x3c, 0x0, 0x31, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x33, 0x0, 0x46, 0x0, 0x3c, - 0x0, 0x35, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x36, 0x0, 0x28, 0x0, 0x3c, 0x0, 0x37, 0x0, 0x50, - 0x0, 0x3c, 0x0, 0x38, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x39, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x3a, - 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x5a, 0x0, 0x3c, - 0x0, 0x3d, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x40, 0x0, 0x64, 0x0, 0x3c, 0x0, 0x42, 0xff, 0xb0, - 0x0, 0x3c, 0x0, 0x44, 0xff, 0xce, 0x0, 0x3c, 0x0, 0x45, 0x0, 0x14, 0x0, 0x3c, 0x0, 0x46, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x47, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x48, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0x4a, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x4b, 0x0, 0x14, 0x0, 0x3c, 0x0, 0x4e, 0x0, 0x14, - 0x0, 0x3c, 0x0, 0x4f, 0x0, 0x14, 0x0, 0x3c, 0x0, 0x50, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x51, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x53, 0xff, 0xe2, 0x0, 0x3c, - 0x0, 0x54, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x55, 0xff, 0xe2, 0x0, 0x3c, 0x0, 0x56, 0xff, 0xe2, - 0x0, 0x3c, 0x0, 0x58, 0xff, 0xe2, 0x0, 0x3c, 0x0, 0x5b, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x5d, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0x5f, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x60, 0x0, 0x64, 0x0, 0x3c, - 0x0, 0x6e, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x6f, 0x0, 0x50, 0x0, 0x3c, 0x0, 0x7d, 0x0, 0x64, - 0x0, 0x3c, 0x0, 0x7f, 0x0, 0x64, 0x0, 0x3c, 0x0, 0x97, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x98, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0x9a, 0x0, 0x46, 0x0, 0x3c, 0x0, 0x9d, 0x0, 0x32, 0x0, 0x3c, - 0x0, 0x9e, 0xff, 0xce, 0x0, 0x3c, 0x0, 0x9f, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa0, 0xff, 0xce, - 0x0, 0x3c, 0x0, 0xa1, 0xff, 0xe2, 0x0, 0x3c, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa3, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa4, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa5, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa7, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xa8, 0xff, 0xd8, - 0x0, 0x3c, 0x0, 0xad, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xae, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xaf, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xb1, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0xb2, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xba, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0xcc, 0xff, 0xd8, - 0x0, 0x3c, 0x0, 0xcd, 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xd2, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0xd3, - 0xff, 0xd8, 0x0, 0x3c, 0x0, 0xd4, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xd5, 0xff, 0xd8, 0x0, 0x3c, - 0x0, 0xd6, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xd7, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xd8, 0x0, 0x46, - 0x0, 0x3c, 0x0, 0xd9, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xda, 0x0, 0x46, 0x0, 0x3c, 0x0, 0xdb, - 0x0, 0x46, 0x0, 0x3c, 0x0, 0xe0, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xe1, 0x0, 0x32, 0x0, 0x3c, - 0x0, 0xe2, 0x0, 0x32, 0x0, 0x3d, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x3d, 0x0, 0x26, 0xff, 0xce, - 0x0, 0x3d, 0x0, 0x2a, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x2c, 0x0, 0x28, 0x0, 0x3d, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0x3d, 0x0, 0x32, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x34, 0xff, 0xce, 0x0, 0x3d, - 0x0, 0x37, 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x39, 0x0, 0x14, 0x0, 0x3d, 0x0, 0x3a, 0x0, 0x14, - 0x0, 0x3d, 0x0, 0x3b, 0x0, 0x14, 0x0, 0x3d, 0x0, 0x3c, 0x0, 0x14, 0x0, 0x3d, 0x0, 0x3d, - 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x59, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x5a, 0xff, 0xe2, 0x0, 0x3d, - 0x0, 0x5c, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x6c, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x78, 0xff, 0xce, - 0x0, 0x3d, 0x0, 0x99, 0xff, 0xce, 0x0, 0x3d, 0x0, 0x9c, 0xff, 0xce, 0x0, 0x3d, 0x0, 0xce, - 0xff, 0xce, 0x0, 0x3d, 0x0, 0xd1, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0xd8, 0x0, 0x28, 0x0, 0x3d, - 0x0, 0xd9, 0x0, 0x28, 0x0, 0x3d, 0x0, 0xda, 0x0, 0x28, 0x0, 0x3d, 0x0, 0xdb, 0x0, 0x28, - 0x0, 0x3d, 0x0, 0xdc, 0xff, 0xce, 0x0, 0x3d, 0x0, 0xdd, 0xff, 0xce, 0x0, 0x3d, 0x0, 0xdf, - 0xff, 0xce, 0x0, 0x3e, 0x0, 0x16, 0x0, 0x1e, 0x0, 0x42, 0x0, 0x26, 0xff, 0xb0, 0x0, 0x42, - 0x0, 0x2a, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x32, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x34, 0xff, 0xb0, - 0x0, 0x42, 0x0, 0x37, 0xff, 0x6a, 0x0, 0x42, 0x0, 0x38, 0xff, 0x9c, 0x0, 0x42, 0x0, 0x39, - 0xff, 0x7e, 0x0, 0x42, 0x0, 0x3a, 0xff, 0x7e, 0x0, 0x42, 0x0, 0x3c, 0xff, 0x38, 0x0, 0x42, - 0x0, 0x46, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x47, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x48, 0xff, 0xd8, - 0x0, 0x42, 0x0, 0x52, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x54, 0xff, 0xd8, 0x0, 0x42, 0x0, 0x57, - 0xff, 0xc4, 0x0, 0x42, 0x0, 0x59, 0xff, 0x9c, 0x0, 0x42, 0x0, 0x5a, 0xff, 0x9c, 0x0, 0x42, - 0x0, 0x5c, 0xff, 0x9c, 0x0, 0x42, 0x0, 0x6c, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x78, 0xff, 0xb0, - 0x0, 0x42, 0x0, 0x99, 0xff, 0xb0, 0x0, 0x42, 0x0, 0x9c, 0xff, 0xb0, 0x0, 0x42, 0x0, 0xa4, - 0xff, 0xd8, 0x0, 0x42, 0x0, 0xa5, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xa6, 0xff, 0xd8, 0x0, 0x42, - 0x0, 0xa7, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xa8, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xae, 0xff, 0xd8, - 0x0, 0x42, 0x0, 0xaf, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xb0, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xb1, - 0xff, 0xd8, 0x0, 0x42, 0x0, 0xb2, 0xff, 0xd8, 0x0, 0x42, 0x0, 0xce, 0xff, 0xb0, 0x0, 0x42, - 0x0, 0xd1, 0xff, 0x9c, 0x0, 0x42, 0x0, 0xd2, 0xff, 0x38, 0x0, 0x42, 0x0, 0xdc, 0xff, 0xb0, - 0x0, 0x42, 0x0, 0xdd, 0xff, 0xb0, 0x0, 0x42, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x45, 0x0, 0x59, - 0xff, 0xf6, 0x0, 0x45, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x45, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0x45, - 0x0, 0x5d, 0xff, 0xf1, 0x0, 0x45, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x47, 0x0, 0x5, 0x0, 0x32, - 0x0, 0x48, 0x0, 0x45, 0xff, 0xf6, 0x0, 0x48, 0x0, 0x53, 0xff, 0xf6, 0x0, 0x48, 0x0, 0x56, - 0x0, 0xa, 0x0, 0x48, 0x0, 0x59, 0xff, 0xf1, 0x0, 0x48, 0x0, 0x5a, 0xff, 0xf1, 0x0, 0x48, - 0x0, 0x5c, 0xff, 0xf1, 0x0, 0x48, 0x0, 0x8c, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x8d, 0x0, 0x1e, - 0x0, 0x48, 0x0, 0x8e, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x8f, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x90, - 0x0, 0x1e, 0x0, 0x48, 0x0, 0x91, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x92, 0x0, 0x1e, 0x0, 0x48, - 0x0, 0x93, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x94, 0x0, 0x1e, 0x0, 0x48, 0x0, 0x95, 0x0, 0x1e, - 0x0, 0x49, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x49, 0x0, 0x4c, 0x0, 0x6, 0x0, 0x49, 0x0, 0x7c, - 0xff, 0xba, 0x0, 0x49, 0x0, 0x8b, 0xff, 0xf9, 0x0, 0x4a, 0x0, 0x5, 0x0, 0x32, 0x0, 0x4a, - 0x0, 0x4d, 0x0, 0xf, 0x0, 0x4c, 0x0, 0x5, 0x0, 0x32, 0x0, 0x4d, 0x0, 0x5, 0x0, 0x32, - 0x0, 0x4e, 0x0, 0x5, 0x0, 0x28, 0x0, 0x4e, 0x0, 0x4c, 0x0, 0x10, 0x0, 0x4e, 0x0, 0x5b, - 0x0, 0xa, 0x0, 0x4e, 0x0, 0x8b, 0x0, 0x11, 0x0, 0x4f, 0x0, 0x5, 0x0, 0x32, 0x0, 0x52, - 0x0, 0x59, 0xff, 0xf6, 0x0, 0x52, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x52, 0x0, 0x5c, 0xff, 0xf6, - 0x0, 0x52, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0x52, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x53, 0x0, 0x48, - 0x0, 0xf, 0x0, 0x53, 0x0, 0x59, 0xff, 0xf6, 0x0, 0x53, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0x53, - 0x0, 0x5c, 0xff, 0xf6, 0x0, 0x53, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0x53, 0x0, 0xa5, 0x0, 0xf, - 0x0, 0x53, 0x0, 0xa6, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa7, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa8, - 0x0, 0xf, 0x0, 0x53, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0x55, 0x0, 0x5, 0x0, 0x5a, 0x0, 0x55, - 0x0, 0xf, 0xff, 0xce, 0x0, 0x55, 0x0, 0x49, 0x0, 0xf, 0x0, 0x55, 0x0, 0x57, 0x0, 0xf, - 0x0, 0x55, 0x0, 0x59, 0x0, 0x1e, 0x0, 0x55, 0x0, 0x5a, 0x0, 0x1e, 0x0, 0x55, 0x0, 0x5b, - 0x0, 0x14, 0x0, 0x55, 0x0, 0x5c, 0x0, 0x1e, 0x0, 0x55, 0x0, 0x84, 0x0, 0xf, 0x0, 0x55, - 0x0, 0x85, 0x0, 0xf, 0x0, 0x55, 0x0, 0xd1, 0x0, 0x1e, 0x0, 0x56, 0x0, 0x44, 0x0, 0x1e, - 0x0, 0x56, 0x0, 0x70, 0x0, 0x1e, 0x0, 0x56, 0x0, 0x9e, 0x0, 0x1e, 0x0, 0x56, 0x0, 0x9f, - 0x0, 0x1e, 0x0, 0x56, 0x0, 0xa0, 0x0, 0x1e, 0x0, 0x56, 0x0, 0xa1, 0x0, 0x1e, 0x0, 0x56, - 0x0, 0xa2, 0x0, 0x1e, 0x0, 0x56, 0x0, 0xa3, 0x0, 0x1e, 0x0, 0x58, 0x0, 0x49, 0x0, 0x14, - 0x0, 0x58, 0x0, 0x55, 0x0, 0xa, 0x0, 0x58, 0x0, 0x84, 0x0, 0x14, 0x0, 0x58, 0x0, 0x85, - 0x0, 0x14, 0x0, 0x59, 0x0, 0x11, 0xff, 0xce, 0x0, 0x59, 0x0, 0x49, 0x0, 0x19, 0x0, 0x59, - 0x0, 0x4d, 0x0, 0xa, 0x0, 0x59, 0x0, 0x56, 0x0, 0xf, 0x0, 0x59, 0x0, 0x57, 0x0, 0x19, - 0x0, 0x59, 0x0, 0x59, 0x0, 0x23, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x23, 0x0, 0x59, 0x0, 0x5b, - 0x0, 0x14, 0x0, 0x59, 0x0, 0x5c, 0x0, 0x23, 0x0, 0x59, 0x0, 0x84, 0x0, 0x19, 0x0, 0x59, - 0x0, 0x85, 0x0, 0x19, 0x0, 0x59, 0x0, 0xd1, 0x0, 0x23, 0x0, 0x5a, 0x0, 0x11, 0xff, 0xce, - 0x0, 0x5a, 0x0, 0x49, 0x0, 0x19, 0x0, 0x5a, 0x0, 0x4d, 0x0, 0xf, 0x0, 0x5a, 0x0, 0x56, - 0x0, 0xa, 0x0, 0x5a, 0x0, 0x57, 0x0, 0x19, 0x0, 0x5a, 0x0, 0x59, 0x0, 0x23, 0x0, 0x5a, - 0x0, 0x5a, 0x0, 0x23, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x5a, 0x0, 0x5c, 0x0, 0x23, - 0x0, 0x5a, 0x0, 0x84, 0x0, 0x19, 0x0, 0x5a, 0x0, 0x85, 0x0, 0x19, 0x0, 0x5a, 0x0, 0xd1, - 0x0, 0x23, 0x0, 0x5c, 0x0, 0x5, 0x0, 0x32, 0x0, 0x5c, 0x0, 0x11, 0xff, 0xce, 0x0, 0x5c, - 0x0, 0x42, 0xff, 0xce, 0x0, 0x5c, 0x0, 0x49, 0x0, 0x19, 0x0, 0x5c, 0x0, 0x4d, 0x0, 0xf, - 0x0, 0x5c, 0x0, 0x56, 0x0, 0xf, 0x0, 0x5c, 0x0, 0x57, 0x0, 0x19, 0x0, 0x5c, 0x0, 0x59, - 0x0, 0x23, 0x0, 0x5c, 0x0, 0x5a, 0x0, 0x23, 0x0, 0x5c, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x5c, - 0x0, 0x5c, 0x0, 0x23, 0x0, 0x5c, 0x0, 0xd1, 0x0, 0x23, 0x0, 0x5d, 0x0, 0x49, 0x0, 0x14, - 0x0, 0x5d, 0x0, 0x56, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x57, 0x0, 0xf, 0x0, 0x5d, 0x0, 0x59, - 0x0, 0x14, 0x0, 0x5d, 0x0, 0x5a, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x5b, 0x0, 0x14, 0x0, 0x5d, - 0x0, 0x5c, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x84, 0x0, 0x14, 0x0, 0x5d, 0x0, 0x85, 0x0, 0x14, - 0x0, 0x5d, 0x0, 0xd1, 0x0, 0x14, 0x0, 0x68, 0x0, 0x44, 0x0, 0xa, 0x0, 0x68, 0x0, 0x46, - 0x0, 0xf, 0x0, 0x68, 0x0, 0x47, 0x0, 0xf, 0x0, 0x68, 0x0, 0x48, 0x0, 0xf, 0x0, 0x68, - 0x0, 0x52, 0x0, 0xf, 0x0, 0x68, 0x0, 0x54, 0x0, 0xf, 0x0, 0x68, 0x0, 0x9e, 0x0, 0xa, - 0x0, 0x68, 0x0, 0x9f, 0x0, 0xa, 0x0, 0x68, 0x0, 0xa0, 0x0, 0xa, 0x0, 0x68, 0x0, 0xa1, - 0x0, 0xa, 0x0, 0x68, 0x0, 0xa2, 0x0, 0xa, 0x0, 0x68, 0x0, 0xa3, 0x0, 0xa, 0x0, 0x68, - 0x0, 0xa4, 0x0, 0xf, 0x0, 0x68, 0x0, 0xa5, 0x0, 0xf, 0x0, 0x68, 0x0, 0xa6, 0x0, 0xf, - 0x0, 0x68, 0x0, 0xa7, 0x0, 0xf, 0x0, 0x68, 0x0, 0xa8, 0x0, 0xf, 0x0, 0x68, 0x0, 0xae, - 0x0, 0xf, 0x0, 0x68, 0x0, 0xaf, 0x0, 0xf, 0x0, 0x68, 0x0, 0xb0, 0x0, 0xf, 0x0, 0x68, - 0x0, 0xb1, 0x0, 0xf, 0x0, 0x68, 0x0, 0xb2, 0x0, 0xf, 0x0, 0x6b, 0x0, 0x5, 0x0, 0x3c, - 0x0, 0x6b, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0x6b, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x34, 0xff, 0xe2, 0x0, 0x6b, - 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0x99, 0xff, 0xe2, - 0x0, 0x6b, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xdc, - 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x6b, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0x6c, - 0x0, 0x12, 0xff, 0xce, 0x0, 0x6c, 0x0, 0x24, 0xff, 0xce, 0x0, 0x6c, 0x0, 0x2d, 0xff, 0xe2, - 0x0, 0x6c, 0x0, 0x37, 0xff, 0xba, 0x0, 0x6c, 0x0, 0x97, 0xff, 0xce, 0x0, 0x6c, 0x0, 0x98, - 0xff, 0xce, 0x0, 0x6c, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x6c, 0x0, 0xcd, 0xff, 0xce, 0x0, 0x6c, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0x6c, 0x0, 0xd5, 0xff, 0xce, 0x0, 0x76, 0x0, 0x37, 0xff, 0x9c, - 0x0, 0x76, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x76, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x78, 0x0, 0x5, - 0x0, 0x3c, 0x0, 0x78, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x78, - 0x0, 0x2d, 0xff, 0xec, 0x0, 0x78, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x34, 0xff, 0xe2, - 0x0, 0x78, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x78, 0x0, 0x99, - 0xff, 0xe2, 0x0, 0x78, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0x78, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x78, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x78, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x78, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0x7a, 0x0, 0x37, 0xff, 0x9c, 0x0, 0x7a, 0x0, 0x3c, 0xff, 0xce, 0x0, 0x7a, 0x0, 0xd2, - 0xff, 0xb0, 0x0, 0x80, 0x0, 0x39, 0x0, 0x32, 0x0, 0x80, 0x0, 0x3a, 0x0, 0x32, 0x0, 0x80, - 0x0, 0x3c, 0x0, 0x32, 0x0, 0x80, 0x0, 0xd2, 0x0, 0x32, 0x0, 0x82, 0x0, 0x37, 0xff, 0x9c, - 0x0, 0x82, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x82, 0x0, 0xd2, 0xff, 0xba, 0x0, 0x87, 0x0, 0x37, - 0xff, 0x9c, 0x0, 0x87, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x87, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0x88, - 0x0, 0x37, 0xff, 0x9c, 0x0, 0x88, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x88, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0x97, 0x0, 0x5, 0xff, 0xce, 0x0, 0x97, 0x0, 0x26, 0xff, 0xdd, 0x0, 0x97, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0x97, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x97, 0x0, 0x32, 0xff, 0xdd, 0x0, 0x97, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0x97, 0x0, 0x37, 0xff, 0xa1, 0x0, 0x97, 0x0, 0x39, 0xff, 0xce, - 0x0, 0x97, 0x0, 0x3a, 0xff, 0xec, 0x0, 0x97, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x97, 0x0, 0x6c, - 0xff, 0xdd, 0x0, 0x97, 0x0, 0x78, 0xff, 0xdd, 0x0, 0x97, 0x0, 0x99, 0xff, 0xdd, 0x0, 0x97, - 0x0, 0x9c, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xce, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0x97, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0x97, 0x0, 0xdf, - 0xff, 0xdd, 0x0, 0x98, 0x0, 0x5, 0xff, 0xce, 0x0, 0x98, 0x0, 0x26, 0xff, 0xdd, 0x0, 0x98, - 0x0, 0x2a, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x98, 0x0, 0x32, 0xff, 0xdd, - 0x0, 0x98, 0x0, 0x34, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x37, 0xff, 0xa1, 0x0, 0x98, 0x0, 0x39, - 0xff, 0xce, 0x0, 0x98, 0x0, 0x3a, 0xff, 0xec, 0x0, 0x98, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0x98, - 0x0, 0x6c, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x78, 0xff, 0xdd, 0x0, 0x98, 0x0, 0x99, 0xff, 0xdd, - 0x0, 0x98, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0x98, 0x0, 0xce, 0xff, 0xdd, 0x0, 0x98, 0x0, 0xd2, - 0xff, 0x9c, 0x0, 0x98, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0x98, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0x98, - 0x0, 0xdf, 0xff, 0xdd, 0x0, 0x9a, 0x0, 0x5, 0x0, 0x3c, 0x0, 0x9a, 0x0, 0x26, 0xff, 0xe2, - 0x0, 0x9a, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x2d, 0xff, 0xec, 0x0, 0x9a, 0x0, 0x32, - 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x34, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0x9a, - 0x0, 0x78, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x9c, 0xff, 0xe2, - 0x0, 0x9a, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0xdd, - 0xff, 0xe2, 0x0, 0x9a, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0x9c, 0x0, 0x12, 0xff, 0xce, 0x0, 0x9c, - 0x0, 0x24, 0xff, 0xce, 0x0, 0x9c, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x9c, 0x0, 0x37, 0xff, 0xba, - 0x0, 0x9c, 0x0, 0x3d, 0xff, 0xec, 0x0, 0x9c, 0x0, 0x42, 0xff, 0xb0, 0x0, 0x9c, 0x0, 0x97, - 0xff, 0xce, 0x0, 0x9c, 0x0, 0x98, 0xff, 0xce, 0x0, 0x9c, 0x0, 0xcc, 0xff, 0xce, 0x0, 0x9c, - 0x0, 0xcd, 0xff, 0xce, 0x0, 0x9c, 0x0, 0xd3, 0xff, 0xce, 0x0, 0x9c, 0x0, 0xd5, 0xff, 0xce, - 0x0, 0x9d, 0x0, 0x5, 0x0, 0x32, 0x0, 0x9d, 0x0, 0x24, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0x9d, 0x0, 0x97, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0x98, 0xff, 0xe2, 0x0, 0x9d, - 0x0, 0xcc, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0x9d, 0x0, 0xd3, 0xff, 0xe2, - 0x0, 0x9d, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0xa5, 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa5, 0x0, 0x56, - 0x0, 0xa, 0x0, 0xa5, 0x0, 0x8c, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x8d, 0x0, 0x1e, 0x0, 0xa5, - 0x0, 0x8e, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x8f, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x90, 0x0, 0x1e, - 0x0, 0xa5, 0x0, 0x91, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x92, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x93, - 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x94, 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x95, 0x0, 0x1e, 0x0, 0xa6, - 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa6, 0x0, 0x56, 0x0, 0xa, 0x0, 0xa6, 0x0, 0x8c, 0x0, 0x1e, - 0x0, 0xa6, 0x0, 0x8d, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x8e, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x8f, - 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x90, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x91, 0x0, 0x1e, 0x0, 0xa6, - 0x0, 0x92, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x93, 0x0, 0x1e, 0x0, 0xa6, 0x0, 0x94, 0x0, 0x1e, - 0x0, 0xa6, 0x0, 0x95, 0x0, 0x1e, 0x0, 0xa7, 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa7, 0x0, 0x56, - 0x0, 0xa, 0x0, 0xa8, 0x0, 0x53, 0xff, 0xf6, 0x0, 0xa8, 0x0, 0x56, 0x0, 0xa, 0x0, 0xa8, - 0x0, 0x8c, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x8d, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x8e, 0x0, 0x1e, - 0x0, 0xa8, 0x0, 0x8f, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x90, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x91, - 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x92, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x93, 0x0, 0x1e, 0x0, 0xa8, - 0x0, 0x94, 0x0, 0x1e, 0x0, 0xa8, 0x0, 0x95, 0x0, 0x1e, 0x0, 0xae, 0x0, 0x59, 0xff, 0xf6, - 0x0, 0xae, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0xae, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xae, 0x0, 0x5d, - 0xff, 0xf1, 0x0, 0xae, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0xaf, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xaf, - 0x0, 0x5a, 0xff, 0xf6, 0x0, 0xaf, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xaf, 0x0, 0x5d, 0xff, 0xf1, - 0x0, 0xaf, 0x0, 0xd1, 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x5a, - 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xb0, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0xb0, - 0x0, 0xd1, 0xff, 0xf6, 0x0, 0xb1, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xb1, 0x0, 0x5a, 0xff, 0xf6, - 0x0, 0xb1, 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xb1, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0xb1, 0x0, 0xd1, - 0xff, 0xf6, 0x0, 0xb2, 0x0, 0x59, 0xff, 0xf6, 0x0, 0xb2, 0x0, 0x5a, 0xff, 0xf6, 0x0, 0xb2, - 0x0, 0x5c, 0xff, 0xf6, 0x0, 0xb2, 0x0, 0x5d, 0xff, 0xf1, 0x0, 0xb2, 0x0, 0xd1, 0xff, 0xf6, - 0x0, 0xb3, 0x0, 0x49, 0x0, 0x14, 0x0, 0xb3, 0x0, 0x55, 0x0, 0xa, 0x0, 0xb4, 0x0, 0x49, - 0x0, 0x14, 0x0, 0xb4, 0x0, 0x55, 0x0, 0xa, 0x0, 0xb5, 0x0, 0x49, 0x0, 0x14, 0x0, 0xb5, - 0x0, 0x55, 0x0, 0xa, 0x0, 0xb6, 0x0, 0x49, 0x0, 0x14, 0x0, 0xb6, 0x0, 0x55, 0x0, 0xa, - 0x0, 0xcc, 0x0, 0x5, 0xff, 0xce, 0x0, 0xcc, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x2d, 0xff, 0xce, 0x0, 0xcc, 0x0, 0x32, 0xff, 0xdd, 0x0, 0xcc, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x37, 0xff, 0xa1, 0x0, 0xcc, 0x0, 0x39, 0xff, 0xce, - 0x0, 0xcc, 0x0, 0x3a, 0xff, 0xec, 0x0, 0xcc, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xcc, 0x0, 0x6c, - 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x78, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0x99, 0xff, 0xdd, 0x0, 0xcc, - 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xce, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0xcc, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xcc, 0x0, 0xdf, - 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x5, 0xff, 0xce, 0x0, 0xcd, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xcd, - 0x0, 0x2a, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x2d, 0xff, 0xce, 0x0, 0xcd, 0x0, 0x32, 0xff, 0xdd, - 0x0, 0xcd, 0x0, 0x34, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x37, 0xff, 0xa1, 0x0, 0xcd, 0x0, 0x39, - 0xff, 0xce, 0x0, 0xcd, 0x0, 0x3a, 0xff, 0xec, 0x0, 0xcd, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xcd, - 0x0, 0x6c, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x78, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0x99, 0xff, 0xdd, - 0x0, 0xcd, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0xce, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0xd2, - 0xff, 0x9c, 0x0, 0xcd, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0xcd, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xcd, - 0x0, 0xdf, 0xff, 0xdd, 0x0, 0xce, 0x0, 0x12, 0xff, 0xce, 0x0, 0xce, 0x0, 0x24, 0xff, 0xce, - 0x0, 0xce, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xce, 0x0, 0x37, 0xff, 0xba, 0x0, 0xce, 0x0, 0x3c, - 0xff, 0xce, 0x0, 0xce, 0x0, 0x3d, 0xff, 0xec, 0x0, 0xce, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xce, - 0x0, 0x97, 0xff, 0xce, 0x0, 0xce, 0x0, 0x98, 0xff, 0xce, 0x0, 0xce, 0x0, 0xcc, 0xff, 0xce, - 0x0, 0xce, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xce, 0x0, 0xd2, 0xff, 0xce, 0x0, 0xce, 0x0, 0xd3, - 0xff, 0xce, 0x0, 0xce, 0x0, 0xd5, 0xff, 0xce, 0x0, 0xd1, 0x0, 0x5, 0x0, 0x32, 0x0, 0xd1, - 0x0, 0x11, 0xff, 0xce, 0x0, 0xd1, 0x0, 0x42, 0xff, 0xce, 0x0, 0xd1, 0x0, 0x49, 0x0, 0x19, - 0x0, 0xd1, 0x0, 0x4d, 0x0, 0xf, 0x0, 0xd1, 0x0, 0x56, 0x0, 0xf, 0x0, 0xd1, 0x0, 0x57, - 0x0, 0x19, 0x0, 0xd1, 0x0, 0x59, 0x0, 0x23, 0x0, 0xd1, 0x0, 0x5a, 0x0, 0x23, 0x0, 0xd1, - 0x0, 0x5b, 0x0, 0x14, 0x0, 0xd1, 0x0, 0x5c, 0x0, 0x23, 0x0, 0xd2, 0x0, 0x5, 0x0, 0x96, - 0x0, 0xd2, 0x0, 0x8, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x9, 0x0, 0x3c, 0x0, 0xd2, 0x0, 0xc, - 0x0, 0x5a, 0x0, 0xd2, 0x0, 0xd, 0x0, 0x32, 0x0, 0xd2, 0x0, 0xf, 0xff, 0xc4, 0x0, 0xd2, - 0x0, 0x22, 0x0, 0x3c, 0x0, 0xd2, 0x0, 0x24, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0x25, 0x0, 0x46, - 0x0, 0xd2, 0x0, 0x27, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x28, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x29, - 0x0, 0x46, 0x0, 0xd2, 0x0, 0x2b, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x2c, 0x0, 0x46, 0x0, 0xd2, - 0x0, 0x2e, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x2f, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x30, 0x0, 0x46, - 0x0, 0xd2, 0x0, 0x31, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x33, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x35, - 0x0, 0x46, 0x0, 0xd2, 0x0, 0x36, 0x0, 0x28, 0x0, 0xd2, 0x0, 0x37, 0x0, 0x50, 0x0, 0xd2, - 0x0, 0x38, 0x0, 0x32, 0x0, 0xd2, 0x0, 0x39, 0x0, 0x5a, 0x0, 0xd2, 0x0, 0x3a, 0x0, 0x5a, - 0x0, 0xd2, 0x0, 0x3b, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x3c, 0x0, 0x5a, 0x0, 0xd2, 0x0, 0x3d, - 0x0, 0x5a, 0x0, 0xd2, 0x0, 0x40, 0x0, 0x64, 0x0, 0xd2, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xd2, - 0x0, 0x5f, 0x0, 0x32, 0x0, 0xd2, 0x0, 0x60, 0x0, 0x64, 0x0, 0xd2, 0x0, 0x6e, 0x0, 0x50, - 0x0, 0xd2, 0x0, 0x6f, 0x0, 0x50, 0x0, 0xd2, 0x0, 0x7d, 0x0, 0x50, 0x0, 0xd2, 0x0, 0x7f, - 0x0, 0x64, 0x0, 0xd2, 0x0, 0x97, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0x98, 0xff, 0xd8, 0x0, 0xd2, - 0x0, 0x9a, 0x0, 0x46, 0x0, 0xd2, 0x0, 0x9d, 0x0, 0x32, 0x0, 0xd2, 0x0, 0xba, 0x0, 0x5a, - 0x0, 0xd2, 0x0, 0xcc, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xcd, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xd2, - 0x0, 0x5a, 0x0, 0xd2, 0x0, 0xd3, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xd4, 0x0, 0x46, 0x0, 0xd2, - 0x0, 0xd5, 0xff, 0xd8, 0x0, 0xd2, 0x0, 0xd6, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xd7, 0x0, 0x46, - 0x0, 0xd2, 0x0, 0xd8, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xd9, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xda, - 0x0, 0x46, 0x0, 0xd2, 0x0, 0xdb, 0x0, 0x46, 0x0, 0xd2, 0x0, 0xe0, 0x0, 0x32, 0x0, 0xd2, - 0x0, 0xe1, 0x0, 0x32, 0x0, 0xd2, 0x0, 0xe2, 0x0, 0x32, 0x0, 0xd3, 0x0, 0x5, 0xff, 0xce, - 0x0, 0xd3, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x2a, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x2d, - 0xff, 0xce, 0x0, 0xd3, 0x0, 0x32, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x34, 0xff, 0xdd, 0x0, 0xd3, - 0x0, 0x37, 0xff, 0xa1, 0x0, 0xd3, 0x0, 0x39, 0xff, 0xce, 0x0, 0xd3, 0x0, 0x3a, 0xff, 0xec, - 0x0, 0xd3, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xd3, 0x0, 0x6c, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x78, - 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x99, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xd3, - 0x0, 0xce, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0xd2, 0xff, 0x9c, 0x0, 0xd3, 0x0, 0xdc, 0xff, 0xdd, - 0x0, 0xd3, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xd3, 0x0, 0xdf, 0xff, 0xdd, 0x0, 0xd4, 0x0, 0x5, - 0x0, 0x3c, 0x0, 0xd4, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0xd4, - 0x0, 0x2d, 0xff, 0xec, 0x0, 0xd4, 0x0, 0x32, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x34, 0xff, 0xe2, - 0x0, 0xd4, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x78, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x99, - 0xff, 0xe2, 0x0, 0xd4, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0xce, 0xff, 0xe2, 0x0, 0xd4, - 0x0, 0xdc, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0xdd, 0xff, 0xe2, 0x0, 0xd4, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0xd5, 0x0, 0x5, 0xff, 0xce, 0x0, 0xd5, 0x0, 0x26, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x2a, - 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x2d, 0xff, 0xce, 0x0, 0xd5, 0x0, 0x32, 0xff, 0xdd, 0x0, 0xd5, - 0x0, 0x34, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x37, 0xff, 0xa1, 0x0, 0xd5, 0x0, 0x39, 0xff, 0xce, - 0x0, 0xd5, 0x0, 0x3a, 0xff, 0xec, 0x0, 0xd5, 0x0, 0x3c, 0xff, 0x9c, 0x0, 0xd5, 0x0, 0x6c, - 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x78, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x99, 0xff, 0xdd, 0x0, 0xd5, - 0x0, 0x9c, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xce, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xd2, 0xff, 0x9c, - 0x0, 0xd5, 0x0, 0xdc, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xdd, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0xdf, - 0xff, 0xdd, 0x0, 0xd6, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xd6, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xd6, - 0x0, 0x2a, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x32, 0xff, 0xe2, - 0x0, 0xd6, 0x0, 0x34, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x6c, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x78, - 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x99, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0x9c, 0xff, 0xe2, 0x0, 0xd6, - 0x0, 0xce, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0xd6, 0x0, 0xdd, 0xff, 0xe2, - 0x0, 0xd6, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xd7, 0x0, 0x26, - 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xd7, - 0x0, 0x32, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x34, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x6c, 0xff, 0xe2, - 0x0, 0xd7, 0x0, 0x78, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x99, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x9c, - 0xff, 0xe2, 0x0, 0xd7, 0x0, 0xce, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0xdc, 0xff, 0xe2, 0x0, 0xd7, - 0x0, 0xdd, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0xdf, 0xff, 0xe2, 0x0, 0xd8, 0x0, 0x5, 0x0, 0x3c, - 0x0, 0xd8, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xd8, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xd8, 0x0, 0x3d, - 0x0, 0x28, 0x0, 0xd8, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xd9, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xd9, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x3d, 0x0, 0x28, - 0x0, 0xd9, 0x0, 0xd2, 0x0, 0x1e, 0x0, 0xda, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xda, 0x0, 0x2d, - 0xff, 0xe2, 0x0, 0xda, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xda, 0x0, 0x3d, 0x0, 0x28, 0x0, 0xda, - 0x0, 0xd2, 0x0, 0x1e, 0x0, 0xdb, 0x0, 0x5, 0x0, 0x3c, 0x0, 0xdb, 0x0, 0x2d, 0xff, 0xe2, - 0x0, 0xdb, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0xdb, 0x0, 0x3d, 0x0, 0x28, 0x0, 0xdb, 0x0, 0xd2, - 0x0, 0x1e, 0x0, 0xdc, 0x0, 0x12, 0xff, 0xce, 0x0, 0xdc, 0x0, 0x24, 0xff, 0xce, 0x0, 0xdc, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdc, 0x0, 0x37, 0xff, 0xba, 0x0, 0xdc, 0x0, 0x3d, 0xff, 0xec, - 0x0, 0xdc, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xdc, 0x0, 0x97, 0xff, 0xce, 0x0, 0xdc, 0x0, 0x98, - 0xff, 0xce, 0x0, 0xdc, 0x0, 0xcc, 0xff, 0xce, 0x0, 0xdc, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xdc, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0xdc, 0x0, 0xd5, 0xff, 0xce, 0x0, 0xdd, 0x0, 0x12, 0xff, 0xce, - 0x0, 0xdd, 0x0, 0x24, 0xff, 0xce, 0x0, 0xdd, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdd, 0x0, 0x37, - 0xff, 0xba, 0x0, 0xdd, 0x0, 0x3d, 0xff, 0xec, 0x0, 0xdd, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xdd, - 0x0, 0x97, 0xff, 0xce, 0x0, 0xdd, 0x0, 0x98, 0xff, 0xce, 0x0, 0xdd, 0x0, 0xcc, 0xff, 0xce, - 0x0, 0xdd, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xdd, 0x0, 0xd3, 0xff, 0xce, 0x0, 0xdd, 0x0, 0xd5, - 0xff, 0xce, 0x0, 0xdf, 0x0, 0x12, 0xff, 0xce, 0x0, 0xdf, 0x0, 0x24, 0xff, 0xce, 0x0, 0xdf, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdf, 0x0, 0x37, 0xff, 0xba, 0x0, 0xdf, 0x0, 0x3d, 0xff, 0xec, - 0x0, 0xdf, 0x0, 0x42, 0xff, 0xb0, 0x0, 0xdf, 0x0, 0x97, 0xff, 0xce, 0x0, 0xdf, 0x0, 0x98, - 0xff, 0xce, 0x0, 0xdf, 0x0, 0xcc, 0xff, 0xce, 0x0, 0xdf, 0x0, 0xcd, 0xff, 0xce, 0x0, 0xdf, - 0x0, 0xd3, 0xff, 0xce, 0x0, 0xdf, 0x0, 0xd5, 0xff, 0xce, 0x0, 0xe0, 0x0, 0x5, 0x0, 0x32, - 0x0, 0xe0, 0x0, 0x24, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xe0, 0x0, 0x97, - 0xff, 0xe2, 0x0, 0xe0, 0x0, 0x98, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0xcc, 0xff, 0xe2, 0x0, 0xe0, - 0x0, 0xcd, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0xd3, 0xff, 0xe2, 0x0, 0xe0, 0x0, 0xd5, 0xff, 0xe2, - 0x0, 0xe1, 0x0, 0x5, 0x0, 0x32, 0x0, 0xe1, 0x0, 0x24, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0x2d, - 0xff, 0xec, 0x0, 0xe1, 0x0, 0x97, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0x98, 0xff, 0xe2, 0x0, 0xe1, - 0x0, 0xcc, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0xcd, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0xd3, 0xff, 0xe2, - 0x0, 0xe1, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0x5, 0x0, 0x32, 0x0, 0xe2, 0x0, 0x24, - 0xff, 0xe2, 0x0, 0xe2, 0x0, 0x2d, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x97, 0xff, 0xe2, 0x0, 0xe2, - 0x0, 0x98, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0xcc, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0xcd, 0xff, 0xe2, - 0x0, 0xe2, 0x0, 0xd3, 0xff, 0xe2, 0x0, 0xe2, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0xe8, 0x9, 0xd, 0x5, 0x0, 0x2, 0x2, 0x3, 0x3, 0x6, 0x6, 0x8, 0x6, - 0x2, 0x3, 0x3, 0x5, 0x4, 0x3, 0x3, 0x2, 0x4, 0x6, 0x5, 0x5, 0x5, 0x6, 0x5, 0x6, - 0x5, 0x5, 0x6, 0x2, 0x2, 0x6, 0x5, 0x6, 0x5, 0x9, 0x6, 0x6, 0x6, 0x7, 0x6, 0x5, - 0x7, 0x7, 0x3, 0x3, 0x6, 0x5, 0x8, 0x7, 0x7, 0x6, 0x8, 0x6, 0x6, 0x5, 0x7, 0x6, - 0x9, 0x6, 0x5, 0x5, 0x3, 0x3, 0x3, 0x4, 0x5, 0x2, 0x5, 0x5, 0x4, 0x5, 0x5, 0x3, - 0x5, 0x5, 0x3, 0x2, 0x5, 0x3, 0x8, 0x5, 0x5, 0x5, 0x5, 0x4, 0x4, 0x3, 0x5, 0x4, - 0x7, 0x4, 0x4, 0x4, 0x3, 0x3, 0x3, 0x4, 0x5, 0x4, 0x6, 0x4, 0x3, 0x5, 0x5, 0x3, - 0x4, 0x9, 0x7, 0x5, 0x4, 0x4, 0x7, 0x5, 0x5, 0x3, 0x4, 0x6, 0x6, 0x7, 0xa, 0x8, - 0x5, 0x6, 0x4, 0x4, 0x2, 0x2, 0x4, 0x6, 0x4, 0x4, 0x6, 0x6, 0x5, 0x2, 0x2, 0x4, - 0xd, 0x3, 0x4, 0x4, 0x3, 0x4, 0x2, 0x3, 0x3, 0x5, 0x3, 0x4, 0x3, 0x6, 0x6, 0x6, - 0x6, 0x7, 0x7, 0x7, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x5, 0x5, 0x5, 0x5, 0x3, - 0x3, 0x3, 0x3, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x9, 0x9, - 0x8, 0x4, 0x3, 0x4, 0x7, 0x7, 0x5, 0x3, 0x3, 0x7, 0x6, 0x4, 0x3, 0x4, 0x9, 0xc, - 0x7, 0x3, 0x6, 0x6, 0x7, 0x4, 0x3, 0x4, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, - 0x3, 0x3, 0x7, 0x7, 0x9, 0x7, 0x7, 0x7, 0x7, 0x0, 0x0, 0x0, 0xa, 0xe, 0x5, 0x0, - 0x2, 0x2, 0x4, 0x3, 0x7, 0x6, 0x9, 0x7, 0x2, 0x3, 0x3, 0x5, 0x5, 0x3, 0x3, 0x2, - 0x4, 0x7, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x6, 0x6, 0x2, 0x3, 0x7, 0x6, 0x7, - 0x5, 0xa, 0x7, 0x7, 0x7, 0x7, 0x6, 0x6, 0x8, 0x8, 0x3, 0x4, 0x7, 0x6, 0x9, 0x8, - 0x8, 0x6, 0x8, 0x7, 0x6, 0x5, 0x7, 0x6, 0x9, 0x7, 0x6, 0x6, 0x3, 0x3, 0x3, 0x4, - 0x5, 0x2, 0x5, 0x6, 0x5, 0x6, 0x5, 0x3, 0x6, 0x6, 0x3, 0x3, 0x5, 0x3, 0x9, 0x6, - 0x5, 0x6, 0x6, 0x4, 0x4, 0x4, 0x6, 0x5, 0x8, 0x5, 0x5, 0x5, 0x3, 0x3, 0x3, 0x4, - 0x6, 0x5, 0x6, 0x5, 0x4, 0x6, 0x6, 0x3, 0x4, 0xa, 0x8, 0x6, 0x4, 0x5, 0x8, 0x5, - 0x5, 0x4, 0x5, 0x7, 0x7, 0x8, 0xb, 0x9, 0x5, 0x6, 0x4, 0x4, 0x2, 0x2, 0x4, 0x7, - 0x4, 0x4, 0x6, 0x6, 0x6, 0x2, 0x2, 0x5, 0xe, 0x3, 0x4, 0x4, 0x4, 0x4, 0x2, 0x3, - 0x3, 0x5, 0x3, 0x4, 0x3, 0x7, 0x7, 0x7, 0x6, 0x8, 0x8, 0x7, 0x5, 0x5, 0x5, 0x5, - 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x3, 0x3, 0x3, 0x3, 0x6, 0x5, 0x5, 0x5, 0x5, - 0x5, 0x6, 0x6, 0x6, 0x6, 0x5, 0xa, 0xa, 0x9, 0x5, 0x3, 0x5, 0x8, 0x8, 0x6, 0x3, - 0x3, 0x8, 0x6, 0x5, 0x3, 0x5, 0xa, 0xd, 0x8, 0x3, 0x7, 0x7, 0x8, 0x5, 0x3, 0x5, - 0x6, 0x7, 0x6, 0x7, 0x6, 0x6, 0x3, 0x4, 0x4, 0x3, 0x8, 0x8, 0xa, 0x8, 0x7, 0x7, - 0x7, 0x0, 0x0, 0x0, 0xb, 0x10, 0x6, 0x0, 0x2, 0x2, 0x4, 0x4, 0x8, 0x7, 0xa, 0x7, - 0x2, 0x4, 0x4, 0x6, 0x5, 0x4, 0x4, 0x3, 0x5, 0x7, 0x6, 0x6, 0x6, 0x7, 0x6, 0x7, - 0x6, 0x7, 0x7, 0x3, 0x3, 0x7, 0x6, 0x7, 0x6, 0xb, 0x8, 0x8, 0x8, 0x8, 0x7, 0x6, - 0x9, 0x8, 0x4, 0x4, 0x7, 0x6, 0xa, 0x8, 0x9, 0x7, 0x9, 0x7, 0x7, 0x6, 0x8, 0x7, - 0xa, 0x7, 0x7, 0x7, 0x4, 0x3, 0x4, 0x4, 0x6, 0x3, 0x6, 0x6, 0x5, 0x6, 0x6, 0x4, - 0x6, 0x7, 0x3, 0x3, 0x6, 0x3, 0xa, 0x7, 0x6, 0x6, 0x6, 0x5, 0x5, 0x4, 0x6, 0x5, - 0x9, 0x5, 0x5, 0x5, 0x4, 0x3, 0x4, 0x5, 0x6, 0x5, 0x7, 0x5, 0x4, 0x7, 0x6, 0x3, - 0x5, 0xa, 0x9, 0x7, 0x5, 0x5, 0x9, 0x6, 0x6, 0x4, 0x5, 0x7, 0x7, 0x9, 0xc, 0x9, - 0x6, 0x7, 0x5, 0x5, 0x3, 0x3, 0x5, 0x8, 0x5, 0x5, 0x7, 0x7, 0x7, 0x3, 0x3, 0x5, - 0x10, 0x3, 0x4, 0x5, 0x4, 0x5, 0x3, 0x3, 0x3, 0x6, 0x3, 0x4, 0x3, 0x8, 0x8, 0x8, - 0x7, 0x8, 0x9, 0x8, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x6, 0x6, 0x6, 0x6, 0x3, - 0x3, 0x3, 0x3, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0xb, 0xb, - 0xa, 0x5, 0x3, 0x5, 0x8, 0x8, 0x7, 0x3, 0x3, 0x9, 0x7, 0x5, 0x3, 0x5, 0xa, 0xf, - 0x9, 0x3, 0x8, 0x8, 0x9, 0x5, 0x3, 0x5, 0x7, 0x8, 0x7, 0x8, 0x7, 0x7, 0x4, 0x4, - 0x4, 0x4, 0x9, 0x9, 0xa, 0x9, 0x8, 0x8, 0x8, 0x0, 0x0, 0x0, 0xc, 0x11, 0x6, 0x0, - 0x3, 0x3, 0x4, 0x4, 0x8, 0x7, 0xb, 0x8, 0x3, 0x4, 0x4, 0x6, 0x6, 0x4, 0x4, 0x3, - 0x5, 0x8, 0x6, 0x7, 0x7, 0x8, 0x7, 0x7, 0x6, 0x7, 0x7, 0x3, 0x3, 0x8, 0x7, 0x8, - 0x6, 0xc, 0x8, 0x8, 0x8, 0x9, 0x8, 0x7, 0xa, 0x9, 0x4, 0x4, 0x8, 0x7, 0xb, 0x9, - 0xa, 0x8, 0xa, 0x8, 0x7, 0x6, 0x9, 0x8, 0xb, 0x8, 0x7, 0x7, 0x4, 0x4, 0x4, 0x5, - 0x6, 0x3, 0x6, 0x7, 0x5, 0x7, 0x6, 0x4, 0x7, 0x7, 0x3, 0x3, 0x6, 0x3, 0xb, 0x7, - 0x6, 0x7, 0x7, 0x5, 0x5, 0x4, 0x7, 0x6, 0x9, 0x6, 0x6, 0x6, 0x4, 0x3, 0x4, 0x5, - 0x7, 0x5, 0x8, 0x6, 0x5, 0x7, 0x7, 0x4, 0x5, 0xb, 0xa, 0x7, 0x5, 0x5, 0x9, 0x6, - 0x6, 0x4, 0x6, 0x8, 0x8, 0xa, 0xd, 0xa, 0x6, 0x8, 0x5, 0x5, 0x3, 0x3, 0x5, 0x9, - 0x5, 0x5, 0x8, 0x8, 0x7, 0x3, 0x3, 0x6, 0x11, 0x3, 0x5, 0x5, 0x4, 0x5, 0x3, 0x4, - 0x3, 0x6, 0x3, 0x5, 0x4, 0x9, 0x9, 0x8, 0x8, 0x9, 0xa, 0x9, 0x6, 0x6, 0x6, 0x6, - 0x6, 0x6, 0x5, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, 0x3, 0x3, 0x7, 0x6, 0x6, 0x6, 0x6, - 0x6, 0x7, 0x7, 0x7, 0x7, 0x6, 0xc, 0xc, 0xb, 0x6, 0x4, 0x6, 0x9, 0x9, 0x7, 0x4, - 0x4, 0xa, 0x7, 0x6, 0x4, 0x6, 0xb, 0x10, 0xa, 0x4, 0x9, 0x9, 0xa, 0x6, 0x4, 0x6, - 0x7, 0x9, 0x8, 0x9, 0x8, 0x8, 0x4, 0x5, 0x5, 0x4, 0xa, 0xa, 0xb, 0xa, 0x9, 0x9, - 0x9, 0x0, 0x0, 0x0, 0xd, 0x13, 0x7, 0x0, 0x3, 0x3, 0x5, 0x4, 0x9, 0x8, 0xc, 0x9, - 0x3, 0x4, 0x4, 0x7, 0x6, 0x4, 0x4, 0x3, 0x5, 0x9, 0x7, 0x7, 0x8, 0x8, 0x7, 0x8, - 0x7, 0x8, 0x8, 0x3, 0x3, 0x9, 0x8, 0x9, 0x7, 0xd, 0x9, 0x9, 0x9, 0xa, 0x8, 0x8, - 0xa, 0xa, 0x4, 0x5, 0x9, 0x7, 0xb, 0xa, 0xb, 0x8, 0xb, 0x9, 0x8, 0x7, 0xa, 0x8, - 0xc, 0x9, 0x8, 0x8, 0x4, 0x4, 0x4, 0x5, 0x7, 0x3, 0x7, 0x7, 0x6, 0x7, 0x7, 0x4, - 0x7, 0x8, 0x4, 0x3, 0x7, 0x4, 0xc, 0x8, 0x7, 0x7, 0x7, 0x5, 0x6, 0x5, 0x8, 0x6, - 0xa, 0x6, 0x6, 0x6, 0x4, 0x4, 0x4, 0x5, 0x7, 0x6, 0x8, 0x6, 0x5, 0x8, 0x7, 0x4, - 0x5, 0xc, 0xb, 0x8, 0x6, 0x6, 0xa, 0x7, 0x7, 0x5, 0x6, 0x9, 0x9, 0xa, 0xe, 0xb, - 0x7, 0x8, 0x6, 0x6, 0x3, 0x3, 0x5, 0x9, 0x5, 0x5, 0x8, 0x8, 0x8, 0x3, 0x3, 0x6, - 0x13, 0x4, 0x5, 0x5, 0x5, 0x6, 0x3, 0x4, 0x4, 0x7, 0x4, 0x5, 0x4, 0x9, 0x9, 0x9, - 0x8, 0xa, 0xa, 0xa, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7, 0x7, 0x4, - 0x4, 0x4, 0x4, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8, 0x6, 0xd, 0xd, - 0xc, 0x6, 0x4, 0x6, 0xa, 0xa, 0x8, 0x4, 0x4, 0xa, 0x8, 0x6, 0x4, 0x6, 0xc, 0x11, - 0xa, 0x4, 0x9, 0x9, 0xa, 0x6, 0x4, 0x6, 0x8, 0x9, 0x8, 0x9, 0x8, 0x8, 0x4, 0x5, - 0x5, 0x4, 0xa, 0xa, 0xc, 0xa, 0xa, 0xa, 0xa, 0x0, 0x0, 0x0, 0xe, 0x14, 0x7, 0x0, - 0x3, 0x3, 0x5, 0x5, 0xa, 0x9, 0xd, 0x9, 0x3, 0x5, 0x5, 0x7, 0x7, 0x4, 0x5, 0x3, - 0x6, 0x9, 0x7, 0x8, 0x8, 0x9, 0x8, 0x9, 0x7, 0x8, 0x9, 0x3, 0x4, 0x9, 0x8, 0x9, - 0x8, 0xe, 0xa, 0xa, 0xa, 0xa, 0x9, 0x8, 0xb, 0xb, 0x4, 0x5, 0x9, 0x8, 0xc, 0xb, - 0xc, 0x9, 0xc, 0x9, 0x9, 0x7, 0xa, 0x9, 0xd, 0x9, 0x8, 0x8, 0x5, 0x4, 0x5, 0x6, - 0x7, 0x3, 0x7, 0x8, 0x6, 0x8, 0x7, 0x5, 0x8, 0x8, 0x4, 0x4, 0x7, 0x4, 0xc, 0x8, - 0x7, 0x8, 0x8, 0x6, 0x6, 0x5, 0x8, 0x7, 0xb, 0x7, 0x7, 0x6, 0x5, 0x4, 0x5, 0x6, - 0x8, 0x6, 0x9, 0x7, 0x5, 0x8, 0x8, 0x4, 0x6, 0xd, 0xc, 0x8, 0x6, 0x6, 0xb, 0x7, - 0x8, 0x5, 0x7, 0x9, 0x9, 0xb, 0xf, 0xc, 0x7, 0x9, 0x6, 0x6, 0x3, 0x3, 0x6, 0xa, - 0x6, 0x6, 0x9, 0x9, 0x8, 0x3, 0x3, 0x7, 0x14, 0x4, 0x6, 0x6, 0x5, 0x6, 0x3, 0x4, - 0x4, 0x7, 0x4, 0x6, 0x4, 0xa, 0xa, 0xa, 0x9, 0xb, 0xb, 0xa, 0x7, 0x7, 0x7, 0x7, - 0x7, 0x7, 0x6, 0x7, 0x7, 0x7, 0x7, 0x4, 0x4, 0x4, 0x4, 0x8, 0x7, 0x7, 0x7, 0x7, - 0x7, 0x8, 0x8, 0x8, 0x8, 0x7, 0xe, 0xe, 0xc, 0x7, 0x4, 0x7, 0xb, 0xb, 0x8, 0x4, - 0x4, 0xb, 0x9, 0x7, 0x4, 0x7, 0xd, 0x13, 0xb, 0x4, 0xa, 0xa, 0xb, 0x7, 0x4, 0x7, - 0x8, 0xa, 0x9, 0xa, 0x9, 0x9, 0x4, 0x5, 0x5, 0x5, 0xb, 0xb, 0xd, 0xb, 0xa, 0xa, - 0xa, 0x0, 0x0, 0x0, 0xf, 0x15, 0x8, 0x0, 0x3, 0x3, 0x5, 0x5, 0xb, 0x9, 0xe, 0xa, - 0x3, 0x5, 0x5, 0x8, 0x7, 0x5, 0x5, 0x4, 0x6, 0xa, 0x8, 0x9, 0x9, 0x9, 0x8, 0x9, - 0x8, 0x9, 0x9, 0x4, 0x4, 0xa, 0x9, 0xa, 0x8, 0xf, 0xb, 0xa, 0xa, 0xb, 0xa, 0x9, - 0xc, 0xb, 0x5, 0x5, 0xa, 0x9, 0xd, 0xb, 0xc, 0xa, 0xd, 0xa, 0x9, 0x8, 0xb, 0x9, - 0xe, 0xa, 0x9, 0x9, 0x5, 0x5, 0x5, 0x6, 0x8, 0x4, 0x8, 0x9, 0x7, 0x8, 0x8, 0x5, - 0x8, 0x9, 0x4, 0x4, 0x8, 0x4, 0xd, 0x9, 0x8, 0x8, 0x8, 0x6, 0x7, 0x5, 0x9, 0x7, - 0xc, 0x7, 0x7, 0x7, 0x5, 0x4, 0x5, 0x6, 0x8, 0x7, 0xa, 0x7, 0x6, 0x9, 0x8, 0x5, - 0x6, 0xe, 0xc, 0x9, 0x6, 0x7, 0xc, 0x8, 0x8, 0x5, 0x7, 0xa, 0xa, 0xc, 0x10, 0xd, - 0x8, 0xa, 0x6, 0x7, 0x4, 0x4, 0x6, 0xb, 0x6, 0x6, 0xa, 0xa, 0x9, 0x4, 0x4, 0x7, - 0x15, 0x4, 0x6, 0x6, 0x5, 0x7, 0x4, 0x5, 0x4, 0x8, 0x4, 0x6, 0x5, 0xb, 0xb, 0xa, - 0xa, 0xc, 0xc, 0xb, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x7, 0x8, 0x8, 0x8, 0x8, 0x4, - 0x4, 0x4, 0x4, 0x9, 0x8, 0x8, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x9, 0x7, 0xf, 0xf, - 0xd, 0x7, 0x5, 0x7, 0xc, 0xc, 0x9, 0x5, 0x5, 0xc, 0x9, 0x7, 0x5, 0x7, 0xe, 0x14, - 0xc, 0x5, 0xb, 0xb, 0xc, 0x7, 0x5, 0x7, 0x9, 0xb, 0xa, 0xb, 0xa, 0xa, 0x5, 0x6, - 0x6, 0x5, 0xc, 0xc, 0xe, 0xc, 0xb, 0xb, 0xb, 0x0, 0x0, 0x0, 0x10, 0x17, 0x8, 0x0, - 0x3, 0x3, 0x6, 0x5, 0xb, 0xa, 0xf, 0xb, 0x3, 0x5, 0x5, 0x9, 0x8, 0x5, 0x5, 0x4, - 0x7, 0xb, 0x8, 0x9, 0x9, 0xa, 0x9, 0xa, 0x9, 0xa, 0xa, 0x4, 0x4, 0xb, 0x9, 0xb, - 0x9, 0x11, 0xb, 0xb, 0xb, 0xc, 0xa, 0x9, 0xd, 0xc, 0x5, 0x6, 0xb, 0x9, 0xe, 0xc, - 0xd, 0xa, 0xe, 0xb, 0xa, 0x8, 0xc, 0xa, 0xf, 0xb, 0x9, 0xa, 0x5, 0x5, 0x5, 0x6, - 0x8, 0x4, 0x8, 0x9, 0x7, 0x9, 0x8, 0x5, 0x9, 0xa, 0x5, 0x4, 0x8, 0x5, 0xe, 0xa, - 0x8, 0x9, 0x9, 0x7, 0x7, 0x6, 0x9, 0x8, 0xc, 0x8, 0x8, 0x7, 0x6, 0x4, 0x6, 0x7, - 0x9, 0x7, 0xa, 0x8, 0x6, 0xa, 0x9, 0x5, 0x7, 0xf, 0xd, 0x9, 0x7, 0x7, 0xc, 0x8, - 0x9, 0x6, 0x7, 0xb, 0xb, 0xd, 0x12, 0xe, 0x8, 0xa, 0x7, 0x7, 0x4, 0x4, 0x7, 0xb, - 0x7, 0x7, 0xa, 0xa, 0xa, 0x4, 0x4, 0x8, 0x17, 0x5, 0x6, 0x7, 0x6, 0x7, 0x4, 0x5, - 0x5, 0x8, 0x5, 0x6, 0x5, 0xb, 0xb, 0xb, 0xa, 0xc, 0xd, 0xc, 0x8, 0x8, 0x8, 0x8, - 0x8, 0x8, 0x7, 0x8, 0x8, 0x8, 0x8, 0x5, 0x5, 0x5, 0x5, 0xa, 0x8, 0x8, 0x8, 0x8, - 0x8, 0x9, 0x9, 0x9, 0x9, 0x8, 0x10, 0x10, 0xe, 0x8, 0x5, 0x8, 0xc, 0xc, 0xa, 0x5, - 0x5, 0xd, 0xa, 0x7, 0x5, 0x8, 0xf, 0x15, 0xd, 0x5, 0xb, 0xb, 0xd, 0x7, 0x5, 0x8, - 0x9, 0xb, 0xa, 0xb, 0xa, 0xa, 0x5, 0x6, 0x6, 0x6, 0xd, 0xd, 0xf, 0xd, 0xc, 0xc, - 0xc, 0x0, 0x0, 0x0, 0x11, 0x18, 0x9, 0x0, 0x4, 0x4, 0x6, 0x6, 0xc, 0xa, 0x10, 0xb, - 0x4, 0x6, 0x6, 0x9, 0x8, 0x5, 0x6, 0x4, 0x7, 0xb, 0x9, 0xa, 0xa, 0xb, 0xa, 0xa, - 0x9, 0xa, 0xa, 0x4, 0x4, 0xb, 0xa, 0xb, 0x9, 0x12, 0xc, 0xc, 0xc, 0xd, 0xb, 0xa, - 0xe, 0xd, 0x5, 0x6, 0xb, 0xa, 0xf, 0xd, 0xe, 0xb, 0xe, 0xb, 0xa, 0x9, 0xc, 0xb, - 0x10, 0xb, 0xa, 0xa, 0x6, 0x5, 0x6, 0x7, 0x9, 0x4, 0x9, 0xa, 0x8, 0xa, 0x9, 0x6, - 0x9, 0xa, 0x5, 0x4, 0x9, 0x5, 0xf, 0xa, 0x9, 0xa, 0xa, 0x7, 0x7, 0x6, 0xa, 0x8, - 0xd, 0x8, 0x8, 0x8, 0x6, 0x5, 0x6, 0x7, 0x9, 0x8, 0xb, 0x8, 0x7, 0xa, 0x9, 0x5, - 0x7, 0x10, 0xe, 0xa, 0x7, 0x8, 0xd, 0x9, 0x9, 0x6, 0x8, 0xb, 0xb, 0xe, 0x13, 0xf, - 0x9, 0xb, 0x7, 0x7, 0x4, 0x4, 0x7, 0xc, 0x7, 0x7, 0xb, 0xb, 0xa, 0x4, 0x4, 0x8, - 0x18, 0x5, 0x7, 0x7, 0x6, 0x8, 0x4, 0x5, 0x5, 0x9, 0x5, 0x7, 0x5, 0xc, 0xc, 0xc, - 0xb, 0xd, 0xe, 0xd, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x8, 0x9, 0x9, 0x9, 0x9, 0x5, - 0x5, 0x5, 0x5, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0x8, 0x11, 0x11, - 0xf, 0x8, 0x5, 0x8, 0xd, 0xd, 0xa, 0x5, 0x5, 0xd, 0xb, 0x8, 0x5, 0x8, 0x10, 0x17, - 0xe, 0x5, 0xc, 0xc, 0xe, 0x8, 0x5, 0x8, 0xa, 0xc, 0xb, 0xc, 0xb, 0xb, 0x5, 0x7, - 0x6, 0x6, 0xe, 0xe, 0x10, 0xe, 0xd, 0xd, 0xd, 0x0, 0x0, 0x0, 0x12, 0x1a, 0x9, 0x0, - 0x4, 0x4, 0x6, 0x6, 0xd, 0xb, 0x10, 0xc, 0x4, 0x6, 0x6, 0xa, 0x9, 0x6, 0x6, 0x4, - 0x8, 0xc, 0x9, 0xa, 0xb, 0xb, 0xa, 0xb, 0xa, 0xb, 0xb, 0x4, 0x5, 0xc, 0xa, 0xc, - 0xa, 0x13, 0xd, 0xd, 0xc, 0xd, 0xc, 0xb, 0xe, 0xe, 0x6, 0x6, 0xc, 0xa, 0x10, 0xe, - 0xf, 0xb, 0xf, 0xc, 0xb, 0x9, 0xd, 0xb, 0x11, 0xc, 0xb, 0xb, 0x6, 0x6, 0x6, 0x7, - 0x9, 0x4, 0xa, 0xa, 0x8, 0xa, 0x9, 0x6, 0xa, 0xb, 0x5, 0x5, 0xa, 0x5, 0x10, 0xb, - 0xa, 0xa, 0xa, 0x8, 0x8, 0x6, 0xb, 0x9, 0xe, 0x9, 0x9, 0x8, 0x6, 0x5, 0x6, 0x8, - 0xa, 0x8, 0xc, 0x9, 0x7, 0xb, 0xa, 0x6, 0x7, 0x11, 0xf, 0xb, 0x8, 0x8, 0xe, 0xa, - 0xa, 0x6, 0x8, 0xc, 0xc, 0xe, 0x14, 0xf, 0x9, 0xc, 0x8, 0x8, 0x4, 0x4, 0x8, 0xd, - 0x8, 0x8, 0xc, 0xb, 0xb, 0x4, 0x4, 0x9, 0x1a, 0x5, 0x7, 0x8, 0x7, 0x8, 0x4, 0x6, - 0x5, 0x9, 0x5, 0x7, 0x6, 0xd, 0xd, 0xc, 0xc, 0xe, 0xe, 0xd, 0xa, 0xa, 0xa, 0xa, - 0xa, 0xa, 0x8, 0x9, 0x9, 0x9, 0x9, 0x5, 0x5, 0x5, 0x5, 0xb, 0xa, 0xa, 0xa, 0xa, - 0xa, 0xb, 0xb, 0xb, 0xb, 0x9, 0x12, 0x12, 0x10, 0x9, 0x6, 0x9, 0xe, 0xe, 0xb, 0x6, - 0x6, 0xe, 0xb, 0x8, 0x6, 0x9, 0x11, 0x18, 0xe, 0x6, 0xd, 0xd, 0xe, 0x8, 0x6, 0x9, - 0xb, 0xd, 0xc, 0xd, 0xc, 0xc, 0x6, 0x7, 0x7, 0x6, 0xe, 0xe, 0x11, 0xe, 0xd, 0xd, - 0xd, 0x0, 0x0, 0x0, 0x13, 0x1b, 0xa, 0x0, 0x4, 0x4, 0x7, 0x6, 0xd, 0xc, 0x11, 0xd, - 0x4, 0x6, 0x6, 0xa, 0x9, 0x6, 0x6, 0x5, 0x8, 0xd, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, - 0xa, 0xb, 0xc, 0x5, 0x5, 0xc, 0xb, 0xc, 0xa, 0x14, 0xd, 0xd, 0xd, 0xe, 0xc, 0xb, - 0xf, 0xe, 0x6, 0x7, 0xd, 0xb, 0x11, 0xe, 0x10, 0xc, 0x10, 0xd, 0xc, 0xa, 0xe, 0xc, - 0x12, 0xc, 0xb, 0xb, 0x6, 0x6, 0x6, 0x7, 0xa, 0x5, 0xa, 0xb, 0x9, 0xb, 0xa, 0x6, - 0xa, 0xb, 0x5, 0x5, 0xa, 0x5, 0x11, 0xb, 0xa, 0xb, 0xb, 0x8, 0x8, 0x7, 0xb, 0x9, - 0xf, 0x9, 0x9, 0x9, 0x7, 0x5, 0x7, 0x8, 0xb, 0x9, 0xc, 0x9, 0x7, 0xb, 0xb, 0x6, - 0x8, 0x12, 0x10, 0xb, 0x8, 0x9, 0xf, 0xa, 0xa, 0x7, 0x9, 0xd, 0xd, 0xf, 0x15, 0x10, - 0xa, 0xc, 0x8, 0x8, 0x5, 0x5, 0x8, 0xe, 0x8, 0x8, 0xc, 0xc, 0xc, 0x5, 0x5, 0x9, - 0x1b, 0x5, 0x7, 0x8, 0x7, 0x9, 0x5, 0x6, 0x5, 0xa, 0x5, 0x7, 0x6, 0xe, 0xe, 0xd, - 0xc, 0xf, 0xf, 0xe, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa, 0xa, 0x5, - 0x5, 0x5, 0x5, 0xb, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0xb, 0xb, 0x9, 0x13, 0x13, - 0x11, 0x9, 0x6, 0x9, 0xf, 0xf, 0xb, 0x6, 0x6, 0xf, 0xc, 0x9, 0x6, 0x9, 0x12, 0x19, - 0xf, 0x6, 0xe, 0xe, 0xf, 0x9, 0x6, 0x9, 0xb, 0xe, 0xc, 0xe, 0xc, 0xc, 0x6, 0x7, - 0x7, 0x7, 0xf, 0xf, 0x12, 0xf, 0xe, 0xe, 0xe, 0x0, 0x0, 0x0, 0x14, 0x1d, 0xa, 0x0, - 0x4, 0x4, 0x7, 0x7, 0xe, 0xc, 0x12, 0xd, 0x4, 0x7, 0x7, 0xb, 0xa, 0x6, 0x7, 0x5, - 0x8, 0xd, 0xa, 0xb, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 0xc, 0x5, 0x5, 0xd, 0xc, 0xd, - 0xb, 0x15, 0xe, 0xe, 0xe, 0xf, 0xd, 0xc, 0x10, 0xf, 0x6, 0x7, 0xd, 0xb, 0x12, 0xf, - 0x11, 0xd, 0x11, 0xd, 0xc, 0xb, 0xf, 0xd, 0x13, 0xd, 0xc, 0xc, 0x7, 0x6, 0x7, 0x8, - 0xa, 0x5, 0xb, 0xc, 0x9, 0xb, 0xb, 0x7, 0xb, 0xc, 0x6, 0x5, 0xb, 0x6, 0x12, 0xc, - 0xb, 0xb, 0xb, 0x8, 0x9, 0x7, 0xc, 0xa, 0x10, 0xa, 0xa, 0x9, 0x7, 0x6, 0x7, 0x8, - 0xb, 0x9, 0xd, 0xa, 0x8, 0xc, 0xb, 0x6, 0x8, 0x13, 0x11, 0xc, 0x9, 0x9, 0x10, 0xb, - 0xb, 0x7, 0x9, 0xd, 0xd, 0x10, 0x16, 0x11, 0xa, 0xd, 0x9, 0x9, 0x5, 0x5, 0x8, 0xe, - 0x8, 0x8, 0xd, 0xd, 0xc, 0x5, 0x5, 0x9, 0x1d, 0x6, 0x8, 0x8, 0x7, 0x9, 0x5, 0x6, - 0x6, 0xa, 0x6, 0x8, 0x6, 0xe, 0xe, 0xe, 0xd, 0xf, 0x10, 0xf, 0xb, 0xb, 0xb, 0xb, - 0xb, 0xb, 0x9, 0xb, 0xb, 0xb, 0xb, 0x6, 0x6, 0x6, 0x6, 0xc, 0xb, 0xb, 0xb, 0xb, - 0xb, 0xc, 0xc, 0xc, 0xc, 0xa, 0x14, 0x14, 0x12, 0xa, 0x6, 0xa, 0xf, 0xf, 0xc, 0x6, - 0x6, 0x10, 0xc, 0x9, 0x6, 0xa, 0x13, 0x1b, 0x10, 0x6, 0xe, 0xe, 0x10, 0x9, 0x6, 0xa, - 0xc, 0xe, 0xd, 0xe, 0xd, 0xd, 0x6, 0x8, 0x8, 0x7, 0x10, 0x10, 0x13, 0x10, 0xf, 0xf, - 0xf, 0x0, 0x0, 0x0, 0x15, 0x1e, 0xb, 0x0, 0x4, 0x4, 0x8, 0x7, 0xf, 0xd, 0x13, 0xe, - 0x4, 0x7, 0x7, 0xb, 0xa, 0x7, 0x7, 0x5, 0x9, 0xe, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, - 0xb, 0xd, 0xd, 0x5, 0x5, 0xe, 0xc, 0xe, 0xb, 0x16, 0xf, 0xf, 0xe, 0x10, 0xd, 0xc, - 0x11, 0x10, 0x7, 0x8, 0xe, 0xc, 0x12, 0x10, 0x11, 0xd, 0x12, 0xe, 0xd, 0xb, 0xf, 0xd, - 0x14, 0xe, 0xc, 0xd, 0x7, 0x7, 0x7, 0x8, 0xb, 0x5, 0xb, 0xc, 0xa, 0xc, 0xb, 0x7, - 0xc, 0xd, 0x6, 0x5, 0xb, 0x6, 0x13, 0xd, 0xb, 0xc, 0xc, 0x9, 0x9, 0x7, 0xc, 0xa, - 0x10, 0xa, 0xa, 0xa, 0x7, 0x6, 0x7, 0x9, 0xc, 0xa, 0xe, 0xa, 0x8, 0xc, 0xc, 0x7, - 0x9, 0x14, 0x11, 0xc, 0x9, 0x9, 0x10, 0xb, 0xb, 0x8, 0xa, 0xe, 0xe, 0x11, 0x17, 0x12, - 0xb, 0xe, 0x9, 0x9, 0x5, 0x5, 0x9, 0xf, 0x9, 0x9, 0xd, 0xd, 0xd, 0x5, 0x5, 0xa, - 0x1e, 0x6, 0x8, 0x9, 0x8, 0x9, 0x5, 0x7, 0x6, 0xb, 0x6, 0x8, 0x7, 0xf, 0xf, 0xe, - 0xe, 0x10, 0x11, 0x10, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb, 0xb, 0x6, - 0x6, 0x6, 0x6, 0xd, 0xb, 0xb, 0xb, 0xb, 0xb, 0xc, 0xc, 0xc, 0xc, 0xa, 0x15, 0x15, - 0x13, 0xa, 0x7, 0xa, 0x10, 0x10, 0xd, 0x7, 0x7, 0x11, 0xd, 0xa, 0x7, 0xa, 0x14, 0x1c, - 0x11, 0x7, 0xf, 0xf, 0x11, 0xa, 0x7, 0xa, 0xc, 0xf, 0xe, 0xf, 0xe, 0xe, 0x7, 0x8, - 0x8, 0x7, 0x11, 0x11, 0x14, 0x11, 0x10, 0x10, 0x10, 0x0, 0x0, 0x0, 0x16, 0x20, 0xb, 0x0, - 0x5, 0x5, 0x8, 0x7, 0xf, 0xe, 0x14, 0xf, 0x5, 0x7, 0x7, 0xc, 0xb, 0x7, 0x7, 0x5, - 0x9, 0xe, 0xb, 0xd, 0xd, 0xe, 0xc, 0xd, 0xc, 0xd, 0xd, 0x5, 0x6, 0xe, 0xd, 0xe, - 0xc, 0x17, 0x10, 0xf, 0xf, 0x10, 0xe, 0xd, 0x12, 0x11, 0x7, 0x8, 0xf, 0xc, 0x13, 0x11, - 0x12, 0xe, 0x13, 0xf, 0xe, 0xc, 0x10, 0xe, 0x15, 0xe, 0xd, 0xd, 0x7, 0x7, 0x7, 0x9, - 0xb, 0x5, 0xc, 0xd, 0xa, 0xc, 0xc, 0x8, 0xc, 0xd, 0x6, 0x6, 0xc, 0x6, 0x13, 0xd, - 0xc, 0xc, 0xc, 0x9, 0xa, 0x8, 0xd, 0xb, 0x11, 0xb, 0xb, 0xa, 0x8, 0x6, 0x8, 0x9, - 0xc, 0xa, 0xe, 0xa, 0x8, 0xd, 0xc, 0x7, 0x9, 0x15, 0x12, 0xd, 0x9, 0xa, 0x11, 0xc, - 0xc, 0x8, 0xa, 0xf, 0xf, 0x12, 0x18, 0x13, 0xb, 0xe, 0x9, 0xa, 0x5, 0x5, 0x9, 0x10, - 0x9, 0x9, 0xe, 0xe, 0xd, 0x5, 0x5, 0xa, 0x20, 0x6, 0x9, 0x9, 0x8, 0xa, 0x5, 0x7, - 0x6, 0xb, 0x6, 0x9, 0x7, 0x10, 0x10, 0xf, 0xe, 0x11, 0x12, 0x10, 0xc, 0xc, 0xc, 0xc, - 0xc, 0xc, 0xa, 0xc, 0xc, 0xc, 0xc, 0x6, 0x6, 0x6, 0x6, 0xd, 0xc, 0xc, 0xc, 0xc, - 0xc, 0xd, 0xd, 0xd, 0xd, 0xb, 0x16, 0x16, 0x14, 0xb, 0x7, 0xb, 0x11, 0x11, 0xd, 0x7, - 0x7, 0x11, 0xe, 0xa, 0x7, 0xb, 0x15, 0x1d, 0x12, 0x7, 0x10, 0x10, 0x12, 0xa, 0x7, 0xb, - 0xd, 0x10, 0xe, 0x10, 0xe, 0xe, 0x7, 0x8, 0x8, 0x8, 0x12, 0x12, 0x15, 0x12, 0x10, 0x10, - 0x10, 0x0, 0x0, 0x0, 0x17, 0x21, 0xc, 0x0, 0x5, 0x5, 0x8, 0x8, 0x10, 0xe, 0x15, 0xf, - 0x5, 0x7, 0x7, 0xc, 0xb, 0x7, 0x7, 0x6, 0xa, 0xf, 0xc, 0xd, 0xd, 0xf, 0xd, 0xe, - 0xc, 0xe, 0xe, 0x6, 0x6, 0xf, 0xd, 0xf, 0xc, 0x18, 0x10, 0x10, 0x10, 0x11, 0xf, 0xd, - 0x12, 0x12, 0x7, 0x8, 0xf, 0xd, 0x14, 0x12, 0x13, 0xf, 0x13, 0xf, 0xe, 0xc, 0x11, 0xf, - 0x16, 0xf, 0xe, 0xe, 0x8, 0x7, 0x8, 0x9, 0xc, 0x6, 0xc, 0xd, 0xa, 0xd, 0xc, 0x8, - 0xd, 0xe, 0x7, 0x6, 0xc, 0x7, 0x14, 0xe, 0xc, 0xd, 0xd, 0xa, 0xa, 0x8, 0xe, 0xb, - 0x12, 0xb, 0xb, 0xb, 0x8, 0x6, 0x8, 0xa, 0xd, 0xa, 0xf, 0xb, 0x9, 0xe, 0xd, 0x7, - 0xa, 0x16, 0x13, 0xe, 0xa, 0xa, 0x12, 0xc, 0xc, 0x8, 0xb, 0xf, 0xf, 0x12, 0x19, 0x14, - 0xc, 0xf, 0xa, 0xa, 0x6, 0x6, 0xa, 0x10, 0xa, 0xa, 0xf, 0xf, 0xe, 0x6, 0x6, 0xb, - 0x21, 0x7, 0x9, 0xa, 0x8, 0xa, 0x6, 0x7, 0x6, 0xc, 0x6, 0x9, 0x7, 0x10, 0x10, 0x10, - 0xf, 0x12, 0x13, 0x11, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xa, 0xc, 0xc, 0xc, 0xc, 0x7, - 0x7, 0x7, 0x7, 0xe, 0xc, 0xc, 0xc, 0xc, 0xc, 0xe, 0xe, 0xe, 0xe, 0xb, 0x17, 0x17, - 0x14, 0xb, 0x7, 0xb, 0x12, 0x12, 0xe, 0x7, 0x7, 0x12, 0xe, 0xb, 0x7, 0xb, 0x16, 0x1f, - 0x12, 0x7, 0x10, 0x10, 0x13, 0xb, 0x7, 0xb, 0xe, 0x10, 0xf, 0x10, 0xf, 0xf, 0x7, 0x9, - 0x9, 0x8, 0x13, 0x13, 0x16, 0x13, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x18, 0x22, 0xc, 0x0, - 0x5, 0x5, 0x9, 0x8, 0x11, 0xf, 0x16, 0x10, 0x5, 0x8, 0x8, 0xd, 0xc, 0x8, 0x8, 0x6, - 0xa, 0x10, 0xc, 0xe, 0xe, 0xf, 0xe, 0xf, 0xd, 0xe, 0xf, 0x6, 0x6, 0x10, 0xe, 0x10, - 0xd, 0x19, 0x11, 0x11, 0x10, 0x12, 0xf, 0xe, 0x13, 0x12, 0x8, 0x9, 0x10, 0xe, 0x15, 0x12, - 0x14, 0xf, 0x14, 0x10, 0xf, 0xd, 0x12, 0xf, 0x17, 0x10, 0xe, 0xf, 0x8, 0x7, 0x8, 0x9, - 0xc, 0x6, 0xd, 0xe, 0xb, 0xd, 0xd, 0x8, 0xd, 0xe, 0x7, 0x6, 0xd, 0x7, 0x15, 0xe, - 0xd, 0xe, 0xd, 0xa, 0xa, 0x8, 0xe, 0xc, 0x13, 0xc, 0xc, 0xb, 0x8, 0x7, 0x8, 0xa, - 0xd, 0xb, 0x10, 0xb, 0x9, 0xe, 0xd, 0x7, 0xa, 0x17, 0x14, 0xe, 0xa, 0xb, 0x13, 0xd, - 0xd, 0x9, 0xb, 0x10, 0x10, 0x13, 0x1a, 0x15, 0xc, 0xf, 0xa, 0xa, 0x6, 0x6, 0xa, 0x11, - 0xa, 0xa, 0xf, 0xf, 0xf, 0x6, 0x6, 0xb, 0x22, 0x7, 0x9, 0xa, 0x9, 0xb, 0x6, 0x8, - 0x7, 0xc, 0x7, 0x9, 0x7, 0x11, 0x11, 0x10, 0xf, 0x12, 0x13, 0x12, 0xd, 0xd, 0xd, 0xd, - 0xd, 0xd, 0xb, 0xd, 0xd, 0xd, 0xd, 0x7, 0x7, 0x7, 0x7, 0xe, 0xd, 0xd, 0xd, 0xd, - 0xd, 0xe, 0xe, 0xe, 0xe, 0xb, 0x18, 0x18, 0x15, 0xc, 0x7, 0xc, 0x12, 0x12, 0xf, 0x7, - 0x7, 0x13, 0xf, 0xb, 0x7, 0xc, 0x17, 0x20, 0x13, 0x7, 0x11, 0x11, 0x13, 0xb, 0x7, 0xc, - 0xe, 0x11, 0xf, 0x11, 0xf, 0xf, 0x8, 0x9, 0x9, 0x8, 0x13, 0x13, 0x17, 0x13, 0x12, 0x12, - 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbb, 0x1, 0x90, 0x0, 0x5, 0x0, 0x1, 0x2, 0xbc, - 0x2, 0x8a, 0x0, 0x0, 0x0, 0x8f, 0x2, 0xbc, 0x2, 0x8a, 0x0, 0x0, 0x1, 0xc5, 0x0, 0x32, - 0x1, 0x3, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0x6c, - 0x74, 0x73, 0x0, 0x40, 0x0, 0x20, 0xf0, 0x2, 0x3, 0xe3, 0xfe, 0xd8, 0x0, 0x0, 0x3, 0xe3, - 0x1, 0x28, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x45, 0x66, 0x95, 0x22, - 0x5f, 0xf, 0x3c, 0xf5, 0x0, 0x0, 0x3, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xba, 0x76, 0x9e, 0x49, - 0x0, 0x0, 0x0, 0x0, 0xba, 0x76, 0x9e, 0x49, 0x0, 0x0, 0xfe, 0xd8, 0x5, 0x43, 0x3, 0xe3, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x3, 0xe3, 0xfe, 0xd8, 0x0, 0x0, 0x5, 0x98, 0x0, 0x0, 0xfe, 0x81, 0x5, 0x43, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, - 0x0, 0x1, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x88, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x8, 0x0, 0x40, 0x0, 0xa, 0x0, 0x0, 0x0, 0x85, 0x1, 0x1c, 0x0, 0x1, 0x0, 0x1 -}; - -static unsigned char lacuna_italic[] = -{ - 0x0, 0x1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x30, 0x0, 0x3, 0x0, 0xc0, 0x4f, 0x53, 0x2f, 0x32, - 0x83, 0xa1, 0x3f, 0xd6, 0x0, 0x0, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x4e, 0x63, 0x6d, 0x61, 0x70, - 0xdb, 0xd5, 0x9f, 0x56, 0x0, 0x0, 0x95, 0x18, 0x0, 0x0, 0x4, 0x8e, 0x63, 0x76, 0x74, 0x20, - 0xc7, 0x2b, 0x4d, 0xd, 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x7, 0x5e, 0x66, 0x70, 0x67, 0x6d, - 0x83, 0x33, 0xc2, 0x4f, 0x0, 0x0, 0x3, 0xdc, 0x0, 0x0, 0x0, 0x14, 0x67, 0x6c, 0x79, 0x66, - 0x2e, 0x7c, 0x77, 0x73, 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, 0x80, 0x6c, 0x68, 0x64, 0x6d, 0x78, - 0xea, 0xa6, 0x3, 0xac, 0x0, 0x0, 0xd8, 0x98, 0x0, 0x0, 0xe, 0x88, 0x68, 0x65, 0x61, 0x64, - 0xd8, 0xb7, 0x80, 0x45, 0x0, 0x0, 0xe7, 0x70, 0x0, 0x0, 0x0, 0x36, 0x68, 0x68, 0x65, 0x61, - 0x8, 0xa1, 0x4, 0x4c, 0x0, 0x0, 0xe7, 0xa8, 0x0, 0x0, 0x0, 0x24, 0x68, 0x6d, 0x74, 0x78, - 0xe9, 0xdd, 0x34, 0x2e, 0x0, 0x0, 0x8f, 0x94, 0x0, 0x0, 0x3, 0x94, 0x6b, 0x65, 0x72, 0x6e, - 0x11, 0x41, 0x1d, 0xde, 0x0, 0x0, 0x99, 0xa8, 0x0, 0x0, 0x3e, 0xee, 0x6c, 0x6f, 0x63, 0x61, - 0x0, 0x39, 0xf5, 0x40, 0x0, 0x0, 0x8b, 0xfc, 0x0, 0x0, 0x3, 0x98, 0x6d, 0x61, 0x78, 0x70, - 0x1, 0x9f, 0x2, 0x29, 0x0, 0x0, 0xe7, 0xcc, 0x0, 0x0, 0x0, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0xce, 0x81, 0xe, 0xfe, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x2, 0xdf, 0x70, 0x6f, 0x73, 0x74, - 0x36, 0x4e, 0x78, 0xd4, 0x0, 0x0, 0x93, 0x28, 0x0, 0x0, 0x1, 0xf0, 0x70, 0x72, 0x65, 0x70, - 0x74, 0xbe, 0x1f, 0x5a, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x15, - 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x1f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1a, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0xe, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x56, - 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x1a, 0x0, 0xa6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x50, 0x1, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x0, 0x18, 0x1, 0xc5, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xd, 0x0, 0x5d, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x7, 0x0, 0x84, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x2b, 0x0, 0xc0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xd, - 0x0, 0x99, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x28, 0x1, 0x41, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0xc, 0x1, 0xb9, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, - 0x0, 0x0, 0x0, 0x3e, 0x0, 0x1f, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x1, 0x0, 0x1a, - 0x0, 0x6a, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x2, 0x0, 0xe, 0x0, 0x8b, 0x0, 0x3, - 0x0, 0x1, 0x4, 0x9, 0x0, 0x3, 0x0, 0x56, 0x0, 0xeb, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, - 0x0, 0x4, 0x0, 0x1a, 0x0, 0xa6, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x5, 0x0, 0x50, - 0x1, 0x69, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x6, 0x0, 0x18, 0x1, 0xc5, 0x4c, 0x61, - 0x63, 0x75, 0x6e, 0x61, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x62, 0x79, 0x20, 0x50, - 0x65, 0x74, 0x65, 0x72, 0x20, 0x48, 0x6f, 0x66, 0x66, 0x6d, 0x61, 0x6e, 0x6e, 0x0, 0x4c, 0x0, - 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x20, 0x10, 0x0, 0x20, 0x0, - 0x32, 0x0, 0x30, 0x0, 0x30, 0x0, 0x31, 0x0, 0x20, 0x0, 0x62, 0x0, 0x79, 0x0, 0x20, 0x0, - 0x50, 0x0, 0x65, 0x0, 0x74, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, 0x0, 0x48, 0x0, 0x6f, 0x0, - 0x66, 0x0, 0x66, 0x0, 0x6d, 0x0, 0x61, 0x0, 0x6e, 0x0, 0x6e, 0x4c, 0x61, 0x63, 0x75, 0x6e, - 0x61, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, 0x75, - 0x0, 0x6e, 0x0, 0x61, 0x0, 0x20, 0x0, 0x49, 0x0, 0x74, 0x0, 0x61, 0x0, 0x6c, 0x0, 0x69, - 0x0, 0x63, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, - 0x75, 0x0, 0x6c, 0x0, 0x61, 0x0, 0x72, 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, 0x20, 0x49, 0x74, - 0x61, 0x6c, 0x69, 0x63, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, - 0x0, 0x20, 0x0, 0x49, 0x0, 0x74, 0x0, 0x61, 0x0, 0x6c, 0x0, 0x69, 0x0, 0x63, 0x4d, 0x61, - 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x65, 0x72, 0x20, 0x34, 0x2e, 0x31, 0x2e, 0x32, 0x20, 0x4c, 0x61, 0x63, 0x75, - 0x6e, 0x61, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x4d, 0x0, 0x61, 0x0, 0x63, 0x0, - 0x72, 0x0, 0x6f, 0x0, 0x6d, 0x0, 0x65, 0x0, 0x64, 0x0, 0x69, 0x0, 0x61, 0x0, 0x20, 0x0, - 0x46, 0x0, 0x6f, 0x0, 0x6e, 0x0, 0x74, 0x0, 0x6f, 0x0, 0x67, 0x0, 0x72, 0x0, 0x61, 0x0, - 0x70, 0x0, 0x68, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, 0x0, 0x34, 0x0, 0x2e, 0x0, 0x31, 0x0, - 0x2e, 0x0, 0x32, 0x0, 0x20, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, - 0x61, 0x0, 0x20, 0x0, 0x49, 0x0, 0x74, 0x0, 0x61, 0x0, 0x6c, 0x0, 0x69, 0x0, 0x63, 0x4d, - 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x6f, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x65, 0x72, 0x20, 0x34, 0x2e, 0x31, 0x2e, 0x32, 0x20, 0x31, 0x37, 0x2e, - 0x30, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x33, 0x0, 0x4d, 0x0, 0x61, 0x0, 0x63, 0x0, 0x72, 0x0, - 0x6f, 0x0, 0x6d, 0x0, 0x65, 0x0, 0x64, 0x0, 0x69, 0x0, 0x61, 0x0, 0x20, 0x0, 0x46, 0x0, - 0x6f, 0x0, 0x6e, 0x0, 0x74, 0x0, 0x6f, 0x0, 0x67, 0x0, 0x72, 0x0, 0x61, 0x0, 0x70, 0x0, - 0x68, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, 0x0, 0x34, 0x0, 0x2e, 0x0, 0x31, 0x0, 0x2e, 0x0, - 0x32, 0x0, 0x20, 0x0, 0x31, 0x0, 0x37, 0x0, 0x2e, 0x0, 0x30, 0x0, 0x32, 0x0, 0x2e, 0x0, - 0x32, 0x0, 0x30, 0x0, 0x30, 0x0, 0x33, 0x4c, 0x61, 0x63, 0x75, 0x6e, 0x61, 0x49, 0x74, 0x61, - 0x6c, 0x69, 0x63, 0x0, 0x4c, 0x0, 0x61, 0x0, 0x63, 0x0, 0x75, 0x0, 0x6e, 0x0, 0x61, 0x0, - 0x49, 0x0, 0x74, 0x0, 0x61, 0x0, 0x6c, 0x0, 0x69, 0x0, 0x63, 0x0, 0x40, 0x1, 0x0, 0x2c, - 0x76, 0x45, 0x20, 0xb0, 0x3, 0x25, 0x45, 0x23, 0x61, 0x68, 0x18, 0x23, 0x68, 0x60, 0x44, 0x2d, - 0xfe, 0xe8, 0xff, 0xfb, 0x2, 0x16, 0x3, 0x10, 0x3, 0x32, 0x0, 0x56, 0x0, 0x6b, 0x0, 0x44, - 0x0, 0x4b, 0x0, 0x4a, 0xa5, 0x9b, 0xf5, 0xee, 0xc6, 0x22, 0x10, 0x62, 0x79, 0x2c, 0xe0, 0xdd, - 0x86, 0x27, 0x68, 0x7, 0x9, 0xd7, 0xab, 0x37, 0x78, 0x54, 0x16, 0xf6, 0x92, 0x6b, 0x2c, 0x15, - 0xec, 0xfc, 0xa3, 0x8c, 0x5b, 0x4a, 0x83, 0xfa, 0xb1, 0x93, 0x40, 0x2, 0xd8, 0xe4, 0x5, 0xa2, - 0x29, 0x44, 0xc1, 0xa2, 0x9, 0x9e, 0x2b, 0x7d, 0xde, 0xef, 0x0, 0xca, 0xf, 0x7b, 0xfb, 0xea, - 0x60, 0x89, 0x5d, 0x71, 0xed, 0x10, 0x8e, 0xa7, 0x3f, 0x26, 0x9f, 0x78, 0xc0, 0x4a, 0x30, 0x9a, - 0x1, 0xfa, 0x3, 0x83, 0xe4, 0x23, 0x81, 0xb7, 0x2f, 0x45, 0x8f, 0xe1, 0xa0, 0x97, 0x59, 0x3a, - 0xc4, 0xaa, 0x69, 0x32, 0x75, 0x32, 0x44, 0x3, 0x92, 0x50, 0xef, 0xa5, 0x3e, 0xe9, 0x65, 0xa7, - 0x7, 0x5a, 0xa2, 0x9e, 0xc, 0x8e, 0x2c, 0x5e, 0xcf, 0xbe, 0x5c, 0xdd, 0xb, 0x4d, 0xbe, 0xe0, - 0x30, 0x9c, 0x91, 0x45, 0x9e, 0xf7, 0x47, 0xcd, 0xa8, 0x61, 0xda, 0xe8, 0x6c, 0x8b, 0xe5, 0x6b, - 0x20, 0x2d, 0x45, 0xdf, 0xee, 0x25, 0x2e, 0x18, 0x6d, 0xfb, 0x2, 0x97, 0x8a, 0x9, 0x79, 0x94, - 0xee, 0x62, 0xbc, 0xef, 0x27, 0x9a, 0xc4, 0x5, 0x66, 0xe5, 0xa3, 0xab, 0xc3, 0x47, 0x72, 0xc4, - 0xe0, 0x30, 0xca, 0x7, 0x65, 0xf7, 0x0, 0x85, 0x9a, 0xe, 0x34, 0xa4, 0xe5, 0x6c, 0x86, 0x45, - 0x68, 0xa4, 0x51, 0xff, 0x91, 0xdf, 0x93, 0x7b, 0x7c, 0xe1, 0xe7, 0xc5, 0xbb, 0x7c, 0x48, 0xa, - 0xcb, 0x9f, 0x67, 0x7f, 0xce, 0x11, 0xb3, 0x82, 0x46, 0x2c, 0xc9, 0xbe, 0x77, 0x4a, 0x12, 0xd6, - 0xf3, 0x36, 0x2b, 0x77, 0x47, 0x1b, 0xb7, 0xb1, 0xd1, 0x52, 0x49, 0xe8, 0xf9, 0x30, 0xaf, 0x55, - 0x3c, 0xf0, 0xb0, 0x8c, 0x50, 0x14, 0xb4, 0x95, 0xad, 0x7a, 0x4f, 0xe1, 0xaf, 0xaa, 0xd1, 0x5f, - 0x7d, 0xf0, 0x10, 0x2e, 0x85, 0x5d, 0x75, 0xc0, 0x56, 0x76, 0xe4, 0x17, 0x6c, 0xb2, 0x0, 0x5d, - 0xa8, 0xf6, 0x6d, 0x67, 0xb, 0x57, 0x92, 0xf3, 0x7b, 0x99, 0xe1, 0x7d, 0xba, 0x4, 0x4f, 0x82, - 0xd5, 0x7, 0x66, 0xf7, 0xc1, 0x99, 0xb1, 0xa, 0x47, 0xa4, 0xc7, 0x36, 0x76, 0xc2, 0x1c, 0x4e, - 0xf0, 0x8e, 0xc, 0x8e, 0x3d, 0xbf, 0x9, 0x8c, 0x44, 0xc1, 0x96, 0x5, 0xfd, 0xb, 0x9c, 0xfe, - 0x3a, 0x3a, 0xe4, 0x6a, 0x85, 0xfa, 0x24, 0xda, 0xf4, 0x79, 0x92, 0x11, 0x17, 0x84, 0xa8, 0x30, - 0x68, 0x99, 0x27, 0x93, 0xdf, 0x69, 0x3f, 0xdd, 0x4d, 0xb4, 0xc4, 0x27, 0x5c, 0x87, 0xb9, 0x81, - 0xad, 0x63, 0x45, 0x41, 0x85, 0xf4, 0xa9, 0x9f, 0x46, 0x3e, 0xf4, 0xa5, 0x9e, 0x50, 0xc, 0xfb, - 0xbe, 0xdb, 0x1a, 0x55, 0xb, 0x1d, 0xba, 0xbe, 0x58, 0x7a, 0x82, 0x3b, 0xae, 0xd2, 0x5b, 0x45, - 0x83, 0xb7, 0xf3, 0x87, 0xc3, 0xc7, 0x46, 0x7e, 0xa6, 0xd0, 0xc3, 0xa4, 0x69, 0x36, 0x51, 0xfe, - 0xfe, 0x98, 0x67, 0x9, 0x6, 0xbf, 0xa7, 0x3f, 0x37, 0x3f, 0x6, 0xe, 0x5c, 0x43, 0xa9, 0x90, - 0xe0, 0xf6, 0x27, 0xb8, 0x49, 0x29, 0xec, 0x8b, 0xce, 0xbb, 0x6e, 0x4b, 0x11, 0x8b, 0x82, 0xa8, - 0x4d, 0x42, 0xf8, 0xf7, 0x73, 0x61, 0x53, 0x48, 0xdc, 0xe0, 0x84, 0x3e, 0x6a, 0x6e, 0x18, 0xe7, - 0xaa, 0x96, 0x27, 0x78, 0xe2, 0x3e, 0x83, 0xd0, 0x28, 0x16, 0xf0, 0x27, 0x9c, 0xce, 0x29, 0x71, - 0x81, 0x1e, 0x52, 0x94, 0xf8, 0x3b, 0x66, 0xa6, 0x15, 0x46, 0xf9, 0xb3, 0xb7, 0xd4, 0x3c, 0x43, - 0xdf, 0xf6, 0x25, 0xd8, 0x1b, 0x74, 0xf2, 0xf0, 0x65, 0xd8, 0x54, 0x28, 0xa8, 0x78, 0xe8, 0x1a, - 0x91, 0xfa, 0x31, 0x9f, 0xc6, 0x3a, 0x54, 0xe4, 0xd0, 0x8b, 0x87, 0x35, 0x2a, 0xd8, 0xdb, 0x74, - 0x23, 0x88, 0x12, 0xb9, 0x60, 0x8a, 0xbd, 0xdf, 0x8f, 0x3f, 0xca, 0x71, 0x75, 0xe0, 0x10, 0xc0, - 0xfb, 0x64, 0x9a, 0xf4, 0x3d, 0xd4, 0xed, 0x77, 0x79, 0x1b, 0xc, 0x8e, 0x9f, 0x36, 0x7f, 0x93, - 0x30, 0xa9, 0xa8, 0x77, 0x16, 0xd7, 0x24, 0xbe, 0xbf, 0x21, 0x4b, 0x81, 0x96, 0x87, 0xb6, 0x69, - 0x3c, 0x4f, 0x9c, 0xee, 0xb0, 0x99, 0x3d, 0x38, 0xee, 0xd7, 0x70, 0x4b, 0x1e, 0xd0, 0xbf, 0xa6, - 0x33, 0x66, 0x96, 0x28, 0xb7, 0xc0, 0x21, 0x4b, 0xd4, 0xb1, 0x36, 0x84, 0x5b, 0x6f, 0xd7, 0xe, - 0x37, 0xe2, 0x8, 0x32, 0x58, 0x12, 0xfa, 0x2b, 0xda, 0x9b, 0x7e, 0x6f, 0xe5, 0xfd, 0xc6, 0x49, - 0x69, 0x2f, 0x13, 0xc2, 0xbd, 0x72, 0x53, 0x8a, 0xab, 0x8a, 0x9a, 0xbb, 0xe8, 0x88, 0x25, 0xdd, - 0x77, 0x1, 0x52, 0xf, 0xfd, 0xe2, 0x98, 0xc6, 0x43, 0x66, 0xe2, 0xf6, 0x85, 0xd6, 0x15, 0x75, - 0xf1, 0x15, 0x74, 0x88, 0x7, 0x34, 0xc7, 0x9d, 0x48, 0xaf, 0x30, 0x75, 0x9e, 0xd9, 0xac, 0xb0, - 0x27, 0x23, 0xb3, 0x83, 0x1e, 0x85, 0xe, 0x67, 0xa4, 0x4d, 0x64, 0xf0, 0x8, 0x9b, 0xa5, 0x3a, - 0x15, 0xd3, 0xe5, 0x5f, 0x64, 0xf0, 0x13, 0x6b, 0xa9, 0x1d, 0x6d, 0xc4, 0x20, 0x69, 0xc8, 0x1c, - 0x53, 0xbb, 0xae, 0x63, 0x8f, 0xf, 0x66, 0xbb, 0x18, 0x63, 0x3b, 0x43, 0xf8, 0xec, 0x8e, 0x8b, - 0x1d, 0x2, 0x86, 0xbc, 0x3d, 0x1c, 0x95, 0x1f, 0xcc, 0xbf, 0x3c, 0x8f, 0x70, 0xdf, 0x4a, 0x3f, - 0xc8, 0x5a, 0x63, 0xcd, 0xe3, 0x63, 0x8e, 0x1f, 0x70, 0xbd, 0x8, 0x61, 0xba, 0x4, 0x4e, 0xa3, - 0xdd, 0xb, 0x69, 0x24, 0xf, 0xdc, 0xbd, 0x41, 0x53, 0xef, 0xab, 0xef, 0x9a, 0xde, 0xe9, 0x13, - 0x24, 0x60, 0x77, 0xa6, 0x52, 0xe8, 0xfd, 0x99, 0x9b, 0x5b, 0x43, 0xcb, 0xe2, 0x9b, 0x84, 0x7b, - 0x15, 0x18, 0xf1, 0xb2, 0x77, 0x27, 0x7, 0xd1, 0xc8, 0x38, 0x47, 0x30, 0x30, 0x8e, 0x9e, 0xbe, - 0xad, 0x57, 0x27, 0xc6, 0xbc, 0x28, 0x19, 0x6e, 0xe, 0x0, 0xa4, 0xe6, 0x65, 0x57, 0x9, 0x3e, - 0xa5, 0xa1, 0x15, 0x4c, 0xf8, 0xe2, 0x96, 0xb9, 0x6, 0x4d, 0xbb, 0x8d, 0x1e, 0x83, 0xe, 0x6f, - 0xb9, 0xec, 0x5c, 0xc8, 0xbf, 0x6d, 0xd3, 0x4, 0x5f, 0xb7, 0x80, 0xd6, 0xe1, 0x5b, 0x8e, 0x2b, - 0x29, 0xb9, 0xa3, 0x5a, 0x5b, 0xd0, 0xbc, 0x30, 0xff, 0x69, 0xdf, 0x5b, 0x2f, 0xab, 0x7f, 0xf0, - 0xa0, 0x62, 0xc5, 0x19, 0x6c, 0xba, 0x1, 0x21, 0xb9, 0x89, 0x23, 0xb0, 0x84, 0x12, 0xa1, 0xe6, - 0x4f, 0x74, 0xaf, 0x30, 0xc0, 0xa6, 0x79, 0x4b, 0xe4, 0xfd, 0x89, 0x1, 0x55, 0x1, 0x64, 0x30, - 0xb2, 0x1, 0x8f, 0x56, 0xde, 0xb8, 0x5, 0xf6, 0x27, 0x6b, 0xc2, 0x49, 0x2c, 0xfd, 0x4d, 0x8d, - 0xef, 0x4d, 0xbc, 0xee, 0x2a, 0x9c, 0xde, 0x31, 0x50, 0xaf, 0xb1, 0xa, 0xfe, 0x26, 0x67, 0xfc, - 0x48, 0x50, 0xfa, 0x39, 0x8c, 0xd8, 0x5, 0x3a, 0xc0, 0x7c, 0x65, 0xee, 0xd, 0xd4, 0xce, 0x65, - 0x7c, 0x6, 0xc5, 0x89, 0xb0, 0x2c, 0x4f, 0xfc, 0xdf, 0x6d, 0x7e, 0x3, 0xa0, 0xfe, 0xef, 0x6f, - 0x9b, 0x6, 0x0, 0xbd, 0xfd, 0x1d, 0x42, 0x32, 0x34, 0xb5, 0xc7, 0x2c, 0x40, 0xc6, 0xfb, 0x36, - 0x2b, 0x75, 0x2, 0x59, 0x65, 0xa0, 0xbc, 0xe4, 0x9f, 0x4d, 0xb2, 0x24, 0x2b, 0xc4, 0xd1, 0x8, - 0x5e, 0x3a, 0x1, 0xca, 0xaa, 0x43, 0x49, 0xe0, 0xa2, 0x26, 0xfe, 0x43, 0x8d, 0xe2, 0x16, 0x9a, - 0xbc, 0x6, 0x1e, 0xa4, 0x26, 0x8, 0x82, 0x3d, 0x48, 0xdc, 0xc3, 0x7f, 0x3b, 0x33, 0x52, 0xa8, - 0xce, 0x41, 0x10, 0x9d, 0x21, 0xac, 0x75, 0xfd, 0x43, 0x32, 0x9a, 0x14, 0xf9, 0x1a, 0x60, 0xcf, - 0x6, 0x35, 0xe8, 0x19, 0x89, 0xe9, 0x2b, 0x29, 0xf8, 0x4a, 0x96, 0xe0, 0x13, 0x95, 0xac, 0x3, - 0x6c, 0xee, 0x23, 0x82, 0xdb, 0x58, 0x3, 0xcc, 0x31, 0x85, 0xc0, 0x34, 0x58, 0x96, 0x85, 0x90, - 0xa9, 0x72, 0x41, 0xb0, 0x89, 0x85, 0xa6, 0x6c, 0x42, 0xf, 0xf8, 0xaa, 0x9a, 0x41, 0x8, 0xc8, - 0xa3, 0x2a, 0x66, 0x64, 0x7, 0xc, 0xbe, 0x8f, 0x24, 0x75, 0x86, 0xc8, 0xaa, 0xa3, 0x47, 0x52, - 0x87, 0x75, 0xe8, 0x36, 0x87, 0xc8, 0x21, 0x5a, 0xb8, 0xfd, 0x53, 0x75, 0x83, 0x5d, 0x80, 0xb4, - 0x26, 0xf4, 0x16, 0xc8, 0x67, 0x13, 0xa7, 0x7, 0xc2, 0xb4, 0x64, 0x5d, 0x18, 0xc4, 0x81, 0x26, - 0x2b, 0x5f, 0x8b, 0xcf, 0xae, 0x9b, 0x54, 0x11, 0xb6, 0x9d, 0xd8, 0x7b, 0x40, 0xee, 0xed, 0x9e, - 0x80, 0x5e, 0x5c, 0x5e, 0x6d, 0x6f, 0xbd, 0xba, 0x8d, 0xf6, 0xdb, 0xd6, 0x1, 0x58, 0x28, 0x9, - 0xcf, 0xeb, 0x30, 0x5b, 0x51, 0x2b, 0xf0, 0xeb, 0xa1, 0x88, 0x2e, 0x22, 0xdb, 0xd7, 0x54, 0x41, - 0xb4, 0xa8, 0xfb, 0xc0, 0x63, 0x1e, 0x4b, 0xe, 0xf9, 0xc7, 0x88, 0x76, 0x0, 0x58, 0xcd, 0xde, - 0x62, 0xb0, 0x9, 0x76, 0xd1, 0xcb, 0x7e, 0xb1, 0xf8, 0x18, 0xa8, 0x7, 0x2b, 0xb2, 0xd8, 0x5d, - 0x52, 0xbd, 0xb7, 0xf3, 0xd7, 0x7f, 0x4e, 0x1c, 0xf5, 0xd8, 0xd6, 0xb5, 0x24, 0xf5, 0x78, 0xc7, - 0x59, 0xf8, 0xf5, 0x69, 0x6d, 0x13, 0x2, 0xb5, 0xa9, 0x3a, 0x71, 0xde, 0xb, 0x3e, 0xad, 0x5b, - 0x5d, 0xca, 0xe6, 0x2c, 0x54, 0x5e, 0x39, 0xfa, 0xdf, 0x6c, 0x1f, 0x70, 0x2e, 0x41, 0x60, 0x94, - 0xb0, 0xe4, 0x87, 0x28, 0xc2, 0x66, 0x6d, 0x1b, 0x8, 0xd9, 0xf3, 0x4d, 0x92, 0x1d, 0x35, 0xfd, - 0xe6, 0x9e, 0x61, 0xc, 0x4, 0xa1, 0x97, 0x5f, 0x77, 0xba, 0x38, 0xb6, 0xa0, 0xc, 0xe, 0x20, - 0x3c, 0xa9, 0xb7, 0x48, 0x43, 0xaa, 0x8e, 0xec, 0xbf, 0x9e, 0x34, 0x64, 0x94, 0xd4, 0xb5, 0x87, - 0x43, 0x29, 0xca, 0x95, 0x5e, 0xb0, 0x38, 0x4f, 0xaa, 0xce, 0x41, 0x30, 0x80, 0x7e, 0xa5, 0xa, - 0x50, 0x91, 0xc6, 0x6f, 0x28, 0xc3, 0x49, 0xb8, 0xff, 0x50, 0x9e, 0x8c, 0x4d, 0xec, 0xbf, 0xdc, - 0xf0, 0x2d, 0xd0, 0x2f, 0x69, 0x8f, 0xd9, 0xaa, 0xae, 0x51, 0x3c, 0xb9, 0x88, 0xd6, 0x6f, 0x4e, - 0x2, 0xef, 0xb2, 0x81, 0x4b, 0x5d, 0x7a, 0x6c, 0x4c, 0xbb, 0x9c, 0xf1, 0xea, 0xd5, 0x36, 0x5b, - 0x59, 0xe, 0xfc, 0xea, 0xdf, 0x5a, 0x7e, 0x2a, 0xe1, 0xea, 0xb2, 0x89, 0x5d, 0x21, 0xe8, 0xd4, - 0x63, 0x40, 0xa3, 0xa9, 0xec, 0xc3, 0x94, 0x19, 0x7a, 0xd, 0x8, 0xc4, 0x9b, 0x77, 0x17, 0x57, - 0xf2, 0xd1, 0x93, 0xb3, 0x18, 0x71, 0xc0, 0xc6, 0x72, 0xad, 0x16, 0x7e, 0xb9, 0xee, 0x4a, 0xc3, - 0xef, 0x74, 0x80, 0xe1, 0x17, 0x81, 0xc9, 0x5, 0x60, 0xb6, 0x53, 0x1d, 0xdd, 0x32, 0x95, 0xa5, - 0x35, 0x50, 0x83, 0xba, 0xdb, 0xd9, 0x35, 0x3d, 0x74, 0x4, 0x4f, 0x43, 0x82, 0x92, 0xeb, 0xc4, - 0x5e, 0x61, 0x30, 0x1a, 0xec, 0x9b, 0x88, 0x4b, 0x3e, 0xe3, 0xdf, 0x92, 0x52, 0x74, 0xbd, 0x54, - 0x86, 0xf5, 0x6f, 0x94, 0x4, 0x2f, 0x94, 0xaa, 0x55, 0x34, 0x64, 0x5, 0xb6, 0x50, 0x86, 0xa8, - 0xd0, 0xec, 0x39, 0xa2, 0x23, 0x57, 0xc6, 0x9d, 0x28, 0xb1, 0x48, 0x41, 0xeb, 0x81, 0xb8, 0xa2, - 0x57, 0x48, 0xd2, 0xfd, 0x6c, 0x9b, 0xad, 0x46, 0xe2, 0xfa, 0x9b, 0xc0, 0x44, 0x64, 0xf6, 0xed, - 0x80, 0x8c, 0x19, 0x6e, 0xc4, 0x28, 0x69, 0xda, 0x2, 0x18, 0xca, 0x8, 0x62, 0xd5, 0x20, 0x74, - 0xa8, 0x5, 0x19, 0xa0, 0x16, 0x53, 0xba, 0xfa, 0x21, 0xdc, 0x83, 0x52, 0xa4, 0x1e, 0x53, 0xbd, - 0xc1, 0x7b, 0x29, 0xd2, 0xa, 0x68, 0x3f, 0x13, 0x9f, 0xb2, 0x93, 0x14, 0x73, 0x30, 0x16, 0x98, - 0x9f, 0xaa, 0x4f, 0x25, 0xfb, 0x99, 0x32, 0xe0, 0xc, 0x26, 0x6e, 0x46, 0x5f, 0x77, 0xaf, 0x42, - 0xff, 0x9e, 0xc9, 0xfe, 0x10, 0xb0, 0x3a, 0x21, 0xd9, 0x83, 0x1, 0xa3, 0x23, 0x33, 0xc2, 0x93, - 0x57, 0xb0, 0x30, 0x5a, 0xb5, 0xcf, 0x46, 0x69, 0x86, 0x50, 0x89, 0xe8, 0x71, 0x36, 0x5d, 0x16, - 0xef, 0xff, 0x79, 0x9e, 0xf2, 0x40, 0xdf, 0xc6, 0x70, 0xa8, 0xfb, 0xe, 0x23, 0x29, 0x42, 0xd9, - 0xe9, 0x48, 0x90, 0xf8, 0x36, 0xd1, 0xfe, 0x5d, 0x61, 0xf1, 0xb, 0x6a, 0xeb, 0x49, 0xa5, 0xfe, - 0x4e, 0x69, 0xcd, 0xc, 0x2b, 0xee, 0x2, 0xba, 0xd6, 0x62, 0x9f, 0x3, 0x73, 0xaf, 0xe5, 0x4e, - 0x87, 0xf4, 0x47, 0x9d, 0xfb, 0x7d, 0x9a, 0x5d, 0x28, 0xef, 0xb0, 0x6b, 0x57, 0x1e, 0xf6, 0x92, - 0x92, 0x72, 0xb, 0x14, 0xf3, 0x91, 0x9a, 0x55, 0x7, 0xe7, 0xa6, 0x66, 0x42, 0x1, 0xc5, 0xbf, - 0x7b, 0x53, 0x5b, 0xff, 0xe2, 0x8f, 0x70, 0x9, 0x1b, 0xb6, 0xb9, 0x18, 0x2, 0x37, 0xf6, 0xb7, - 0x98, 0x45, 0x7, 0xdd, 0xa1, 0x72, 0x5f, 0xa2, 0x9f, 0xba, 0xae, 0x8b, 0xe0, 0xde, 0x31, 0x12, - 0x7, 0x72, 0x42, 0x3c, 0xed, 0xad, 0x8b, 0x17, 0x73, 0x37, 0x12, 0xc7, 0xb4, 0x7, 0x65, 0x24, - 0xe1, 0xc6, 0x87, 0x7b, 0x17, 0xe5, 0xf7, 0xcc, 0xb7, 0x7c, 0x20, 0xba, 0x8e, 0xea, 0xbd, 0x63, - 0x37, 0x12, 0xc3, 0xf4, 0xe, 0xb2, 0x3e, 0x54, 0xb4, 0x92, 0x14, 0xae, 0x34, 0x4d, 0xc3, 0xff, - 0x4a, 0xdf, 0xc4, 0x6b, 0xb7, 0xff, 0x5e, 0x9c, 0x81, 0x47, 0x8f, 0xe8, 0x7b, 0x9f, 0xe7, 0x3a, - 0xdd, 0xe4, 0x6d, 0x85, 0xd, 0x30, 0xbf, 0xdb, 0x60, 0x36, 0x40, 0x7a, 0xb0, 0x4a, 0x81, 0x8a, - 0x83, 0xb3, 0x64, 0x13, 0x1, 0xe7, 0xaf, 0x75, 0xf, 0x31, 0x20, 0xa7, 0xd9, 0x4a, 0x44, 0xfa, - 0xe9, 0x2, 0xf5, 0x2, 0xb9, 0x63, 0x22, 0x16, 0xca, 0xb9, 0x33, 0x14, 0x13, 0x54, 0x63, 0xa8, - 0xb2, 0xe8, 0xd6, 0x91, 0x37, 0x31, 0x52, 0xc5, 0xf8, 0x57, 0x22, 0xdf, 0x4d, 0xb9, 0xf4, 0x28, - 0x99, 0xdc, 0x34, 0x20, 0xc8, 0x20, 0x80, 0x41, 0x60, 0xf1, 0xf9, 0xd1, 0x8e, 0x63, 0xf, 0xea, - 0xa3, 0x9f, 0x1c, 0x2b, 0x33, 0xf3, 0xb2, 0x9c, 0x30, 0x4c, 0x0, 0x10, 0x3, 0xa5, 0x0, 0x0, - 0x40, 0xd, 0x9, 0x9, 0x4, 0x4, 0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x0, 0x0, 0x1, 0x8d, - 0xb8, 0x1, 0xff, 0x85, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, - 0x45, 0x68, 0x44, 0x45, 0x68, 0x44, 0xb3, 0x6, 0x5, 0x46, 0x0, 0x2b, 0xb3, 0x8, 0x7, 0x46, - 0x0, 0x2b, 0xb1, 0x5, 0x5, 0x45, 0x68, 0x44, 0xb1, 0x7, 0x7, 0x45, 0x68, 0x44, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x3f, 0x0, 0x0, 0x1, 0xb6, 0x3, 0x20, 0x0, 0x3, 0x0, 0x7, 0x0, 0x56, - 0x40, 0x20, 0x1, 0x8, 0x8, 0x40, 0x9, 0x2, 0x7, 0x4, 0x5, 0x1, 0x0, 0x6, 0x5, 0x5, - 0x3, 0x2, 0x5, 0x4, 0x7, 0x0, 0x7, 0x6, 0x7, 0x1, 0x2, 0x1, 0x3, 0x0, 0x1, 0x1, - 0x0, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x0, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x33, 0x11, 0x21, 0x11, 0x25, 0x33, 0x11, 0x23, 0x3f, 0x1, - 0x77, 0xfe, 0xc7, 0xfa, 0xfa, 0x3, 0x20, 0xfc, 0xe0, 0x3f, 0x2, 0xa3, 0x0, 0x2, 0x0, 0x70, - 0xff, 0xf2, 0x1, 0x49, 0x3, 0xc, 0x0, 0x3, 0x0, 0xf, 0x0, 0x45, 0x40, 0x16, 0x1, 0x10, - 0x10, 0x40, 0x11, 0x0, 0x2, 0x1, 0xa, 0x4, 0x2, 0x0, 0xd, 0x8, 0x7, 0x7, 0x3, 0x0, - 0x3, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x3, 0x23, 0x1b, 0x1, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, - 0x16, 0x1, 0x49, 0x5c, 0x47, 0x3f, 0x10, 0x4, 0x28, 0x1a, 0x1c, 0x23, 0x4, 0x3, 0x28, 0x1b, - 0x1b, 0x23, 0x3, 0xc, 0xfd, 0xc8, 0x2, 0x38, 0xfd, 0x27, 0x1b, 0x26, 0x26, 0x1b, 0x1b, 0x25, - 0x26, 0x0, 0x0, 0x2, 0x0, 0x5, 0x2, 0x53, 0x1, 0x1f, 0x3, 0x32, 0x0, 0x3, 0x0, 0x7, - 0x0, 0x46, 0x40, 0x18, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x7, 0x4, 0x3, 0x0, 0x6, 0x5, - 0x2, 0x3, 0x1, 0x7, 0x4, 0x3, 0x3, 0x0, 0x4, 0x1, 0x7, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x27, 0x23, 0x7, 0x23, 0x27, - 0x1, 0x1f, 0x16, 0x33, 0x13, 0x62, 0x16, 0x33, 0x13, 0x3, 0x32, 0xdf, 0xdf, 0xdf, 0xdf, 0x0, - 0x0, 0x2, 0x0, 0x3c, 0x0, 0x0, 0x2, 0x84, 0x3, 0x56, 0x0, 0x1b, 0x0, 0x1f, 0x0, 0x90, - 0x40, 0x46, 0x1, 0x20, 0x20, 0x40, 0x21, 0x0, 0x1e, 0x1c, 0x1b, 0x1a, 0x19, 0x16, 0x15, 0x12, - 0x11, 0x10, 0xe, 0xd, 0xc, 0xb, 0x8, 0x7, 0x4, 0x3, 0x2, 0x0, 0x1d, 0x1c, 0x11, 0x10, - 0x1, 0x5, 0x0, 0x7, 0x1b, 0x1a, 0x17, 0x16, 0x13, 0x5, 0x12, 0x1f, 0x1e, 0xf, 0xe, 0x3, - 0x5, 0x2, 0x7, 0xd, 0xc, 0x9, 0x8, 0x5, 0x5, 0x4, 0x19, 0x18, 0x15, 0x3, 0x14, 0xb, - 0xa, 0x7, 0x3, 0x6, 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x2f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x20, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x20, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x23, 0x7, 0x33, 0x15, 0x23, 0x3, 0x23, 0x13, 0x23, 0x3, 0x23, 0x13, 0x23, 0x35, 0x33, - 0x37, 0x23, 0x35, 0x33, 0x13, 0x33, 0x3, 0x33, 0x13, 0x33, 0x3, 0x33, 0x7, 0x23, 0x7, 0x33, - 0x2, 0x84, 0x6f, 0x14, 0x68, 0x71, 0x29, 0x45, 0x29, 0xcd, 0x29, 0x45, 0x29, 0x65, 0x6e, 0x14, - 0x68, 0x71, 0x29, 0x45, 0x29, 0xcd, 0x29, 0x45, 0x29, 0x66, 0xb4, 0xcd, 0x14, 0xcd, 0x1, 0xf0, - 0x8b, 0x40, 0xfe, 0xdb, 0x1, 0x25, 0xfe, 0xdb, 0x1, 0x25, 0x40, 0x8b, 0x40, 0x1, 0x26, 0xfe, - 0xda, 0x1, 0x26, 0xfe, 0xda, 0x40, 0x8b, 0x0, 0x0, 0x3, 0x0, 0x56, 0xff, 0x89, 0x2, 0x85, - 0x3, 0x8a, 0x0, 0x29, 0x0, 0x2d, 0x0, 0x31, 0x0, 0x5b, 0x40, 0x21, 0x1, 0x32, 0x32, 0x40, - 0x33, 0x0, 0x2e, 0x2c, 0x18, 0x16, 0x3, 0x1, 0x30, 0x2e, 0x2c, 0x2a, 0x24, 0x1c, 0x15, 0xd, - 0x7, 0x0, 0x2d, 0x2a, 0x30, 0x2f, 0x28, 0x3, 0x11, 0x1, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x15, 0x0, 0x32, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x32, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x17, 0x16, - 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x27, - 0xf, 0x1, 0x37, 0x3, 0x7, 0x23, 0x37, 0x2, 0x85, 0x26, 0x59, 0x5c, 0x3b, 0x2b, 0x36, 0x6, - 0x5, 0x39, 0x15, 0x54, 0xb0, 0x57, 0x4b, 0x6e, 0x46, 0x4c, 0x39, 0x24, 0x31, 0x57, 0x68, 0x9f, - 0x10, 0x1, 0x32, 0x17, 0x4e, 0x55, 0x22, 0x48, 0x7, 0x9, 0x54, 0x45, 0x62, 0x66, 0x54, 0x14, - 0x44, 0x15, 0x2c, 0x13, 0x44, 0x13, 0x2, 0xd6, 0x44, 0x37, 0x17, 0x1d, 0x3a, 0x31, 0x32, 0x12, - 0x36, 0x72, 0x70, 0x6a, 0x3a, 0x32, 0x1d, 0x15, 0x1b, 0x3f, 0x40, 0x77, 0x8, 0x9, 0x35, 0x2e, - 0x15, 0x31, 0x36, 0x21, 0x45, 0x4a, 0x5e, 0x32, 0x29, 0x76, 0x9b, 0x2, 0x9d, 0xfc, 0x91, 0x92, - 0x90, 0x0, 0x0, 0x5, 0x0, 0x3c, 0xff, 0xec, 0x3, 0x18, 0x3, 0x4e, 0x0, 0xb, 0x0, 0xf, - 0x0, 0x1b, 0x0, 0x27, 0x0, 0x33, 0x0, 0x5d, 0x40, 0x22, 0x1, 0x34, 0x34, 0x40, 0x35, 0x19, - 0x2b, 0x25, 0x1f, 0x16, 0x6, 0x0, 0x2e, 0x28, 0x22, 0x1c, 0x19, 0x13, 0xe, 0xc, 0x9, 0x3, - 0x31, 0x7, 0x10, 0xf, 0xc, 0xe, 0xd, 0x10, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x3, 0x0, 0x34, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x34, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x6, 0x9, 0x1, 0x23, 0x1, 0x3, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x6, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x26, - 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xe2, 0x46, 0x60, 0x79, 0x51, 0x46, 0x5c, - 0x74, 0x1, 0xd3, 0xfd, 0x85, 0x4f, 0x2, 0x7b, 0x66, 0x45, 0x61, 0x79, 0x52, 0x45, 0x5c, 0x74, - 0xfe, 0xbd, 0x35, 0x2b, 0x36, 0x47, 0x34, 0x2a, 0x37, 0x48, 0x1, 0x70, 0x34, 0x2c, 0x36, 0x47, - 0x34, 0x2b, 0x36, 0x48, 0x1, 0xe4, 0x5a, 0x43, 0x51, 0x78, 0x57, 0x43, 0x52, 0x7a, 0x1, 0x6a, - 0xfc, 0x9e, 0x3, 0x62, 0xfc, 0xb0, 0x59, 0x43, 0x52, 0x78, 0x57, 0x43, 0x52, 0x7a, 0x2, 0xac, - 0x2b, 0x33, 0x4d, 0x36, 0x2b, 0x33, 0x4d, 0xfe, 0x50, 0x2a, 0x34, 0x4e, 0x36, 0x2a, 0x33, 0x4c, - 0x0, 0x2, 0x0, 0x64, 0xff, 0xd8, 0x3, 0xa5, 0x2, 0x9d, 0x0, 0x22, 0x0, 0x2b, 0x0, 0x5f, - 0x40, 0x23, 0x1, 0x2c, 0x2c, 0x40, 0x2d, 0x1c, 0x2b, 0x25, 0x1e, 0x1d, 0x1a, 0x19, 0x13, 0xb, - 0x29, 0x23, 0x20, 0x1e, 0x1c, 0x1a, 0x17, 0x10, 0xf, 0x8, 0xf, 0xe, 0x4, 0x1c, 0x1b, 0x2, - 0xd, 0x2, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x2f, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x2c, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2c, 0xff, 0xc0, 0x38, 0x59, 0x25, - 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x1, - 0x1e, 0x1, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x23, 0x37, 0x21, 0x7, 0x23, 0x16, 0x15, - 0x14, 0x6, 0x1, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x2, 0xae, 0x37, 0x36, 0x43, - 0x61, 0x75, 0x5f, 0x65, 0xa9, 0x7a, 0x3d, 0x30, 0x60, 0x58, 0xfe, 0x4e, 0x13, 0x66, 0x34, 0x6b, - 0x4e, 0x6f, 0xa, 0x3c, 0x8, 0x1, 0x14, 0x8, 0x87, 0x8, 0x3e, 0xfe, 0xe9, 0x17, 0x1e, 0x6d, - 0x40, 0x33, 0x18, 0x4c, 0x3b, 0x1a, 0x1f, 0x53, 0x58, 0x7a, 0x7f, 0xb3, 0x14, 0x82, 0xfd, 0xcc, - 0x1e, 0x2c, 0x4c, 0x6e, 0xa5, 0x2d, 0x27, 0x40, 0x40, 0x27, 0x2b, 0x57, 0xa9, 0x1, 0x60, 0x8, - 0x56, 0x45, 0x4c, 0x35, 0x2d, 0x0, 0x0, 0x1, 0x0, 0x78, 0x2, 0x53, 0x0, 0xd4, 0x3, 0x32, - 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x0, 0x2, 0x1, - 0x3, 0x0, 0x4, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, - 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0x4, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x7, - 0x23, 0x27, 0xd4, 0x16, 0x33, 0x13, 0x3, 0x32, 0xdf, 0xdf, 0x0, 0x1, 0x0, 0x3c, 0xff, 0x26, - 0x1, 0x53, 0x3, 0x47, 0x0, 0x11, 0x0, 0x39, 0x40, 0xf, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, - 0xb, 0x8, 0x6, 0x0, 0x11, 0x9, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x12, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x6, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x7, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x37, 0x36, 0x37, 0x1, 0x53, 0x49, 0x1d, 0x3f, 0x18, 0x9, 0x41, 0x40, 0x52, 0x8, 0x17, 0x4a, - 0x29, 0x4b, 0x3, 0x22, 0x71, 0x3f, 0x89, 0xaf, 0x3f, 0x43, 0xc3, 0xaf, 0x20, 0xc4, 0xde, 0x43, - 0x40, 0xad, 0x95, 0x52, 0x68, 0x0, 0x0, 0x1, 0x0, 0x3c, 0xff, 0x26, 0x1, 0x53, 0x3, 0x47, - 0x0, 0x11, 0x0, 0x39, 0x40, 0xf, 0x1, 0x12, 0x12, 0x40, 0x13, 0x10, 0x10, 0xd, 0xb, 0x5, - 0xe, 0x4, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, - 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x15, 0x14, 0x1, - 0x4b, 0x17, 0x4a, 0x28, 0x4c, 0x3a, 0x49, 0x1e, 0x3e, 0x18, 0x9, 0x41, 0x40, 0x52, 0x1, 0x21, - 0xac, 0x95, 0x53, 0x67, 0x25, 0x70, 0x40, 0x88, 0xb0, 0x3f, 0x43, 0xc3, 0xaf, 0x20, 0xc4, 0xdf, - 0x42, 0x0, 0x0, 0x1, 0x0, 0x5f, 0x1, 0xc3, 0x1, 0xca, 0x3, 0x31, 0x0, 0x11, 0x0, 0x5a, - 0x40, 0x20, 0x1, 0x12, 0x12, 0x40, 0x13, 0x0, 0x11, 0x10, 0xd, 0xc, 0x8, 0x7, 0x4, 0x3, - 0x10, 0xf, 0xb, 0xa, 0x9, 0x7, 0x6, 0x2, 0x1, 0x0, 0x6, 0x5, 0xf, 0xe, 0x4, 0x1, - 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x17, 0x7, 0x27, 0x7, - 0x23, 0x37, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x33, 0x7, 0x37, 0x1, 0xca, 0x7b, 0x66, - 0x1f, 0x6a, 0x15, 0x37, 0xf, 0x7c, 0x14, 0x78, 0x66, 0x20, 0x6c, 0x15, 0x34, 0xc, 0x7c, 0x2, - 0xbe, 0x48, 0x44, 0x2b, 0x3e, 0x82, 0x82, 0x3b, 0x2d, 0x43, 0x44, 0x2c, 0x3f, 0x86, 0x86, 0x42, - 0x0, 0x1, 0x0, 0x3c, 0x0, 0x52, 0x1, 0xbb, 0x1, 0xc4, 0x0, 0xb, 0x0, 0x51, 0x40, 0x1b, - 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xb, 0x8, 0x7, 0x6, 0x5, 0x2, 0x1, 0x0, 0xb, 0xa, - 0x6, 0x5, 0x4, 0x0, 0xa, 0x9, 0x4, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x7, 0x23, 0x7, 0x23, 0x37, 0x23, 0x37, 0x33, 0x37, 0x33, 0x7, 0x1, 0xbb, 0x9, 0x99, 0x15, - 0x44, 0x15, 0x99, 0x9, 0x99, 0x15, 0x44, 0x15, 0x1, 0x2b, 0x40, 0x99, 0x99, 0x40, 0x99, 0x99, - 0x0, 0x1, 0x0, 0x5c, 0xff, 0x8e, 0x0, 0xdf, 0x0, 0x76, 0x0, 0xf, 0x0, 0x39, 0x40, 0xf, - 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xa, 0x6, 0x3, 0x0, 0xd, 0x2, 0x1, 0xa, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x14, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, - 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0xdf, 0x64, 0x16, 0xe, 0x24, 0x8, 0x33, 0x3, 0x2, - 0x26, 0x1b, 0x1a, 0x23, 0x31, 0x51, 0x52, 0x14, 0xb, 0x39, 0xf, 0x9, 0x1, 0x7, 0x35, 0x1a, - 0x21, 0x29, 0x0, 0x1, 0x0, 0x3c, 0x0, 0xf5, 0x1, 0x15, 0x1, 0x35, 0x0, 0x3, 0x0, 0x39, - 0x40, 0xf, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, 0x1, 0x2, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x1, 0x15, 0x9, - 0xd0, 0x9, 0x1, 0x35, 0x40, 0x40, 0x0, 0x1, 0x0, 0x39, 0xff, 0xf3, 0x0, 0xc1, 0x0, 0x74, - 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x6, 0x0, 0x9, 0x3, - 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x37, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, - 0x3e, 0x1, 0x33, 0x32, 0x16, 0xbd, 0x4, 0x27, 0x1a, 0x1b, 0x24, 0x4, 0x3, 0x27, 0x1b, 0x1b, - 0x24, 0x31, 0x1a, 0x24, 0x28, 0x1a, 0x1b, 0x24, 0x28, 0x0, 0x0, 0x1, 0x0, 0x3c, 0x0, 0x0, - 0x2, 0x10, 0x3, 0x56, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, - 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, - 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, - 0x38, 0x59, 0x9, 0x1, 0x23, 0x1, 0x2, 0x10, 0xfe, 0x7b, 0x4f, 0x1, 0x85, 0x3, 0x56, 0xfc, - 0xaa, 0x3, 0x56, 0x0, 0x0, 0x2, 0x0, 0x46, 0xff, 0xf2, 0x2, 0x4b, 0x2, 0x40, 0x0, 0x13, - 0x0, 0x23, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x24, 0x24, 0x40, 0x25, 0x12, 0x20, 0x18, 0x1e, 0x16, - 0x12, 0x8, 0xe, 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x24, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, - 0x14, 0x33, 0x32, 0x37, 0x36, 0x2, 0x47, 0x14, 0x5c, 0x4d, 0x64, 0x57, 0x3e, 0x4b, 0x4, 0x14, - 0x5d, 0x4d, 0x64, 0x5a, 0x3d, 0x48, 0x5a, 0x4, 0x8f, 0x5f, 0x35, 0x26, 0xc, 0x4, 0x8e, 0x5f, - 0x36, 0x26, 0x1, 0x19, 0x97, 0x4f, 0x41, 0x35, 0x41, 0x79, 0x1b, 0x1d, 0x97, 0x4f, 0x41, 0x34, - 0x3f, 0x79, 0x1c, 0x1f, 0x1b, 0x19, 0xac, 0x50, 0x39, 0x57, 0x1c, 0x1b, 0xa9, 0x50, 0x39, 0x0, - 0x0, 0x1, 0x0, 0x46, 0x0, 0x0, 0x1, 0xa5, 0x2, 0x3a, 0x0, 0xa, 0x0, 0x4e, 0x40, 0x1a, - 0x1, 0xb, 0xb, 0x40, 0xc, 0x0, 0xa, 0x6, 0x5, 0x4, 0x3, 0x0, 0xa, 0x9, 0x7, 0x5, - 0x2, 0x0, 0x9, 0x8, 0x2, 0x1, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0xb, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xb, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x7, 0x21, 0x37, - 0x33, 0x13, 0x7, 0x27, 0x37, 0x33, 0x3, 0x1, 0xa5, 0xa, 0xfe, 0xab, 0xa, 0x7b, 0x36, 0x7a, - 0x17, 0xa5, 0x52, 0x43, 0x48, 0x48, 0x48, 0x1, 0x9b, 0x2c, 0x3a, 0x49, 0xfe, 0xe, 0x0, 0x1, - 0x0, 0x46, 0x0, 0x0, 0x2, 0x19, 0x2, 0x41, 0x0, 0x1a, 0x0, 0x4b, 0x40, 0x19, 0x1, 0x1b, - 0x1b, 0x40, 0x1c, 0x19, 0x12, 0x4, 0x3, 0x19, 0x13, 0xe, 0x6, 0x4, 0x3, 0x10, 0x7, 0x15, - 0x15, 0x6, 0x5, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x10, - 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x6, 0x0, 0x1b, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x1b, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0xf, 0x1, 0x21, 0x7, 0x21, 0x3f, 0x1, - 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x14, 0x2, 0x17, 0xd, 0x97, 0xb2, 0x1, 0x37, 0xa, 0xfe, 0x58, 0xb, 0xe7, 0x41, 0x1a, - 0x2a, 0x6, 0x1, 0x6e, 0x54, 0x4d, 0x2c, 0x5d, 0x75, 0x5b, 0x33, 0x30, 0x1, 0x8a, 0x65, 0x65, - 0x78, 0x48, 0x4e, 0xa1, 0x2d, 0x1a, 0x2a, 0x2c, 0xa, 0x9, 0x5b, 0x4e, 0x31, 0x64, 0x2c, 0x2a, - 0x46, 0xd, 0x0, 0x1, 0x0, 0x46, 0xff, 0x1d, 0x2, 0x3e, 0x2, 0x41, 0x0, 0x2e, 0x0, 0x50, - 0x40, 0x1b, 0x1, 0x2f, 0x2f, 0x40, 0x30, 0x0, 0x28, 0x1e, 0x1d, 0x13, 0xf, 0x29, 0x21, 0x1c, - 0x19, 0xe, 0x6, 0x2, 0x0, 0x24, 0x7, 0x2b, 0x2b, 0xa, 0x1, 0xe, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xe, 0x0, 0x2f, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2f, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x6, 0x7, 0x16, 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, - 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x1, 0x37, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x2, - 0x36, 0xf, 0x7b, 0x28, 0x1a, 0x1e, 0x40, 0x43, 0x6a, 0x4d, 0x41, 0x33, 0x18, 0x37, 0x15, 0x29, - 0x2f, 0x2b, 0x3a, 0x2b, 0x30, 0x9, 0x3, 0x7e, 0x38, 0xa, 0x33, 0x48, 0x5e, 0x40, 0x33, 0x27, - 0x2e, 0x27, 0x1a, 0x2f, 0x58, 0x70, 0x60, 0x37, 0x34, 0x1, 0x81, 0x90, 0x2c, 0x13, 0x28, 0x2f, - 0x3f, 0x6b, 0x48, 0x4c, 0x25, 0x1d, 0x25, 0x31, 0x1e, 0x18, 0x1b, 0x25, 0x28, 0x48, 0x12, 0x10, - 0x81, 0x3, 0x2, 0x4b, 0x5c, 0x48, 0x30, 0x3a, 0x17, 0x14, 0x1a, 0x2f, 0x5d, 0x3a, 0x36, 0x0, - 0x0, 0x1, 0x0, 0x46, 0xff, 0x18, 0x2, 0x32, 0x2, 0x32, 0x0, 0xe, 0x0, 0x5d, 0x40, 0x24, - 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0xd, 0xc, 0xe, 0xd, 0xa, 0x9, 0x6, 0x5, 0x4, 0x0, - 0xe, 0xb, 0xa, 0x3, 0x0, 0x8, 0x1, 0x9, 0x8, 0x4, 0x3, 0x6, 0x5, 0x2, 0x3, 0x1, - 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, - 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x7, 0x23, 0x7, 0x23, - 0x37, 0x21, 0x37, 0x1, 0x33, 0x1, 0x33, 0x37, 0x33, 0x7, 0x2, 0x32, 0xa, 0x5b, 0x23, 0x54, - 0x1f, 0xfe, 0xd1, 0x7, 0x1, 0x44, 0x5c, 0xfe, 0xd0, 0xc4, 0x21, 0x58, 0x23, 0x49, 0x49, 0xe8, - 0xe8, 0x32, 0x2, 0x0, 0xfe, 0x17, 0xed, 0xed, 0x0, 0x1, 0x0, 0x46, 0xff, 0x1d, 0x2, 0x10, - 0x2, 0x34, 0x0, 0x20, 0x0, 0x55, 0x40, 0x1e, 0x1, 0x21, 0x21, 0x40, 0x22, 0x0, 0x1f, 0x1e, - 0x14, 0x12, 0x3, 0x1f, 0x1a, 0x11, 0x9, 0x3, 0x0, 0x2, 0x1, 0x8, 0x0, 0x1c, 0x8, 0x5, - 0x20, 0x0, 0xf, 0x1, 0x11, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x2f, 0xfd, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x11, 0x0, 0x21, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x7, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x13, 0x2, 0x10, 0xa, 0xf4, - 0x20, 0x2d, 0x2b, 0x5b, 0x2f, 0x27, 0x3, 0xe, 0x35, 0x41, 0x6e, 0x76, 0x4a, 0x39, 0x3a, 0x4a, - 0x44, 0x29, 0x25, 0xb, 0x4, 0x6f, 0x34, 0x31, 0x40, 0x35, 0x2, 0x34, 0x4a, 0xe0, 0x16, 0x42, - 0x37, 0x56, 0x15, 0x16, 0x6f, 0x45, 0x55, 0x67, 0x2c, 0x4c, 0x36, 0x30, 0x53, 0x1b, 0x18, 0x88, - 0x20, 0x1, 0x7c, 0x0, 0x0, 0x2, 0x0, 0x46, 0xff, 0xf8, 0x2, 0x16, 0x2, 0xf1, 0x0, 0x1a, - 0x0, 0x29, 0x0, 0x4a, 0x40, 0x18, 0x1, 0x2a, 0x2a, 0x40, 0x2b, 0xe, 0x26, 0x1f, 0x17, 0x15, - 0x11, 0xf, 0x23, 0x1b, 0x15, 0xe, 0x6, 0x0, 0xc, 0x2, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x2a, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, - 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, - 0x22, 0x7, 0x6, 0x7, 0x36, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x27, 0x26, 0x7, - 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0xe, 0xe, 0xdf, 0x4a, 0x3a, 0x57, 0x4, - 0x19, 0x5d, 0x58, 0x75, 0x54, 0x35, 0x2a, 0x22, 0x45, 0x45, 0x41, 0x47, 0x12, 0x39, 0x65, 0x48, - 0x39, 0x50, 0x5f, 0x1a, 0x21, 0x43, 0x4e, 0x2d, 0x29, 0x4b, 0x45, 0x4a, 0x26, 0x22, 0xed, 0xf5, - 0x2d, 0x44, 0x95, 0x21, 0x25, 0xc9, 0x75, 0x6f, 0x38, 0x34, 0x28, 0x4a, 0x50, 0x77, 0x41, 0x2f, - 0x41, 0x7b, 0x40, 0x2b, 0x35, 0x1, 0x2, 0x36, 0x31, 0x4f, 0x45, 0x58, 0x36, 0x2f, 0x0, 0x1, - 0x0, 0x46, 0xff, 0x20, 0x1, 0xf4, 0x2, 0x2e, 0x0, 0x6, 0x0, 0x44, 0x40, 0x15, 0x1, 0x7, - 0x7, 0x40, 0x8, 0x0, 0x5, 0x4, 0x3, 0x0, 0x5, 0x4, 0x8, 0x0, 0x6, 0x0, 0x3, 0x2, - 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0x7, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x1, 0x23, 0x1, 0x21, 0x37, 0x1, 0xf4, 0x7, 0xfe, 0xb6, 0x5d, 0x1, 0x41, 0xfe, - 0xe4, 0x9, 0x2, 0x2e, 0x33, 0xfd, 0x25, 0x2, 0xc6, 0x48, 0x0, 0x3, 0x0, 0x43, 0xff, 0xf9, - 0x2, 0x24, 0x2, 0xf0, 0x0, 0x19, 0x0, 0x29, 0x0, 0x37, 0x0, 0x4e, 0x40, 0x1a, 0x1, 0x38, - 0x38, 0x40, 0x39, 0x0, 0x36, 0x2e, 0x26, 0x1e, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0x10, 0xe, 0x8, - 0x4, 0x0, 0x16, 0xa, 0x1, 0x1, 0xe, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xe, 0x0, 0x38, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x38, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x7, 0x16, - 0x17, 0x16, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x37, 0x36, 0x37, 0x26, 0x37, 0x36, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x7, 0x36, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x17, 0x16, - 0x33, 0x32, 0x37, 0x36, 0x3, 0x36, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x17, 0x16, - 0x33, 0x32, 0x2, 0x1e, 0x4, 0x2a, 0x1c, 0x1e, 0x2a, 0x1b, 0x1f, 0x3, 0xc, 0xe8, 0x5a, 0x40, - 0x46, 0x3, 0x5, 0x83, 0x48, 0x7, 0x5, 0x31, 0x3d, 0x67, 0x4a, 0x35, 0x3e, 0x54, 0x4, 0x26, - 0x20, 0x30, 0x31, 0x24, 0x2b, 0x4, 0x5, 0x2a, 0x23, 0x29, 0x2f, 0x22, 0x2f, 0xb, 0x6, 0x2c, - 0x26, 0x3c, 0x39, 0x2c, 0x38, 0x2, 0x3, 0x3b, 0x28, 0x31, 0x8b, 0x2, 0x39, 0x44, 0x30, 0x21, - 0xa, 0x19, 0x31, 0x39, 0x41, 0xdd, 0x39, 0x3f, 0x61, 0x8d, 0x40, 0x3c, 0x5c, 0x44, 0x34, 0x41, - 0x2b, 0x33, 0x5e, 0x3c, 0x20, 0x1b, 0x1a, 0x1e, 0x36, 0x3d, 0x25, 0x1d, 0x16, 0x1e, 0xfe, 0xdb, - 0x53, 0x2f, 0x28, 0x21, 0x2b, 0x54, 0x53, 0x28, 0x1a, 0x0, 0x0, 0x2, 0x0, 0x3f, 0xff, 0x1b, - 0x2, 0xc, 0x2, 0x41, 0x0, 0x1c, 0x0, 0x2b, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x2c, 0x2c, 0x40, - 0x2d, 0x1b, 0x2a, 0xf, 0xd, 0x7, 0x26, 0x1f, 0x1b, 0x13, 0xd, 0x6, 0x9, 0x7, 0x4, 0x22, - 0x7, 0x17, 0x17, 0x4, 0x1, 0x13, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x13, 0x0, 0x2c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x2c, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, - 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x6, 0x23, 0x22, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x27, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, - 0x6, 0x17, 0x16, 0x33, 0x32, 0x2, 0x9, 0x14, 0x49, 0x52, 0x8f, 0x42, 0x36, 0x25, 0x24, 0x34, - 0x54, 0x3c, 0x35, 0x13, 0x31, 0x5d, 0x4a, 0x3c, 0x55, 0x8, 0x7, 0x4e, 0x41, 0x60, 0x5b, 0x37, - 0x3d, 0x51, 0x1, 0x47, 0x3d, 0x4a, 0x29, 0x24, 0x7, 0x6, 0x21, 0x24, 0x42, 0x92, 0xfc, 0xdc, - 0x7a, 0x8b, 0x25, 0x38, 0x19, 0x5b, 0x52, 0x82, 0x38, 0x2e, 0x40, 0x82, 0x84, 0x41, 0x36, 0x41, - 0x47, 0x83, 0x1c, 0x26, 0xe, 0xc, 0x48, 0x58, 0x34, 0x2d, 0x4d, 0x42, 0x32, 0x37, 0x0, 0x2, - 0x0, 0x39, 0xff, 0xf3, 0x0, 0xfd, 0x2, 0x1d, 0x0, 0xb, 0x0, 0x17, 0x0, 0x40, 0x40, 0x13, - 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x15, 0x12, 0xc, 0x6, 0x0, 0x3, 0x8, 0x9, 0x9, 0xf, - 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x18, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x13, 0xe, - 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x3, 0xe, 0x1, 0x23, 0x22, 0x26, - 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0xf9, 0x3, 0x28, 0x1a, 0x1b, 0x24, 0x4, 0x3, 0x27, 0x1b, - 0x1b, 0x24, 0x40, 0x4, 0x27, 0x1a, 0x1b, 0x24, 0x4, 0x3, 0x27, 0x1b, 0x1b, 0x24, 0x1, 0xdb, - 0x1b, 0x24, 0x28, 0x1b, 0x1b, 0x23, 0x28, 0xfe, 0x3c, 0x1a, 0x24, 0x28, 0x1a, 0x1b, 0x24, 0x28, - 0x0, 0x2, 0x0, 0x39, 0xff, 0x8e, 0x0, 0xf9, 0x2, 0x1d, 0x0, 0xb, 0x0, 0x1b, 0x0, 0x44, - 0x40, 0x15, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0x19, 0x16, 0x12, 0xf, 0xc, 0x6, 0x0, 0x3, - 0x8, 0x9, 0x9, 0xe, 0x1, 0x16, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x16, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, - 0xff, 0xc0, 0x38, 0x59, 0x13, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, - 0x3, 0x6, 0x7, 0x27, 0x3e, 0x1, 0x35, 0x34, 0x27, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, - 0xf5, 0x4, 0x27, 0x1b, 0x1a, 0x24, 0x3, 0x4, 0x27, 0x1b, 0x1b, 0x24, 0x3d, 0x6, 0x5e, 0x16, - 0xe, 0x24, 0x8, 0x33, 0x3, 0x2, 0x28, 0x1b, 0x1a, 0x23, 0x1, 0xdb, 0x1b, 0x24, 0x28, 0x1b, - 0x1b, 0x23, 0x28, 0xfe, 0x3c, 0x4c, 0x57, 0x14, 0xb, 0x39, 0xf, 0x9, 0x1, 0x7, 0x35, 0x1a, - 0x21, 0x2a, 0x0, 0x1, 0x0, 0x19, 0xff, 0xf6, 0x2, 0x3b, 0x2, 0x82, 0x0, 0x9, 0x0, 0x46, - 0x40, 0x16, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x9, 0x2, 0x1, 0x0, 0x9, 0x8, 0x5, 0x3, - 0x2, 0x0, 0x7, 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x5, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, 0x17, 0x7, 0x3, 0x37, 0x13, 0x17, 0x7, - 0x2, 0x3b, 0xc, 0xfe, 0x54, 0x6c, 0x41, 0x95, 0x3, 0xe3, 0x39, 0xa7, 0x1, 0x67, 0x54, 0xfa, - 0x23, 0x1, 0x40, 0x14, 0x1, 0x38, 0x27, 0xf4, 0x0, 0x2, 0x0, 0x69, 0x0, 0xec, 0x1, 0xfb, - 0x1, 0xc3, 0x0, 0x3, 0x0, 0x7, 0x0, 0x4b, 0x40, 0x19, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, - 0x6, 0x4, 0x2, 0x0, 0x2, 0x1, 0x7, 0x0, 0x7, 0x4, 0x7, 0x5, 0x3, 0x0, 0x6, 0x5, - 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, - 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, - 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, 0x37, 0x5, 0x7, 0x21, 0x37, 0x1, 0xfb, 0x9, 0xfe, 0x8b, - 0x9, 0x1, 0x61, 0x9, 0xfe, 0x8b, 0x9, 0x1, 0xc3, 0x40, 0x40, 0x97, 0x40, 0x40, 0x0, 0x1, - 0x0, 0x3c, 0xff, 0xf6, 0x2, 0x5e, 0x2, 0x79, 0x0, 0x9, 0x0, 0x46, 0x40, 0x16, 0x1, 0xa, - 0xa, 0x40, 0xb, 0x0, 0x7, 0x6, 0x5, 0x4, 0x8, 0x7, 0x5, 0x4, 0x3, 0x0, 0x9, 0x2, - 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, - 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x3, 0x27, 0x37, 0x21, 0x37, 0x21, 0x27, 0x37, 0x2, 0x5e, 0x2, 0xe7, - 0x3a, 0xa9, 0xfe, 0x58, 0xb, 0x1, 0xab, 0x63, 0x3b, 0x1, 0x4a, 0x14, 0xfe, 0xc0, 0x27, 0xf6, - 0x54, 0xf2, 0x20, 0x0, 0x0, 0x2, 0x0, 0x64, 0xff, 0xf3, 0x1, 0xf4, 0x3, 0x13, 0x0, 0x1c, - 0x0, 0x28, 0x0, 0x4b, 0x40, 0x19, 0x1, 0x29, 0x29, 0x40, 0x2a, 0x1b, 0x26, 0x15, 0x8, 0x7, - 0x23, 0x1d, 0x1b, 0x16, 0xf, 0x8, 0x13, 0x8, 0x18, 0x20, 0x18, 0x3, 0x1, 0x16, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x16, 0x0, 0x29, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x29, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x6, 0x7, 0x6, 0x7, 0x6, 0xf, 0x1, 0x23, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, - 0x27, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x3, 0xe, 0x1, 0x23, - 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x1, 0xf2, 0x9, 0x2e, 0x30, 0x30, 0x50, 0xc, - 0xa, 0x53, 0xa, 0xb, 0x6b, 0x27, 0x28, 0x27, 0x4, 0x5, 0x28, 0x21, 0x38, 0x49, 0x51, 0x22, - 0x5c, 0x65, 0x5e, 0x71, 0xf9, 0x4, 0x27, 0x1b, 0x1b, 0x23, 0x3, 0x4, 0x27, 0x1b, 0x1b, 0x23, - 0x2, 0x53, 0x3f, 0x2b, 0x24, 0x25, 0x3f, 0x54, 0x4b, 0x5c, 0x64, 0x52, 0x1c, 0x1b, 0x21, 0x2e, - 0x38, 0x1c, 0x17, 0x32, 0x41, 0x3f, 0x55, 0x4e, 0xe, 0xfd, 0xcf, 0x1a, 0x24, 0x28, 0x1a, 0x1b, - 0x24, 0x28, 0x0, 0x2, 0x0, 0x55, 0xff, 0x2c, 0x3, 0xbf, 0x2, 0xe0, 0x0, 0x40, 0x0, 0x4e, - 0x0, 0x6b, 0x40, 0x2a, 0x1, 0x4f, 0x4f, 0x40, 0x50, 0x3f, 0x4c, 0x43, 0x2f, 0x1b, 0x1a, 0x17, - 0x16, 0x15, 0x13, 0x7, 0x49, 0x41, 0x3f, 0x35, 0x2f, 0x29, 0x1f, 0x18, 0x17, 0xd, 0x23, 0x7, - 0x3b, 0x2d, 0x7, 0x32, 0x3b, 0x32, 0x9, 0x1, 0x5, 0x4, 0x1, 0x1, 0x35, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x35, 0x0, 0x4f, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, - 0x6, 0x7, 0x23, 0x26, 0x37, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x37, 0x33, 0x3, 0x6, 0x17, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, - 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x7, 0x6, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x25, 0x26, - 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x3, 0xba, 0xa, 0x1e, - 0x22, 0x2c, 0xdc, 0xd, 0x3, 0x3a, 0x48, 0x49, 0x30, 0x33, 0x5, 0x15, 0x52, 0x38, 0x48, 0x47, - 0x30, 0x7, 0x51, 0x36, 0x4, 0x6, 0x6e, 0x3c, 0xe, 0x5, 0x4c, 0x50, 0x95, 0xa9, 0x6f, 0x6a, - 0x18, 0x6, 0x4d, 0x52, 0x94, 0x2d, 0x25, 0x2, 0x3d, 0x1c, 0xac, 0xcc, 0x6, 0x1c, 0x81, 0x87, - 0xca, 0xad, 0x66, 0x63, 0xfe, 0xc8, 0x31, 0x3c, 0x2f, 0x24, 0x2d, 0xf, 0x3, 0x38, 0x29, 0x43, - 0x39, 0x1, 0x6, 0x45, 0x47, 0x4e, 0x2c, 0x13, 0x1c, 0x38, 0x38, 0x3b, 0x67, 0x1f, 0x22, 0x8c, - 0x3e, 0x2b, 0x27, 0x1e, 0xfe, 0x74, 0x19, 0x16, 0x5b, 0x68, 0x29, 0x27, 0x93, 0x56, 0x5b, 0x73, - 0x6e, 0xb3, 0x29, 0x26, 0x94, 0x56, 0x5b, 0x5, 0x44, 0x7, 0xd8, 0xb0, 0x28, 0x2a, 0xd4, 0x81, - 0x85, 0x6c, 0x6b, 0xb0, 0x28, 0x5d, 0x30, 0x26, 0x31, 0x67, 0x1a, 0x17, 0x45, 0x4c, 0x5a, 0x0, - 0x0, 0x2, 0xff, 0xec, 0x0, 0x0, 0x2, 0x5d, 0x3, 0x11, 0x0, 0x7, 0x0, 0xc, 0x0, 0x50, - 0x40, 0x1d, 0x1, 0xd, 0xd, 0x40, 0xe, 0x0, 0xa, 0x9, 0xc, 0x8, 0x5, 0x0, 0xc, 0x8, - 0x7, 0x3, 0x2, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xd, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xd, 0xff, 0xc0, 0x38, 0x59, - 0x21, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0xb, 0x1, 0x23, 0x7, 0x3, 0x2, 0x5d, 0x57, - 0x18, 0xfe, 0xe4, 0x87, 0x5f, 0x1, 0xbe, 0x57, 0x1c, 0x23, 0x7, 0x17, 0xae, 0xf6, 0xf6, 0x3, - 0x11, 0xfe, 0x2b, 0x1, 0x6d, 0x2f, 0xfe, 0xc2, 0x0, 0x3, 0x0, 0x64, 0x0, 0x0, 0x2, 0xa2, - 0x3, 0xc, 0x0, 0x10, 0x0, 0x17, 0x0, 0x20, 0x0, 0x59, 0x40, 0x20, 0x1, 0x21, 0x21, 0x40, - 0x22, 0x0, 0x1f, 0x1e, 0x1d, 0x1c, 0x16, 0x15, 0x14, 0x13, 0x1e, 0x1a, 0x15, 0x11, 0xb, 0x8, - 0x5, 0x4, 0x0, 0xd, 0xc, 0x3, 0xb, 0xa, 0x1, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, - 0x0, 0x21, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x7, 0x15, 0x1e, 0x1, 0x7, 0x6, 0x21, 0x23, 0x13, - 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x2b, 0x1, 0x3, 0x33, 0x32, 0x7, 0x36, 0x35, 0x34, 0x2b, - 0x1, 0x3, 0x33, 0x32, 0x2, 0x9c, 0x5, 0x2d, 0x20, 0x24, 0x2a, 0x39, 0x5, 0x13, 0xfe, 0xf0, - 0xfd, 0x71, 0xd6, 0x7d, 0x3f, 0x3b, 0x5d, 0x9b, 0x85, 0x28, 0x80, 0xc8, 0x18, 0x1, 0xb1, 0x88, - 0x2c, 0x8f, 0xc6, 0x2, 0x46, 0x42, 0x34, 0x23, 0x11, 0x6, 0x12, 0x68, 0x3c, 0xe0, 0x3, 0xc, - 0x37, 0x34, 0x4f, 0x73, 0xfe, 0xf1, 0xdf, 0xd, 0xc, 0x84, 0xfe, 0xd3, 0x0, 0x1, 0x0, 0x5f, - 0xff, 0xf9, 0x2, 0xae, 0x3, 0x14, 0x0, 0x1d, 0x0, 0x43, 0x40, 0x15, 0x1, 0x1e, 0x1e, 0x40, - 0x1f, 0x0, 0xf, 0xd, 0x3, 0x1, 0x16, 0x10, 0x9, 0x0, 0x1c, 0x3, 0x12, 0x1, 0x1, 0x16, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x16, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, - 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x2, 0xae, 0x45, 0x34, 0x6d, - 0x6b, 0x47, 0x3f, 0x12, 0x5, 0x2d, 0x30, 0x55, 0x73, 0x4a, 0x3b, 0x5e, 0xa1, 0x6a, 0x4b, 0x57, - 0x5, 0x1a, 0x71, 0x5e, 0x75, 0xa3, 0x2, 0x82, 0x21, 0x68, 0x60, 0x57, 0x8d, 0x27, 0x24, 0x70, - 0x42, 0x45, 0x6d, 0x28, 0x8f, 0x4c, 0x58, 0x9c, 0x24, 0x28, 0xc8, 0x6d, 0x5a, 0x0, 0x0, 0x2, - 0x0, 0x64, 0x0, 0x0, 0x2, 0xc6, 0x3, 0xc, 0x0, 0xc, 0x0, 0x17, 0x0, 0x45, 0x40, 0x16, - 0x1, 0x18, 0x18, 0x40, 0x19, 0xb, 0x14, 0x12, 0x11, 0x13, 0xf, 0xb, 0x5, 0x7, 0x6, 0x3, - 0x5, 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, - 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x2b, 0x1, 0x13, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, - 0x7, 0x36, 0x35, 0x34, 0x2b, 0x1, 0x3, 0x17, 0x32, 0x37, 0x36, 0x2, 0xc4, 0x14, 0x69, 0x60, - 0xa1, 0xe2, 0x71, 0xb4, 0x89, 0x55, 0x5f, 0x5c, 0x3, 0xec, 0x5b, 0x5d, 0x6c, 0x9f, 0x4b, 0x3a, - 0x1, 0x9e, 0xd4, 0x69, 0x61, 0x3, 0xc, 0x4c, 0x54, 0x9d, 0x18, 0x1a, 0x1d, 0x1a, 0xf1, 0xfd, - 0x82, 0x1, 0x66, 0x50, 0x0, 0x1, 0x0, 0x64, 0x0, 0x0, 0x2, 0x8c, 0x3, 0xc, 0x0, 0xb, - 0x0, 0x53, 0x40, 0x1d, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, - 0x2, 0x1, 0xa, 0x8, 0x7, 0x4, 0x3, 0x0, 0xa, 0x9, 0x1, 0xb, 0x0, 0x3, 0x1, 0xa, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0xa, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, - 0x13, 0x2, 0x8c, 0xa, 0xfe, 0xa2, 0x27, 0x1, 0x39, 0xa, 0xfe, 0xc7, 0x2a, 0x1, 0x73, 0xa, - 0xfe, 0x32, 0x70, 0x3, 0xc, 0x47, 0xfe, 0xef, 0x47, 0xfe, 0xda, 0x47, 0x3, 0xc, 0x0, 0x1, - 0x0, 0x64, 0x0, 0x0, 0x2, 0x95, 0x3, 0xc, 0x0, 0x9, 0x0, 0x4b, 0x40, 0x19, 0x1, 0xa, - 0xa, 0x40, 0xb, 0x0, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x8, 0x4, 0x3, 0x0, 0x8, 0x7, - 0x1, 0x9, 0x0, 0x3, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x8, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, 0x3, 0x23, - 0x13, 0x2, 0x95, 0xa, 0xfe, 0x9a, 0x27, 0x1, 0x3d, 0xb, 0xfe, 0xc4, 0x34, 0x5c, 0x71, 0x3, - 0xc, 0x47, 0xfe, 0xef, 0x47, 0xfe, 0x93, 0x3, 0xc, 0x0, 0x0, 0x1, 0x0, 0x5f, 0xff, 0xf9, - 0x2, 0xce, 0x3, 0x14, 0x0, 0x26, 0x0, 0x59, 0x40, 0x21, 0x1, 0x27, 0x27, 0x40, 0x28, 0x13, - 0x1f, 0x16, 0x14, 0x3, 0x25, 0x24, 0x1b, 0x13, 0xb, 0x3, 0x2, 0x0, 0x26, 0x0, 0x8, 0x25, - 0x24, 0x11, 0x3, 0x7, 0x1, 0x2, 0x1, 0x1, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x3f, 0x3f, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x27, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x3, 0x23, 0x37, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, - 0x33, 0x32, 0x37, 0x36, 0x3f, 0x1, 0x23, 0x37, 0x2, 0xbf, 0x36, 0x40, 0xd, 0x30, 0x29, 0x3a, - 0x55, 0x70, 0x4a, 0x55, 0x5, 0x18, 0x78, 0x64, 0x87, 0xa6, 0x49, 0x44, 0x2f, 0x84, 0x6d, 0x98, - 0x13, 0x4, 0x2d, 0x33, 0x60, 0x5c, 0x3d, 0x38, 0xb, 0x8, 0xbb, 0xa, 0x1, 0x92, 0xfe, 0x6e, - 0x61, 0x33, 0x16, 0x1f, 0x4d, 0x58, 0x9d, 0x23, 0x27, 0xcd, 0x6a, 0x58, 0x92, 0x20, 0x67, 0xb3, - 0x93, 0x24, 0x22, 0x6f, 0x42, 0x48, 0x3b, 0x36, 0x53, 0x42, 0x48, 0x0, 0x0, 0x1, 0x0, 0x64, - 0x0, 0x0, 0x2, 0xe0, 0x3, 0xc, 0x0, 0xb, 0x0, 0x53, 0x40, 0x1f, 0x1, 0xc, 0xc, 0x40, - 0xd, 0x0, 0xa, 0x9, 0x4, 0x3, 0x9, 0x8, 0x6, 0x3, 0x2, 0x0, 0x6, 0x5, 0x2, 0x3, - 0x1, 0x1, 0xb, 0x8, 0x7, 0x3, 0x0, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, - 0x13, 0x21, 0x3, 0x23, 0x13, 0x33, 0x3, 0x21, 0x13, 0x2, 0xe0, 0x70, 0x59, 0x34, 0xfe, 0xa6, - 0x34, 0x59, 0x6f, 0x59, 0x31, 0x1, 0x59, 0x32, 0x3, 0xc, 0xfc, 0xf4, 0x1, 0x6b, 0xfe, 0x95, - 0x3, 0xc, 0xfe, 0xa5, 0x1, 0x5b, 0x0, 0x1, 0x0, 0x4d, 0x0, 0x0, 0x1, 0x83, 0x3, 0xc, - 0x0, 0xb, 0x0, 0x59, 0x40, 0x23, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xa, 0x9, 0x6, 0x4, - 0x3, 0x0, 0xa, 0x9, 0x2, 0x3, 0x1, 0x7, 0x0, 0x8, 0x7, 0x4, 0x3, 0x3, 0x7, 0x5, - 0x6, 0x5, 0x1, 0xb, 0x0, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, - 0x3, 0x33, 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x37, 0x1, 0x83, 0x8, 0x37, 0x60, 0x3c, 0x8, - 0xcb, 0x7, 0x36, 0x61, 0x3c, 0x8, 0x3, 0xc, 0x38, 0xfd, 0x64, 0x38, 0x38, 0x2, 0x9c, 0x38, - 0x0, 0x1, 0x0, 0xa, 0xff, 0x40, 0x1, 0x4f, 0x3, 0xc, 0x0, 0x9, 0x0, 0x38, 0x40, 0xf, - 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x6, 0x0, 0x5, 0x9, 0x0, 0x3, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x6, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x6, 0x7, 0x6, 0x7, 0x27, 0x36, 0x37, 0x13, - 0x1, 0x4f, 0x69, 0xf, 0x33, 0x38, 0x5a, 0x8, 0x6a, 0x17, 0x69, 0x3, 0xc, 0xfd, 0x2c, 0x63, - 0x41, 0x46, 0xe, 0x4a, 0x10, 0x9c, 0x2, 0xd6, 0x0, 0x1, 0x0, 0x64, 0x0, 0x0, 0x2, 0xc8, - 0x3, 0xc, 0x0, 0xb, 0x0, 0x4f, 0x40, 0x1d, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xa, 0x4, - 0xa, 0x9, 0x7, 0x2, 0x1, 0x0, 0x7, 0x6, 0x3, 0x3, 0x2, 0x1, 0xb, 0x9, 0x8, 0x3, - 0x0, 0x3, 0x1, 0x7, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x7, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xc, 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x13, 0x23, 0x3, 0x7, 0x3, 0x23, 0x13, 0x33, 0x3, - 0x1, 0x2, 0xc8, 0xfe, 0xd1, 0xeb, 0x5a, 0xca, 0x76, 0x2c, 0x5a, 0x72, 0x5a, 0x36, 0x1, 0x69, - 0x3, 0xc, 0xfe, 0xc6, 0xfe, 0x2e, 0x1, 0x98, 0x7d, 0xfe, 0xe5, 0x3, 0xc, 0xfe, 0x85, 0x1, - 0x7b, 0x0, 0x0, 0x1, 0x0, 0x64, 0x0, 0x0, 0x2, 0x1b, 0x3, 0xc, 0x0, 0x5, 0x0, 0x43, - 0x40, 0x15, 0x1, 0x6, 0x6, 0x40, 0x7, 0x0, 0x5, 0x0, 0x5, 0x4, 0x2, 0x0, 0x4, 0x3, - 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, - 0x0, 0x6, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x6, 0xff, - 0xc0, 0x38, 0x59, 0x25, 0x7, 0x21, 0x13, 0x33, 0x3, 0x2, 0x1b, 0xa, 0xfe, 0x53, 0x71, 0x5b, - 0x67, 0x46, 0x46, 0x3, 0xc, 0xfd, 0x3a, 0x0, 0x0, 0x1, 0x0, 0x64, 0xff, 0xfb, 0x3, 0x56, - 0x3, 0xc, 0x0, 0xf, 0x0, 0x56, 0x40, 0x20, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xe, 0xd, - 0x8, 0x7, 0x4, 0x3, 0xa, 0x3, 0x2, 0x0, 0x6, 0x5, 0x1, 0xa, 0x9, 0x1, 0x1, 0xf, - 0xc, 0xb, 0x3, 0x0, 0x3, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, - 0x3f, 0x3c, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x27, 0x13, - 0x23, 0x1, 0x23, 0x3, 0x23, 0x3, 0x23, 0x13, 0x33, 0x13, 0x33, 0x1, 0x3, 0x56, 0x6e, 0x54, - 0x65, 0x6, 0xfe, 0xd0, 0x38, 0x69, 0x6, 0x64, 0x54, 0x71, 0x83, 0x5e, 0x6, 0x1, 0x10, 0x3, - 0xc, 0xfc, 0xf3, 0x1, 0x2, 0xb3, 0xfd, 0x48, 0x2, 0xbf, 0xfd, 0x46, 0x3, 0xc, 0xfd, 0x74, - 0x2, 0x8c, 0x0, 0x1, 0x0, 0x64, 0x0, 0x0, 0x2, 0xf5, 0x3, 0xc, 0x0, 0xb, 0x0, 0x4b, - 0x40, 0x1b, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xa, 0x9, 0x4, 0x3, 0x6, 0x0, 0x6, 0x5, - 0x2, 0x3, 0x1, 0x1, 0xb, 0x8, 0x7, 0x3, 0x0, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x3, 0x23, - 0x3, 0x23, 0x13, 0x33, 0x13, 0x33, 0x13, 0x2, 0xf5, 0x71, 0x6c, 0xf6, 0x8, 0x65, 0x51, 0x70, - 0x7c, 0xeb, 0x7, 0x60, 0x3, 0xc, 0xfc, 0xf4, 0x2, 0xb1, 0xfd, 0x4f, 0x3, 0xc, 0xfd, 0x61, - 0x2, 0x9f, 0x0, 0x2, 0x0, 0x5f, 0xff, 0xf9, 0x2, 0xfa, 0x3, 0x14, 0x0, 0x13, 0x0, 0x23, - 0x0, 0x3f, 0x40, 0x13, 0x1, 0x24, 0x24, 0x40, 0x25, 0x12, 0x20, 0x18, 0x1c, 0x14, 0x12, 0x8, - 0xe, 0x3, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x24, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x14, 0x27, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, - 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0xf5, 0x1b, 0x77, 0x65, 0x84, 0x73, 0x4e, 0x5a, 0x6, 0x1b, - 0x77, 0x65, 0x85, 0x71, 0x4e, 0x5a, 0x5a, 0x2f, 0x35, 0x63, 0x8a, 0x51, 0x44, 0x2f, 0x34, 0x65, - 0x89, 0x50, 0x45, 0x1, 0x86, 0xc6, 0x6b, 0x5c, 0x49, 0x55, 0x9d, 0x27, 0x2b, 0xc7, 0x6b, 0x5c, - 0x4d, 0x59, 0x9b, 0x25, 0x1e, 0x6e, 0x44, 0x4b, 0x88, 0x72, 0x95, 0x6f, 0x41, 0x47, 0x86, 0x71, - 0x0, 0x2, 0x0, 0x64, 0x0, 0x0, 0x2, 0xae, 0x3, 0xc, 0x0, 0xa, 0x0, 0x15, 0x0, 0x4c, - 0x40, 0x1a, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x10, 0xf, 0x11, 0xb, 0x5, 0x0, 0x12, 0x11, - 0x7, 0x3, 0x2, 0x7, 0x6, 0x3, 0x5, 0x4, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x21, 0x23, - 0x3, 0x23, 0x13, 0x33, 0x32, 0x17, 0x16, 0x7, 0x34, 0x27, 0x26, 0x2b, 0x1, 0x3, 0x33, 0x32, - 0x37, 0x36, 0x2, 0xa8, 0x10, 0xfe, 0xe1, 0x89, 0x32, 0x5a, 0x71, 0xc9, 0x8a, 0x45, 0x41, 0x5b, - 0x2a, 0x30, 0x5d, 0x76, 0x2c, 0x87, 0x5c, 0x37, 0x3f, 0x2, 0x39, 0xe8, 0xfe, 0xaf, 0x3, 0xc, - 0x3c, 0x37, 0x59, 0x3a, 0x23, 0x28, 0xfe, 0xd3, 0x25, 0x2c, 0x0, 0x2, 0x0, 0x5f, 0xff, 0xcc, - 0x2, 0xfa, 0x3, 0x14, 0x0, 0x16, 0x0, 0x29, 0x0, 0x79, 0x40, 0x32, 0x1, 0x2a, 0x2a, 0x40, - 0x2b, 0x15, 0x28, 0x27, 0x5, 0x26, 0x25, 0x3, 0x2, 0x28, 0x2, 0x27, 0x26, 0x27, 0x3, 0x9, - 0x3, 0x4, 0x25, 0x5, 0x26, 0x26, 0x27, 0x4, 0x4, 0x26, 0x1f, 0x5, 0xb, 0x17, 0x5, 0x15, - 0x23, 0x8, 0x7, 0x1b, 0x8, 0x11, 0x4, 0x11, 0x3, 0x7, 0x1, 0x1, 0xb, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2f, 0xfd, 0x2f, 0xfd, 0x87, - 0x2e, 0x8, 0xc4, 0xe, 0xc4, 0xe, 0xc4, 0x8, 0xfc, 0x8, 0xc4, 0xe, 0xc4, 0xe, 0xc4, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, - 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2a, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x17, 0x7, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x27, 0x34, 0x27, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x2, 0xf5, 0x18, - 0x63, 0x63, 0x38, 0x63, 0x5d, 0x6a, 0x6f, 0x4f, 0x5e, 0x6, 0x1b, 0x77, 0x65, 0x84, 0x71, 0x4f, - 0x5a, 0x5b, 0x30, 0x35, 0x63, 0x8b, 0x50, 0x43, 0x2f, 0x33, 0x65, 0x50, 0x40, 0x63, 0x37, 0x60, - 0x5b, 0x1, 0x86, 0xb0, 0x6a, 0x6e, 0x32, 0x6f, 0x43, 0x4a, 0x58, 0x9d, 0x26, 0x29, 0xc7, 0x6b, - 0x5c, 0x4d, 0x59, 0x9b, 0x25, 0x1c, 0x6f, 0x44, 0x4d, 0x89, 0x73, 0x95, 0x70, 0x40, 0x47, 0x31, - 0x6e, 0x32, 0x6b, 0x76, 0x0, 0x2, 0x0, 0x64, 0x0, 0x0, 0x2, 0xa3, 0x3, 0xc, 0x0, 0xe, - 0x0, 0x18, 0x0, 0x56, 0x40, 0x20, 0x1, 0x19, 0x19, 0x40, 0x1a, 0xc, 0x16, 0x15, 0x4, 0x3, - 0x15, 0xf, 0xc, 0x6, 0x1, 0x0, 0x14, 0x13, 0x8, 0x7, 0x8, 0x7, 0x3, 0x6, 0x5, 0x2, - 0x3, 0x1, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, - 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x19, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x19, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x13, 0x23, 0x3, 0x23, 0x3, - 0x23, 0x13, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x6, 0x37, 0x34, 0x27, 0x26, 0x2b, 0x1, 0x3, - 0x33, 0x32, 0x36, 0x1, 0xe5, 0x8a, 0x56, 0x87, 0xa0, 0x35, 0x59, 0x71, 0xe8, 0x6b, 0x3f, 0x3c, - 0x67, 0xf, 0x22, 0x27, 0x4c, 0x92, 0x28, 0xac, 0x4d, 0x56, 0x1, 0x65, 0xfe, 0x9b, 0x1, 0x5c, - 0xfe, 0xa4, 0x3, 0xc, 0x39, 0x36, 0x54, 0x59, 0x7e, 0xd3, 0x37, 0x21, 0x27, 0xfe, 0xe1, 0x54, - 0x0, 0x1, 0x0, 0x28, 0xff, 0xf8, 0x2, 0x56, 0x3, 0x14, 0x0, 0x29, 0x0, 0x47, 0x40, 0x17, - 0x1, 0x2a, 0x2a, 0x40, 0x2b, 0x0, 0x18, 0x16, 0x3, 0x1, 0x24, 0x1c, 0x15, 0xd, 0x7, 0x0, - 0x28, 0x3, 0x11, 0x1, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x15, 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x17, 0x16, - 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x2, - 0x56, 0x25, 0x59, 0x5c, 0x3b, 0x2b, 0x37, 0x5, 0x5, 0x39, 0x15, 0x54, 0xb0, 0x57, 0x4b, 0x6e, - 0x46, 0x4c, 0x39, 0x24, 0x31, 0x57, 0x68, 0x9f, 0x10, 0x1, 0x32, 0x17, 0x4e, 0x56, 0x22, 0x47, - 0x7, 0x9, 0x54, 0x45, 0x62, 0x66, 0x2, 0xd6, 0x44, 0x37, 0x17, 0x1d, 0x3a, 0x31, 0x32, 0x12, - 0x36, 0x72, 0x70, 0x6a, 0x3a, 0x32, 0x1d, 0x15, 0x1b, 0x3f, 0x40, 0x77, 0x8, 0x9, 0x35, 0x2e, - 0x15, 0x31, 0x36, 0x21, 0x45, 0x4a, 0x5e, 0x32, 0x29, 0x0, 0x0, 0x1, 0x0, 0x4b, 0x0, 0x0, - 0x2, 0x73, 0x3, 0xc, 0x0, 0x7, 0x0, 0x47, 0x40, 0x17, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, - 0x6, 0x5, 0x2, 0x1, 0x6, 0x5, 0x4, 0x0, 0x4, 0x3, 0x1, 0x7, 0x0, 0x3, 0x1, 0x6, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x8, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x7, 0x23, 0x3, 0x23, 0x13, 0x23, 0x37, 0x2, 0x73, 0x9, 0xe4, 0x67, 0x5c, 0x67, 0xdf, 0x9, - 0x3, 0xc, 0x47, 0xfd, 0x3b, 0x2, 0xc5, 0x47, 0x0, 0x1, 0x0, 0x6e, 0xff, 0xf8, 0x2, 0xdd, - 0x3, 0xc, 0x0, 0x19, 0x0, 0x43, 0x40, 0x16, 0x1, 0x1a, 0x1a, 0x40, 0x1b, 0x0, 0x14, 0x10, - 0xd, 0x9, 0x0, 0x5, 0x1, 0x19, 0xd, 0xc, 0x3, 0x0, 0x3, 0x1, 0x9, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x1a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x1a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x6, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x37, 0x13, 0x2, 0xdd, 0x49, 0x15, 0x5b, 0x4f, 0x73, 0x5f, 0x43, 0x52, 0x4, 0x48, 0x59, - 0x46, 0x4, 0x34, 0x2a, 0x3f, 0x4a, 0x35, 0x43, 0x11, 0x49, 0x3, 0xc, 0xfe, 0x8, 0x93, 0x49, - 0x40, 0x35, 0x42, 0x7a, 0x1c, 0x1f, 0x1, 0xe8, 0xfe, 0x13, 0x1c, 0x18, 0x5b, 0x2c, 0x23, 0x2a, - 0x36, 0x74, 0x1, 0xf7, 0x0, 0x1, 0x0, 0x64, 0x0, 0x0, 0x2, 0x9b, 0x3, 0x18, 0x0, 0x8, - 0x0, 0x41, 0x40, 0x14, 0x1, 0x9, 0x9, 0x40, 0xa, 0x0, 0x6, 0x5, 0x3, 0x0, 0x8, 0x4, - 0x3, 0x3, 0x2, 0x1, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, - 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, - 0x0, 0x9, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x9, 0xff, - 0xc0, 0x38, 0x59, 0x9, 0x1, 0x23, 0x3, 0x33, 0x13, 0x33, 0x37, 0x1, 0x2, 0x9b, 0xfe, 0xb3, - 0x67, 0x83, 0x55, 0x6c, 0x8, 0x1e, 0x1, 0x7, 0x2, 0xf4, 0xfd, 0xc, 0x3, 0xc, 0xfd, 0x5b, - 0x4d, 0x2, 0x64, 0x0, 0x0, 0x1, 0x0, 0x64, 0x0, 0x0, 0x3, 0xd9, 0x3, 0x14, 0x0, 0x12, - 0x0, 0x52, 0x40, 0x1f, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, 0x10, 0xf, 0xb, 0xa, 0x4, 0x3, - 0x8, 0x0, 0x12, 0x3, 0xe, 0xd, 0x9, 0x3, 0x8, 0x3, 0x7, 0x6, 0x2, 0x3, 0x1, 0x1, - 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x3f, 0x1, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x8, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, - 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x23, 0x3, 0x23, 0x7, 0x3, 0x23, 0x3, 0x33, 0x13, 0x33, - 0x37, 0x13, 0x33, 0x13, 0x33, 0x37, 0x13, 0x3, 0xd9, 0xfe, 0xee, 0x60, 0x52, 0x6, 0x14, 0xea, - 0x61, 0x4c, 0x4f, 0x3d, 0x6, 0x11, 0xed, 0x5a, 0x52, 0x6, 0x11, 0xd7, 0x2, 0xf9, 0xfd, 0x7, - 0x2, 0x92, 0x3d, 0xfd, 0xab, 0x3, 0xc, 0xfd, 0x66, 0x38, 0x2, 0x62, 0xfd, 0x66, 0x38, 0x2, - 0x6a, 0x0, 0x0, 0x1, 0xff, 0xec, 0xff, 0xec, 0x2, 0x9a, 0x3, 0x19, 0x0, 0xb, 0x0, 0x4b, - 0x40, 0x19, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0xa, 0x4, 0x8, 0x7, 0x6, 0x2, 0x1, 0x0, - 0xb, 0x5, 0x9, 0x8, 0x3, 0x3, 0x2, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x13, 0x23, 0x3, - 0x1, 0x27, 0x1, 0x3, 0x33, 0x1b, 0x1, 0x2, 0x9a, 0xfe, 0xea, 0xb8, 0x5f, 0x94, 0xfe, 0xdd, - 0x3a, 0x1, 0x3a, 0xb8, 0x5e, 0x93, 0xfd, 0x2, 0xe8, 0xfe, 0xa9, 0xfe, 0x6f, 0x1, 0x4a, 0xfe, - 0xa2, 0x31, 0x1, 0x7c, 0x1, 0x73, 0xfe, 0xd5, 0x1, 0x38, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, - 0x2, 0x92, 0x3, 0x18, 0x0, 0x9, 0x0, 0x45, 0x40, 0x16, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, - 0x8, 0x7, 0x5, 0x4, 0x3, 0x0, 0x9, 0x6, 0x5, 0x3, 0x3, 0x2, 0x1, 0x1, 0x5, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x3, - 0x23, 0x13, 0x3, 0x33, 0x13, 0x33, 0x13, 0x2, 0x92, 0xfe, 0xd9, 0x2f, 0x5a, 0x2f, 0xc1, 0x5d, - 0x9e, 0x7, 0xfc, 0x2, 0xea, 0xfe, 0x53, 0xfe, 0xc3, 0x1, 0x41, 0x1, 0xcb, 0xfe, 0x93, 0x1, - 0x79, 0x0, 0x0, 0x1, 0x0, 0xa, 0x0, 0x0, 0x2, 0x7d, 0x3, 0xc, 0x0, 0x9, 0x0, 0x51, - 0x40, 0x1d, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x8, 0x7, 0x5, 0x3, 0x2, 0x0, 0x8, 0x7, - 0x8, 0x0, 0x3, 0x2, 0x8, 0x4, 0x5, 0x4, 0x1, 0x9, 0x0, 0x3, 0x1, 0x5, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0xa, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x1, 0x21, 0x7, 0x21, 0x37, 0x1, 0x21, 0x37, 0x2, 0x7d, 0x8, 0xfe, 0xc, - 0x1, 0xa5, 0xa, 0xfd, 0xee, 0x8, 0x1, 0xed, 0xfe, 0x79, 0xa, 0x3, 0xc, 0x3a, 0xfd, 0x76, - 0x48, 0x43, 0x2, 0x81, 0x48, 0x0, 0x0, 0x1, 0x0, 0x3c, 0xff, 0x39, 0x1, 0x9e, 0x3, 0x32, - 0x0, 0x7, 0x0, 0x4c, 0x40, 0x1a, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x6, 0x4, 0x3, 0x0, - 0x4, 0x3, 0x7, 0x5, 0x2, 0x1, 0x7, 0x0, 0x6, 0x5, 0x7, 0x0, 0x4, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x8, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x23, 0x3, 0x33, 0x7, 0x23, 0x13, 0x1, 0x9e, 0x9, 0x7b, 0x77, 0x7b, 0xa, 0xd8, - 0x8a, 0x3, 0x32, 0x46, 0xfc, 0x93, 0x46, 0x3, 0xf9, 0x0, 0x0, 0x1, 0x0, 0x3c, 0x0, 0x0, - 0x1, 0x9e, 0x3, 0x56, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, - 0x2, 0x0, 0x3, 0x2, 0x1, 0x0, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, - 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, - 0x38, 0x59, 0x21, 0x23, 0x1, 0x33, 0x1, 0x9e, 0x4f, 0xfe, 0xed, 0x4f, 0x3, 0x56, 0x0, 0x1, - 0x0, 0x3c, 0xff, 0x39, 0x1, 0x9e, 0x3, 0x32, 0x0, 0x7, 0x0, 0x4c, 0x40, 0x1a, 0x1, 0x8, - 0x8, 0x40, 0x9, 0x0, 0x6, 0x5, 0x2, 0x0, 0x6, 0x5, 0x7, 0x0, 0x4, 0x3, 0x7, 0x1, - 0x2, 0x1, 0x7, 0x0, 0x4, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, - 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x37, 0x33, 0x13, 0x23, 0x37, - 0x1, 0x9e, 0x8a, 0xd8, 0xa, 0x7a, 0x77, 0x7a, 0x9, 0x3, 0x32, 0xfc, 0x7, 0x46, 0x3, 0x6d, - 0x46, 0x0, 0x0, 0x1, 0x0, 0x5, 0x2, 0x73, 0x1, 0x19, 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, - 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, 0x2, 0x4, 0x0, 0x6, 0x5, 0x4, 0x3, 0x1, - 0x3, 0x0, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, - 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x19, 0x43, 0x3a, 0x50, 0x47, 0x80, 0x40, 0x2, 0x73, - 0x56, 0x56, 0x92, 0x0, 0x0, 0x1, 0x0, 0x3c, 0xff, 0xc0, 0x1, 0xd3, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x3, 0x2, 0x0, 0x2, 0x1, 0x0, - 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x7, 0x21, 0x37, - 0x1, 0xd3, 0x9, 0xfe, 0x72, 0x9, 0x40, 0x40, 0x0, 0x1, 0x0, 0x64, 0x2, 0x6d, 0x0, 0xcf, - 0x3, 0x7, 0x0, 0x3, 0x0, 0x39, 0x40, 0xf, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, - 0x3, 0x2, 0x1, 0x0, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x13, - 0x23, 0x27, 0x33, 0xcf, 0x42, 0x29, 0x4b, 0x2, 0x6d, 0x9a, 0x0, 0x2, 0x0, 0x3c, 0xff, 0xf8, - 0x2, 0x5, 0x2, 0x1a, 0x0, 0x16, 0x0, 0x25, 0x0, 0x51, 0x40, 0x1d, 0x1, 0x26, 0x26, 0x40, - 0x27, 0x0, 0x21, 0x19, 0x15, 0x8, 0x1f, 0x17, 0xd, 0x5, 0x3, 0x0, 0x13, 0x2, 0xa, 0x1, - 0x6, 0x5, 0x1, 0x16, 0x0, 0x2, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x3f, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x26, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x6, 0x15, 0x14, - 0x17, 0x23, 0x26, 0x37, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, - 0x17, 0x37, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, - 0x37, 0x2, 0x5, 0x38, 0x7, 0x9, 0x4c, 0x10, 0x3, 0x40, 0x58, 0x4a, 0x58, 0x6, 0x16, 0x52, - 0x38, 0x4a, 0x52, 0x2e, 0x8, 0x14, 0x2f, 0x47, 0x2f, 0x25, 0x2f, 0xf, 0x5, 0x57, 0x2d, 0x2d, - 0x26, 0x11, 0x2, 0x12, 0xfe, 0x81, 0x2f, 0x1e, 0x17, 0x2f, 0x1b, 0x21, 0x44, 0x74, 0x66, 0x26, - 0x29, 0x8e, 0x3f, 0x2c, 0x26, 0x1e, 0x6e, 0x2d, 0x28, 0x33, 0x67, 0x23, 0x1f, 0x8c, 0x24, 0x1e, - 0x24, 0x0, 0x0, 0x2, 0x0, 0x41, 0xff, 0xf8, 0x1, 0xe8, 0x3, 0x32, 0x0, 0x12, 0x0, 0x25, - 0x0, 0x4a, 0x40, 0x19, 0x1, 0x26, 0x26, 0x40, 0x27, 0x11, 0x22, 0x17, 0xb, 0x1e, 0x15, 0x11, - 0xb, 0xa, 0x6, 0xd, 0x2, 0xa, 0x9, 0x4, 0x2, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3f, 0x3c, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x26, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x2, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x33, 0x3, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, - 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0xf, 0x1, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x36, 0x1, 0xe4, 0x22, 0xd8, 0x44, 0x2e, 0x37, 0x4, 0x53, 0x56, 0x33, 0x35, 0x4f, 0x42, - 0x2b, 0x3c, 0x5f, 0x5, 0x59, 0x2a, 0x29, 0x24, 0x14, 0x14, 0x2, 0x1e, 0x1a, 0x26, 0x34, 0x26, - 0x2f, 0x1, 0x15, 0xfe, 0xe3, 0x2b, 0x34, 0x63, 0x1c, 0x1f, 0x2, 0x3d, 0xfe, 0xae, 0x3a, 0x23, - 0x33, 0x72, 0x1c, 0x33, 0x26, 0x1f, 0x89, 0x21, 0x1e, 0x2c, 0x8a, 0x13, 0x11, 0x3b, 0x20, 0x1c, - 0x28, 0x32, 0x0, 0x1, 0x0, 0x3c, 0xff, 0xf8, 0x1, 0xb1, 0x2, 0x1a, 0x0, 0x1b, 0x0, 0x43, - 0x40, 0x15, 0x1, 0x1c, 0x1c, 0x40, 0x1d, 0x0, 0xd, 0xb, 0x3, 0x1, 0x14, 0xe, 0x9, 0x0, - 0x1a, 0x2, 0x10, 0x1, 0x1, 0x14, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x14, - 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, - 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1, - 0xb1, 0x36, 0x1f, 0x37, 0x33, 0x24, 0x2c, 0xb, 0x3, 0x6c, 0x44, 0x2e, 0x2d, 0x4e, 0x5f, 0x48, - 0x32, 0x3c, 0x2, 0xd, 0x43, 0x3d, 0x5c, 0x4f, 0x1, 0xdc, 0x31, 0x26, 0x29, 0x34, 0x6d, 0x1b, - 0x18, 0x93, 0x2e, 0x36, 0x41, 0x33, 0x3f, 0x72, 0x14, 0x16, 0x8b, 0x48, 0x41, 0x0, 0x0, 0x2, - 0x0, 0x3c, 0xff, 0xf8, 0x2, 0x2a, 0x3, 0x32, 0x0, 0x16, 0x0, 0x25, 0x0, 0x54, 0x40, 0x1f, - 0x1, 0x26, 0x26, 0x40, 0x27, 0x0, 0x21, 0x15, 0x8, 0x1f, 0x17, 0xd, 0x5, 0x3, 0x0, 0x19, - 0x8, 0x13, 0x13, 0x2, 0xa, 0x1, 0x6, 0x5, 0x1, 0x16, 0x0, 0x4, 0x1, 0xd, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x3f, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, - 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x26, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x3, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x37, 0x6, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x13, 0x3, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, - 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x37, 0x2, 0x2a, 0x5d, 0x7, 0xa, 0x4c, 0x11, 0x4, - 0x40, 0x59, 0x4a, 0x58, 0x6, 0x16, 0x52, 0x38, 0x4a, 0x4f, 0x2e, 0x2c, 0x37, 0x2f, 0x45, 0x2f, - 0x25, 0x2f, 0xf, 0x5, 0x57, 0x2d, 0x2d, 0x26, 0x11, 0x3, 0x32, 0xfd, 0x61, 0x2d, 0x1e, 0x18, - 0x30, 0x1b, 0x21, 0x44, 0x75, 0x65, 0x26, 0x29, 0x8e, 0x3f, 0x2c, 0x26, 0x1, 0x3e, 0xfe, 0x72, - 0x2d, 0x28, 0x33, 0x67, 0x23, 0x1f, 0x8c, 0x24, 0x1e, 0x24, 0x0, 0x2, 0x0, 0x3c, 0xff, 0xf8, - 0x1, 0xe0, 0x2, 0x1a, 0x0, 0x1b, 0x0, 0x29, 0x0, 0x4b, 0x40, 0x19, 0x1, 0x2a, 0x2a, 0x40, - 0x2b, 0x0, 0x26, 0x22, 0xc, 0xa, 0x8, 0x6, 0x24, 0x1e, 0x13, 0xd, 0x8, 0x0, 0x19, 0x2, - 0xf, 0x1, 0x1, 0x13, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x13, 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x6, 0x33, - 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, - 0x16, 0x7, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x16, 0x33, 0x32, 0x37, 0x36, 0x1, - 0xdc, 0x4, 0x30, 0x2a, 0x40, 0x24, 0x29, 0x2f, 0x2f, 0x5, 0x7a, 0x44, 0x3b, 0x27, 0x49, 0x69, - 0x4d, 0x35, 0x3e, 0x2, 0xd, 0x43, 0x3e, 0x60, 0x53, 0x61, 0x62, 0x1, 0x1f, 0x18, 0x21, 0x73, - 0x1a, 0x17, 0x33, 0x1d, 0x1a, 0x58, 0x1, 0x80, 0x40, 0x2d, 0x26, 0xe, 0x8, 0xa, 0xa0, 0x2c, - 0x3a, 0x3b, 0x34, 0x3e, 0x73, 0x14, 0x15, 0x8b, 0x48, 0x41, 0x56, 0x4b, 0x8, 0x7, 0x26, 0x14, - 0xf, 0xb0, 0x8, 0x4, 0xe, 0x0, 0x0, 0x1, 0xff, 0xce, 0xff, 0x30, 0x1, 0x78, 0x3, 0x31, - 0x0, 0x13, 0x0, 0x4e, 0x40, 0x1b, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0xf, 0xe, 0x7, 0x6, - 0xf, 0xe, 0xa, 0x5, 0x4, 0x0, 0x0, 0xa, 0x11, 0x10, 0x5, 0x3, 0x4, 0x2, 0x1, 0xa, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, - 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x22, 0xf, 0x1, 0x33, 0x7, 0x23, 0x3, 0x6, 0x27, 0x37, 0x32, 0x37, - 0x13, 0x23, 0x37, 0x33, 0x37, 0x36, 0x1, 0x78, 0xa, 0x64, 0xb, 0x12, 0x63, 0x9, 0x64, 0x49, - 0x14, 0xb8, 0xa, 0x64, 0xb, 0x47, 0x48, 0x9, 0x49, 0x13, 0x15, 0x3, 0x30, 0x49, 0x51, 0x84, - 0x43, 0xfd, 0xf3, 0x92, 0x1, 0x48, 0x52, 0x2, 0x4, 0x43, 0x8e, 0x91, 0x0, 0x2, 0x0, 0x41, - 0xff, 0x23, 0x2, 0xb, 0x2, 0x1b, 0x0, 0x1d, 0x0, 0x2c, 0x0, 0x52, 0x40, 0x1d, 0x1, 0x2d, - 0x2d, 0x40, 0x2e, 0x1d, 0x28, 0x20, 0x1b, 0xe, 0xb, 0x9, 0x26, 0x1e, 0x1d, 0x13, 0xe, 0x8, - 0x4, 0x1d, 0x1c, 0x2, 0x19, 0x2, 0x10, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3f, 0x3f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x2d, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x6, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x3f, 0x1, 0x6, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x37, 0x1, 0xbc, 0xe, 0x46, 0x38, - 0x51, 0x31, 0x32, 0x25, 0x16, 0x2c, 0x2d, 0x44, 0x7a, 0x10, 0xc, 0x3c, 0x53, 0x49, 0x57, 0x6, - 0x16, 0x51, 0x38, 0x4a, 0x4e, 0x30, 0x7, 0x52, 0x66, 0x2f, 0x44, 0x2f, 0x25, 0x2e, 0xf, 0x5, - 0x55, 0x2e, 0x2c, 0x22, 0x13, 0x23, 0x65, 0x30, 0x25, 0x17, 0x12, 0x15, 0x37, 0x2c, 0x71, 0x55, - 0x3b, 0x76, 0x66, 0x25, 0x29, 0x8e, 0x40, 0x2c, 0x27, 0x1e, 0x6d, 0x2d, 0x29, 0x33, 0x67, 0x24, - 0x1f, 0x8e, 0x26, 0x1d, 0x26, 0x0, 0x0, 0x1, 0x0, 0x41, 0x0, 0x0, 0x2, 0xb, 0x3, 0x32, - 0x0, 0x18, 0x0, 0x51, 0x40, 0x1e, 0x1, 0x19, 0x19, 0x40, 0x1a, 0x7, 0x1, 0x17, 0xe, 0xb, - 0x7, 0x1, 0x0, 0x10, 0x8, 0x3, 0x17, 0x16, 0xb, 0x3, 0xa, 0x1, 0x3, 0x2, 0x18, 0x0, - 0x4, 0x1, 0x17, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3f, 0x17, 0x3c, 0x10, - 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x17, 0x0, 0x19, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x19, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x3, - 0x23, 0x13, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0x7, 0x34, 0x3, 0x23, 0x13, 0x1, 0x8, - 0x30, 0x43, 0x54, 0x3f, 0x29, 0x34, 0x4, 0x2d, 0x55, 0x2d, 0x3, 0x54, 0x35, 0x31, 0x24, 0xe, - 0x33, 0x55, 0x72, 0x3, 0x32, 0xfe, 0xaa, 0x3e, 0x21, 0x2a, 0x58, 0x17, 0x19, 0xfe, 0xb9, 0x1, - 0x40, 0x1c, 0x15, 0x60, 0x2b, 0x20, 0x1f, 0x1, 0xfe, 0x98, 0x3, 0x32, 0x0, 0x2, 0x0, 0x46, - 0xff, 0xf8, 0x0, 0xf4, 0x2, 0xd9, 0x0, 0xb, 0x0, 0x18, 0x0, 0x45, 0x40, 0x16, 0x1, 0x19, - 0x19, 0x40, 0x1a, 0x0, 0x3, 0x15, 0x11, 0xf, 0xc, 0x6, 0x0, 0x9, 0x12, 0x1, 0x18, 0xc, - 0x2, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x19, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x19, 0xff, 0xc0, 0x38, - 0x59, 0x13, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0x3, 0x6, - 0x15, 0x14, 0x17, 0x7, 0x22, 0x26, 0x35, 0x34, 0x37, 0x13, 0xf3, 0x1, 0x22, 0x16, 0x16, 0x1c, - 0x1, 0x1, 0x21, 0x17, 0x15, 0x1d, 0x23, 0x33, 0x3, 0x2c, 0xa, 0x34, 0x43, 0x3, 0x33, 0x2, - 0xa6, 0x16, 0x21, 0x1f, 0x15, 0x17, 0x1f, 0x1e, 0xa9, 0xfe, 0x97, 0x14, 0x10, 0x3d, 0x7, 0x49, - 0x4c, 0x40, 0x11, 0x12, 0x1, 0x6b, 0x0, 0x2, 0xff, 0xce, 0xfe, 0xf1, 0x1, 0x0, 0x2, 0xd9, - 0x0, 0xb, 0x0, 0x17, 0x0, 0x41, 0x40, 0x14, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x3, 0x12, - 0xc, 0x6, 0x0, 0x9, 0x11, 0x0, 0x17, 0xc, 0x2, 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x12, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x13, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, - 0x33, 0x32, 0x16, 0x7, 0x3, 0x6, 0x7, 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x37, 0x13, 0xfe, - 0x1, 0x22, 0x15, 0x16, 0x1d, 0x1, 0x1, 0x21, 0x17, 0x15, 0x1e, 0x24, 0x49, 0xf, 0x32, 0x2c, - 0x39, 0x1f, 0x34, 0x19, 0x16, 0xc, 0x4b, 0x2, 0xa6, 0x16, 0x21, 0x1f, 0x15, 0x17, 0x1f, 0x1e, - 0xa9, 0xfd, 0xed, 0x6c, 0x4b, 0x40, 0x17, 0x41, 0x20, 0x31, 0x2d, 0x53, 0x2, 0xf, 0x0, 0x1, - 0x0, 0x41, 0x0, 0x0, 0x2, 0x14, 0x3, 0x32, 0x0, 0xb, 0x0, 0x50, 0x40, 0x1d, 0x1, 0xc, - 0xc, 0x40, 0xd, 0x0, 0xa, 0x4, 0xa, 0x9, 0x7, 0x2, 0x1, 0x0, 0x9, 0x8, 0x4, 0x7, - 0x6, 0x3, 0x3, 0x2, 0x1, 0xb, 0x0, 0x2, 0x1, 0x7, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x13, 0x23, - 0x3, 0xf, 0x1, 0x23, 0x13, 0x33, 0x3, 0x37, 0x2, 0x14, 0xd6, 0x9d, 0x54, 0x84, 0x50, 0x1d, - 0x55, 0x71, 0x55, 0x44, 0xe4, 0x2, 0x11, 0xbd, 0xfe, 0xac, 0x1, 0x1f, 0x44, 0xdb, 0x3, 0x32, - 0xfe, 0x16, 0xc9, 0x0, 0x0, 0x1, 0x0, 0x41, 0xff, 0xf8, 0x0, 0xf2, 0x3, 0x32, 0x0, 0xc, - 0x0, 0x3d, 0x40, 0x12, 0x1, 0xd, 0xd, 0x40, 0xe, 0x0, 0x9, 0x5, 0x3, 0x0, 0x6, 0x1, - 0xc, 0x0, 0x4, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0xd, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xd, 0xff, 0xc0, 0x38, 0x59, 0x13, - 0x3, 0x6, 0x15, 0x14, 0x17, 0x7, 0x22, 0x26, 0x35, 0x34, 0x37, 0x13, 0xf2, 0x59, 0x3, 0x2c, - 0xa, 0x34, 0x43, 0x2, 0x5a, 0x3, 0x32, 0xfd, 0x77, 0x14, 0x10, 0x3d, 0x7, 0x49, 0x4c, 0x40, - 0x11, 0x12, 0x2, 0x8b, 0x0, 0x1, 0x0, 0x4b, 0x0, 0x0, 0x3, 0x34, 0x2, 0x1a, 0x0, 0x2c, - 0x0, 0x5e, 0x40, 0x23, 0x1, 0x2d, 0x2d, 0x40, 0x2e, 0x14, 0x28, 0x21, 0x1f, 0x1a, 0x11, 0x6, - 0x27, 0x24, 0x22, 0x14, 0x10, 0xd, 0x5, 0x2, 0xb, 0x0, 0x8, 0x18, 0x1c, 0x18, 0x22, 0x2, - 0x27, 0x10, 0x5, 0x1, 0x1, 0x27, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3c, 0x3f, - 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x27, 0x0, 0x2d, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x32, 0x15, 0x14, 0x7, 0x3, 0x33, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x7, - 0x3, 0x33, 0x13, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, - 0x26, 0x27, 0x23, 0x16, 0x15, 0x14, 0x7, 0x3, 0x33, 0x13, 0x36, 0x37, 0x36, 0x1, 0x5c, 0x54, - 0x3, 0x2d, 0x55, 0x31, 0x11, 0x20, 0x28, 0x28, 0x59, 0x3, 0x2c, 0x55, 0x2a, 0x4, 0x31, 0x28, - 0x3e, 0x5d, 0x48, 0x2c, 0x5e, 0x2d, 0x58, 0x18, 0x4, 0xa, 0x47, 0xa, 0x4, 0x37, 0x54, 0x35, - 0x12, 0x24, 0x29, 0x1, 0xd1, 0x61, 0x10, 0x13, 0xfe, 0xb3, 0x1, 0x71, 0x20, 0x1c, 0x24, 0x66, - 0x13, 0x17, 0xfe, 0xbf, 0x1, 0x40, 0x1a, 0x17, 0x58, 0x2c, 0x25, 0x4b, 0x4b, 0x2c, 0x21, 0x2e, - 0x17, 0x1b, 0x2e, 0x1d, 0x20, 0xfe, 0x74, 0x1, 0x72, 0x24, 0x1b, 0x20, 0x0, 0x1, 0x0, 0x4b, - 0x0, 0x0, 0x2, 0x13, 0x2, 0x1a, 0x0, 0x1c, 0x0, 0x51, 0x40, 0x1e, 0x1, 0x1d, 0x1d, 0x40, - 0x1e, 0x1b, 0x15, 0x1b, 0x12, 0x10, 0xd, 0x5, 0x2, 0x7, 0x8, 0x17, 0x17, 0x2, 0x13, 0x12, - 0x2, 0xd, 0xc, 0x2, 0x3, 0x1, 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x13, 0x36, - 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0x7, 0x3, 0x23, 0x13, 0x36, 0x35, 0x34, 0x27, 0x33, 0x16, - 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x2, 0x10, 0x2d, 0x55, 0x2c, 0x4, 0x55, 0x35, - 0x31, 0x24, 0xd, 0x33, 0x54, 0x37, 0x4, 0xa, 0x47, 0xa, 0x4, 0x43, 0x63, 0x40, 0x28, 0x34, - 0x1, 0x47, 0xfe, 0xb9, 0x1, 0x40, 0x1c, 0x15, 0x60, 0x2b, 0x20, 0x1f, 0xfe, 0x99, 0x1, 0x8c, - 0x20, 0x1d, 0x2e, 0x1b, 0x17, 0x2e, 0x4d, 0x21, 0x2a, 0x58, 0x17, 0x0, 0x0, 0x2, 0x0, 0x37, - 0xff, 0xf8, 0x1, 0xef, 0x2, 0x1a, 0x0, 0x11, 0x0, 0x1d, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x1e, - 0x1e, 0x40, 0x1f, 0x10, 0x1c, 0x16, 0x1a, 0x14, 0x10, 0x6, 0xc, 0x2, 0x2, 0x1, 0x1, 0x6, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x2, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, - 0x34, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x1, 0xea, 0x24, 0xd3, 0x52, 0x32, 0x38, - 0x4, 0x13, 0x48, 0x41, 0x61, 0x4e, 0x30, 0x39, 0x5d, 0x5, 0x68, 0x81, 0x1b, 0x4, 0x6b, 0x7e, - 0x1, 0x8, 0xfe, 0xf0, 0x31, 0x37, 0x6b, 0x1d, 0x20, 0x8c, 0x47, 0x3f, 0x30, 0x38, 0x6c, 0x1d, - 0x21, 0x25, 0x1e, 0x86, 0xc9, 0x24, 0x1d, 0x86, 0x0, 0x2, 0x0, 0xf, 0xfe, 0xe3, 0x1, 0xfc, - 0x2, 0x1a, 0x0, 0x18, 0x0, 0x27, 0x0, 0x54, 0x40, 0x1f, 0x1, 0x28, 0x28, 0x40, 0x29, 0x10, - 0x24, 0xa, 0x0, 0x21, 0x1b, 0x10, 0x7, 0x5, 0x2, 0x1d, 0x8, 0xc, 0x16, 0x1, 0xc, 0x2, - 0x8, 0x7, 0x2, 0x2, 0x1, 0x0, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x3f, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x28, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x28, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x3, 0x23, 0x13, - 0x36, 0x35, 0x34, 0x27, 0x33, 0x16, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, - 0x7, 0x6, 0x23, 0x22, 0x26, 0x25, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0xf, 0x1, 0x1e, 0x1, - 0x33, 0x32, 0x37, 0x36, 0x90, 0x2d, 0x54, 0x5f, 0x5, 0xa, 0x47, 0xa, 0x4, 0x40, 0x56, 0x42, - 0x2b, 0x3b, 0x3, 0x15, 0x5b, 0x39, 0x50, 0x1d, 0x48, 0x1, 0x3, 0x6, 0x59, 0x2b, 0x4f, 0x14, - 0x22, 0xb, 0x3f, 0x1e, 0x34, 0x27, 0x30, 0x1f, 0xfe, 0xc4, 0x2, 0xa9, 0x20, 0x1e, 0x2d, 0x1b, - 0x17, 0x2e, 0x4d, 0x24, 0x33, 0x72, 0x1d, 0x20, 0xab, 0x46, 0x2b, 0x1a, 0xf0, 0x27, 0x21, 0x87, - 0x41, 0x2b, 0xf5, 0x11, 0x1e, 0x27, 0x32, 0x0, 0x0, 0x2, 0x0, 0x3c, 0xfe, 0xe3, 0x2, 0x3, - 0x2, 0x1a, 0x0, 0x11, 0x0, 0x20, 0x0, 0x54, 0x40, 0x1f, 0x1, 0x21, 0x21, 0x40, 0x22, 0x10, - 0x1c, 0xe, 0x1, 0x1a, 0x12, 0x10, 0x6, 0x1, 0x0, 0x14, 0x8, 0xc, 0x10, 0xf, 0x2, 0xc, - 0x2, 0x3, 0x1, 0x11, 0x0, 0x0, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3f, 0x3f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x21, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x13, 0x6, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x3, 0x13, 0x26, - 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x37, 0x1, 0x3b, 0x30, - 0x3b, 0x53, 0x49, 0x58, 0x6, 0x16, 0x51, 0x39, 0x4a, 0x4f, 0x2e, 0x8, 0x52, 0x73, 0xe, 0x2f, - 0x46, 0x2f, 0x25, 0x2e, 0xf, 0x5, 0x56, 0x2f, 0x2c, 0x24, 0x13, 0xfe, 0xe3, 0x1, 0x4b, 0x37, - 0x77, 0x66, 0x25, 0x28, 0x8e, 0x3f, 0x2c, 0x26, 0x1e, 0xfc, 0xd1, 0x2, 0xc1, 0x2d, 0x28, 0x33, - 0x67, 0x23, 0x1f, 0x8c, 0x23, 0x1d, 0x24, 0x0, 0x0, 0x1, 0x0, 0x4b, 0x0, 0x0, 0x1, 0xad, - 0x2, 0x1a, 0x0, 0x14, 0x0, 0x48, 0x40, 0x18, 0x1, 0x15, 0x15, 0x40, 0x16, 0x0, 0x11, 0x3, - 0x1, 0xe, 0xc, 0x9, 0x0, 0x13, 0x2, 0xf, 0xe, 0x2, 0x9, 0x8, 0x1, 0x1, 0x9, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x15, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x15, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, - 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x3, 0x23, 0x13, 0x36, 0x35, 0x34, 0x27, 0x33, 0x16, 0x17, - 0x36, 0x33, 0x32, 0x1, 0xad, 0x28, 0x11, 0x20, 0x30, 0x2c, 0x22, 0x3, 0x34, 0x54, 0x38, 0x5, - 0xa, 0x46, 0xc, 0x3, 0x3f, 0x51, 0x29, 0x2, 0x9, 0x45, 0xb, 0x2f, 0x25, 0x13, 0xfe, 0x98, - 0x1, 0x8c, 0x21, 0x1e, 0x2c, 0x1b, 0x19, 0x2d, 0x4e, 0x0, 0x0, 0x1, 0x0, 0x14, 0xff, 0xf8, - 0x1, 0x9b, 0x2, 0x1a, 0x0, 0x24, 0x0, 0x47, 0x40, 0x17, 0x1, 0x25, 0x25, 0x40, 0x26, 0x0, - 0x16, 0x14, 0x3, 0x1, 0x1f, 0x18, 0x13, 0xd, 0x7, 0x0, 0x23, 0x2, 0x11, 0x1, 0x1, 0x13, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x13, 0x0, 0x25, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, - 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x2e, 0x1, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x1, 0x9b, 0x24, 0x3c, 0x36, 0x28, 0x1b, 0x22, 0x61, 0x38, 0x12, 0x31, - 0x40, 0x30, 0x46, 0x68, 0x4a, 0x29, 0x43, 0x42, 0x63, 0x25, 0x3, 0x73, 0x12, 0x30, 0x40, 0x34, - 0x44, 0x50, 0x1, 0xf2, 0x41, 0x21, 0xe, 0x11, 0x20, 0x2c, 0x41, 0x27, 0x12, 0x30, 0x38, 0x4d, - 0x25, 0x1b, 0x36, 0x40, 0x2d, 0x3e, 0x24, 0x21, 0x2, 0x52, 0x12, 0x31, 0x37, 0x45, 0x25, 0x1e, - 0x0, 0x1, 0x0, 0x3e, 0xff, 0xf8, 0x1, 0x48, 0x2, 0x8c, 0x0, 0x15, 0x0, 0x55, 0x40, 0x1f, - 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, 0x10, 0xf, 0x2, 0x1, 0x15, 0x14, 0x10, 0xf, 0xc, 0x7, - 0x5, 0x0, 0x14, 0x13, 0x8, 0x1, 0x15, 0x12, 0x11, 0x3, 0x0, 0x2, 0x1, 0x10, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x10, - 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x3, 0x6, 0x15, 0x14, 0x17, 0x7, 0x22, 0x27, 0x26, 0x35, - 0x34, 0x37, 0x13, 0x23, 0x37, 0x33, 0x37, 0x33, 0x7, 0x1, 0x48, 0x9, 0x64, 0x28, 0x2, 0x56, - 0xb, 0x42, 0x2d, 0x32, 0x3, 0x28, 0x48, 0x9, 0x48, 0x12, 0x55, 0x12, 0x2, 0x12, 0x42, 0xfe, - 0xe0, 0x11, 0xd, 0x49, 0x8, 0x49, 0x25, 0x29, 0x49, 0xf, 0x10, 0x1, 0x22, 0x41, 0x7b, 0x7a, - 0x0, 0x1, 0x0, 0x4b, 0xff, 0xf8, 0x2, 0x7, 0x2, 0x12, 0x0, 0x1c, 0x0, 0x51, 0x40, 0x1e, - 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0xd, 0x15, 0x1b, 0x12, 0x10, 0xd, 0x5, 0x2, 0x7, 0x8, 0x17, - 0x17, 0x1, 0x13, 0x12, 0x1, 0xd, 0xc, 0x2, 0x3, 0x1, 0x2, 0x1, 0x1b, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1b, 0x0, 0x1d, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, 0x38, 0x59, 0x37, - 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x33, 0x3, 0x6, 0x15, - 0x14, 0x17, 0x23, 0x26, 0x37, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x4f, 0x2b, 0x55, 0x2c, - 0x4, 0x58, 0x33, 0x2b, 0x1c, 0x10, 0x32, 0x54, 0x36, 0x5, 0xa, 0x47, 0xf, 0x1, 0x43, 0x59, - 0x42, 0x28, 0x30, 0xda, 0x1, 0x38, 0xfe, 0xc0, 0x19, 0x14, 0x64, 0x2f, 0x1e, 0x24, 0x1, 0x60, - 0xfe, 0x74, 0x20, 0x1d, 0x2d, 0x1c, 0x20, 0x24, 0x4c, 0x26, 0x2d, 0x5a, 0x19, 0x0, 0x0, 0x1, - 0x0, 0x1e, 0x0, 0x0, 0x1, 0xd9, 0x2, 0x1e, 0x0, 0x9, 0x0, 0x41, 0x40, 0x14, 0x1, 0xa, - 0xa, 0x40, 0xb, 0x0, 0x7, 0x6, 0x3, 0x0, 0x9, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, - 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, - 0x3, 0x33, 0x13, 0x17, 0x33, 0x37, 0x13, 0x1, 0xd9, 0xf3, 0x58, 0x70, 0x56, 0x4b, 0x8, 0x4, - 0x1a, 0xaf, 0x1, 0xf8, 0xfe, 0x8, 0x2, 0x12, 0xfe, 0x95, 0x42, 0x42, 0x1, 0x77, 0x0, 0x1, - 0x0, 0x2d, 0x0, 0x0, 0x2, 0xf2, 0x2, 0x1d, 0x0, 0x13, 0x0, 0x51, 0x40, 0x1e, 0x1, 0x14, - 0x14, 0x40, 0x15, 0x0, 0x11, 0x10, 0xb, 0xa, 0x4, 0x3, 0x8, 0x0, 0x13, 0xe, 0xd, 0x9, - 0x3, 0x8, 0x2, 0x7, 0x6, 0x2, 0x3, 0x1, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x17, 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, - 0x3, 0x23, 0x7, 0x3, 0x23, 0x3, 0x33, 0x13, 0x33, 0x37, 0x13, 0x33, 0x13, 0x17, 0x33, 0x37, - 0x13, 0x2, 0xf2, 0xdd, 0x56, 0x3b, 0x4, 0x1b, 0x89, 0x54, 0x5b, 0x55, 0x3b, 0x3, 0x18, 0x93, - 0x4f, 0x35, 0x6, 0x3, 0x15, 0x9d, 0x1, 0xfc, 0xfe, 0x4, 0x1, 0x8c, 0x46, 0xfe, 0xba, 0x2, - 0x12, 0xfe, 0x54, 0x42, 0x1, 0x6a, 0xfe, 0x96, 0x42, 0x41, 0x1, 0x76, 0x0, 0x1, 0xff, 0xdd, - 0xff, 0xed, 0x1, 0xe8, 0x2, 0x1c, 0x0, 0xb, 0x0, 0x4b, 0x40, 0x19, 0x1, 0xc, 0xc, 0x40, - 0xd, 0x0, 0xa, 0x4, 0x8, 0x7, 0x6, 0x2, 0x1, 0x0, 0xb, 0x5, 0x9, 0x8, 0x2, 0x3, - 0x2, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x13, 0x23, 0x27, 0x7, 0x27, 0x37, 0x3, 0x33, 0x17, - 0x37, 0x1, 0xe8, 0xc4, 0x89, 0x60, 0x62, 0xd9, 0x35, 0xe5, 0x7d, 0x5c, 0x5a, 0xb6, 0x1, 0xea, - 0xd5, 0xfe, 0xeb, 0xd1, 0xe4, 0x31, 0xf4, 0x1, 0x0, 0xbe, 0xc8, 0x0, 0x0, 0x1, 0xff, 0xbf, - 0xfe, 0xf6, 0x1, 0xd4, 0x2, 0x1e, 0x0, 0x17, 0x0, 0x42, 0x40, 0x14, 0x1, 0x18, 0x18, 0x40, - 0x19, 0x0, 0x15, 0x14, 0xf, 0xd, 0x7, 0x0, 0x17, 0x6, 0x10, 0xf, 0x2, 0x1, 0x7, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, - 0x7, 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, - 0x15, 0x33, 0x36, 0x37, 0x1, 0xd4, 0x3b, 0x66, 0x4a, 0x29, 0x60, 0x76, 0x2b, 0x30, 0x10, 0x29, - 0x22, 0x38, 0x9, 0xd, 0x54, 0x53, 0x18, 0x1d, 0x22, 0x6, 0x78, 0x4c, 0x1, 0xff, 0xbd, 0xb7, - 0x85, 0x3a, 0x86, 0x50, 0x3c, 0x22, 0xe, 0x23, 0x2f, 0x51, 0x75, 0xb6, 0xe2, 0x34, 0x87, 0x99, - 0x62, 0xde, 0xe4, 0x0, 0x0, 0x1, 0x0, 0xf, 0x0, 0x0, 0x1, 0xbf, 0x2, 0x12, 0x0, 0x9, - 0x0, 0x51, 0x40, 0x1d, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x8, 0x7, 0x5, 0x3, 0x2, 0x0, - 0x3, 0x2, 0x7, 0x4, 0x8, 0x7, 0x7, 0x0, 0x5, 0x4, 0x1, 0x9, 0x0, 0x2, 0x1, 0x5, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, - 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x7, 0x1, 0x21, 0x7, 0x21, 0x37, 0x1, 0x23, 0x37, 0x1, 0xbf, 0x7, - 0xfe, 0xc5, 0x1, 0x5, 0x9, 0xfe, 0x96, 0x8, 0x1, 0x33, 0xea, 0x9, 0x2, 0x12, 0x33, 0xfe, - 0x64, 0x43, 0x3c, 0x1, 0x94, 0x42, 0x0, 0x1, 0x0, 0x3c, 0xff, 0x39, 0x1, 0x66, 0x3, 0x32, - 0x0, 0x26, 0x0, 0x59, 0x40, 0x21, 0x1, 0x27, 0x27, 0x40, 0x28, 0x0, 0x1f, 0x1d, 0x18, 0x13, - 0x10, 0xb, 0x9, 0x0, 0x13, 0x12, 0x7, 0x14, 0x1f, 0x7, 0x20, 0x2, 0x1, 0x7, 0x0, 0x15, - 0x14, 0x26, 0x0, 0x4, 0x1, 0x1f, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, - 0x10, 0xfd, 0x3c, 0x2f, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1f, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, - 0x22, 0x7, 0x3, 0xe, 0x1, 0xf, 0x1, 0x16, 0x15, 0x14, 0x7, 0x3, 0x6, 0x15, 0x14, 0x3b, - 0x1, 0x7, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x13, 0x36, 0x35, 0x34, 0x23, 0x37, 0x32, 0x37, - 0x13, 0x3e, 0x1, 0x33, 0x1, 0x66, 0x8, 0x26, 0x2d, 0x8, 0x26, 0x5, 0x30, 0x22, 0x1, 0x3d, - 0x1, 0x29, 0x1, 0x26, 0x26, 0x7, 0x45, 0x26, 0x2d, 0x1, 0x2a, 0x2, 0x35, 0x7, 0x3e, 0xb, - 0x26, 0x7, 0x3e, 0x2f, 0x3, 0x32, 0x39, 0x38, 0xfe, 0xe1, 0x25, 0x33, 0x5, 0x2, 0xa, 0x44, - 0x9, 0x8, 0xfe, 0xc6, 0x8, 0x7, 0x29, 0x39, 0x30, 0x29, 0xa, 0xb, 0x1, 0x35, 0xb, 0x9, - 0x3a, 0x34, 0x4e, 0x1, 0x18, 0x33, 0x3b, 0x0, 0x0, 0x1, 0x0, 0x69, 0xff, 0x38, 0x1, 0x3c, - 0x3, 0x56, 0x0, 0x3, 0x0, 0x39, 0x40, 0xf, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, - 0x3, 0x0, 0x2, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, - 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, - 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x1, - 0x3, 0x23, 0x13, 0x1, 0x3c, 0x8f, 0x44, 0x8f, 0x3, 0x56, 0xfb, 0xe2, 0x4, 0x1e, 0x0, 0x1, - 0x0, 0x14, 0xff, 0x39, 0x1, 0x3e, 0x3, 0x32, 0x0, 0x26, 0x0, 0x50, 0x40, 0x1b, 0x1, 0x27, - 0x27, 0x40, 0x28, 0x0, 0x1b, 0x1a, 0xa, 0x9, 0x25, 0x20, 0x1b, 0x18, 0x13, 0x11, 0x10, 0x8, - 0x0, 0x8, 0x7, 0x1d, 0x1c, 0x4, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x22, 0x7, - 0x3, 0xe, 0x1, 0x2b, 0x1, 0x37, 0x33, 0x32, 0x37, 0x13, 0x3e, 0x1, 0x37, 0x35, 0x26, 0x35, - 0x34, 0x37, 0x13, 0x36, 0x35, 0x34, 0x2b, 0x1, 0x37, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x3, - 0x6, 0x15, 0x14, 0x1, 0x3e, 0x7, 0x3e, 0xb, 0x26, 0x7, 0x3e, 0x2f, 0x40, 0x8, 0x26, 0x2d, - 0x7, 0x26, 0x5, 0x30, 0x23, 0x3d, 0x2, 0x29, 0x1, 0x27, 0x26, 0x8, 0x45, 0x25, 0x2e, 0x2, - 0x2a, 0x1, 0x1, 0x41, 0x34, 0x4e, 0xfe, 0xe8, 0x33, 0x3b, 0x39, 0x38, 0x1, 0x1f, 0x25, 0x33, - 0x5, 0x2, 0xa, 0x44, 0x9, 0x8, 0x1, 0x3a, 0x8, 0x7, 0x29, 0x39, 0x30, 0x29, 0xa, 0xb, - 0xfe, 0xcb, 0xb, 0x9, 0x3a, 0x0, 0x0, 0x1, 0x0, 0x1e, 0x2, 0x7c, 0x1, 0x4f, 0x2, 0xdf, - 0x0, 0xf, 0x0, 0x40, 0x40, 0x13, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xf, 0xd, 0x7, 0x8, - 0x0, 0x5, 0x7, 0xa, 0xa, 0x2, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x8, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, - 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, - 0x16, 0x33, 0x32, 0x37, 0x1, 0x4f, 0x31, 0x2f, 0x16, 0x46, 0x15, 0x27, 0x19, 0x20, 0x30, 0x35, - 0x17, 0x47, 0xd, 0x27, 0x1b, 0x2, 0xa2, 0x26, 0x1f, 0x15, 0x30, 0x29, 0x21, 0x15, 0x0, 0x1, - 0x0, 0x3c, 0x0, 0x0, 0x1, 0xf5, 0x3, 0x32, 0x0, 0xb, 0x0, 0x54, 0x40, 0x20, 0x1, 0xc, - 0xc, 0x40, 0xd, 0x0, 0xb, 0xa, 0x6, 0x5, 0x4, 0x0, 0x6, 0x5, 0x2, 0x3, 0x1, 0x7, - 0xb, 0x8, 0x7, 0x3, 0x0, 0xa, 0x9, 0x4, 0x4, 0x3, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x23, 0x3, 0x23, 0x13, 0x23, 0x37, 0x33, 0x13, 0x33, 0x3, 0x1, 0xf5, 0x9, 0xb3, - 0x3f, 0x50, 0x3f, 0xad, 0x9, 0xad, 0x27, 0x50, 0x27, 0x2, 0x10, 0x42, 0xfe, 0x32, 0x1, 0xce, - 0x42, 0x1, 0x22, 0xfe, 0xde, 0x0, 0x0, 0x3, 0x0, 0x32, 0xff, 0x93, 0x1, 0xa7, 0x2, 0x7b, - 0x0, 0x3, 0x0, 0x7, 0x0, 0x23, 0x0, 0x5b, 0x40, 0x21, 0x1, 0x24, 0x24, 0x40, 0x25, 0x8, - 0x15, 0x13, 0xb, 0x9, 0x7, 0x4, 0x2, 0x1, 0x1c, 0x16, 0x11, 0x8, 0x6, 0x4, 0x2, 0x0, - 0x3, 0x0, 0x6, 0x5, 0x22, 0x2, 0x18, 0x1, 0x1, 0x1c, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3f, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1c, - 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x3, 0x7, 0x23, 0x37, 0x13, 0x7, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1, 0x44, 0x12, 0x3d, 0x12, 0x15, 0x14, 0x3d, 0x14, - 0xf2, 0x36, 0x1f, 0x37, 0x33, 0x24, 0x2c, 0xb, 0x3, 0x6c, 0x44, 0x2e, 0x2d, 0x4e, 0x5f, 0x48, - 0x32, 0x3c, 0x2, 0xd, 0x43, 0x3d, 0x5c, 0x4f, 0x2, 0x7b, 0x80, 0x80, 0xfd, 0xab, 0x93, 0x93, - 0x1, 0xb6, 0x31, 0x26, 0x29, 0x34, 0x6d, 0x1b, 0x18, 0x93, 0x2e, 0x36, 0x41, 0x34, 0x3e, 0x72, - 0x14, 0x16, 0x8b, 0x48, 0x41, 0x0, 0x0, 0x1, 0x0, 0x3c, 0xff, 0xf6, 0x2, 0x64, 0x2, 0xdc, - 0x0, 0x25, 0x0, 0x67, 0x40, 0x2a, 0x1, 0x26, 0x26, 0x40, 0x27, 0x0, 0x25, 0x23, 0x16, 0x5, - 0x21, 0x1c, 0x1b, 0x15, 0xe, 0xd, 0x9, 0x0, 0xa, 0x7, 0x9, 0x1c, 0x1b, 0x10, 0x3, 0xf, - 0x7, 0x1e, 0x1d, 0xe, 0x3, 0xd, 0x18, 0x7, 0x13, 0x13, 0x9, 0x3, 0x1, 0x1, 0x9, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x26, 0xff, 0xc0, 0x38, 0x59, 0x25, 0xe, 0x1, 0x23, 0x22, - 0x27, 0x6, 0x7, 0x6, 0x23, 0x37, 0x36, 0x3f, 0x1, 0x23, 0x37, 0x33, 0x37, 0x36, 0x33, 0x32, - 0x17, 0x7, 0x26, 0x23, 0x22, 0xf, 0x1, 0x33, 0x7, 0x23, 0x7, 0x6, 0x7, 0x16, 0x33, 0x32, - 0x37, 0x2, 0x64, 0x1a, 0x71, 0x4d, 0x58, 0x55, 0x27, 0x29, 0x1f, 0x34, 0x9, 0x65, 0xb, 0x1a, - 0x5e, 0x8, 0x5e, 0x14, 0x21, 0xad, 0x64, 0x41, 0x32, 0x37, 0x3e, 0x68, 0x15, 0x10, 0x63, 0x8, - 0x63, 0x19, 0x2, 0x3, 0x31, 0x5b, 0x68, 0x2a, 0xa5, 0x55, 0x5a, 0x3d, 0x24, 0xd, 0xa, 0x40, - 0x1, 0x54, 0xbd, 0x3d, 0x80, 0xd5, 0x62, 0x2b, 0x4b, 0x9e, 0x75, 0x3d, 0xb6, 0x10, 0xa, 0x3c, - 0x7b, 0x0, 0x0, 0x2, 0x0, 0x3c, 0xff, 0x7c, 0x1, 0xe8, 0x2, 0xff, 0x0, 0xc, 0x0, 0x3e, - 0x0, 0x58, 0x40, 0x1f, 0x1, 0x3f, 0x3f, 0x40, 0x40, 0x2a, 0x2b, 0x15, 0x13, 0x4, 0x0, 0x3d, - 0x3b, 0x39, 0x31, 0x2a, 0x22, 0x20, 0x1e, 0x18, 0x12, 0x8, 0x2, 0x2d, 0x7, 0x28, 0x28, 0xf, - 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x3f, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x3f, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x6, 0x15, 0x14, 0x17, 0x36, - 0x37, 0x36, 0x37, 0x36, 0x27, 0x2e, 0x1, 0x13, 0x6, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, - 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x17, 0x16, 0x17, - 0x16, 0x17, 0x16, 0x7, 0x6, 0x7, 0x16, 0x15, 0x14, 0xfe, 0x41, 0x7a, 0x20, 0x8, 0xf, 0x5, - 0x4, 0x19, 0x17, 0x2c, 0x1f, 0x33, 0x52, 0x1f, 0x4c, 0xe, 0x2c, 0x1e, 0x2c, 0x27, 0x3a, 0x1f, - 0x1e, 0x1d, 0x4b, 0x6a, 0x15, 0x1e, 0x1b, 0x1a, 0x22, 0x37, 0x42, 0x37, 0x29, 0x26, 0x29, 0x22, - 0x1a, 0x1e, 0x5, 0x5, 0x2d, 0x1f, 0x1f, 0x2e, 0x3, 0x1c, 0x3, 0x6, 0x66, 0xb, 0x1, 0xe1, - 0x2f, 0x3f, 0x44, 0x9b, 0x1c, 0xc, 0x17, 0x29, 0x27, 0x2e, 0x22, 0x42, 0xfe, 0x1, 0x3a, 0x1c, - 0xe, 0x39, 0x1a, 0x32, 0x27, 0x21, 0x2e, 0x28, 0x27, 0x64, 0x56, 0x65, 0x3e, 0x28, 0x2d, 0x32, - 0x24, 0x1e, 0xd, 0x10, 0x22, 0x39, 0x19, 0x12, 0x14, 0x24, 0x26, 0x44, 0x2b, 0x2a, 0x46, 0x5, - 0x34, 0x35, 0x6b, 0x3d, 0x22, 0x1e, 0x37, 0x0, 0x0, 0x1, 0x0, 0x37, 0x0, 0xda, 0x1, 0x4f, - 0x1, 0xe6, 0x0, 0xb, 0x0, 0x35, 0x40, 0xd, 0x1, 0xc, 0xc, 0x40, 0xd, 0x0, 0x6, 0x0, - 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x0, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0xc, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xc, 0xff, 0xc0, 0x38, 0x59, 0x1, 0xe, 0x1, 0x23, 0x22, - 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x1, 0x49, 0x7, 0x54, 0x37, 0x38, 0x48, 0x6, 0x6, - 0x55, 0x37, 0x38, 0x48, 0x1, 0x60, 0x38, 0x4e, 0x51, 0x35, 0x38, 0x4e, 0x4f, 0x0, 0x0, 0x2, - 0x0, 0x55, 0xff, 0x30, 0x2, 0x16, 0x3, 0x31, 0x0, 0x8, 0x0, 0x12, 0x0, 0x4b, 0x40, 0x1a, - 0x1, 0x13, 0x13, 0x40, 0x14, 0x10, 0x2, 0x1, 0x10, 0xb, 0x5, 0x0, 0x11, 0x12, 0x7, 0x0, - 0xb, 0x10, 0xf, 0x8, 0x3, 0x0, 0x4, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x36, 0x33, 0x13, 0x6, 0x27, 0x37, 0x32, 0x37, 0x13, 0x33, 0xf, 0x1, 0x1, 0x24, 0x2f, 0x9, - 0x41, 0x56, 0x76, 0x50, 0x2e, 0x13, 0xb9, 0x9, 0x65, 0xa, 0x74, 0xad, 0x9, 0x58, 0x3, 0x31, - 0xfe, 0xa6, 0x5b, 0x41, 0x4f, 0x6f, 0xfc, 0x91, 0x92, 0x1, 0x44, 0x52, 0x3, 0x6a, 0x43, 0x1, - 0x0, 0x1, 0xff, 0xb5, 0xff, 0x31, 0x1, 0xfd, 0x3, 0x2c, 0x0, 0x34, 0x0, 0x4d, 0x40, 0x1a, - 0x1, 0x35, 0x35, 0x40, 0x36, 0xf, 0x20, 0x1e, 0x2c, 0x27, 0x23, 0x1d, 0x18, 0x15, 0xf, 0x4, - 0x30, 0x7, 0xb, 0xb, 0x4, 0x1b, 0x1, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0x35, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x35, 0xff, 0xc0, 0x38, 0x59, 0x17, 0x6, 0x7, 0x6, 0x23, - 0x37, 0x32, 0x37, 0x13, 0x3e, 0x1, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x6, 0x7, 0x6, - 0x15, 0x14, 0x16, 0x7, 0xe, 0x1, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x1, 0x37, 0x36, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, - 0x82, 0xb, 0x3e, 0x35, 0x4f, 0x9, 0x68, 0xb, 0x5a, 0xb, 0x6c, 0x53, 0x59, 0x2d, 0x22, 0x1b, - 0x1a, 0x19, 0x1b, 0x5d, 0x6, 0x8, 0x69, 0x48, 0x3f, 0x2b, 0x2b, 0x1a, 0x28, 0x22, 0x38, 0x6, - 0x6, 0x31, 0x33, 0x2, 0x7, 0x5c, 0x6, 0x5, 0x14, 0x16, 0x2b, 0x32, 0x20, 0x1a, 0x6, 0x35, - 0x51, 0x28, 0x21, 0x44, 0x52, 0x2, 0xaf, 0x57, 0x5f, 0x33, 0x27, 0x37, 0x34, 0x32, 0x26, 0x26, - 0x29, 0x22, 0x26, 0x99, 0x38, 0x50, 0x5f, 0x23, 0x39, 0x13, 0x38, 0x2b, 0x2b, 0x47, 0x4c, 0x33, - 0xb, 0xa, 0x38, 0x75, 0x30, 0x27, 0x1b, 0x1f, 0x25, 0x1f, 0x2c, 0x0, 0x0, 0x1, 0x0, 0x3c, - 0x2, 0x6d, 0x0, 0xd0, 0x3, 0x7, 0x0, 0x3, 0x0, 0x39, 0x40, 0xf, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, - 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, - 0xc0, 0x38, 0x59, 0x13, 0x7, 0x23, 0x37, 0xd0, 0x53, 0x41, 0x49, 0x3, 0x7, 0x9a, 0x9a, 0x0, - 0x0, 0x2, 0x0, 0x3b, 0x2, 0x6f, 0x1, 0x44, 0x2, 0xd9, 0x0, 0xb, 0x0, 0x17, 0x0, 0x3d, - 0x40, 0x11, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x12, 0xc, 0x6, 0x0, 0x15, 0x9, 0xf, 0x3, - 0x1, 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0xe, 0x1, - 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, - 0x3e, 0x1, 0x33, 0x32, 0x16, 0x1, 0x42, 0x1, 0x22, 0x15, 0x16, 0x1d, 0x1, 0x1, 0x21, 0x17, - 0x16, 0x1d, 0x9e, 0x1, 0x22, 0x15, 0x16, 0x1d, 0x1, 0x1, 0x21, 0x17, 0x15, 0x1e, 0x2, 0xa6, - 0x16, 0x21, 0x1f, 0x15, 0x17, 0x1f, 0x1e, 0x15, 0x16, 0x21, 0x1f, 0x15, 0x17, 0x1f, 0x1e, 0x0, - 0x0, 0x2, 0xff, 0xe2, 0x0, 0x0, 0x3, 0xa1, 0x3, 0xc, 0x0, 0x5, 0x0, 0x15, 0x0, 0x6b, - 0x40, 0x2a, 0x1, 0x16, 0x16, 0x40, 0x17, 0x6, 0x12, 0x11, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, - 0x8, 0x7, 0x5, 0x4, 0x2, 0x0, 0x14, 0x11, 0x10, 0xe, 0xd, 0xa, 0x9, 0x6, 0x4, 0x0, - 0x14, 0x13, 0x10, 0x3, 0xf, 0x1, 0x15, 0x6, 0x3, 0x1, 0x14, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x3f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x14, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x31, 0x23, 0x7, 0x3, - 0x33, 0x1, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, 0x37, 0x23, 0x7, 0x23, - 0x1, 0x1, 0xf1, 0x3, 0x15, 0xd4, 0xbc, 0x1, 0xe0, 0xa, 0xfe, 0xbc, 0x25, 0x1, 0x1d, 0xa, - 0xfe, 0xe3, 0x27, 0x1, 0x55, 0xa, 0xfe, 0x4f, 0x21, 0xd7, 0xa0, 0x5f, 0x1, 0xf7, 0x2, 0xa4, - 0x24, 0xfe, 0xbc, 0x1, 0xd0, 0x48, 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0x48, 0xf6, 0xf6, 0x3, 0xc, - 0x0, 0x3, 0x0, 0x5f, 0xff, 0xc5, 0x2, 0xfa, 0x3, 0x48, 0x0, 0x19, 0x0, 0x22, 0x0, 0x2b, - 0x0, 0x5e, 0x40, 0x23, 0x1, 0x2c, 0x2c, 0x40, 0x2d, 0x18, 0x25, 0x22, 0x1c, 0x13, 0x6, 0x26, - 0x23, 0x20, 0x1a, 0x18, 0x16, 0x15, 0xb, 0x9, 0x8, 0x28, 0x8, 0x4, 0x15, 0x14, 0x8, 0x7, - 0x11, 0x3, 0x4, 0x1, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x3c, - 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x2c, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2c, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, - 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x15, 0x14, 0x3, 0x26, 0x23, 0x22, 0x7, 0x6, - 0x15, 0x14, 0x17, 0x1, 0x34, 0x27, 0x1, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0xf5, 0x1b, 0x78, - 0x67, 0x84, 0x44, 0x3b, 0x32, 0x4f, 0x49, 0x61, 0x6, 0x1b, 0x79, 0x67, 0x85, 0x44, 0x3b, 0x33, - 0x4f, 0x4a, 0x5e, 0xbf, 0x2a, 0x38, 0x8b, 0x51, 0x44, 0x32, 0x1, 0xb5, 0x32, 0xfe, 0xb1, 0x29, - 0x38, 0x89, 0x51, 0x46, 0x1, 0x86, 0xc6, 0x6c, 0x5c, 0x1f, 0x52, 0x78, 0x57, 0xa2, 0x26, 0x2a, - 0xc7, 0x6b, 0x5c, 0x1f, 0x53, 0x7b, 0x58, 0xa1, 0x25, 0x1, 0x1, 0x19, 0x88, 0x73, 0x95, 0x74, - 0x40, 0x1, 0x47, 0x71, 0x44, 0xfd, 0xd7, 0x16, 0x86, 0x72, 0x0, 0x2, 0x0, 0x64, 0x0, 0x0, - 0x2, 0xa6, 0x3, 0x18, 0x0, 0x3, 0x0, 0xd, 0x0, 0x52, 0x40, 0x1d, 0x1, 0xe, 0xe, 0x40, - 0xf, 0x4, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x2, 0x0, 0x3, 0x0, 0x7, 0x2, 0x1, 0xd, - 0xa, 0x9, 0x3, 0x7, 0x6, 0x1, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x3f, 0x3c, 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x9, 0x0, 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, 0x37, - 0x9, 0x1, 0x3, 0x23, 0x13, 0x3, 0x33, 0x13, 0x33, 0x13, 0x2, 0x1d, 0x9, 0xfe, 0x81, 0x9, - 0x2, 0x8, 0xfe, 0xd9, 0x2f, 0x5a, 0x2f, 0xc1, 0x5d, 0x9e, 0x7, 0xfc, 0x1, 0x5a, 0x3f, 0x3f, - 0x1, 0x90, 0xfe, 0x53, 0xfe, 0xc3, 0x1, 0x41, 0x1, 0xcb, 0xfe, 0x93, 0x1, 0x79, 0x0, 0x2, - 0x0, 0x3c, 0x1, 0xb6, 0x1, 0x7b, 0x3, 0x35, 0x0, 0x14, 0x0, 0x22, 0x0, 0x49, 0x40, 0x17, - 0x1, 0x23, 0x23, 0x40, 0x24, 0x0, 0x1e, 0x17, 0x14, 0x13, 0x6, 0x4, 0x3, 0x0, 0x1b, 0x15, - 0xb, 0x0, 0x11, 0x8, 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0xb, 0x0, 0x23, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x23, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x6, 0x17, 0x23, 0x26, 0x37, 0x6, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x7, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x1, 0x7b, 0x26, 0x9, 0x8, 0x3c, - 0x9, 0x2, 0x29, 0x34, 0x35, 0x43, 0x4, 0xf, 0x39, 0x27, 0x34, 0x37, 0x21, 0x6, 0xe, 0x23, - 0x2f, 0x52, 0x13, 0x3, 0x26, 0x1e, 0x1d, 0x20, 0x15, 0xb, 0x3, 0x2f, 0xfe, 0xf4, 0x42, 0x25, - 0xd, 0x14, 0x27, 0x55, 0x49, 0x18, 0x1a, 0x64, 0x2c, 0x1f, 0x1b, 0x15, 0x52, 0x22, 0x85, 0x14, - 0x12, 0x31, 0x39, 0x1b, 0x12, 0x12, 0x0, 0x2, 0x0, 0x3c, 0x1, 0xb6, 0x1, 0x70, 0x3, 0x35, - 0x0, 0x11, 0x0, 0x1d, 0x0, 0x3d, 0x40, 0x11, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x10, 0x1c, 0x16, - 0x1a, 0x14, 0x10, 0x6, 0xc, 0x2, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, - 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x33, - 0x32, 0x1, 0x6d, 0x1a, 0x96, 0x39, 0x22, 0x26, 0x3, 0xd, 0x33, 0x2d, 0x44, 0x36, 0x22, 0x28, - 0x41, 0x3, 0x4b, 0x58, 0x12, 0x3, 0x4b, 0x58, 0x2, 0x75, 0xbf, 0x22, 0x27, 0x4a, 0x15, 0x17, - 0x62, 0x31, 0x2d, 0x22, 0x27, 0x4b, 0x15, 0x17, 0x15, 0x12, 0x63, 0x8a, 0x16, 0x12, 0x63, 0x0, - 0x0, 0x3, 0x0, 0x0, 0xff, 0xf7, 0x2, 0xda, 0x2, 0x1b, 0x0, 0x33, 0x0, 0x41, 0x0, 0x4e, - 0x0, 0x6a, 0x40, 0x29, 0x1, 0x4f, 0x4f, 0x40, 0x50, 0x0, 0x4c, 0x44, 0x3e, 0x2d, 0x28, 0x21, - 0x1f, 0x15, 0x10, 0xe, 0x8, 0x6, 0x48, 0x42, 0x3c, 0x36, 0x29, 0x24, 0x1b, 0x11, 0xa, 0x0, - 0x3a, 0x26, 0x7, 0x2b, 0x31, 0x2b, 0x2, 0x17, 0x13, 0x1, 0x1, 0x1b, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1b, 0x0, 0x4f, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4f, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, - 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x36, - 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, - 0x7, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x16, 0x33, 0x32, 0x37, 0x36, 0x5, 0x26, - 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x17, 0x16, 0x33, 0x32, 0x37, 0x2, 0xd6, 0x3, 0x31, 0x2a, - 0x3f, 0x24, 0x2a, 0x2e, 0x30, 0x1, 0x1f, 0x21, 0x3a, 0x3d, 0x38, 0x33, 0x4a, 0x6e, 0x65, 0x30, - 0x57, 0x5f, 0x49, 0x2f, 0x33, 0x47, 0x42, 0x54, 0x30, 0x39, 0x8, 0x1, 0x56, 0x42, 0x35, 0x13, - 0x4a, 0x48, 0x63, 0x28, 0x14, 0x28, 0x2e, 0x32, 0x51, 0x61, 0x62, 0x2, 0x1f, 0x19, 0x20, 0x73, - 0x19, 0x16, 0x33, 0x27, 0x1f, 0x47, 0xfe, 0xd0, 0x38, 0x29, 0x2d, 0x26, 0x2a, 0x4, 0x3, 0x1b, - 0x18, 0x28, 0x4d, 0x2f, 0x1, 0x80, 0x40, 0x2d, 0x26, 0xe, 0x8, 0xa, 0xc, 0xc, 0x40, 0x25, - 0x28, 0x30, 0x33, 0x42, 0x4e, 0x4e, 0x24, 0x26, 0x43, 0x52, 0x39, 0x34, 0xe, 0x38, 0xd, 0xb, - 0x4f, 0x20, 0x42, 0x24, 0x4c, 0x1f, 0x16, 0x18, 0x52, 0x50, 0x9, 0x8, 0x25, 0x14, 0xf, 0xaa, - 0x9, 0x8, 0x10, 0x4a, 0xd, 0x1b, 0x1e, 0x2f, 0x28, 0x16, 0x13, 0x36, 0x0, 0x3, 0x0, 0x37, - 0xff, 0xc4, 0x2, 0x18, 0x2, 0x48, 0x0, 0x3, 0x0, 0x15, 0x0, 0x21, 0x0, 0x4b, 0x40, 0x19, - 0x1, 0x22, 0x22, 0x40, 0x23, 0x0, 0x20, 0x1a, 0x1e, 0x18, 0x14, 0xa, 0x2, 0x0, 0x1, 0x0, - 0x3, 0x2, 0x10, 0x2, 0x6, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x22, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x1, 0x33, 0x1, 0x2, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, - 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x2, 0x18, 0x4a, 0xfe, 0x69, - 0x4a, 0x1, 0x90, 0x24, 0xd3, 0x52, 0x32, 0x38, 0x4, 0x13, 0x48, 0x41, 0x61, 0x4d, 0x31, 0x39, - 0x5d, 0x5, 0x68, 0x81, 0x1b, 0x5, 0x6c, 0x7e, 0x2, 0x48, 0xfd, 0x7c, 0x1, 0x44, 0xfe, 0xf0, - 0x31, 0x37, 0x6b, 0x1d, 0x20, 0x8c, 0x47, 0x3f, 0x30, 0x38, 0x6c, 0x1d, 0x21, 0x25, 0x1e, 0x86, - 0xc9, 0x24, 0x1d, 0x86, 0x0, 0x2, 0x0, 0x3c, 0xff, 0xf3, 0x1, 0xca, 0x3, 0x13, 0x0, 0xb, - 0x0, 0x2c, 0x0, 0x48, 0x40, 0x17, 0x1, 0x2d, 0x2d, 0x40, 0x2e, 0xc, 0x2c, 0x28, 0x1b, 0x1a, - 0x3, 0x24, 0x1b, 0x11, 0xc, 0x6, 0x0, 0xe, 0x9, 0x3, 0x1, 0x11, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x11, 0x0, 0x2d, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, 0x1, 0xe, 0x1, 0x23, - 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x13, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x1, 0x33, 0x7, 0x6, 0x7, 0x6, 0x7, 0x6, 0x7, 0x6, - 0x7, 0x6, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x1, 0xb4, 0x4, 0x27, 0x1b, 0x1a, 0x24, - 0x3, 0x4, 0x28, 0x1a, 0x1b, 0x23, 0x13, 0x5c, 0x65, 0x5f, 0x6e, 0x2, 0x8, 0x2d, 0x2f, 0x2f, - 0x52, 0xc, 0xa, 0x53, 0x8, 0x4, 0x22, 0x23, 0x32, 0x27, 0x27, 0x26, 0x3, 0x5, 0x2a, 0x22, - 0x30, 0x31, 0x26, 0x14, 0x34, 0x2, 0xd1, 0x1c, 0x23, 0x28, 0x1b, 0x1a, 0x24, 0x28, 0xfd, 0x47, - 0x3f, 0x5d, 0x4b, 0xc, 0xd, 0x3f, 0x2b, 0x24, 0x24, 0x41, 0x52, 0x4b, 0x4c, 0x30, 0x37, 0x3a, - 0x27, 0x1d, 0x1c, 0x22, 0x29, 0x3b, 0x1e, 0x18, 0xf, 0x9, 0x20, 0x0, 0x0, 0x2, 0x0, 0x28, - 0xff, 0xf2, 0x1, 0x1, 0x3, 0xc, 0x0, 0x3, 0x0, 0xf, 0x0, 0x42, 0x40, 0x14, 0x1, 0x10, - 0x10, 0x40, 0x11, 0xa, 0xd, 0x2, 0x1, 0xa, 0x4, 0x2, 0x0, 0x3, 0x0, 0x7, 0x3, 0x1, - 0x0, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x0, 0x0, 0x10, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x17, 0x13, - 0x33, 0xb, 0x1, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0xe, 0x1, 0x23, 0x22, 0x26, 0x28, 0x5c, - 0x47, 0x3f, 0xf, 0x3, 0x28, 0x1a, 0x1c, 0x23, 0x3, 0x4, 0x28, 0x1b, 0x1b, 0x23, 0xe, 0x2, - 0x38, 0xfd, 0xc8, 0x2, 0xd9, 0x1b, 0x26, 0x26, 0x1b, 0x1b, 0x25, 0x26, 0x0, 0x1, 0x0, 0x14, - 0xff, 0x60, 0x1, 0xef, 0x3, 0x32, 0x0, 0x1b, 0x0, 0x56, 0x40, 0x21, 0x1, 0x1c, 0x1c, 0x40, - 0x1d, 0x0, 0x1, 0x15, 0x14, 0x10, 0x9, 0x8, 0x0, 0x3, 0x7, 0x1a, 0x15, 0x14, 0xb, 0x3, - 0xa, 0x7, 0x17, 0x16, 0x9, 0x3, 0x8, 0x10, 0x1a, 0x4, 0x1, 0x10, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x10, 0x0, 0x1c, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0xf, 0x1, 0x33, 0x7, 0x23, 0x3, 0x6, 0x7, 0x6, - 0x27, 0x37, 0x32, 0x37, 0x13, 0x23, 0x37, 0x33, 0x37, 0x36, 0x33, 0x32, 0x1, 0xef, 0x23, 0x1f, - 0x2b, 0x22, 0x11, 0xe, 0x7, 0x18, 0x64, 0x8, 0x64, 0x36, 0xb, 0x3f, 0x36, 0x50, 0xa, 0x66, - 0xb, 0x36, 0x48, 0x8, 0x48, 0x18, 0x18, 0x85, 0x37, 0x3, 0xe, 0x3f, 0x1d, 0x1d, 0x18, 0x35, - 0xaf, 0x42, 0xfe, 0x70, 0x53, 0x2a, 0x24, 0x1, 0x47, 0x57, 0x1, 0x92, 0x42, 0xad, 0xb2, 0x0, - 0x0, 0x2, 0x0, 0x3c, 0x0, 0x3c, 0x2, 0x82, 0x2, 0x12, 0x0, 0x6, 0x0, 0xd, 0x0, 0x4e, - 0x40, 0x1c, 0x1, 0xe, 0xe, 0x40, 0xf, 0x0, 0xb, 0x9, 0x8, 0x7, 0x4, 0x2, 0x1, 0x0, - 0xa, 0x9, 0x3, 0x3, 0x2, 0xd, 0x7, 0x6, 0x3, 0x0, 0x2, 0x1, 0xb, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0xe, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xe, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, - 0x17, 0x23, 0x27, 0x3f, 0x1, 0x23, 0x7, 0x17, 0x23, 0x27, 0x3f, 0x1, 0x2, 0x82, 0xfa, 0xb0, - 0x59, 0xb0, 0x3, 0xed, 0x90, 0xfa, 0xb0, 0x59, 0xb0, 0x2, 0xee, 0x2, 0x12, 0xec, 0xea, 0xe4, - 0x11, 0xe1, 0xec, 0xea, 0xe4, 0x11, 0xe1, 0x0, 0x0, 0x2, 0x0, 0x36, 0x0, 0x3c, 0x2, 0x7c, - 0x2, 0x12, 0x0, 0x6, 0x0, 0xd, 0x0, 0x4e, 0x40, 0x1c, 0x1, 0xe, 0xe, 0x40, 0xf, 0xb, - 0xb, 0x9, 0x8, 0x7, 0x4, 0x2, 0x1, 0x0, 0xd, 0x7, 0x6, 0x3, 0x0, 0xa, 0x9, 0x3, - 0x3, 0x2, 0x2, 0x1, 0x0, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x0, 0x0, 0xe, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0xe, 0xff, 0xc0, 0x38, 0x59, 0x3f, 0x1, 0x27, 0x33, 0x17, 0xf, 0x1, 0x33, 0x37, 0x27, - 0x33, 0x17, 0xf, 0x1, 0x36, 0xfa, 0xaf, 0x59, 0xaf, 0x3, 0xed, 0x90, 0xfa, 0xaf, 0x59, 0xaf, - 0x2, 0xee, 0x3c, 0xec, 0xea, 0xe4, 0x11, 0xe1, 0xec, 0xea, 0xe4, 0x11, 0xe1, 0x0, 0x0, 0x3, - 0x0, 0x52, 0xff, 0xf3, 0x2, 0xcf, 0x0, 0x74, 0x0, 0xb, 0x0, 0x17, 0x0, 0x23, 0x0, 0x45, - 0x40, 0x15, 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x1e, 0x18, 0x12, 0xc, 0x6, 0x0, 0x21, 0x15, - 0x9, 0x1b, 0xf, 0x3, 0x1, 0x1e, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x3c, 0x2f, - 0x3c, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x1e, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x24, 0xff, 0xc0, 0x38, 0x59, 0x25, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, - 0x16, 0x5, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0xe, 0x1, - 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x2, 0xcb, 0x3, 0x28, 0x1a, 0x1b, 0x24, - 0x4, 0x3, 0x27, 0x1b, 0x1b, 0x24, 0xfe, 0xfd, 0x4, 0x28, 0x1a, 0x1b, 0x23, 0x3, 0x4, 0x27, - 0x1b, 0x1a, 0x24, 0xf9, 0x4, 0x27, 0x1a, 0x1b, 0x24, 0x4, 0x3, 0x27, 0x1b, 0x1b, 0x24, 0x31, - 0x1a, 0x24, 0x28, 0x1a, 0x1b, 0x24, 0x28, 0x1b, 0x1a, 0x24, 0x28, 0x1a, 0x1b, 0x24, 0x28, 0x1b, - 0x1a, 0x24, 0x28, 0x1a, 0x1b, 0x24, 0x28, 0x0, 0x0, 0x2, 0x0, 0x5f, 0xff, 0xfa, 0x4, 0x5, - 0x3, 0x14, 0x0, 0x18, 0x0, 0x26, 0x0, 0x61, 0x40, 0x25, 0x1, 0x27, 0x27, 0x40, 0x28, 0xd, - 0x24, 0x1b, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0x20, 0x19, 0x15, 0x14, 0x11, 0x10, - 0xd, 0x4, 0x17, 0x16, 0x1, 0xd, 0xc, 0x3, 0xa, 0x3, 0x0, 0x1, 0x1, 0x4, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0x27, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x27, 0xff, 0xc0, 0x38, 0x59, 0x5, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x21, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, 0x3, 0x21, 0x7, - 0x21, 0x6, 0x13, 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x1, 0x7e, 0x73, 0x4f, 0x5d, 0x4, 0x15, 0x7d, 0x66, 0x84, 0x45, 0x3f, 0x1, 0xa2, 0xa, 0xfe, - 0xbc, 0x25, 0x1, 0x1d, 0xa, 0xfe, 0xe3, 0x28, 0x1, 0x55, 0xa, 0xfe, 0x4e, 0x27, 0x88, 0x4b, - 0x31, 0x6a, 0xa6, 0x11, 0x4, 0x35, 0x36, 0x53, 0x5b, 0x2b, 0x6, 0x4f, 0x5c, 0xa4, 0x20, 0x23, - 0xc8, 0x6a, 0x56, 0x8, 0x48, 0xfe, 0xf1, 0x48, 0xfe, 0xdb, 0x48, 0x6, 0x2, 0xcc, 0x8, 0xba, - 0x8e, 0x1b, 0x1b, 0x73, 0x4e, 0x51, 0x7, 0x0, 0x0, 0x3, 0x0, 0x37, 0xff, 0xf7, 0x3, 0x2e, - 0x2, 0x1b, 0x0, 0x24, 0x0, 0x30, 0x0, 0x3c, 0x0, 0x5b, 0x40, 0x21, 0x1, 0x3d, 0x3d, 0x40, - 0x3e, 0x0, 0x3b, 0x35, 0x2d, 0x29, 0x20, 0x12, 0xd, 0xb, 0x8, 0x6, 0x39, 0x33, 0x2b, 0x25, - 0x18, 0xe, 0x8, 0x0, 0x22, 0x1e, 0x2, 0x14, 0x10, 0x1, 0x1, 0x18, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x18, 0x0, 0x3d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x3d, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x6, 0x16, - 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x7, 0x36, 0x27, 0x26, 0x23, 0x22, - 0x7, 0x16, 0x33, 0x32, 0x37, 0x36, 0x5, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, - 0x33, 0x32, 0x3, 0x2b, 0x4, 0x31, 0x29, 0x40, 0x24, 0x2c, 0x32, 0x30, 0x2, 0x41, 0x3d, 0x4c, - 0x34, 0x2c, 0x4a, 0x71, 0x6d, 0x31, 0x42, 0x7b, 0x4c, 0x31, 0x39, 0x4, 0x10, 0x4b, 0x41, 0x5f, - 0x66, 0x2f, 0x42, 0x6b, 0x53, 0x63, 0x61, 0x5, 0x20, 0x18, 0x24, 0x7a, 0x1a, 0x17, 0x38, 0x1e, - 0x1a, 0x5b, 0xfe, 0xcc, 0x5, 0x68, 0x81, 0x1b, 0x4, 0x69, 0x80, 0x1, 0x80, 0x40, 0x2d, 0x26, - 0xe, 0x8, 0xa, 0x48, 0x58, 0x2c, 0x34, 0x42, 0x67, 0x66, 0x33, 0x3c, 0x6d, 0x1b, 0x1d, 0x8a, - 0x47, 0x3d, 0x5b, 0x5c, 0x57, 0x4b, 0x2f, 0x17, 0x13, 0xb1, 0x8, 0x4, 0xf, 0x24, 0x25, 0x1e, - 0x87, 0xca, 0x21, 0x1c, 0x8b, 0x0, 0x0, 0x1, 0x0, 0x3c, 0x0, 0xf4, 0x1, 0xd2, 0x1, 0x34, - 0x0, 0x3, 0x0, 0x39, 0x40, 0xf, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, - 0x2, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, - 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, - 0x37, 0x1, 0xd2, 0x8, 0xfe, 0x72, 0x8, 0x1, 0x34, 0x40, 0x40, 0x0, 0x0, 0x1, 0x0, 0x3c, - 0x0, 0xf4, 0x2, 0x54, 0x1, 0x34, 0x0, 0x3, 0x0, 0x39, 0x40, 0xf, 0x1, 0x4, 0x4, 0x40, - 0x5, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, - 0x0, 0x4, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, 0x37, 0x2, 0x54, 0x9, 0xfd, 0xf1, 0x9, 0x1, 0x34, 0x40, - 0x40, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x2, 0x4b, 0x1, 0x78, 0x3, 0x33, 0x0, 0x10, 0x0, 0x21, - 0x0, 0x45, 0x40, 0x15, 0x1, 0x22, 0x22, 0x40, 0x23, 0x1c, 0x1c, 0x18, 0x14, 0x11, 0xb, 0x7, - 0x3, 0x0, 0x13, 0x2, 0x1f, 0xe, 0x1, 0x0, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, - 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x0, 0x0, 0x22, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x34, 0x37, 0x17, 0x6, 0x7, 0x6, 0x15, 0x14, - 0x17, 0x16, 0x7, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x34, 0x37, 0x17, 0x6, 0x7, 0x6, 0x15, - 0x14, 0x17, 0x16, 0x7, 0xe, 0x1, 0x23, 0x22, 0x26, 0x3b, 0x64, 0x15, 0xd, 0x11, 0x13, 0x7, - 0x34, 0x4, 0x1, 0x27, 0x1b, 0x1a, 0x22, 0xba, 0x64, 0x15, 0xd, 0x11, 0x13, 0x7, 0x34, 0x4, - 0x1, 0x27, 0x1b, 0x1a, 0x22, 0x2, 0x90, 0x50, 0x53, 0x14, 0xb, 0x1b, 0x1e, 0xf, 0x9, 0x1, - 0x7, 0x35, 0x1a, 0x21, 0x29, 0x1c, 0x50, 0x53, 0x14, 0xb, 0x1b, 0x1e, 0xf, 0x9, 0x1, 0x7, - 0x35, 0x1a, 0x21, 0x29, 0xff, 0xff, 0x0, 0x78, 0x2, 0x4d, 0x1, 0xb8, 0x3, 0x35, 0x0, 0x27, - 0x0, 0xf, 0x0, 0x19, 0x2, 0xbf, 0x0, 0x7, 0x0, 0xf, 0x0, 0xd9, 0x2, 0xbf, 0x0, 0x1, - 0x0, 0x64, 0x2, 0x4b, 0x0, 0xe7, 0x3, 0x33, 0x0, 0xf, 0x0, 0x39, 0x40, 0xf, 0x1, 0x10, - 0x10, 0x40, 0x11, 0xa, 0xa, 0x6, 0x3, 0x0, 0x2, 0xd, 0x1, 0x0, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x0, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x10, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x34, 0x37, 0x17, 0xe, 0x1, 0x15, 0x14, 0x17, 0x16, 0x7, - 0xe, 0x1, 0x23, 0x22, 0x26, 0x64, 0x64, 0x15, 0xd, 0x24, 0x8, 0x33, 0x3, 0x2, 0x26, 0x1c, - 0x19, 0x23, 0x2, 0x90, 0x51, 0x52, 0x14, 0xa, 0x3a, 0xf, 0x8, 0x2, 0x7, 0x35, 0x1a, 0x21, - 0x2a, 0x0, 0xff, 0xff, 0x0, 0x78, 0x2, 0x4b, 0x0, 0xf8, 0x3, 0x33, 0x0, 0x7, 0x0, 0xf, - 0x0, 0x19, 0x2, 0xbd, 0xff, 0xff, 0x0, 0x3c, 0x0, 0x0, 0x2, 0x10, 0x3, 0x56, 0x0, 0x6, - 0x0, 0x12, 0x0, 0x0, 0x0, 0x3, 0x0, 0x3c, 0xff, 0xf9, 0x2, 0xed, 0x3, 0x14, 0x0, 0x3, - 0x0, 0x7, 0x0, 0x25, 0x0, 0x5d, 0x40, 0x23, 0x1, 0x26, 0x26, 0x40, 0x27, 0x8, 0x17, 0x15, - 0xb, 0x9, 0x1e, 0x18, 0x11, 0x8, 0x7, 0x5, 0x3, 0x1, 0x7, 0x6, 0x7, 0x5, 0x4, 0x1, - 0x0, 0x7, 0x3, 0x2, 0x24, 0x3, 0x1a, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3f, 0x2f, 0x3c, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, - 0x0, 0x26, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x26, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x21, 0x37, 0x21, 0x7, 0x21, 0x37, 0x21, 0x13, 0x7, 0x26, 0x23, 0x22, - 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x2, 0x2d, 0xfe, 0x23, 0x8, 0x1, 0xdd, - 0x1c, 0xfe, 0x23, 0x8, 0x1, 0xdd, 0xcc, 0x45, 0x33, 0x6d, 0x6c, 0x46, 0x40, 0x12, 0x5, 0x2e, - 0x2f, 0x56, 0x72, 0x4a, 0x3b, 0x5e, 0xa0, 0x6a, 0x4b, 0x58, 0x6, 0x19, 0x72, 0x5e, 0x74, 0xa3, - 0x1, 0xb9, 0x3a, 0xce, 0x3a, 0x1, 0x23, 0x21, 0x68, 0x60, 0x57, 0x8d, 0x27, 0x24, 0x70, 0x42, - 0x45, 0x6d, 0x28, 0x8f, 0x4c, 0x58, 0x9c, 0x24, 0x28, 0xc8, 0x6d, 0x5a, 0x0, 0x1, 0x0, 0x3c, - 0x0, 0x3c, 0x1, 0x8f, 0x2, 0x12, 0x0, 0x6, 0x0, 0x3e, 0x40, 0x12, 0x1, 0x7, 0x7, 0x40, - 0x8, 0x0, 0x4, 0x2, 0x1, 0x0, 0x3, 0x2, 0x6, 0x0, 0x2, 0x1, 0x4, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x17, 0x23, 0x27, 0x3f, 0x1, 0x1, - 0x8f, 0xfa, 0xb0, 0x5a, 0xaf, 0x2, 0xee, 0x2, 0x12, 0xec, 0xea, 0xe3, 0x11, 0xe2, 0x0, 0x1, - 0x0, 0x2f, 0x0, 0x3c, 0x1, 0x82, 0x2, 0x12, 0x0, 0x6, 0x0, 0x3e, 0x40, 0x12, 0x1, 0x7, - 0x7, 0x40, 0x8, 0x4, 0x4, 0x2, 0x1, 0x0, 0x6, 0x0, 0x3, 0x2, 0x2, 0x1, 0x0, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x0, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x3f, 0x1, 0x27, 0x33, 0x17, 0xf, - 0x1, 0x2f, 0xf9, 0xaf, 0x59, 0xb0, 0x3, 0xed, 0x3c, 0xec, 0xea, 0xe3, 0x11, 0xe2, 0xff, 0xff, - 0xff, 0xce, 0xff, 0x31, 0x2, 0x32, 0x3, 0x30, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, - 0x0, 0x4c, 0x1, 0x28, 0x0, 0x0, 0xff, 0xff, 0xff, 0xce, 0xff, 0x31, 0x2, 0x32, 0x3, 0x32, - 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4f, 0x1, 0x36, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x55, 0xff, 0x38, 0x2, 0x3b, 0x3, 0x32, 0x0, 0x13, 0x0, 0x6b, 0x40, 0x2b, 0x1, 0x14, - 0x14, 0x40, 0x15, 0xf, 0x13, 0x12, 0x7, 0x6, 0x5, 0x4, 0x1, 0x0, 0x13, 0x12, 0xf, 0xe, - 0xd, 0x9, 0x8, 0x5, 0x4, 0x3, 0x11, 0x10, 0x9, 0x3, 0x8, 0x7, 0xf, 0xe, 0xb, 0x3, - 0xa, 0x3, 0x2, 0xd, 0xc, 0x4, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, - 0x2f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x5, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x3, 0x23, 0x13, 0x23, 0x37, 0x33, 0x13, - 0x23, 0x37, 0x33, 0x13, 0x33, 0x3, 0x33, 0x7, 0x23, 0x3, 0x33, 0x2, 0x5, 0xb0, 0x2c, 0x50, - 0x2c, 0xb0, 0x9, 0xb0, 0x25, 0xb0, 0x8, 0xb0, 0x28, 0x50, 0x28, 0xb0, 0x8, 0xb0, 0x25, 0xb0, - 0x7f, 0xfe, 0xb9, 0x1, 0x47, 0x41, 0x1, 0xe, 0x42, 0x1, 0x22, 0xfe, 0xde, 0x42, 0xfe, 0xf2, - 0xff, 0xff, 0x0, 0x3c, 0x0, 0xe3, 0x0, 0xbe, 0x1, 0x64, 0x0, 0x7, 0x0, 0x11, 0x0, 0x0, - 0x0, 0xf0, 0xff, 0xff, 0x0, 0x3c, 0xff, 0x8e, 0x0, 0xbc, 0x0, 0x76, 0x0, 0x6, 0x0, 0xf, - 0xdd, 0x0, 0xff, 0xff, 0x0, 0x5c, 0xff, 0x8e, 0x1, 0x9c, 0x0, 0x76, 0x0, 0x26, 0x0, 0xf, - 0xff, 0x0, 0x0, 0x7, 0x0, 0xf, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x55, 0xff, 0xec, - 0x5, 0x1, 0x3, 0x4e, 0x0, 0xb, 0x0, 0x17, 0x0, 0x1b, 0x0, 0x27, 0x0, 0x33, 0x0, 0x3f, - 0x0, 0x4b, 0x0, 0x6d, 0x40, 0x2a, 0x1, 0x4c, 0x4c, 0x40, 0x4d, 0x9, 0x43, 0x3d, 0x37, 0x2b, - 0x22, 0x12, 0xc, 0x6, 0x46, 0x40, 0x3a, 0x34, 0x2e, 0x28, 0x25, 0x1f, 0x1a, 0x18, 0x15, 0xf, - 0x9, 0x3, 0x49, 0x31, 0x7, 0x0, 0x1b, 0x18, 0x1a, 0x19, 0x1c, 0x0, 0x1, 0x1, 0xf, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xf, 0x0, 0x4c, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4c, 0xff, 0xc0, 0x38, - 0x59, 0x5, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x1, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x9, 0x1, 0x23, 0x1, 0x3, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x25, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x4, 0x3b, 0x46, - 0x60, 0x79, 0x51, 0x46, 0x5c, 0x74, 0xfc, 0x6e, 0x46, 0x60, 0x79, 0x51, 0x46, 0x5c, 0x74, 0x1, - 0xd3, 0xfd, 0x85, 0x4f, 0x2, 0x7b, 0x66, 0x45, 0x61, 0x79, 0x52, 0x45, 0x5c, 0x74, 0x1, 0xfc, - 0x34, 0x2b, 0x36, 0x47, 0x33, 0x2b, 0x37, 0x47, 0xfc, 0xc1, 0x35, 0x2b, 0x36, 0x47, 0x34, 0x2a, - 0x37, 0x48, 0x1, 0x70, 0x34, 0x2c, 0x36, 0x47, 0x34, 0x2b, 0x36, 0x48, 0x2, 0x59, 0x43, 0x52, - 0x78, 0x57, 0x43, 0x52, 0x7a, 0x1, 0xe6, 0x5a, 0x43, 0x51, 0x78, 0x57, 0x43, 0x52, 0x7a, 0x1, - 0x6a, 0xfc, 0x9e, 0x3, 0x62, 0xfc, 0xb0, 0x59, 0x43, 0x52, 0x78, 0x57, 0x43, 0x52, 0x7a, 0xc6, - 0x2a, 0x34, 0x4e, 0x36, 0x2a, 0x33, 0x4c, 0x2, 0x1d, 0x2b, 0x33, 0x4d, 0x36, 0x2b, 0x33, 0x4d, - 0xfe, 0x50, 0x2a, 0x34, 0x4e, 0x36, 0x2a, 0x33, 0x4c, 0x0, 0x0, 0x1, 0x0, 0x5c, 0xff, 0xf8, - 0x0, 0xe7, 0x2, 0x12, 0x0, 0xc, 0x0, 0x3d, 0x40, 0x12, 0x1, 0xd, 0xd, 0x40, 0xe, 0x0, - 0x9, 0x5, 0x3, 0x0, 0x6, 0x1, 0xc, 0x0, 0x2, 0x1, 0x9, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x3f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x9, 0x0, 0xd, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0xd, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x3, 0x6, 0x15, 0x14, 0x17, 0x7, 0x22, 0x26, 0x35, 0x34, - 0x37, 0x13, 0xe7, 0x33, 0x3, 0x2c, 0x9, 0x34, 0x44, 0x3, 0x33, 0x2, 0x12, 0xfe, 0x97, 0x14, - 0x10, 0x3d, 0x7, 0x49, 0x4c, 0x40, 0x11, 0x12, 0x1, 0x6b, 0x0, 0x1, 0x0, 0x54, 0x2, 0x73, - 0x1, 0x68, 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x0, - 0x2, 0x4, 0x0, 0x6, 0x5, 0x4, 0x3, 0x1, 0x3, 0x0, 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x4, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x1, 0x68, - 0x43, 0x39, 0x51, 0x47, 0x81, 0x40, 0x2, 0x73, 0x56, 0x56, 0x92, 0x0, 0x0, 0x1, 0x0, 0x60, - 0x2, 0x7c, 0x1, 0x8f, 0x2, 0xdf, 0x0, 0x11, 0x0, 0x40, 0x40, 0x13, 0x1, 0x12, 0x12, 0x40, - 0x13, 0x0, 0x11, 0xd, 0x7, 0x8, 0x0, 0x5, 0x7, 0xa, 0xa, 0x2, 0x1, 0x8, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x12, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x12, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, - 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x1, 0x8f, 0x36, 0x2b, - 0x15, 0x40, 0x15, 0x29, 0x20, 0x1b, 0x2e, 0x32, 0x17, 0x40, 0xe, 0x1a, 0x7, 0x14, 0x1d, 0x2, - 0xa2, 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x2, 0x4, 0x14, 0x0, 0x1, 0x0, 0x4d, 0x2, 0x97, - 0x1, 0x4e, 0x2, 0xd7, 0x0, 0x3, 0x0, 0x39, 0x40, 0xf, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, - 0x2, 0x0, 0x3, 0x0, 0x2, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, - 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x7, 0x23, 0x37, 0x1, 0x4e, 0x9, 0xf8, 0x9, 0x2, 0xd7, 0x40, 0x40, 0x0, 0x1, - 0x0, 0x6b, 0x2, 0x7b, 0x1, 0xb6, 0x3, 0x8, 0x0, 0xe, 0x0, 0x3c, 0x40, 0x11, 0x1, 0xf, - 0xf, 0x40, 0x10, 0x0, 0x7, 0x0, 0xb, 0x7, 0x4, 0xe, 0x8, 0x4, 0x1, 0x7, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x26, 0x27, - 0x37, 0x1e, 0x1, 0x33, 0x32, 0x36, 0x37, 0x1, 0xb6, 0x18, 0x2d, 0x30, 0x37, 0x37, 0x5a, 0xe, - 0x35, 0x9, 0x3a, 0x24, 0x23, 0x46, 0x13, 0x2, 0xf4, 0x35, 0x21, 0x23, 0x41, 0x38, 0x14, 0x26, - 0x2e, 0x2e, 0x26, 0x0, 0xff, 0xff, 0x0, 0x3b, 0x2, 0x7c, 0x0, 0xbc, 0x2, 0xfd, 0x0, 0x7, - 0x0, 0x11, 0x0, 0x0, 0x2, 0x89, 0x0, 0x2, 0x0, 0x53, 0x2, 0x41, 0x1, 0x25, 0x3, 0x9, - 0x0, 0xb, 0x0, 0x17, 0x0, 0x40, 0x40, 0x13, 0x1, 0x18, 0x18, 0x40, 0x19, 0x0, 0x15, 0x12, - 0xc, 0x6, 0x0, 0xf, 0x7, 0x9, 0x9, 0x3, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x6, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, - 0x32, 0x16, 0x7, 0x36, 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x16, 0x33, 0x32, 0x36, 0x1, 0x20, - 0x5, 0x3d, 0x28, 0x29, 0x3a, 0x6, 0x5, 0x40, 0x29, 0x29, 0x35, 0x35, 0x3, 0x1b, 0x16, 0x16, - 0x22, 0x3, 0x3, 0x1d, 0x16, 0x15, 0x21, 0x2, 0xa5, 0x2a, 0x3a, 0x3c, 0x28, 0x2a, 0x3a, 0x3b, - 0x29, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x1e, 0x1e, 0x0, 0x1, 0xff, 0xdf, 0xff, 0x7, 0x0, 0x90, - 0x0, 0x1a, 0x0, 0x12, 0x0, 0x4a, 0x40, 0x18, 0x1, 0x13, 0x13, 0x40, 0x14, 0x10, 0xb, 0x9, - 0x3, 0x10, 0xe, 0xd, 0xb, 0x7, 0x2, 0x5, 0x7, 0x0, 0xd, 0xc, 0x0, 0x1, 0x2, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x13, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, - 0x17, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x7, 0x37, 0x33, 0x7, 0x16, - 0x15, 0x14, 0x6, 0x23, 0x2c, 0x18, 0x1e, 0x12, 0x17, 0x34, 0x9, 0x7, 0x2a, 0x13, 0x16, 0x27, - 0x33, 0x1a, 0x39, 0x3d, 0xf9, 0x1d, 0x1c, 0xf, 0x40, 0x32, 0xe, 0x6, 0x6, 0x69, 0x47, 0x13, - 0x42, 0x31, 0x46, 0x0, 0x0, 0x2, 0x0, 0x3b, 0x2, 0x62, 0x1, 0xbf, 0x3, 0x32, 0x0, 0x3, - 0x0, 0x7, 0x0, 0x46, 0x40, 0x18, 0x1, 0x8, 0x8, 0x40, 0x9, 0x0, 0x6, 0x4, 0x2, 0x0, - 0x6, 0x5, 0x2, 0x3, 0x1, 0x7, 0x4, 0x3, 0x3, 0x0, 0x4, 0x1, 0x6, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x8, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x8, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x23, 0x7, - 0x23, 0x37, 0x1, 0xbf, 0xa9, 0x33, 0x81, 0x4d, 0xa9, 0x33, 0x81, 0x3, 0x32, 0xd0, 0xd0, 0xd0, - 0xd0, 0x0, 0x0, 0x1, 0x0, 0x2f, 0xff, 0x7, 0x0, 0xdb, 0x0, 0x1a, 0x0, 0x13, 0x0, 0x43, - 0x40, 0x14, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0x13, 0x11, 0xe, 0xa, 0x8, 0x7, 0x5, 0x0, - 0x9, 0x8, 0x2, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, - 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, - 0xc0, 0x38, 0x59, 0x17, 0x6, 0x23, 0x22, 0x26, 0x37, 0x36, 0x37, 0x27, 0x33, 0x17, 0x26, 0x7, - 0x6, 0x7, 0x6, 0x16, 0x33, 0x32, 0x37, 0xdb, 0x22, 0x27, 0x2c, 0x37, 0x6, 0xb, 0x49, 0x10, - 0x30, 0x13, 0x14, 0x16, 0x2e, 0x5, 0x3, 0x1f, 0x1b, 0x1a, 0x12, 0xdc, 0x1d, 0x3f, 0x2b, 0x53, - 0xf, 0x47, 0x69, 0x4, 0x5, 0xa, 0x35, 0x1c, 0x26, 0x11, 0x0, 0x1, 0x0, 0x4a, 0x2, 0x73, - 0x1, 0x5e, 0x3, 0x5, 0x0, 0x6, 0x0, 0x3f, 0x40, 0x13, 0x1, 0x7, 0x7, 0x40, 0x8, 0x4, - 0x2, 0x4, 0x0, 0x4, 0x3, 0x1, 0x3, 0x0, 0x6, 0x5, 0x1, 0x0, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x0, 0x0, 0x7, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x7, 0xff, 0xc0, 0x38, 0x59, 0x13, 0x33, 0x17, 0x37, 0x33, 0x7, 0x23, 0x4a, 0x44, - 0x39, 0x50, 0x47, 0x80, 0x40, 0x3, 0x5, 0x56, 0x56, 0x92, 0xff, 0xff, 0x0, 0xe, 0xff, 0xf8, - 0x2, 0x40, 0x3, 0xc9, 0x0, 0x26, 0x0, 0x36, 0x0, 0x0, 0x0, 0x7, 0x0, 0x95, 0x0, 0xa4, - 0x0, 0xc4, 0xff, 0xff, 0x0, 0x6, 0xff, 0xf8, 0x1, 0x9a, 0x3, 0x5, 0x0, 0x26, 0x0, 0x56, - 0x0, 0x0, 0x0, 0x6, 0x0, 0x95, 0x3c, 0x0, 0x0, 0x1, 0x0, 0x36, 0x0, 0x0, 0x1, 0x0, - 0x3, 0x20, 0x0, 0x3, 0x0, 0x3a, 0x40, 0x10, 0x1, 0x4, 0x4, 0x40, 0x5, 0x0, 0x2, 0x0, - 0x3, 0x0, 0x2, 0x1, 0x1, 0x1, 0x2, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, - 0x3c, 0x1, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x2, 0x0, 0x4, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x4, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x3, 0x23, 0x13, 0x1, 0x0, 0x75, 0x55, 0x71, 0x3, 0x20, 0xfc, 0xe0, 0x3, 0x20, 0x0, - 0x0, 0x4, 0xff, 0xec, 0x0, 0x0, 0x2, 0x79, 0x3, 0x82, 0x0, 0x7, 0x0, 0xc, 0x0, 0x18, - 0x0, 0x24, 0x0, 0x5e, 0x40, 0x23, 0x1, 0x25, 0x25, 0x40, 0x26, 0xd, 0x1c, 0x10, 0xc, 0xa, - 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, 0x1f, 0x19, 0x13, 0xd, 0xc, 0x8, 0x5, 0x0, 0x22, 0x16, - 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, - 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, - 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, 0xc0, - 0x38, 0x59, 0x21, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0xb, 0x1, 0x23, 0x7, 0x3, 0x1, - 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0xe, 0x1, 0x23, 0x22, - 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x2, 0x5d, 0x57, 0x1a, 0xfe, 0xdc, 0x7d, 0x5f, 0x1, - 0xb6, 0x57, 0x16, 0x29, 0x7, 0x17, 0xb0, 0x1, 0x8b, 0x1, 0x22, 0x15, 0x16, 0x1d, 0x1, 0x1, - 0x21, 0x17, 0x15, 0x1e, 0xd0, 0x1, 0x22, 0x16, 0x16, 0x1c, 0x1, 0x1, 0x21, 0x17, 0x15, 0x1d, - 0xdb, 0xdb, 0x2, 0xeb, 0xfe, 0x36, 0x1, 0x62, 0x2f, 0xfe, 0xcd, 0x2, 0x2f, 0x17, 0x20, 0x1e, - 0x15, 0x17, 0x1f, 0x1d, 0x15, 0x17, 0x20, 0x1e, 0x15, 0x17, 0x1f, 0x1d, 0x0, 0x4, 0xff, 0xec, - 0x0, 0x0, 0x2, 0x5d, 0x3, 0xe8, 0x0, 0x7, 0x0, 0xc, 0x0, 0x18, 0x0, 0x24, 0x0, 0x5e, - 0x40, 0x23, 0x1, 0x25, 0x25, 0x40, 0x26, 0x0, 0x22, 0x1c, 0x10, 0xc, 0xa, 0x9, 0x8, 0x7, - 0x6, 0x3, 0x2, 0x1f, 0x19, 0x13, 0xd, 0xc, 0x8, 0x5, 0x0, 0x16, 0x5, 0x4, 0x1, 0x3, - 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x25, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, - 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0xb, 0x1, 0x23, 0x7, 0x3, 0x1, 0xe, 0x1, 0x23, 0x22, - 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0x36, 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x16, - 0x33, 0x32, 0x36, 0x2, 0x5d, 0x57, 0x1a, 0xfe, 0xdc, 0x7d, 0x5f, 0x1, 0xb6, 0x57, 0x16, 0x29, - 0x7, 0x17, 0xb0, 0x1, 0x5e, 0x5, 0x3d, 0x28, 0x29, 0x39, 0x5, 0x6, 0x3f, 0x29, 0x29, 0x35, - 0x35, 0x3, 0x1b, 0x16, 0x16, 0x22, 0x3, 0x3, 0x1d, 0x16, 0x16, 0x20, 0xdb, 0xdb, 0x2, 0xeb, - 0xfe, 0x36, 0x1, 0x62, 0x2f, 0xfe, 0xcd, 0x2, 0x63, 0x29, 0x3b, 0x3c, 0x28, 0x2a, 0x3a, 0x3a, - 0x2a, 0x16, 0x1f, 0x1f, 0x16, 0x15, 0x1f, 0x1e, 0xff, 0xff, 0x0, 0x5f, 0xff, 0x7, 0x2, 0xae, - 0x3, 0x14, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x0, 0x92, 0x1, 0x18, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x64, 0x0, 0x0, 0x2, 0x84, 0x3, 0xba, 0x0, 0x3, 0x0, 0xf, 0x0, 0x62, - 0x40, 0x25, 0x1, 0x10, 0x10, 0x40, 0x11, 0x4, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0xe, 0xc, - 0xb, 0x8, 0x7, 0x4, 0x2, 0x0, 0x2, 0x1, 0x8, 0x0, 0x6, 0x5, 0x8, 0xf, 0x4, 0x3, - 0x0, 0xe, 0xd, 0x1, 0x1, 0xe, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, - 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xe, 0x0, - 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x23, 0x37, 0x17, 0x7, 0x21, 0x7, 0x21, 0x7, 0x21, 0x3, 0x21, 0x7, - 0x21, 0x13, 0x2, 0x10, 0x53, 0x41, 0x49, 0xbf, 0xa, 0xfe, 0x9e, 0x21, 0x1, 0x3b, 0xa, 0xfe, - 0xc5, 0x24, 0x1, 0x73, 0xa, 0xfe, 0x32, 0x62, 0x3, 0xba, 0x9a, 0x9a, 0xe4, 0x48, 0xef, 0x48, - 0xfe, 0xf1, 0x48, 0x2, 0xd6, 0x0, 0x0, 0x2, 0x0, 0x64, 0x0, 0x0, 0x2, 0xe0, 0x3, 0x7a, - 0x0, 0x11, 0x0, 0x1d, 0x0, 0x5a, 0x40, 0x21, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x12, 0x1d, 0x1c, - 0x1b, 0x1a, 0x19, 0x16, 0x15, 0x12, 0x11, 0xd, 0x7, 0x5, 0x2, 0x18, 0x12, 0x8, 0x0, 0xa, - 0x18, 0x17, 0x14, 0x3, 0x13, 0x1, 0x1, 0x18, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, - 0x3c, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x18, 0x0, 0x1e, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x37, 0x17, 0x3, 0x23, 0x3, 0x23, 0x3, 0x23, 0x13, 0x33, 0x13, 0x33, 0x13, 0x2, 0x7c, - 0x36, 0x2b, 0x15, 0x3f, 0x16, 0x29, 0x1f, 0x1b, 0x2e, 0x31, 0x18, 0x40, 0xd, 0x1a, 0x8, 0x14, - 0x1d, 0x7b, 0x6a, 0x64, 0xff, 0x8, 0x5d, 0x4a, 0x68, 0x73, 0xf5, 0x7, 0x58, 0x3, 0x3d, 0x26, - 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1, 0x5, 0x14, 0x9d, 0xfd, 0x2a, 0x2, 0x7b, 0xfd, 0x85, 0x2, - 0xd6, 0xfd, 0x97, 0x2, 0x69, 0x0, 0x0, 0x4, 0x0, 0x5f, 0xff, 0xf8, 0x2, 0xf5, 0x3, 0x81, - 0x0, 0x13, 0x0, 0x25, 0x0, 0x31, 0x0, 0x3d, 0x0, 0x4e, 0x40, 0x1a, 0x1, 0x3e, 0x3e, 0x40, - 0x3f, 0x12, 0x35, 0x29, 0x23, 0x1a, 0xe, 0x38, 0x32, 0x2c, 0x26, 0x1f, 0x16, 0x12, 0x8, 0x3b, - 0x2f, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x3e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x3e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, - 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, - 0x27, 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x3, 0xe, - 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0xe, 0x1, 0x23, 0x22, 0x26, - 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x2, 0xf2, 0x16, 0x7d, 0x5c, 0x7f, 0x67, 0x54, 0x6a, 0x3, - 0x15, 0x7f, 0x64, 0x7a, 0x6b, 0x53, 0x63, 0x5d, 0x3, 0x3b, 0x39, 0x5e, 0x6c, 0x90, 0x11, 0x3, - 0x33, 0x38, 0x6a, 0x6d, 0x8e, 0x12, 0x2, 0x21, 0x16, 0x16, 0x1d, 0x1, 0x2, 0x21, 0x16, 0x16, - 0x1d, 0xb1, 0x2, 0x21, 0x16, 0x16, 0x1d, 0x1, 0x1, 0x22, 0x16, 0x16, 0x1d, 0x1, 0x68, 0xcc, - 0x5e, 0x46, 0x45, 0x57, 0x9e, 0x1a, 0x1c, 0xbe, 0x64, 0x50, 0x4b, 0x59, 0x99, 0x1a, 0x1b, 0x1b, - 0x19, 0x74, 0x41, 0x3e, 0x9d, 0x8a, 0x1b, 0x1a, 0x6a, 0x41, 0x48, 0x9e, 0x2, 0x71, 0x17, 0x20, - 0x1e, 0x15, 0x17, 0x1f, 0x1d, 0x15, 0x17, 0x20, 0x1e, 0x15, 0x17, 0x1f, 0x1d, 0x0, 0x0, 0x3, - 0x0, 0x6e, 0xff, 0xf8, 0x2, 0xd9, 0x3, 0x81, 0x0, 0xb, 0x0, 0x17, 0x0, 0x31, 0x0, 0x52, - 0x40, 0x1c, 0x1, 0x32, 0x32, 0x40, 0x33, 0x18, 0x31, 0x2c, 0x25, 0x24, 0x18, 0xf, 0x3, 0x28, - 0x25, 0x21, 0x18, 0x12, 0xc, 0x6, 0x0, 0x15, 0x9, 0x1d, 0x1, 0x1, 0x21, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x21, 0x0, - 0x32, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x32, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, 0xe, - 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x5, 0x3, 0x6, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x36, 0x37, 0x13, 0x2, 0x66, 0x1, 0x22, 0x15, 0x16, 0x1d, 0x1, 0x1, 0x21, 0x17, 0x15, - 0x1e, 0xb2, 0x1, 0x22, 0x16, 0x16, 0x1c, 0x1, 0x1, 0x21, 0x17, 0x15, 0x1d, 0x1, 0x22, 0x45, - 0x15, 0x5b, 0x4f, 0x73, 0x5f, 0x43, 0x52, 0x4, 0x44, 0x5a, 0x43, 0x4, 0x34, 0x2a, 0x3e, 0x4b, - 0x35, 0x43, 0x11, 0x46, 0x3, 0x4f, 0x17, 0x20, 0x1e, 0x15, 0x17, 0x1f, 0x1d, 0x15, 0x17, 0x20, - 0x1e, 0x15, 0x17, 0x1f, 0x1d, 0x6d, 0xfe, 0x1d, 0x93, 0x49, 0x40, 0x35, 0x42, 0x7b, 0x1c, 0x1e, - 0x1, 0xd3, 0xfe, 0x28, 0x1c, 0x18, 0x5b, 0x2c, 0x23, 0x2a, 0x36, 0x74, 0x1, 0xe2, 0xff, 0xff, - 0x0, 0x3c, 0xff, 0xf8, 0x2, 0x5, 0x3, 0x7, 0x0, 0x26, 0x0, 0x44, 0x0, 0x0, 0x0, 0x7, - 0x0, 0x69, 0x0, 0xdd, 0x0, 0x0, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xf8, 0x2, 0x5, 0x3, 0x7, - 0x0, 0x26, 0x0, 0x44, 0x0, 0x0, 0x0, 0x7, 0x0, 0x43, 0x0, 0xa4, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x3c, 0xff, 0xf8, 0x2, 0x5, 0x3, 0x5, 0x0, 0x26, 0x0, 0x44, 0x0, 0x0, 0x0, 0x6, - 0x0, 0x8c, 0x6e, 0x0, 0x0, 0x4, 0x0, 0x3c, 0xff, 0xf8, 0x2, 0x5, 0x2, 0xd7, 0x0, 0x16, - 0x0, 0x25, 0x0, 0x31, 0x0, 0x3d, 0x0, 0x64, 0x40, 0x27, 0x1, 0x3e, 0x3e, 0x40, 0x3f, 0x0, - 0x21, 0x19, 0x15, 0x8, 0x38, 0x32, 0x2c, 0x26, 0x1f, 0x17, 0xd, 0x5, 0x3, 0x0, 0x35, 0x29, - 0x8, 0x2f, 0x3b, 0x2f, 0x13, 0x2, 0xa, 0x1, 0x6, 0x5, 0x1, 0x16, 0x0, 0x2, 0x1, 0xd, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x3f, 0x3f, 0x2f, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x3e, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x3e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x3, 0x6, 0x15, - 0x14, 0x17, 0x23, 0x26, 0x37, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x37, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, - 0x36, 0x37, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x2, 0x5, 0x38, 0x7, 0x9, 0x4c, - 0x10, 0x3, 0x40, 0x58, 0x4a, 0x58, 0x6, 0x16, 0x52, 0x38, 0x4a, 0x52, 0x2e, 0x8, 0x14, 0x2f, - 0x47, 0x2f, 0x25, 0x2f, 0xf, 0x5, 0x57, 0x2d, 0x2d, 0x26, 0x11, 0x6b, 0x20, 0x16, 0x17, 0x1f, - 0x1f, 0x17, 0x16, 0x20, 0xbd, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x16, 0x20, 0x2, 0x12, 0xfe, - 0x81, 0x2f, 0x1e, 0x17, 0x2f, 0x1b, 0x21, 0x44, 0x74, 0x66, 0x26, 0x29, 0x8e, 0x3f, 0x2c, 0x26, - 0x1e, 0x6e, 0x2d, 0x28, 0x33, 0x67, 0x23, 0x1f, 0x8c, 0x24, 0x1e, 0x24, 0x1, 0xfa, 0x16, 0x20, - 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0x0, 0xff, 0xff, - 0x0, 0x3c, 0xff, 0xf8, 0x2, 0x5, 0x2, 0xdf, 0x0, 0x26, 0x0, 0x44, 0x0, 0x0, 0x0, 0x6, - 0x0, 0x8d, 0x5a, 0x0, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xf8, 0x2, 0x5, 0x3, 0x27, 0x0, 0x26, - 0x0, 0x44, 0x0, 0x0, 0x0, 0x7, 0x0, 0x91, 0x0, 0x9e, 0x0, 0x1e, 0xff, 0xff, 0x0, 0x3c, - 0xff, 0x7, 0x1, 0xb1, 0x2, 0x1a, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x0, 0x92, - 0x0, 0xa8, 0x0, 0x0, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xf8, 0x1, 0xdc, 0x3, 0x7, 0x0, 0x26, - 0x0, 0x48, 0x0, 0x0, 0x0, 0x7, 0x0, 0x69, 0x0, 0xdc, 0x0, 0x0, 0xff, 0xff, 0x0, 0x3c, - 0xff, 0xf8, 0x1, 0xdc, 0x3, 0x7, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x7, 0x0, 0x43, - 0x0, 0x96, 0x0, 0x0, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xf8, 0x1, 0xdc, 0x3, 0x5, 0x0, 0x26, - 0x0, 0x48, 0x0, 0x0, 0x0, 0x6, 0x0, 0x8c, 0x59, 0x0, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xf8, - 0x1, 0xdc, 0x2, 0xd9, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6a, 0x0, 0x90, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x46, 0xff, 0xf8, 0x1, 0x32, 0x3, 0x7, 0x0, 0x26, 0x0, 0x8b, - 0xea, 0x0, 0x0, 0x6, 0x0, 0x69, 0x62, 0x0, 0xff, 0xff, 0x0, 0x46, 0xff, 0xf8, 0x0, 0xd1, - 0x3, 0x7, 0x0, 0x26, 0x0, 0x8b, 0xea, 0x0, 0x0, 0x6, 0x0, 0x43, 0xfe, 0x0, 0xff, 0xff, - 0x0, 0x32, 0xff, 0xf8, 0x1, 0x46, 0x3, 0x5, 0x0, 0x26, 0x0, 0x8b, 0xec, 0x0, 0x0, 0x6, - 0x0, 0x8c, 0xde, 0x0, 0x0, 0x3, 0x0, 0x36, 0xff, 0xf8, 0x1, 0x3f, 0x2, 0xd9, 0x0, 0xb, - 0x0, 0x17, 0x0, 0x24, 0x0, 0x4d, 0x40, 0x1a, 0x1, 0x25, 0x25, 0x40, 0x26, 0x0, 0xf, 0x3, - 0x21, 0x1d, 0x1b, 0x18, 0x12, 0xc, 0x6, 0x0, 0x15, 0x9, 0x1e, 0x1, 0x24, 0x18, 0x2, 0x1, - 0x12, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x12, - 0x0, 0x25, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x25, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x7, - 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x17, 0x3, 0x6, 0x15, 0x14, - 0x17, 0x7, 0x22, 0x26, 0x35, 0x34, 0x37, 0x13, 0x1, 0x3d, 0x1, 0x22, 0x15, 0x16, 0x1d, 0x1, - 0x1, 0x21, 0x17, 0x16, 0x1d, 0x9e, 0x1, 0x22, 0x15, 0x16, 0x1d, 0x1, 0x1, 0x21, 0x17, 0x15, - 0x1e, 0x31, 0x33, 0x3, 0x2c, 0xa, 0x34, 0x43, 0x3, 0x33, 0x2, 0xa6, 0x16, 0x21, 0x1f, 0x15, - 0x17, 0x1f, 0x1e, 0x15, 0x16, 0x21, 0x1f, 0x15, 0x17, 0x1f, 0x1e, 0xa9, 0xfe, 0x97, 0x14, 0x10, - 0x3d, 0x7, 0x49, 0x4c, 0x40, 0x11, 0x12, 0x1, 0x6b, 0x0, 0xff, 0xff, 0x0, 0x55, 0x0, 0x0, - 0x2, 0x1d, 0x2, 0xdf, 0x0, 0x26, 0x0, 0x51, 0xa, 0x0, 0x0, 0x7, 0x0, 0x8d, 0x0, 0x89, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x37, 0xff, 0xf8, 0x1, 0xef, 0x3, 0x7, 0x0, 0x26, 0x0, 0x52, - 0x0, 0x0, 0x0, 0x7, 0x0, 0x69, 0x0, 0xe6, 0x0, 0x0, 0xff, 0xff, 0x0, 0x37, 0xff, 0xf8, - 0x1, 0xef, 0x3, 0x7, 0x0, 0x26, 0x0, 0x52, 0x0, 0x0, 0x0, 0x7, 0x0, 0x43, 0x0, 0x96, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x37, 0xff, 0xf8, 0x1, 0xef, 0x3, 0x5, 0x0, 0x26, 0x0, 0x52, - 0x0, 0x0, 0x0, 0x6, 0x0, 0x8c, 0x6e, 0x0, 0x0, 0x4, 0x0, 0x37, 0xff, 0xf8, 0x1, 0xef, - 0x2, 0xd8, 0x0, 0x11, 0x0, 0x1d, 0x0, 0x29, 0x0, 0x35, 0x0, 0x4f, 0x40, 0x1b, 0x1, 0x36, - 0x36, 0x40, 0x37, 0x10, 0x2d, 0x21, 0x1c, 0x16, 0x30, 0x2a, 0x24, 0x1e, 0x1a, 0x14, 0x10, 0x6, - 0x33, 0x27, 0xc, 0x2, 0x2, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, - 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x36, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x36, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x2, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, - 0x34, 0x23, 0x22, 0x7, 0x6, 0x15, 0x14, 0x33, 0x32, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x1, 0xea, 0x24, 0xd3, 0x52, 0x32, 0x38, 0x4, 0x13, 0x48, 0x41, 0x61, 0x4e, 0x30, 0x39, - 0x5d, 0x5, 0x68, 0x81, 0x1b, 0x4, 0x6b, 0x7e, 0x6e, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x17, - 0x1f, 0xbd, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x1, 0x8, 0xfe, 0xf0, 0x31, 0x37, - 0x6b, 0x1d, 0x20, 0x8c, 0x47, 0x3f, 0x30, 0x38, 0x6c, 0x1d, 0x21, 0x25, 0x1e, 0x86, 0xc9, 0x24, - 0x1d, 0x86, 0x2, 0x61, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x1f, 0x1f, 0x16, - 0x16, 0x20, 0x1f, 0x0, 0xff, 0xff, 0x0, 0x37, 0xff, 0xf8, 0x1, 0xef, 0x2, 0xdf, 0x0, 0x26, - 0x0, 0x52, 0x0, 0x0, 0x0, 0x6, 0x0, 0x8d, 0x5a, 0x0, 0xff, 0xff, 0x0, 0x4b, 0xff, 0xf8, - 0x2, 0x7, 0x3, 0x7, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x0, 0x69, 0x0, 0xf0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x4b, 0xff, 0xf8, 0x2, 0x7, 0x3, 0x7, 0x0, 0x26, 0x0, 0x58, - 0x0, 0x0, 0x0, 0x7, 0x0, 0x43, 0x0, 0xa0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x4b, 0xff, 0xf8, - 0x2, 0x7, 0x3, 0x5, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x6, 0x0, 0x8c, 0x78, 0x0, - 0x0, 0x3, 0x0, 0x4b, 0xff, 0xf8, 0x2, 0x7, 0x2, 0xd6, 0x0, 0x1c, 0x0, 0x28, 0x0, 0x34, - 0x0, 0x64, 0x40, 0x28, 0x1, 0x35, 0x35, 0x40, 0x36, 0xd, 0x15, 0x2f, 0x29, 0x23, 0x1d, 0x1b, - 0x12, 0x10, 0xd, 0x5, 0x2, 0x2c, 0x20, 0x8, 0x26, 0x7, 0x8, 0x17, 0x32, 0x26, 0x17, 0x1, - 0x13, 0x12, 0x1, 0xd, 0xc, 0x2, 0x3, 0x1, 0x2, 0x1, 0x1b, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x2f, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x1b, 0x0, 0x35, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x35, 0xff, 0xc0, 0x38, 0x59, 0x37, 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, - 0x36, 0x37, 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x37, 0x6, 0x23, 0x22, 0x27, - 0x26, 0x35, 0x34, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x4f, 0x2b, 0x55, 0x2c, 0x4, - 0x58, 0x33, 0x2b, 0x1c, 0x10, 0x32, 0x54, 0x36, 0x5, 0xa, 0x47, 0xf, 0x1, 0x43, 0x59, 0x42, - 0x28, 0x30, 0x1, 0xa5, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0xbc, 0x20, 0x16, 0x16, - 0x20, 0x20, 0x16, 0x17, 0x1f, 0xda, 0x1, 0x38, 0xfe, 0xc0, 0x19, 0x14, 0x64, 0x2f, 0x1e, 0x24, - 0x1, 0x60, 0xfe, 0x74, 0x20, 0x1d, 0x2d, 0x1c, 0x20, 0x24, 0x4c, 0x26, 0x2d, 0x5a, 0x19, 0x1, - 0xe2, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, - 0x0, 0x2, 0x0, 0x36, 0x1, 0xe5, 0x1, 0xa9, 0x3, 0x4a, 0x0, 0xe, 0x0, 0x1a, 0x0, 0x40, - 0x40, 0x13, 0x1, 0x1b, 0x1b, 0x40, 0x1c, 0xd, 0x12, 0x15, 0xf, 0xd, 0x7, 0x18, 0x7, 0x4, - 0xa, 0x4, 0x1, 0x7, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x2f, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0x1b, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1b, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x15, 0x14, 0x27, - 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0xa8, 0xa, 0x39, 0x34, - 0x49, 0x4e, 0x64, 0x7, 0x6, 0x76, 0x4d, 0x46, 0x5d, 0x48, 0x39, 0x2c, 0x34, 0x45, 0x3b, 0x2a, - 0x35, 0x44, 0x2, 0x94, 0x54, 0x2f, 0x2c, 0x64, 0x4f, 0x4f, 0x63, 0x59, 0x46, 0xb, 0x6, 0x2b, - 0x37, 0x4b, 0x35, 0x2a, 0x36, 0x48, 0x0, 0x4, 0x0, 0x3c, 0xff, 0x29, 0x3, 0xa5, 0x2, 0xdd, - 0x0, 0xd, 0x0, 0x16, 0x0, 0x29, 0x0, 0x3d, 0x0, 0x6d, 0x40, 0x2d, 0x1, 0x3e, 0x3e, 0x40, - 0x3f, 0x28, 0x36, 0x2c, 0x28, 0x1f, 0x12, 0xe, 0xd, 0xb, 0x5, 0x0, 0x3a, 0x8, 0x1b, 0x30, - 0x8, 0x24, 0x13, 0x12, 0x8, 0x3, 0x2, 0x11, 0x10, 0x8, 0x6, 0x24, 0x1b, 0x7, 0x6, 0x2, - 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x1f, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, - 0x3c, 0x3f, 0x3c, 0x2f, 0x2f, 0x10, 0xfd, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x10, 0xfd, - 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x1f, 0x0, 0x3e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x3e, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x23, 0x7, 0x23, 0x13, 0x33, 0x32, - 0x17, 0x16, 0x7, 0x6, 0x7, 0x37, 0x36, 0x2b, 0x1, 0x7, 0x33, 0x32, 0x37, 0x36, 0x5, 0x6, - 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x0, 0x33, 0x32, 0x17, 0x16, 0x15, - 0x14, 0x7, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, - 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, 0x9e, 0x5b, 0x3c, 0x7d, 0x1c, 0x52, 0x48, 0xa5, 0x68, 0x31, - 0x2e, 0x6, 0xa, 0x6b, 0x23, 0xb, 0x7f, 0x58, 0x18, 0x62, 0x3b, 0x1b, 0x25, 0x1, 0x2e, 0x1c, - 0x7c, 0x82, 0xc9, 0xba, 0x66, 0x60, 0x3, 0x14, 0x1, 0x7, 0xc6, 0xb2, 0x6b, 0x68, 0x5c, 0x6, - 0x4c, 0x4f, 0x90, 0xaa, 0x6a, 0x66, 0x18, 0x6, 0x4d, 0x52, 0x91, 0xa8, 0x6a, 0x63, 0xca, 0xca, - 0x2, 0x11, 0x2e, 0x2a, 0x4d, 0x76, 0x21, 0x9a, 0x58, 0xb3, 0xf, 0x13, 0x33, 0xd6, 0x7f, 0x85, - 0x75, 0x6f, 0xbc, 0x21, 0x23, 0xd0, 0x1, 0x0, 0x70, 0x6d, 0xb0, 0x26, 0x27, 0x2a, 0x26, 0x92, - 0x55, 0x58, 0x6a, 0x66, 0xb2, 0x29, 0x26, 0x95, 0x5a, 0x5e, 0x71, 0x69, 0x0, 0x3, 0x0, 0x3c, - 0xff, 0x29, 0x3, 0xa5, 0x2, 0xdd, 0x0, 0x20, 0x0, 0x33, 0x0, 0x47, 0x0, 0x59, 0x40, 0x21, - 0x1, 0x48, 0x48, 0x40, 0x49, 0x32, 0x10, 0xc, 0x4, 0x1, 0x40, 0x36, 0x32, 0x29, 0x19, 0x11, - 0xa, 0x0, 0x44, 0x8, 0x25, 0x3a, 0x8, 0x2e, 0x2e, 0x25, 0x1f, 0x2, 0x15, 0x1, 0x1, 0x29, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3f, 0x2f, 0x2f, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x29, 0x0, 0x48, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x48, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x2e, 0x1, 0x23, 0x22, 0x7, 0x6, 0x7, - 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x37, 0x17, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, - 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, - 0x35, 0x34, 0x37, 0x36, 0x0, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x27, - 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x2, - 0x96, 0x36, 0xb, 0x33, 0x1b, 0x2b, 0x26, 0x32, 0xa, 0x3, 0x6d, 0x1d, 0x26, 0x23, 0xf, 0x2a, - 0x28, 0x23, 0x2a, 0x3f, 0x46, 0x30, 0x38, 0x2, 0xd, 0x42, 0x3c, 0x5b, 0x56, 0x1, 0x40, 0x1c, - 0x7c, 0x82, 0xc9, 0xba, 0x66, 0x60, 0x3, 0x14, 0x1, 0x7, 0xc6, 0xb2, 0x6b, 0x68, 0x5c, 0x6, - 0x4c, 0x4f, 0x90, 0xaa, 0x6a, 0x66, 0x18, 0x6, 0x4d, 0x52, 0x91, 0xa8, 0x6a, 0x63, 0x1, 0xdc, - 0x31, 0x11, 0x16, 0x2b, 0x37, 0x69, 0x1a, 0x17, 0x9a, 0x11, 0xf, 0x10, 0x33, 0x23, 0xf, 0x10, - 0x34, 0x3d, 0x71, 0x16, 0x17, 0x8b, 0x48, 0x41, 0xfe, 0xe9, 0xd6, 0x7f, 0x85, 0x75, 0x6f, 0xbc, - 0x21, 0x23, 0xd0, 0x1, 0x0, 0x70, 0x6d, 0xb0, 0x26, 0x27, 0x2a, 0x26, 0x92, 0x55, 0x58, 0x6a, - 0x66, 0xb2, 0x29, 0x26, 0x95, 0x5a, 0x5e, 0x71, 0x69, 0x0, 0x0, 0x2, 0x0, 0x3c, 0x1, 0xae, - 0x3, 0x47, 0x3, 0x32, 0x0, 0xf, 0x0, 0x17, 0x0, 0x6f, 0x40, 0x2e, 0x1, 0x18, 0x18, 0x40, - 0x19, 0xf, 0x13, 0x12, 0xd, 0xc, 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, 0x1, 0x0, 0x17, 0x15, - 0x14, 0x13, 0xf, 0x9, 0x2, 0x1, 0x15, 0x14, 0x10, 0x3, 0x11, 0x7, 0xa, 0x5, 0x4, 0x17, - 0x16, 0xf, 0xe, 0xb, 0x5, 0xa, 0x4, 0x1, 0x15, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x17, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x15, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x37, 0x23, 0x7, 0x23, 0x27, - 0x23, 0x7, 0x23, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x5, 0x27, 0x3, 0x23, 0x13, 0x7, 0x37, - 0x21, 0x3, 0x13, 0x43, 0x21, 0x3, 0x8d, 0x23, 0x49, 0x4, 0x21, 0x43, 0x34, 0x4c, 0x51, 0x4, - 0x9d, 0x48, 0xfe, 0x47, 0x89, 0x2d, 0x44, 0x2c, 0x84, 0x8, 0x1, 0x52, 0x1, 0xb1, 0xf6, 0xf9, - 0xfb, 0xf8, 0x1, 0x81, 0xfe, 0xee, 0x1, 0x12, 0x3b, 0x1, 0xfe, 0xba, 0x1, 0x46, 0x1, 0x3b, - 0x0, 0x1, 0x0, 0x3c, 0x0, 0x8a, 0x1, 0xda, 0x2, 0x2c, 0x0, 0x13, 0x0, 0x6b, 0x40, 0x2d, - 0x1, 0x14, 0x14, 0x40, 0x15, 0xf, 0x13, 0x12, 0xf, 0xe, 0xd, 0x9, 0x8, 0x5, 0x4, 0x3, - 0x13, 0x12, 0x7, 0x3, 0x6, 0x7, 0x5, 0x4, 0x1, 0x3, 0x0, 0x11, 0x10, 0x9, 0x3, 0x8, - 0x7, 0xf, 0xe, 0xb, 0x3, 0xa, 0xd, 0xc, 0x3, 0x2, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, 0x17, 0x3c, 0x2f, 0x17, 0x3c, 0xfd, - 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x23, 0x7, 0x23, 0x37, 0x23, 0x37, - 0x33, 0x37, 0x23, 0x37, 0x33, 0x37, 0x33, 0x7, 0x33, 0x7, 0x23, 0x7, 0x33, 0x1, 0xbc, 0xd2, - 0x30, 0x43, 0x30, 0x6b, 0x9, 0x83, 0x2c, 0xa3, 0x8, 0xba, 0x36, 0x43, 0x35, 0x83, 0x9, 0x9a, - 0x2c, 0xba, 0xec, 0x62, 0x62, 0x40, 0x57, 0x40, 0x69, 0x69, 0x40, 0x57, 0x0, 0x2, 0x0, 0x3c, - 0x0, 0x84, 0x1, 0xdc, 0x2, 0x5d, 0x0, 0xb, 0x0, 0xf, 0x0, 0x5d, 0x40, 0x21, 0x1, 0x10, - 0x10, 0x40, 0x11, 0xb, 0xf, 0xe, 0xb, 0xa, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, - 0xf, 0xd, 0xb, 0xa, 0x9, 0x5, 0x4, 0x3, 0x9, 0x8, 0xd, 0xc, 0x1, 0xd, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x7, 0x23, 0x37, 0x23, 0x37, - 0x33, 0x37, 0x33, 0x7, 0x33, 0x3, 0x21, 0x37, 0x21, 0x1, 0xd4, 0x99, 0x15, 0x44, 0x15, 0x99, - 0x9, 0x99, 0x14, 0x44, 0x15, 0x99, 0x2a, 0xfe, 0x8a, 0x9, 0x1, 0x75, 0x1, 0x84, 0x99, 0x99, - 0x40, 0x99, 0x99, 0xfe, 0xc0, 0x40, 0x0, 0x1, 0x0, 0x3c, 0x0, 0x0, 0x2, 0xc4, 0x2, 0x17, - 0x0, 0x9, 0x0, 0x47, 0x40, 0x17, 0x1, 0xa, 0xa, 0x40, 0xb, 0x0, 0x6, 0x5, 0x2, 0x1, - 0x7, 0x5, 0x4, 0x0, 0x9, 0x8, 0x2, 0x4, 0x3, 0x1, 0x1, 0x7, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0xa, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x27, 0x3, 0x23, - 0x13, 0x7, 0x27, 0x25, 0x33, 0x2, 0xc4, 0x28, 0xea, 0x37, 0x57, 0x36, 0xfd, 0x21, 0x1, 0x4d, - 0x14, 0x1, 0x58, 0x3c, 0x87, 0xfe, 0x5d, 0x1, 0xa0, 0x83, 0x3e, 0xbc, 0x0, 0x1, 0x0, 0x3c, - 0x0, 0x0, 0x2, 0xc6, 0x2, 0x17, 0x0, 0x9, 0x0, 0x47, 0x40, 0x17, 0x1, 0xa, 0xa, 0x40, - 0xb, 0x7, 0x6, 0x5, 0x2, 0x1, 0x7, 0x5, 0x4, 0x0, 0x9, 0x8, 0x1, 0x4, 0x3, 0x2, - 0x1, 0x0, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x0, 0x0, 0xa, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0xa, 0xff, 0xc0, 0x38, - 0x59, 0x3f, 0x1, 0x17, 0x13, 0x33, 0x3, 0x37, 0x17, 0x5, 0x23, 0x3c, 0x28, 0xea, 0x36, 0x58, - 0x37, 0xff, 0x22, 0xfe, 0xb3, 0x14, 0xbf, 0x3b, 0x86, 0x1, 0xa3, 0xfe, 0x59, 0x87, 0x41, 0xb6, - 0x0, 0x1, 0x0, 0x3c, 0xfe, 0xd8, 0x2, 0x38, 0x2, 0x12, 0x0, 0x1c, 0x0, 0x54, 0x40, 0x1f, - 0x1, 0x1d, 0x1d, 0x40, 0x1e, 0x0, 0x17, 0xe, 0x8, 0x15, 0x12, 0x10, 0x5, 0x3, 0x0, 0x10, - 0xf, 0xc, 0x1, 0x6, 0x5, 0x1, 0x1c, 0x12, 0x11, 0x3, 0x0, 0x2, 0x1, 0x10, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x3f, 0x3c, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x10, 0x0, - 0x1d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1d, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x3, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x27, 0x6, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x3, 0x23, 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x2, - 0x38, 0x37, 0x3, 0xc, 0x46, 0xd, 0x3, 0x29, 0x11, 0x27, 0x3b, 0x3d, 0x1d, 0x2d, 0x55, 0x6f, - 0x55, 0x2f, 0x1, 0x53, 0x31, 0x29, 0xd, 0x25, 0x34, 0x2, 0x12, 0xfe, 0x74, 0x1c, 0x1a, 0x32, - 0x1e, 0x1a, 0x2f, 0x2c, 0xb, 0x1a, 0x32, 0xfe, 0xae, 0x3, 0x3a, 0xfe, 0xa3, 0xc, 0xc, 0x5c, - 0x23, 0xb, 0x2d, 0x1, 0x76, 0x0, 0x0, 0x1, 0x0, 0x4, 0xff, 0xdf, 0x1, 0xb7, 0x2, 0x12, - 0x0, 0x17, 0x0, 0x51, 0x40, 0x1c, 0x1, 0x18, 0x18, 0x40, 0x19, 0xb, 0x16, 0x15, 0x11, 0xa, - 0x8, 0x4, 0x2, 0x16, 0x15, 0x14, 0xb, 0x2, 0x0, 0xd, 0x13, 0x1, 0x17, 0x0, 0x2, 0x1, - 0x14, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, - 0x0, 0x14, 0x0, 0x18, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, - 0x18, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x1, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x17, 0x6, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x7, 0x27, 0x1, 0x23, 0x37, 0x1, 0xb0, 0x7, - 0xfe, 0xd6, 0xf, 0x12, 0x36, 0x3a, 0x19, 0x1b, 0x2b, 0x27, 0x21, 0x36, 0x41, 0x27, 0x25, 0x35, - 0x36, 0x2c, 0x3e, 0x1b, 0x1, 0x37, 0xea, 0x9, 0x2, 0x12, 0x33, 0xfe, 0x71, 0x4, 0x23, 0xf, - 0x21, 0x31, 0x33, 0x15, 0x1e, 0x1a, 0x33, 0x1, 0xa5, 0x42, 0x0, 0x1, 0x0, 0x28, 0xff, 0xe6, - 0x2, 0xd6, 0x3, 0xc, 0x0, 0x15, 0x0, 0x56, 0x40, 0x21, 0x1, 0x16, 0x16, 0x40, 0x17, 0x0, - 0x14, 0x13, 0x12, 0xf, 0xc, 0x7, 0x5, 0x0, 0x14, 0x13, 0x10, 0xf, 0x2, 0x5, 0x1, 0x8, - 0x0, 0x8, 0x12, 0x11, 0x1, 0x15, 0x0, 0x3, 0x1, 0x14, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, - 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x14, 0x0, 0x16, 0x49, 0x68, 0x61, - 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, - 0x23, 0x3, 0x6, 0x15, 0x14, 0x17, 0x7, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x23, 0x3, - 0x23, 0x13, 0x23, 0x37, 0x2, 0xd6, 0xb, 0x78, 0x44, 0x2, 0x66, 0xb, 0x51, 0x33, 0x37, 0x3, - 0x44, 0xff, 0x60, 0x60, 0x60, 0x6d, 0xb, 0x3, 0xc, 0x52, 0xfe, 0x11, 0x13, 0x12, 0x69, 0x7, - 0x50, 0x2e, 0x31, 0x59, 0x14, 0x16, 0x1, 0xf2, 0xfd, 0x46, 0x2, 0xba, 0x52, 0x0, 0x0, 0x1, - 0x0, 0x28, 0xff, 0xe6, 0x2, 0x27, 0x2, 0x12, 0x0, 0x15, 0x0, 0x5b, 0x40, 0x24, 0x1, 0x16, - 0x16, 0x40, 0x17, 0x0, 0x14, 0x13, 0x12, 0xf, 0xc, 0x7, 0x5, 0x0, 0x7, 0x8, 0x8, 0x14, - 0x13, 0x10, 0xf, 0x2, 0x5, 0x1, 0x7, 0x0, 0x8, 0x12, 0x11, 0x1, 0x15, 0x0, 0x2, 0x1, - 0x14, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x10, 0xfd, 0x17, 0x3c, - 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x14, 0x0, 0x16, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x16, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x3, 0x6, 0x15, 0x14, 0x17, 0x7, - 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x23, 0x3, 0x23, 0x13, 0x23, 0x37, 0x2, 0x27, 0x9, - 0x4c, 0x2e, 0x2, 0x2e, 0xb, 0x35, 0x20, 0x23, 0x3, 0x2d, 0xbb, 0x40, 0x55, 0x40, 0x45, 0x9, - 0x2, 0x12, 0x40, 0xfe, 0xb7, 0xf, 0xb, 0x39, 0x4, 0x4c, 0x3, 0x21, 0x24, 0x3e, 0x10, 0x12, - 0x1, 0x44, 0xfe, 0x2e, 0x1, 0xd2, 0x40, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xff, 0x60, 0x1, 0xd1, - 0x3, 0x32, 0x0, 0x13, 0x0, 0x3d, 0x40, 0x12, 0x1, 0x14, 0x14, 0x40, 0x15, 0x0, 0x1, 0xc, - 0x0, 0x3, 0x7, 0x12, 0xc, 0x12, 0x4, 0x1, 0xc, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, - 0x2f, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x0, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, - 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, - 0xc0, 0x38, 0x59, 0x1, 0x7, 0x26, 0x23, 0x22, 0x7, 0x6, 0x7, 0x3, 0x6, 0x7, 0x6, 0x27, - 0x37, 0x32, 0x37, 0x13, 0x36, 0x33, 0x32, 0x1, 0xd1, 0x23, 0x1f, 0x2b, 0x22, 0x11, 0xe, 0x7, - 0x56, 0xb, 0x3f, 0x36, 0x50, 0xa, 0x65, 0xc, 0x56, 0x18, 0x85, 0x37, 0x3, 0xe, 0x3f, 0x1d, - 0x1d, 0x18, 0x35, 0xfd, 0x7f, 0x53, 0x2a, 0x24, 0x1, 0x47, 0x57, 0x2, 0x81, 0xb2, 0x0, 0x1, - 0x0, 0x3c, 0x0, 0xae, 0x1, 0xc1, 0x1, 0x66, 0x0, 0x5, 0x0, 0x44, 0x40, 0x15, 0x1, 0x6, - 0x6, 0x40, 0x7, 0x0, 0x4, 0x3, 0x2, 0x0, 0x4, 0x3, 0x7, 0x0, 0x5, 0x0, 0x2, 0x1, - 0x1, 0x4, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x4, 0x0, 0x6, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x6, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x23, 0x37, 0x21, 0x37, 0x1, 0xc1, 0x19, 0x44, 0x11, 0xfe, 0xc7, 0x9, 0x1, 0x66, - 0xb8, 0x78, 0x40, 0x0, 0x0, 0x5, 0x0, 0x55, 0xff, 0xfb, 0x3, 0x6a, 0x3, 0x28, 0x0, 0xf, - 0x0, 0x22, 0x0, 0x30, 0x0, 0x3c, 0x0, 0x48, 0x0, 0x5e, 0x40, 0x23, 0x1, 0x49, 0x49, 0x40, - 0x4a, 0xe, 0x46, 0x40, 0x3a, 0x34, 0x28, 0x24, 0x1f, 0x43, 0x3d, 0x37, 0x31, 0x29, 0x23, 0x1b, - 0x12, 0xe, 0x6, 0x16, 0x7, 0xb, 0x2d, 0x7, 0x26, 0xb, 0x3, 0x1, 0x1, 0x6, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x49, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0x49, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x4, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, - 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x27, 0x7, 0x26, 0x23, 0x22, - 0x7, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x27, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, - 0x3e, 0x1, 0x33, 0x32, 0x16, 0x17, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, - 0x16, 0x3, 0x66, 0x17, 0xfe, 0xfe, 0xa5, 0x93, 0xc0, 0x4, 0x16, 0x1, 0x2, 0xa4, 0x96, 0xbf, - 0x52, 0x3, 0x45, 0x48, 0x79, 0x88, 0xd4, 0x12, 0x4, 0x49, 0x4a, 0x7a, 0x88, 0x68, 0x65, 0x4c, - 0x2e, 0x47, 0x68, 0x6b, 0x62, 0x27, 0x2a, 0x37, 0x4e, 0x4a, 0x45, 0x42, 0x32, 0xce, 0x3, 0x1f, - 0x15, 0x16, 0x1c, 0x3, 0x2, 0x20, 0x15, 0x15, 0x1d, 0xb4, 0x3, 0x20, 0x15, 0x15, 0x1d, 0x3, - 0x3, 0x1f, 0x16, 0x15, 0x1d, 0x1, 0x91, 0xa8, 0xee, 0xca, 0x94, 0x1c, 0x1c, 0xa8, 0xef, 0xc9, - 0x95, 0x1c, 0x1d, 0x1b, 0x1b, 0x7a, 0x4f, 0x52, 0xc6, 0x8b, 0x1a, 0x1a, 0x7a, 0x50, 0x53, 0x64, - 0x61, 0x5, 0x2a, 0x5a, 0x5c, 0x2d, 0x28, 0x1d, 0x2b, 0x29, 0x1f, 0xde, 0x15, 0x1d, 0x20, 0x15, - 0x16, 0x1c, 0x1f, 0x16, 0x15, 0x1d, 0x20, 0x15, 0x16, 0x1c, 0x1f, 0x0, 0x0, 0x1c, 0x0, 0x64, - 0xff, 0x50, 0x4, 0xb7, 0x3, 0x8e, 0x0, 0xd, 0x0, 0x14, 0x0, 0x19, 0x0, 0x1d, 0x0, 0x21, - 0x0, 0x25, 0x0, 0x29, 0x0, 0x2d, 0x0, 0x33, 0x0, 0x37, 0x0, 0x3b, 0x0, 0x40, 0x0, 0x45, - 0x0, 0x49, 0x0, 0x4d, 0x0, 0x51, 0x0, 0x55, 0x0, 0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x68, - 0x0, 0x6c, 0x0, 0x71, 0x0, 0x76, 0x0, 0x7a, 0x0, 0x7e, 0x0, 0x83, 0x0, 0x87, 0x1, 0x1c, - 0x40, 0x81, 0x1, 0x88, 0x88, 0x40, 0x89, 0x0, 0x86, 0x84, 0x82, 0x80, 0x7d, 0x7b, 0x7a, 0x78, - 0x76, 0x73, 0x70, 0x6e, 0x6b, 0x69, 0x68, 0x66, 0x64, 0x62, 0x5d, 0x5a, 0x57, 0x55, 0x53, 0x51, - 0x4f, 0x4d, 0x4b, 0x48, 0x46, 0x44, 0x41, 0x3f, 0x3c, 0x3b, 0x39, 0x37, 0x35, 0x32, 0x2f, 0x2d, - 0x2b, 0x28, 0x26, 0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x18, 0x16, 0x14, 0x10, 0x9, 0x8, 0x86, - 0x84, 0x80, 0x7f, 0x7d, 0x7b, 0x79, 0x77, 0x74, 0x72, 0x70, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x62, - 0x61, 0x5f, 0x5c, 0x59, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x43, 0x41, 0x3e, - 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x31, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, - 0x1a, 0x18, 0x15, 0x13, 0x12, 0xe, 0xb, 0x8, 0x7, 0x3, 0x2, 0x0, 0xc, 0x6, 0x5f, 0x1, - 0x1, 0xb, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xb, 0x0, 0x88, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x88, 0xff, 0xc0, 0x38, 0x59, 0x1, 0xf, 0x1, 0x17, - 0x3, 0x1, 0x7, 0x27, 0x37, 0x7, 0x27, 0x3, 0x25, 0x5, 0x7, 0x2f, 0x1, 0xf, 0x1, 0x15, - 0x17, 0x37, 0x27, 0xf, 0x1, 0x37, 0x2f, 0x1, 0x7, 0x1f, 0x1, 0x27, 0x7, 0x17, 0x3, 0x27, - 0x7, 0x17, 0x5, 0xf, 0x1, 0x37, 0x3, 0x27, 0x7, 0x17, 0x5, 0x27, 0xf, 0x1, 0x17, 0x37, - 0x1, 0x27, 0x7, 0x17, 0x5, 0x27, 0x7, 0x1f, 0x1, 0xf, 0x1, 0x17, 0x3f, 0x1, 0xf, 0x1, - 0x17, 0x37, 0x3, 0xf, 0x1, 0x37, 0x3, 0x27, 0x7, 0x17, 0x2f, 0x1, 0x7, 0x17, 0x1, 0x27, - 0x7, 0x17, 0x37, 0x27, 0xf, 0x1, 0x17, 0x37, 0x2f, 0x1, 0xf, 0x1, 0x37, 0x1, 0x27, 0x1f, - 0x2, 0x27, 0x7, 0x17, 0x1, 0x2f, 0x1, 0x17, 0x1, 0x27, 0xf, 0x1, 0x37, 0x1, 0x27, 0x7, - 0x1f, 0x2, 0x27, 0x7, 0x17, 0x1, 0x2f, 0x1, 0x17, 0x5, 0x27, 0x1f, 0x1, 0x37, 0x2f, 0x2, - 0x17, 0x4, 0xb7, 0x3d, 0x1c, 0x10, 0x73, 0xfe, 0xe1, 0x19, 0xad, 0x1, 0x30, 0xfe, 0x85, 0x2, - 0x5c, 0x1, 0xe1, 0x10, 0x8, 0x7e, 0x8, 0x3e, 0x8b, 0x4b, 0x2, 0x49, 0x3a, 0x4a, 0x69, 0x95, - 0x75, 0xa3, 0xb3, 0xac, 0x83, 0xc0, 0x86, 0x8e, 0x83, 0x9b, 0x1, 0x65, 0x66, 0x33, 0x5e, 0x81, - 0xa6, 0x96, 0xb7, 0x1, 0x54, 0xb, 0x33, 0x2a, 0xb, 0x2f, 0xfe, 0xa4, 0x9d, 0xa8, 0xac, 0x1, - 0x97, 0xc4, 0xaf, 0xdd, 0xd1, 0x60, 0x29, 0xf, 0x47, 0x50, 0x45, 0x27, 0xb, 0x2a, 0x21, 0x83, - 0x29, 0x78, 0xa9, 0xb9, 0xc7, 0xcf, 0x20, 0xae, 0xdd, 0xc1, 0x1, 0xd3, 0xd9, 0x7, 0xbb, 0xc3, - 0xc, 0x46, 0x1f, 0xf, 0x42, 0x19, 0x7, 0x6a, 0x1f, 0x65, 0xfe, 0xd4, 0xcd, 0x16, 0xb3, 0xcc, - 0xb7, 0x7, 0xa2, 0xfe, 0x88, 0x18, 0xbe, 0x2b, 0x2, 0x9d, 0xa, 0x58, 0x14, 0x58, 0xfe, 0xf4, - 0x84, 0x27, 0xa, 0x9d, 0xb1, 0xa0, 0x4, 0x93, 0xfe, 0xb2, 0x12, 0xa9, 0x25, 0x1, 0x43, 0x9a, - 0xd, 0x4d, 0x3f, 0x9b, 0xf, 0x96, 0x1d, 0x2, 0x8e, 0x95, 0x1b, 0xb, 0xfe, 0xb9, 0xfe, 0xc6, - 0x2, 0x5c, 0x34, 0x19, 0x8d, 0x2, 0x81, 0xb9, 0xc7, 0x26, 0x18, 0x36, 0x5, 0x24, 0x1e, 0x3b, - 0x1a, 0x6, 0x3c, 0x9e, 0x48, 0xfc, 0x3c, 0x31, 0x45, 0x5b, 0x49, 0x4c, 0x54, 0x1, 0x30, 0x3a, - 0x29, 0x41, 0xca, 0x55, 0xb0, 0x62, 0x1, 0x17, 0x46, 0x40, 0x51, 0xa2, 0x7, 0x35, 0x77, 0x7, - 0x30, 0x1, 0xb8, 0x42, 0x35, 0x4c, 0xc8, 0x57, 0x66, 0x67, 0x1, 0x61, 0x81, 0x8, 0x52, 0x46, - 0x4d, 0x7c, 0x5, 0x31, 0x1, 0x44, 0x6c, 0xc6, 0x7b, 0x1, 0x3b, 0x52, 0x54, 0x62, 0xc1, 0x4d, - 0x45, 0x5a, 0xff, 0x0, 0x67, 0xce, 0x60, 0x12, 0x9, 0x54, 0x68, 0x9, 0x4e, 0xb0, 0x6, 0x6e, - 0x99, 0x71, 0x1, 0x76, 0x62, 0xd6, 0x5c, 0x81, 0x5f, 0xa6, 0x57, 0x1, 0x87, 0xd5, 0x5a, 0xd8, - 0xfe, 0x6f, 0x7, 0x62, 0x71, 0x63, 0x1, 0x23, 0x44, 0x26, 0x6f, 0x55, 0x72, 0x56, 0x7b, 0x4f, - 0x1, 0x44, 0xad, 0x57, 0xb5, 0xc0, 0x54, 0x81, 0x29, 0x22, 0xf, 0x82, 0x51, 0x87, 0x0, 0x2, - 0x0, 0x21, 0x0, 0x1, 0x2, 0x8b, 0x3, 0x20, 0x0, 0x5, 0x0, 0xe, 0x0, 0x4a, 0x40, 0x18, - 0x1, 0xf, 0xf, 0x40, 0x10, 0x0, 0xc, 0x9, 0x6, 0xc, 0x6, 0x3, 0x0, 0xe, 0xd, 0x8, - 0x1, 0x5, 0x4, 0x2, 0x1, 0x1, 0x3, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, 0x3c, 0x2f, - 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, - 0x49, 0x68, 0xb9, 0x0, 0x3, 0x0, 0xf, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, - 0x37, 0xb9, 0x0, 0xf, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x7, 0x21, 0x27, 0x1, 0x33, 0x13, 0x27, - 0x3, 0x27, 0x7, 0x3, 0x7, 0x37, 0x21, 0x2, 0x8b, 0xb, 0xfd, 0xaa, 0x9, 0x1, 0x95, 0x16, - 0x64, 0x10, 0x68, 0x9, 0x1c, 0xe3, 0x1d, 0x34, 0x1, 0x37, 0xd, 0xc, 0xc, 0x3, 0x13, 0xfd, - 0x23, 0x2b, 0x1, 0xcd, 0x46, 0x46, 0xfe, 0x33, 0x2b, 0x8, 0x0, 0x3, 0xff, 0xec, 0x0, 0x0, - 0x2, 0x5d, 0x3, 0xba, 0x0, 0x7, 0x0, 0xc, 0x0, 0x10, 0x0, 0x5a, 0x40, 0x21, 0x1, 0x11, - 0x11, 0x40, 0x12, 0x0, 0xe, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, 0xf, 0xd, - 0xc, 0x8, 0x5, 0x0, 0x10, 0xf, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x5, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x11, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0xb, 0x1, - 0x23, 0x7, 0x3, 0x1, 0x23, 0x27, 0x33, 0x2, 0x5d, 0x57, 0x1a, 0xfe, 0xdc, 0x7d, 0x5f, 0x1, - 0xb6, 0x57, 0x16, 0x29, 0x7, 0x17, 0xb0, 0x1, 0x8, 0x42, 0x29, 0x4b, 0xdb, 0xdb, 0x2, 0xeb, - 0xfe, 0x36, 0x1, 0x62, 0x2f, 0xfe, 0xcd, 0x1, 0xff, 0x9a, 0x0, 0x3, 0xff, 0xec, 0x0, 0x0, - 0x2, 0x70, 0x3, 0x7e, 0x0, 0x7, 0x0, 0xc, 0x0, 0x1e, 0x0, 0x61, 0x40, 0x25, 0x1, 0x1f, - 0x1f, 0x40, 0x20, 0xd, 0x1e, 0x1a, 0x14, 0xf, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, - 0x15, 0xd, 0xc, 0x8, 0x5, 0x0, 0x12, 0x7, 0x17, 0x17, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, - 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x10, 0xfd, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x1f, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1f, 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, - 0x21, 0x7, 0x23, 0x1, 0x33, 0xb, 0x1, 0x23, 0x7, 0x3, 0x1, 0x6, 0x23, 0x22, 0x26, 0x23, - 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x2, 0x5d, 0x57, 0x1a, - 0xfe, 0xdc, 0x7d, 0x5f, 0x1, 0xb6, 0x57, 0x16, 0x29, 0x7, 0x17, 0xb0, 0x1, 0x84, 0x36, 0x2b, - 0x15, 0x3f, 0x16, 0x29, 0x1f, 0x1b, 0x2e, 0x32, 0x17, 0x40, 0xd, 0x1a, 0x8, 0x14, 0x1d, 0xdb, - 0xdb, 0x2, 0xeb, 0xfe, 0x36, 0x1, 0x62, 0x2f, 0xfe, 0xcd, 0x2, 0x20, 0x26, 0x1f, 0x19, 0x34, - 0x29, 0x21, 0x2, 0x4, 0x14, 0x0, 0x0, 0x3, 0x0, 0x5f, 0xff, 0xf8, 0x2, 0xf5, 0x3, 0x71, - 0x0, 0x13, 0x0, 0x25, 0x0, 0x37, 0x0, 0x4e, 0x40, 0x1a, 0x1, 0x38, 0x38, 0x40, 0x39, 0x12, - 0x37, 0x33, 0x2d, 0x2b, 0x28, 0x23, 0x1a, 0xe, 0x2e, 0x26, 0x1f, 0x16, 0x12, 0x8, 0x30, 0x4, - 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x8, 0x0, 0x38, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x38, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x27, 0x26, - 0x23, 0x22, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x3, 0x6, 0x23, 0x22, - 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x2, 0xf2, - 0x16, 0x7d, 0x5c, 0x7f, 0x67, 0x54, 0x6a, 0x3, 0x15, 0x7f, 0x64, 0x7a, 0x6b, 0x53, 0x63, 0x5d, - 0x3, 0x3b, 0x39, 0x5e, 0x6c, 0x90, 0x11, 0x3, 0x33, 0x38, 0x6a, 0x6d, 0x8e, 0x1, 0x36, 0x2b, - 0x15, 0x40, 0x15, 0x29, 0x20, 0x1b, 0x2e, 0x32, 0x17, 0x40, 0xe, 0x1a, 0x7, 0x14, 0x1d, 0x1, - 0x68, 0xcc, 0x5e, 0x46, 0x45, 0x57, 0x9e, 0x1a, 0x1c, 0xbe, 0x64, 0x50, 0x4b, 0x59, 0x99, 0x1a, - 0x1b, 0x1b, 0x19, 0x74, 0x41, 0x3e, 0x9d, 0x8a, 0x1b, 0x1a, 0x6a, 0x41, 0x48, 0x9e, 0x2, 0x56, - 0x26, 0x1f, 0x19, 0x34, 0x29, 0x21, 0x1, 0x5, 0x14, 0x0, 0x0, 0x3, 0x0, 0x3c, 0x0, 0x38, - 0x1, 0xa1, 0x1, 0xf4, 0x0, 0x3, 0x0, 0xf, 0x0, 0x1b, 0x0, 0x50, 0x40, 0x1c, 0x1, 0x1c, - 0x1c, 0x40, 0x1d, 0x3, 0x16, 0x10, 0xa, 0x4, 0x3, 0x1, 0x7, 0x8, 0xd, 0x19, 0x8, 0x13, - 0x3, 0x2, 0x7, 0x1, 0x0, 0xd, 0x13, 0x1, 0x1, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x2f, - 0x2f, 0x2f, 0x3c, 0xfd, 0x3c, 0x10, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1, 0x0, 0x1c, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1c, 0xff, 0xc0, 0x38, 0x59, 0x25, 0x21, 0x37, 0x21, - 0x27, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x3, 0xe, 0x1, 0x23, - 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x1, 0x98, 0xfe, 0xa4, 0x9, 0x1, 0x5c, 0x5b, - 0x4, 0x28, 0x1a, 0x1b, 0x23, 0x3, 0x4, 0x27, 0x1b, 0x1a, 0x24, 0x2d, 0x3, 0x28, 0x1a, 0x1b, - 0x24, 0x4, 0x3, 0x27, 0x1b, 0x1b, 0x24, 0xf4, 0x40, 0x7e, 0x1b, 0x24, 0x29, 0x1a, 0x1b, 0x23, - 0x27, 0xfe, 0xaa, 0x1b, 0x24, 0x28, 0x1b, 0x1b, 0x23, 0x28, 0x0, 0x3, 0xff, 0xbf, 0xfe, 0xf6, - 0x1, 0xd4, 0x2, 0xd7, 0x0, 0x17, 0x0, 0x23, 0x0, 0x2f, 0x0, 0x55, 0x40, 0x1e, 0x1, 0x30, - 0x30, 0x40, 0x31, 0x0, 0x17, 0x15, 0x14, 0x2a, 0x24, 0x1e, 0x18, 0xf, 0xd, 0x7, 0x0, 0x27, - 0x1b, 0x8, 0x21, 0x2d, 0x21, 0x6, 0x10, 0xf, 0x2, 0x1, 0x7, 0x46, 0x76, 0x2f, 0x37, 0x18, - 0x0, 0x3f, 0x3c, 0x2f, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x7, 0x0, 0x30, - 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x30, 0xff, 0xc0, 0x38, - 0x59, 0x1, 0x6, 0x7, 0x6, 0x7, 0x6, 0x7, 0x27, 0x36, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, - 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x33, 0x36, 0x3f, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x1, 0xd4, 0x3b, 0x66, 0x4a, 0x29, 0x60, 0x76, 0x2b, 0x30, 0x10, 0x29, 0x22, 0x38, 0x9, - 0xd, 0x54, 0x53, 0x18, 0x1d, 0x22, 0x6, 0x78, 0x4c, 0x18, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, - 0x17, 0x1f, 0xbd, 0x20, 0x16, 0x16, 0x1f, 0x1f, 0x16, 0x17, 0x1f, 0x1, 0xff, 0xbd, 0xb7, 0x85, - 0x3a, 0x86, 0x50, 0x3c, 0x22, 0xe, 0x23, 0x2f, 0x51, 0x75, 0xb6, 0xe2, 0x34, 0x87, 0x99, 0x62, - 0xde, 0xe4, 0x83, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, - 0x20, 0x1f, 0x0, 0x3, 0x0, 0x50, 0x0, 0x0, 0x2, 0x92, 0x3, 0x82, 0x0, 0x9, 0x0, 0x15, - 0x0, 0x21, 0x0, 0x55, 0x40, 0x1e, 0x1, 0x22, 0x22, 0x40, 0x23, 0x0, 0x19, 0xd, 0x9, 0x8, - 0x7, 0x1c, 0x16, 0x10, 0xa, 0x5, 0x4, 0x3, 0x0, 0x1f, 0x13, 0x6, 0x5, 0x3, 0x3, 0x2, - 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x3f, 0x3c, 0x2f, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, - 0x1, 0x49, 0x68, 0xb9, 0x0, 0x5, 0x0, 0x22, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, - 0x11, 0x37, 0xb9, 0x0, 0x22, 0xff, 0xc0, 0x38, 0x59, 0x9, 0x1, 0x3, 0x23, 0x13, 0x3, 0x33, - 0x13, 0x33, 0x13, 0x27, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, - 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x2, 0x92, 0xfe, 0xd9, 0x2f, - 0x5a, 0x2f, 0xc1, 0x5d, 0x9e, 0x7, 0xfc, 0x3f, 0x1e, 0x16, 0x15, 0x1e, 0x1e, 0x15, 0x16, 0x1e, - 0xaa, 0x1e, 0x15, 0x15, 0x1e, 0x1e, 0x15, 0x15, 0x1e, 0x2, 0xea, 0xfe, 0x53, 0xfe, 0xc3, 0x1, - 0x41, 0x1, 0xcb, 0xfe, 0x93, 0x1, 0x79, 0x36, 0x16, 0x1e, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x15, - 0x16, 0x1e, 0x1e, 0x16, 0x15, 0x1f, 0x1f, 0x0, 0x0, 0x3, 0xff, 0xec, 0x0, 0x0, 0x2, 0x5e, - 0x3, 0xab, 0x0, 0x6, 0x0, 0xe, 0x0, 0x13, 0x0, 0x60, 0x40, 0x24, 0x1, 0x14, 0x14, 0x40, - 0x15, 0x0, 0x13, 0x11, 0x10, 0xf, 0xe, 0xd, 0xa, 0x9, 0x4, 0x3, 0x2, 0x1, 0x0, 0x13, - 0xf, 0xc, 0x7, 0x4, 0x0, 0x6, 0x5, 0xc, 0xb, 0x8, 0x3, 0x7, 0x1, 0x1, 0xc, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xc, 0x0, 0x14, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x14, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, - 0x33, 0x13, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0xb, 0x1, 0x23, 0x7, 0x3, 0x2, 0x5e, - 0x44, 0x39, 0x50, 0x47, 0x80, 0x40, 0x53, 0x57, 0x1a, 0xfe, 0xdc, 0x7d, 0x5f, 0x1, 0xb6, 0x57, - 0x16, 0x29, 0x7, 0x17, 0xb0, 0x3, 0x19, 0x56, 0x56, 0x92, 0xfc, 0x55, 0xdb, 0xdb, 0x2, 0xeb, - 0xfe, 0x36, 0x1, 0x62, 0x2f, 0xfe, 0xcd, 0x0, 0x0, 0x2, 0x0, 0x64, 0x0, 0x0, 0x2, 0x84, - 0x3, 0xb2, 0x0, 0xb, 0x0, 0x12, 0x0, 0x65, 0x40, 0x26, 0x1, 0x13, 0x13, 0x40, 0x14, 0x0, - 0x10, 0xf, 0xe, 0xd, 0xc, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x10, 0xc, 0xa, 0x8, 0x7, - 0x4, 0x3, 0x0, 0x2, 0x1, 0x8, 0xb, 0x0, 0x12, 0x11, 0xa, 0x9, 0x1, 0x1, 0xa, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x21, - 0x7, 0x21, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, 0x13, 0x25, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, - 0x2, 0x84, 0xa, 0xfe, 0x9e, 0x21, 0x1, 0x3b, 0xa, 0xfe, 0xc5, 0x24, 0x1, 0x73, 0xa, 0xfe, - 0x32, 0x62, 0x1, 0x75, 0x43, 0x3a, 0x50, 0x47, 0x80, 0x40, 0x2, 0xd6, 0x48, 0xef, 0x48, 0xfe, - 0xf1, 0x48, 0x2, 0xd6, 0x4a, 0x56, 0x56, 0x92, 0x0, 0x3, 0xff, 0xec, 0x0, 0x0, 0x2, 0x5d, - 0x3, 0xba, 0x0, 0x7, 0x0, 0xc, 0x0, 0x10, 0x0, 0x5a, 0x40, 0x21, 0x1, 0x11, 0x11, 0x40, - 0x12, 0x0, 0xf, 0xe, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x3, 0x2, 0xf, 0xd, 0xc, 0x8, - 0x5, 0x0, 0x10, 0xd, 0x5, 0x4, 0x1, 0x3, 0x0, 0x1, 0x1, 0x5, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x17, 0x3c, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, - 0x5, 0x0, 0x11, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x11, - 0xff, 0xc0, 0x38, 0x59, 0x21, 0x23, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0xb, 0x1, 0x23, 0x7, - 0x3, 0x1, 0x7, 0x23, 0x37, 0x2, 0x5d, 0x57, 0x1a, 0xfe, 0xdc, 0x7d, 0x5f, 0x1, 0xb6, 0x57, - 0x16, 0x29, 0x7, 0x17, 0xb0, 0x1, 0x65, 0x53, 0x41, 0x4a, 0xdb, 0xdb, 0x2, 0xeb, 0xfe, 0x36, - 0x1, 0x62, 0x2f, 0xfe, 0xcd, 0x2, 0x99, 0x9a, 0x9a, 0x0, 0x0, 0x3, 0x0, 0x64, 0x0, 0x0, - 0x2, 0x84, 0x3, 0x86, 0x0, 0xb, 0x0, 0x17, 0x0, 0x23, 0x0, 0x66, 0x40, 0x27, 0x1, 0x24, - 0x24, 0x40, 0x25, 0x18, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x22, 0x20, 0x1f, 0x1c, 0x1b, 0x18, - 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, 0x1a, 0x19, 0x8, 0x23, 0x18, 0x15, 0x9, 0x22, - 0x21, 0x1, 0x1, 0x22, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x2f, 0x3c, - 0xfd, 0x3c, 0x10, 0xfd, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x22, 0x0, - 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, - 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x21, 0x7, 0x21, 0x7, - 0x21, 0x3, 0x21, 0x7, 0x21, 0x13, 0x2, 0x4e, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, - 0xc9, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0xff, 0xa, 0xfe, 0x9e, 0x21, 0x1, 0x3b, - 0xa, 0xfe, 0xc5, 0x24, 0x1, 0x73, 0xa, 0xfe, 0x32, 0x62, 0x3, 0x50, 0x16, 0x20, 0x20, 0x16, - 0x16, 0x20, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x17, 0x1f, 0x1f, 0x91, 0x48, 0xef, 0x48, 0xfe, - 0xf1, 0x48, 0x2, 0xd6, 0x0, 0x2, 0x0, 0x64, 0x0, 0x0, 0x2, 0x84, 0x3, 0xba, 0x0, 0xb, - 0x0, 0xf, 0x0, 0x5e, 0x40, 0x22, 0x1, 0x10, 0x10, 0x40, 0x11, 0x0, 0xd, 0xc, 0xb, 0x8, - 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xe, 0xc, 0xa, 0x8, 0x7, 0x4, 0x3, 0x0, - 0xf, 0xe, 0xa, 0x9, 0x1, 0x1, 0xa, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xa, 0x0, - 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x7, 0x21, 0x7, 0x21, 0x7, 0x21, 0x3, 0x21, 0x7, 0x21, 0x13, 0x25, 0x23, - 0x27, 0x33, 0x2, 0x84, 0xa, 0xfe, 0x9e, 0x21, 0x1, 0x3b, 0xa, 0xfe, 0xc5, 0x24, 0x1, 0x73, - 0xa, 0xfe, 0x32, 0x62, 0x1, 0x5, 0x42, 0x29, 0x4b, 0x2, 0xd6, 0x48, 0xef, 0x48, 0xfe, 0xf1, - 0x48, 0x2, 0xd6, 0x4a, 0x9a, 0x0, 0x0, 0x2, 0x0, 0x4d, 0x0, 0x0, 0x1, 0x95, 0x3, 0xba, - 0x0, 0xb, 0x0, 0xf, 0x0, 0x61, 0x40, 0x25, 0x1, 0x10, 0x10, 0x40, 0x11, 0xc, 0xe, 0xd, - 0xb, 0xa, 0x9, 0x2, 0x1, 0x0, 0xe, 0xc, 0xa, 0x9, 0x6, 0x4, 0x3, 0x0, 0x8, 0x7, - 0x4, 0x3, 0x3, 0x7, 0x5, 0xf, 0xc, 0x6, 0x5, 0x1, 0x1, 0x6, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x6, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x3, 0x33, 0x7, 0x23, 0x37, 0x33, - 0x13, 0x23, 0x3f, 0x1, 0x7, 0x23, 0x37, 0x1, 0x7d, 0x7, 0x3c, 0x54, 0x3c, 0x8, 0xcd, 0x7, - 0x3c, 0x54, 0x3c, 0x7, 0xe6, 0x53, 0x41, 0x49, 0x2, 0xd5, 0x38, 0xfd, 0x9b, 0x38, 0x38, 0x2, - 0x65, 0x38, 0xe5, 0x9a, 0x9a, 0x0, 0x0, 0x2, 0x0, 0x4d, 0x0, 0x0, 0x1, 0xa9, 0x3, 0xb2, - 0x0, 0xb, 0x0, 0x12, 0x0, 0x67, 0x40, 0x28, 0x1, 0x13, 0x13, 0x40, 0x14, 0xc, 0x10, 0xf, - 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x2, 0x1, 0x0, 0x10, 0xc, 0xa, 0x9, 0x6, 0x4, 0x3, - 0x0, 0x8, 0x7, 0x4, 0x3, 0x3, 0x7, 0x5, 0x12, 0x11, 0x6, 0x5, 0x1, 0x1, 0x6, 0x46, - 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x13, 0x49, 0x68, 0x61, 0xb0, - 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x13, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, - 0x3, 0x33, 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x3f, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, - 0x1, 0x7d, 0x7, 0x3c, 0x54, 0x3c, 0x8, 0xcd, 0x7, 0x3c, 0x54, 0x3c, 0x7, 0xfa, 0x43, 0x39, - 0x51, 0x47, 0x80, 0x40, 0x2, 0xd5, 0x38, 0xfd, 0x9b, 0x38, 0x38, 0x2, 0x65, 0x38, 0x4b, 0x56, - 0x56, 0x92, 0x0, 0x3, 0x0, 0x4d, 0x0, 0x0, 0x1, 0xbd, 0x3, 0x85, 0x0, 0xb, 0x0, 0x17, - 0x0, 0x23, 0x0, 0x68, 0x40, 0x29, 0x1, 0x24, 0x24, 0x40, 0x25, 0x0, 0x23, 0x22, 0x21, 0x1a, - 0x19, 0x18, 0x22, 0x21, 0x1e, 0x1c, 0x1b, 0x18, 0x12, 0xc, 0x6, 0x0, 0xf, 0x3, 0x8, 0x9, - 0x20, 0x1f, 0x1c, 0x3, 0x1b, 0x7, 0x1d, 0x15, 0x9, 0x1e, 0x1d, 0x1, 0x1, 0x1e, 0x46, 0x76, - 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x10, 0xfd, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x1e, 0x0, 0x24, 0x49, 0x68, 0x61, 0xb0, 0x40, - 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x24, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x14, 0x6, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x7, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x23, 0x3, 0x33, 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x37, - 0x1, 0xbd, 0x1f, 0x17, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0xc7, 0x1f, 0x17, 0x16, 0x20, 0x20, - 0x16, 0x16, 0x20, 0x87, 0x7, 0x3c, 0x54, 0x3c, 0x8, 0xcd, 0x7, 0x3c, 0x54, 0x3c, 0x7, 0x3, - 0x4f, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x20, 0x16, 0x16, 0x20, 0x20, - 0x90, 0x38, 0xfd, 0x9b, 0x38, 0x38, 0x2, 0x65, 0x38, 0x0, 0x0, 0x2, 0x0, 0x4d, 0x0, 0x0, - 0x1, 0x7d, 0x3, 0xba, 0x0, 0xb, 0x0, 0xf, 0x0, 0x61, 0x40, 0x25, 0x1, 0x10, 0x10, 0x40, - 0x11, 0x0, 0xd, 0xc, 0xb, 0xa, 0x9, 0x2, 0x1, 0x0, 0xe, 0xc, 0xa, 0x9, 0x6, 0x4, - 0x3, 0x0, 0x8, 0x7, 0x4, 0x3, 0x3, 0x7, 0x5, 0xf, 0xe, 0x6, 0x5, 0x1, 0x1, 0x6, - 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x3c, 0x2f, 0x3c, 0x10, 0xfd, 0x17, 0x3c, 0x1, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x6, 0x0, 0x10, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, - 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x10, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x7, 0x23, 0x3, 0x33, - 0x7, 0x23, 0x37, 0x33, 0x13, 0x23, 0x3f, 0x1, 0x23, 0x27, 0x33, 0x1, 0x7d, 0x7, 0x3c, 0x54, - 0x3c, 0x8, 0xcd, 0x7, 0x3c, 0x54, 0x3c, 0x7, 0x87, 0x42, 0x29, 0x4b, 0x2, 0xd5, 0x38, 0xfd, - 0x9b, 0x38, 0x38, 0x2, 0x65, 0x38, 0x4b, 0x9a, 0x0, 0x3, 0x0, 0x5f, 0xff, 0xf8, 0x2, 0xf5, - 0x3, 0xba, 0x0, 0x13, 0x0, 0x25, 0x0, 0x29, 0x0, 0x4d, 0x40, 0x1a, 0x1, 0x2a, 0x2a, 0x40, - 0x2b, 0x12, 0x23, 0x1a, 0xe, 0x28, 0x26, 0x1f, 0x16, 0x12, 0x8, 0x28, 0x27, 0x8, 0x26, 0x29, - 0x26, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x10, 0xfd, - 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, - 0x68, 0xb9, 0x0, 0x8, 0x0, 0x2a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, - 0xb9, 0x0, 0x2a, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, - 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x27, - 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x3, 0x7, 0x23, - 0x37, 0x2, 0xf2, 0x16, 0x7d, 0x5c, 0x7f, 0x67, 0x54, 0x6a, 0x3, 0x15, 0x7f, 0x64, 0x7a, 0x6b, - 0x53, 0x63, 0x5d, 0x3, 0x3b, 0x39, 0x5e, 0x6c, 0x90, 0x11, 0x3, 0x33, 0x38, 0x6a, 0x6d, 0x8e, - 0x37, 0x53, 0x41, 0x49, 0x1, 0x68, 0xcc, 0x5e, 0x46, 0x45, 0x57, 0x9e, 0x1a, 0x1c, 0xbe, 0x64, - 0x50, 0x4b, 0x59, 0x99, 0x1a, 0x1b, 0x1b, 0x19, 0x74, 0x41, 0x3e, 0x9d, 0x8a, 0x1b, 0x1a, 0x6a, - 0x41, 0x48, 0x9e, 0x2, 0xdc, 0x9a, 0x9a, 0x0, 0x0, 0x3, 0x0, 0x5f, 0xff, 0xf8, 0x2, 0xf5, - 0x3, 0xb2, 0x0, 0x13, 0x0, 0x25, 0x0, 0x2c, 0x0, 0x50, 0x40, 0x1b, 0x1, 0x2d, 0x2d, 0x40, - 0x2e, 0x12, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x23, 0x1a, 0xe, 0x2a, 0x26, 0x1f, 0x16, 0x12, 0x8, - 0x2c, 0x2b, 0x4, 0x1, 0x1, 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, 0x2d, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2d, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, - 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, - 0x3, 0x23, 0x27, 0x7, 0x23, 0x37, 0x33, 0x2, 0xf2, 0x16, 0x7d, 0x5c, 0x7f, 0x67, 0x54, 0x6a, - 0x3, 0x15, 0x7f, 0x64, 0x7a, 0x6b, 0x53, 0x63, 0x5d, 0x3, 0x3b, 0x39, 0x5e, 0x6c, 0x90, 0x11, - 0x3, 0x33, 0x38, 0x6a, 0x6d, 0x8e, 0x1e, 0x43, 0x39, 0x51, 0x47, 0x81, 0x40, 0x1, 0x68, 0xcc, - 0x5e, 0x46, 0x45, 0x57, 0x9e, 0x1a, 0x1c, 0xbe, 0x64, 0x50, 0x4b, 0x59, 0x99, 0x1a, 0x1b, 0x1b, - 0x19, 0x74, 0x41, 0x3e, 0x9d, 0x8a, 0x1b, 0x1a, 0x6a, 0x41, 0x48, 0x9e, 0x2, 0x42, 0x56, 0x56, - 0x92, 0x0, 0x0, 0x5, 0x0, 0x64, 0xff, 0xfb, 0x3, 0x78, 0x3, 0x28, 0x0, 0xd, 0x0, 0x1d, - 0x0, 0x2e, 0x0, 0x3a, 0x0, 0x46, 0x0, 0x5e, 0x40, 0x23, 0x1, 0x47, 0x47, 0x40, 0x48, 0x1c, - 0x44, 0x3e, 0x38, 0x32, 0x2c, 0xd, 0x7, 0x41, 0x3b, 0x35, 0x2f, 0x29, 0x20, 0x1c, 0x14, 0x6, - 0x0, 0x24, 0x7, 0x19, 0xb, 0x7, 0x2, 0x19, 0x11, 0x1, 0x1, 0x14, 0x46, 0x76, 0x2f, 0x37, - 0x18, 0x0, 0x3f, 0x2f, 0x2f, 0xfd, 0x10, 0xfd, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0x14, 0x0, 0x47, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x47, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x6, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x17, - 0x16, 0x33, 0x32, 0x3f, 0x1, 0x6, 0x4, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x24, 0x33, - 0x32, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x7, 0x6, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, - 0x16, 0x17, 0xe, 0x1, 0x23, 0x22, 0x26, 0x37, 0x3e, 0x1, 0x33, 0x32, 0x16, 0x2, 0xbf, 0x57, - 0x97, 0x69, 0x37, 0x21, 0x8, 0x39, 0x11, 0xe, 0x26, 0x4f, 0x75, 0x3c, 0xee, 0x16, 0xfe, 0xfe, - 0xa5, 0x91, 0xc2, 0x3, 0x17, 0x1, 0x2, 0xa4, 0x96, 0xbe, 0x52, 0x4, 0x45, 0x49, 0x79, 0x88, - 0xd3, 0x13, 0x3, 0x94, 0x78, 0x83, 0xd3, 0xfe, 0xc7, 0x3, 0x20, 0x15, 0x16, 0x1c, 0x3, 0x3, - 0x1f, 0x16, 0x15, 0x1d, 0xaf, 0x2, 0x20, 0x15, 0x16, 0x1c, 0x3, 0x3, 0x1f, 0x15, 0x16, 0x1c, - 0x1, 0x5f, 0xb9, 0x52, 0x32, 0x3e, 0x16, 0x41, 0x18, 0x3e, 0x8f, 0x1b, 0xa8, 0xee, 0xcb, 0x94, - 0x1b, 0x1c, 0xa8, 0xef, 0xc9, 0x95, 0x1c, 0x1d, 0x1b, 0x1b, 0x7a, 0x4f, 0x52, 0xc6, 0x8b, 0x1a, - 0x19, 0x7a, 0xa4, 0xc7, 0x1, 0xa, 0x15, 0x1d, 0x20, 0x15, 0x16, 0x1c, 0x1f, 0x16, 0x15, 0x1d, - 0x20, 0x15, 0x16, 0x1c, 0x1f, 0x0, 0x0, 0x3, 0x0, 0x5f, 0xff, 0xf8, 0x2, 0xf5, 0x3, 0xb8, - 0x0, 0x13, 0x0, 0x25, 0x0, 0x29, 0x0, 0x4a, 0x40, 0x18, 0x1, 0x2a, 0x2a, 0x40, 0x2b, 0x12, - 0x27, 0x26, 0x23, 0x1a, 0xe, 0x28, 0x26, 0x1f, 0x16, 0x12, 0x8, 0x29, 0x28, 0x4, 0x1, 0x1, - 0x8, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x8, 0x0, - 0x2a, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x2a, 0xff, 0xc0, - 0x38, 0x59, 0x1, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, - 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x7, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x7, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x3, 0x23, 0x27, 0x33, 0x2, 0xf2, 0x16, 0x7d, - 0x5c, 0x7f, 0x67, 0x54, 0x6a, 0x3, 0x15, 0x7f, 0x64, 0x7a, 0x6b, 0x53, 0x63, 0x5d, 0x3, 0x3b, - 0x39, 0x5e, 0x6c, 0x90, 0x11, 0x3, 0x33, 0x38, 0x6a, 0x6d, 0x8e, 0x7d, 0x42, 0x29, 0x4b, 0x1, - 0x68, 0xcc, 0x5e, 0x46, 0x45, 0x57, 0x9e, 0x1a, 0x1c, 0xbe, 0x64, 0x50, 0x4b, 0x59, 0x99, 0x1a, - 0x1b, 0x1b, 0x19, 0x74, 0x41, 0x3e, 0x9d, 0x8a, 0x1b, 0x1a, 0x6a, 0x41, 0x48, 0x9e, 0x2, 0x40, - 0x9a, 0x0, 0x0, 0x2, 0x0, 0x6e, 0xff, 0xf8, 0x2, 0xd9, 0x3, 0xb8, 0x0, 0x3, 0x0, 0x1d, - 0x0, 0x4e, 0x40, 0x1a, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x4, 0x1d, 0x18, 0x11, 0x10, 0x4, 0x2, - 0x1, 0x14, 0x11, 0xd, 0x4, 0x2, 0x0, 0x3, 0x0, 0x9, 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, - 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0xd, 0x0, 0x1e, 0x49, - 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, - 0x1, 0x7, 0x23, 0x37, 0x17, 0x3, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x2, 0x35, - 0x53, 0x41, 0x4a, 0xee, 0x45, 0x15, 0x5b, 0x4f, 0x73, 0x5f, 0x43, 0x52, 0x4, 0x44, 0x5a, 0x43, - 0x4, 0x34, 0x2a, 0x3e, 0x4b, 0x35, 0x43, 0x11, 0x46, 0x3, 0xb8, 0x9a, 0x9a, 0xc1, 0xfe, 0x1d, - 0x93, 0x49, 0x40, 0x35, 0x42, 0x7b, 0x1c, 0x1e, 0x1, 0xd3, 0xfe, 0x28, 0x1c, 0x18, 0x5b, 0x2c, - 0x23, 0x2a, 0x36, 0x74, 0x1, 0xe2, 0x0, 0x2, 0x0, 0x6e, 0xff, 0xf8, 0x2, 0xd9, 0x3, 0xb2, - 0x0, 0x6, 0x0, 0x20, 0x0, 0x54, 0x40, 0x1d, 0x1, 0x21, 0x21, 0x40, 0x22, 0x7, 0x20, 0x1b, - 0x14, 0x13, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x17, 0x14, 0x10, 0x7, 0x4, 0x0, 0x6, 0x5, - 0xc, 0x1, 0x1, 0x10, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, - 0x30, 0x1, 0x49, 0x68, 0xb9, 0x0, 0x10, 0x0, 0x21, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, - 0x38, 0x11, 0x37, 0xb9, 0x0, 0x21, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x7, 0x23, 0x37, - 0x33, 0x17, 0x3, 0x6, 0x7, 0x6, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x33, 0x3, - 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x2, 0x58, 0x44, 0x39, 0x50, - 0x47, 0x80, 0x40, 0xd5, 0x45, 0x15, 0x5b, 0x4f, 0x73, 0x5f, 0x43, 0x52, 0x4, 0x44, 0x5a, 0x43, - 0x4, 0x34, 0x2a, 0x3e, 0x4b, 0x35, 0x43, 0x11, 0x46, 0x3, 0x20, 0x56, 0x56, 0x92, 0xbb, 0xfe, - 0x1d, 0x93, 0x49, 0x40, 0x35, 0x42, 0x7b, 0x1c, 0x1e, 0x1, 0xd3, 0xfe, 0x28, 0x1c, 0x18, 0x5b, - 0x2c, 0x23, 0x2a, 0x36, 0x74, 0x1, 0xe2, 0x0, 0x0, 0x2, 0x0, 0x6e, 0xff, 0xf8, 0x2, 0xd9, - 0x3, 0xba, 0x0, 0x3, 0x0, 0x1d, 0x0, 0x4e, 0x40, 0x1a, 0x1, 0x1e, 0x1e, 0x40, 0x1f, 0x4, - 0x1d, 0x18, 0x11, 0x10, 0x4, 0x1, 0x0, 0x14, 0x11, 0xd, 0x4, 0x2, 0x0, 0x3, 0x2, 0x9, - 0x1, 0x1, 0xd, 0x46, 0x76, 0x2f, 0x37, 0x18, 0x0, 0x3f, 0x2f, 0x3c, 0x1, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x0, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x30, 0x1, 0x49, 0x68, - 0xb9, 0x0, 0xd, 0x0, 0x1e, 0x49, 0x68, 0x61, 0xb0, 0x40, 0x52, 0x58, 0x38, 0x11, 0x37, 0xb9, - 0x0, 0x1e, 0xff, 0xc0, 0x38, 0x59, 0x1, 0x23, 0x27, 0x33, 0x5, 0x3, 0x6, 0x7, 0x6, 0x23, - 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x33, 0x3, 0x6, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x37, 0x36, 0x37, 0x13, 0x1, 0xf2, 0x42, 0x29, 0x4b, 0x1, 0x7, 0x45, 0x15, 0x5b, 0x4f, 0x73, - 0x5f, 0x43, 0x52, 0x4, 0x44, 0x5a, 0x43, 0x4, 0x34, 0x2a, 0x3e, 0x4b, 0x35, 0x43, 0x11, 0x46, - 0x3, 0x20, 0x9a, 0xc3, 0xfe, 0x1d, 0x93, 0x49, 0x40, 0x35, 0x42, 0x7b, 0x1c, 0x1e, 0x1, 0xd3, - 0xfe, 0x28, 0x1c, 0x18, 0x5b, 0x2c, 0x23, 0x2a, 0x36, 0x74, 0x1, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x7c, - 0x0, 0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0x2, 0x68, 0x0, 0x0, 0x3, 0x62, - 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x5, 0x46, 0x0, 0x0, 0x5, 0x9a, 0x0, 0x0, 0x6, 0x16, - 0x0, 0x0, 0x6, 0x92, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x8, 0x22, - 0x0, 0x0, 0x8, 0x76, 0x0, 0x0, 0x8, 0xda, 0x0, 0x0, 0x9, 0x34, 0x0, 0x0, 0x9, 0xe0, - 0x0, 0x0, 0xa, 0x5e, 0x0, 0x0, 0xb, 0x2, 0x0, 0x0, 0xb, 0xe0, 0x0, 0x0, 0xc, 0x78, - 0x0, 0x0, 0xd, 0x34, 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, 0xe, 0x6a, 0x0, 0x0, 0xf, 0x6a, - 0x0, 0x0, 0x10, 0x3e, 0x0, 0x0, 0x10, 0xd0, 0x0, 0x0, 0x11, 0x72, 0x0, 0x0, 0x11, 0xe8, - 0x0, 0x0, 0x12, 0x5e, 0x0, 0x0, 0x12, 0xd4, 0x0, 0x0, 0x13, 0xa2, 0x0, 0x0, 0x14, 0xf0, - 0x0, 0x0, 0x15, 0x78, 0x0, 0x0, 0x16, 0x3c, 0x0, 0x0, 0x16, 0xde, 0x0, 0x0, 0x17, 0x74, - 0x0, 0x0, 0x17, 0xfe, 0x0, 0x0, 0x18, 0x7a, 0x0, 0x0, 0x19, 0x4c, 0x0, 0x0, 0x19, 0xd6, - 0x0, 0x0, 0x1a, 0x60, 0x0, 0x0, 0x1a, 0xc8, 0x0, 0x0, 0x1b, 0x52, 0x0, 0x0, 0x1b, 0xb8, - 0x0, 0x0, 0x1c, 0x52, 0x0, 0x0, 0x1c, 0xd2, 0x0, 0x0, 0x1d, 0x80, 0x0, 0x0, 0x1e, 0x1a, - 0x0, 0x0, 0x1f, 0x14, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x20, 0x8a, 0x0, 0x0, 0x20, 0xf8, - 0x0, 0x0, 0x21, 0x94, 0x0, 0x0, 0x22, 0x4, 0x0, 0x0, 0x22, 0xa2, 0x0, 0x0, 0x23, 0x2a, - 0x0, 0x0, 0x23, 0xa2, 0x0, 0x0, 0x24, 0x26, 0x0, 0x0, 0x24, 0x9a, 0x0, 0x0, 0x24, 0xee, - 0x0, 0x0, 0x25, 0x62, 0x0, 0x0, 0x25, 0xc4, 0x0, 0x0, 0x26, 0x18, 0x0, 0x0, 0x26, 0x6a, - 0x0, 0x0, 0x27, 0x32, 0x0, 0x0, 0x27, 0xf2, 0x0, 0x0, 0x28, 0x8e, 0x0, 0x0, 0x29, 0x5a, - 0x0, 0x0, 0x2a, 0x26, 0x0, 0x0, 0x2a, 0xbc, 0x0, 0x0, 0x2b, 0x96, 0x0, 0x0, 0x2c, 0x3c, - 0x0, 0x0, 0x2c, 0xd6, 0x0, 0x0, 0x2d, 0x6e, 0x0, 0x0, 0x2d, 0xf4, 0x0, 0x0, 0x2e, 0x64, - 0x0, 0x0, 0x2f, 0x4c, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x30, 0x98, 0x0, 0x0, 0x31, 0x68, - 0x0, 0x0, 0x32, 0x28, 0x0, 0x0, 0x32, 0xba, 0x0, 0x0, 0x33, 0x70, 0x0, 0x0, 0x34, 0x10, - 0x0, 0x0, 0x34, 0xbe, 0x0, 0x0, 0x35, 0x2e, 0x0, 0x0, 0x35, 0xcc, 0x0, 0x0, 0x36, 0x4c, - 0x0, 0x0, 0x36, 0xe4, 0x0, 0x0, 0x37, 0x66, 0x0, 0x0, 0x38, 0x38, 0x0, 0x0, 0x38, 0x8e, - 0x0, 0x0, 0x39, 0x56, 0x0, 0x0, 0x39, 0xce, 0x0, 0x0, 0x3a, 0x56, 0x0, 0x0, 0x3b, 0x26, - 0x0, 0x0, 0x3c, 0x2, 0x0, 0x0, 0x3d, 0x18, 0x0, 0x0, 0x3d, 0x7e, 0x0, 0x0, 0x3e, 0x10, - 0x0, 0x0, 0x3e, 0xfc, 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x40, 0xa0, - 0x0, 0x0, 0x41, 0x8a, 0x0, 0x0, 0x42, 0x1e, 0x0, 0x0, 0x42, 0xd6, 0x0, 0x0, 0x43, 0x70, - 0x0, 0x0, 0x44, 0xbc, 0x0, 0x0, 0x45, 0x74, 0x0, 0x0, 0x46, 0x4c, 0x0, 0x0, 0x46, 0xcc, - 0x0, 0x0, 0x47, 0x80, 0x0, 0x0, 0x48, 0x8, 0x0, 0x0, 0x48, 0x8e, 0x0, 0x0, 0x49, 0x48, - 0x0, 0x0, 0x4a, 0x28, 0x0, 0x0, 0x4b, 0x36, 0x0, 0x0, 0x4b, 0x8c, 0x0, 0x0, 0x4b, 0xe2, - 0x0, 0x0, 0x4c, 0x94, 0x0, 0x0, 0x4c, 0xae, 0x0, 0x0, 0x4d, 0x22, 0x0, 0x0, 0x4d, 0x34, - 0x0, 0x0, 0x4d, 0x44, 0x0, 0x0, 0x4e, 0x1c, 0x0, 0x0, 0x4e, 0x7e, 0x0, 0x0, 0x4e, 0xde, - 0x0, 0x0, 0x4e, 0xf6, 0x0, 0x0, 0x4f, 0xe, 0x0, 0x0, 0x4f, 0xc0, 0x0, 0x0, 0x4f, 0xd2, - 0x0, 0x0, 0x4f, 0xe2, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x51, 0x4a, 0x0, 0x0, 0x51, 0xba, - 0x0, 0x0, 0x52, 0x1c, 0x0, 0x0, 0x52, 0x9a, 0x0, 0x0, 0x52, 0xee, 0x0, 0x0, 0x53, 0x64, - 0x0, 0x0, 0x53, 0x76, 0x0, 0x0, 0x54, 0x8, 0x0, 0x0, 0x54, 0x94, 0x0, 0x0, 0x55, 0x2, - 0x0, 0x0, 0x55, 0x8a, 0x0, 0x0, 0x55, 0xea, 0x0, 0x0, 0x56, 0x2, 0x0, 0x0, 0x56, 0x18, - 0x0, 0x0, 0x56, 0x70, 0x0, 0x0, 0x57, 0x4c, 0x0, 0x0, 0x58, 0x28, 0x0, 0x0, 0x58, 0x40, - 0x0, 0x0, 0x58, 0xe6, 0x0, 0x0, 0x59, 0xa6, 0x0, 0x0, 0x5a, 0xae, 0x0, 0x0, 0x5b, 0x9e, - 0x0, 0x0, 0x5b, 0xb6, 0x0, 0x0, 0x5b, 0xce, 0x0, 0x0, 0x5b, 0xe4, 0x0, 0x0, 0x5c, 0xfe, - 0x0, 0x0, 0x5d, 0x14, 0x0, 0x0, 0x5d, 0x2c, 0x0, 0x0, 0x5d, 0x44, 0x0, 0x0, 0x5d, 0x5c, - 0x0, 0x0, 0x5d, 0x74, 0x0, 0x0, 0x5d, 0x8a, 0x0, 0x0, 0x5d, 0xa2, 0x0, 0x0, 0x5d, 0xb8, - 0x0, 0x0, 0x5d, 0xce, 0x0, 0x0, 0x5d, 0xe4, 0x0, 0x0, 0x5e, 0xaa, 0x0, 0x0, 0x5e, 0xc2, - 0x0, 0x0, 0x5e, 0xda, 0x0, 0x0, 0x5e, 0xf2, 0x0, 0x0, 0x5f, 0x8, 0x0, 0x0, 0x5f, 0xf4, - 0x0, 0x0, 0x60, 0xa, 0x0, 0x0, 0x60, 0x22, 0x0, 0x0, 0x60, 0x3a, 0x0, 0x0, 0x60, 0x50, - 0x0, 0x0, 0x61, 0x50, 0x0, 0x0, 0x61, 0xe6, 0x0, 0x0, 0x63, 0xc, 0x0, 0x0, 0x64, 0x3a, - 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x65, 0xac, 0x0, 0x0, 0x65, 0xac, 0x0, 0x0, 0x66, 0x46, - 0x0, 0x0, 0x66, 0xbc, 0x0, 0x0, 0x67, 0x30, 0x0, 0x0, 0x67, 0xe6, 0x0, 0x0, 0x67, 0xe6, - 0x0, 0x0, 0x68, 0x8a, 0x0, 0x0, 0x69, 0x2e, 0x0, 0x0, 0x69, 0xd8, 0x0, 0x0, 0x6a, 0x5e, - 0x0, 0x0, 0x6a, 0x5e, 0x0, 0x0, 0x6a, 0xc4, 0x0, 0x0, 0x6b, 0xfc, 0x0, 0x0, 0x6f, 0xe, - 0x0, 0x0, 0x6f, 0x9a, 0x0, 0x0, 0x6f, 0x9a, 0x0, 0x0, 0x70, 0x3a, 0x0, 0x0, 0x71, 0x6, - 0x0, 0x0, 0x71, 0xfa, 0x0, 0x0, 0x72, 0xaa, 0x0, 0x0, 0x72, 0xaa, 0x0, 0x0, 0x73, 0x92, - 0x0, 0x0, 0x74, 0x58, 0x0, 0x0, 0x75, 0x8, 0x0, 0x0, 0x75, 0xb8, 0x0, 0x0, 0x76, 0x5a, - 0x0, 0x0, 0x77, 0x34, 0x0, 0x0, 0x77, 0xd6, 0x0, 0x0, 0x78, 0x76, 0x0, 0x0, 0x79, 0x22, - 0x0, 0x0, 0x79, 0xfa, 0x0, 0x0, 0x7a, 0x98, 0x0, 0x0, 0x7b, 0x68, 0x0, 0x0, 0x7c, 0x42, - 0x0, 0x0, 0x7d, 0x76, 0x0, 0x0, 0x7e, 0x42, 0x0, 0x0, 0x7e, 0xf6, 0x0, 0x0, 0x7f, 0xb8, - 0x0, 0x0, 0x80, 0x6c, 0x1, 0xf4, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9, 0x0, 0x0, - 0x1, 0x9, 0x0, 0x0, 0x1, 0xbc, 0x0, 0x70, 0x1, 0x4c, 0x0, 0x5, 0x2, 0xc0, 0x0, 0x3c, - 0x2, 0xa6, 0x0, 0x56, 0x3, 0x54, 0x0, 0x3c, 0x3, 0x80, 0x0, 0x64, 0x1, 0x10, 0x0, 0x78, - 0x1, 0x53, 0x0, 0x3c, 0x1, 0x8f, 0x0, 0x3c, 0x2, 0x29, 0x0, 0x5f, 0x1, 0xf7, 0x0, 0x3c, - 0x1, 0x3e, 0x0, 0x5c, 0x1, 0x51, 0x0, 0x3c, 0x0, 0xfa, 0x0, 0x39, 0x2, 0x15, 0x0, 0x3c, - 0x2, 0x87, 0x0, 0x46, 0x1, 0xe1, 0x0, 0x46, 0x2, 0x55, 0x0, 0x46, 0x2, 0x73, 0x0, 0x46, - 0x2, 0x6e, 0x0, 0x46, 0x2, 0x4c, 0x0, 0x46, 0x2, 0x52, 0x0, 0x46, 0x2, 0x30, 0x0, 0x46, - 0x2, 0x5b, 0x0, 0x43, 0x2, 0x48, 0x0, 0x3f, 0x1, 0x36, 0x0, 0x39, 0x1, 0x32, 0x0, 0x39, - 0x2, 0x98, 0x0, 0x19, 0x2, 0x64, 0x0, 0x69, 0x2, 0x9a, 0x0, 0x3c, 0x1, 0xfe, 0x0, 0x64, - 0x3, 0xf6, 0x0, 0x55, 0x2, 0x85, 0xff, 0xec, 0x2, 0xa6, 0x0, 0x64, 0x2, 0x72, 0x0, 0x5f, - 0x2, 0xcb, 0x0, 0x64, 0x2, 0x69, 0x0, 0x64, 0x2, 0x4a, 0x0, 0x64, 0x2, 0xef, 0x0, 0x5f, - 0x2, 0xe9, 0x0, 0x64, 0x1, 0x6f, 0x0, 0x4d, 0x1, 0x54, 0x0, 0xa, 0x2, 0x96, 0x0, 0x64, - 0x2, 0x20, 0x0, 0x64, 0x3, 0x5f, 0x0, 0x64, 0x2, 0xfe, 0x0, 0x64, 0x2, 0xff, 0x0, 0x5f, - 0x2, 0x80, 0x0, 0x64, 0x2, 0xff, 0x0, 0x5f, 0x2, 0x8f, 0x0, 0x64, 0x2, 0x4c, 0x0, 0x28, - 0x1, 0xab, 0x0, 0x4b, 0x2, 0xdd, 0x0, 0x6e, 0x2, 0x37, 0x0, 0x64, 0x3, 0x75, 0x0, 0x64, - 0x2, 0x4a, 0xff, 0xec, 0x1, 0xfc, 0x0, 0x50, 0x2, 0x32, 0x0, 0xa, 0x1, 0x9e, 0x0, 0x3c, - 0x1, 0xda, 0x0, 0x3c, 0x1, 0xda, 0x0, 0x3c, 0x1, 0x8a, 0x0, 0x5, 0x2, 0xf, 0x0, 0x3c, - 0x1, 0x33, 0x0, 0x64, 0x2, 0x39, 0x0, 0x3c, 0x2, 0xb, 0x0, 0x41, 0x1, 0xb6, 0x0, 0x3c, - 0x2, 0x34, 0x0, 0x3c, 0x1, 0xf5, 0x0, 0x3c, 0x1, 0x32, 0xff, 0xce, 0x2, 0x3d, 0x0, 0x41, - 0x2, 0x4c, 0x0, 0x41, 0x1, 0x7, 0x0, 0x46, 0x1, 0x8, 0xff, 0xce, 0x2, 0x0, 0x0, 0x41, - 0x1, 0x6, 0x0, 0x41, 0x3, 0x75, 0x0, 0x4b, 0x2, 0x54, 0x0, 0x4b, 0x2, 0x8, 0x0, 0x37, - 0x2, 0x15, 0x0, 0xf, 0x2, 0x21, 0x0, 0x3c, 0x1, 0x85, 0x0, 0x4b, 0x1, 0xaf, 0x0, 0x14, - 0x1, 0x4b, 0x0, 0x3e, 0x2, 0x3e, 0x0, 0x4b, 0x1, 0xbb, 0x0, 0x1e, 0x2, 0xd4, 0x0, 0x2d, - 0x1, 0xcf, 0xff, 0xdd, 0x1, 0xbb, 0xff, 0xbf, 0x1, 0xce, 0x0, 0xf, 0x1, 0x48, 0x0, 0x3c, - 0x1, 0x5a, 0x0, 0x69, 0x1, 0x7a, 0x0, 0x14, 0x1, 0x6d, 0x0, 0x1e, 0x2, 0x31, 0x0, 0x3c, - 0x1, 0xca, 0x0, 0x32, 0x2, 0xa0, 0x0, 0x3c, 0x2, 0x24, 0x0, 0x3c, 0x1, 0x86, 0x0, 0x37, - 0x2, 0x2a, 0x0, 0x55, 0x2, 0xc, 0xff, 0xb5, 0x1, 0xc, 0x0, 0x3c, 0x1, 0x7e, 0x0, 0x3b, - 0x3, 0x7e, 0xff, 0xe2, 0x2, 0xff, 0x0, 0x5f, 0x2, 0x56, 0x0, 0x64, 0x1, 0xb7, 0x0, 0x3c, - 0x1, 0xac, 0x0, 0x3c, 0x2, 0xef, 0x0, 0x0, 0x2, 0x31, 0x0, 0x37, 0x1, 0xde, 0x0, 0x3c, - 0x1, 0x12, 0x0, 0x28, 0x2, 0x2b, 0x0, 0x14, 0x2, 0xb8, 0x0, 0x3c, 0x2, 0x90, 0x0, 0x36, - 0x3, 0x4e, 0x0, 0x52, 0x3, 0xe2, 0x0, 0x5f, 0x3, 0x44, 0x0, 0x37, 0x2, 0xe, 0x0, 0x3c, - 0x2, 0x90, 0x0, 0x3c, 0x1, 0xb4, 0x0, 0x3b, 0x1, 0xf4, 0x0, 0x78, 0x1, 0x20, 0x0, 0x64, - 0x1, 0x5c, 0x0, 0x78, 0x2, 0x15, 0x0, 0x3c, 0x3, 0x15, 0x0, 0x3c, 0x1, 0xc5, 0x0, 0x3c, - 0x1, 0x9d, 0x0, 0x2f, 0x2, 0x46, 0xff, 0xce, 0x2, 0x3c, 0xff, 0xce, 0x2, 0x90, 0x0, 0x55, - 0x0, 0xfa, 0x0, 0x3c, 0x0, 0xf8, 0x0, 0x3c, 0x1, 0xd8, 0x0, 0x5c, 0x5, 0x56, 0x0, 0x55, - 0x1, 0x1d, 0x0, 0x5c, 0x1, 0x8a, 0x0, 0x54, 0x1, 0xa7, 0x0, 0x60, 0x1, 0x6e, 0x0, 0x4d, - 0x1, 0xc1, 0x0, 0x6b, 0x0, 0xf7, 0x0, 0x3b, 0x1, 0x3d, 0x0, 0x53, 0x1, 0x1a, 0xff, 0xdf, - 0x1, 0xfa, 0x0, 0x3b, 0x1, 0x1a, 0x0, 0x2f, 0x1, 0x8a, 0x0, 0x4a, 0x2, 0x66, 0x0, 0xe, - 0x1, 0xb3, 0x0, 0x6, 0x2, 0x57, 0x0, 0x36, 0x2, 0x9f, 0xff, 0xec, 0x2, 0x85, 0xff, 0xec, - 0x2, 0x72, 0x0, 0x5f, 0x2, 0x61, 0x0, 0x64, 0x3, 0x0, 0x0, 0x64, 0x2, 0xfa, 0x0, 0x5f, - 0x2, 0xd9, 0x0, 0x6e, 0x2, 0x39, 0x0, 0x3c, 0x2, 0x39, 0x0, 0x3c, 0x2, 0x39, 0x0, 0x3c, - 0x2, 0x39, 0x0, 0x3c, 0x2, 0x39, 0x0, 0x3c, 0x2, 0x39, 0x0, 0x3c, 0x1, 0xb6, 0x0, 0x3c, - 0x1, 0xf5, 0x0, 0x3c, 0x1, 0xf5, 0x0, 0x3c, 0x1, 0xf5, 0x0, 0x3c, 0x1, 0xf5, 0x0, 0x3c, - 0x1, 0xa, 0x0, 0x46, 0x1, 0x8, 0x0, 0x46, 0x1, 0xa, 0x0, 0x32, 0x1, 0xb, 0x0, 0x36, - 0x2, 0x5e, 0x0, 0x55, 0x2, 0x8, 0x0, 0x37, 0x2, 0x8, 0x0, 0x37, 0x2, 0x8, 0x0, 0x37, - 0x2, 0x8, 0x0, 0x37, 0x2, 0x8, 0x0, 0x37, 0x2, 0x3e, 0x0, 0x4b, 0x2, 0x3e, 0x0, 0x4b, - 0x2, 0x3e, 0x0, 0x4b, 0x2, 0x3e, 0x0, 0x4b, 0x1, 0xe5, 0x0, 0x36, 0x3, 0xe1, 0x0, 0x3c, - 0x3, 0xe1, 0x0, 0x3c, 0x3, 0x83, 0x0, 0x3c, 0x2, 0x16, 0x0, 0x3c, 0x1, 0x38, 0x0, 0x0, - 0x2, 0x18, 0x0, 0x3c, 0x3, 0x0, 0x0, 0x3c, 0x3, 0x2, 0x0, 0x3c, 0x2, 0xa6, 0x0, 0x3c, - 0x1, 0x38, 0x0, 0x0, 0x1, 0xce, 0x0, 0x4, 0x2, 0xfe, 0x0, 0x28, 0x2, 0x4f, 0x0, 0x28, - 0x1, 0xdb, 0xff, 0xf6, 0x1, 0x38, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x3c, 0x3, 0xbf, 0x0, 0x55, - 0x5, 0x2f, 0x0, 0x64, 0x3, 0x1d, 0x0, 0x21, 0x1, 0x38, 0x0, 0x0, 0x2, 0x85, 0xff, 0xec, - 0x2, 0x98, 0xff, 0xec, 0x2, 0xfa, 0x0, 0x5f, 0x1, 0xdd, 0x0, 0x3c, 0x1, 0x38, 0x0, 0x0, - 0x1, 0xbb, 0xff, 0xbf, 0x1, 0xfc, 0x0, 0x50, 0x2, 0x86, 0xff, 0xec, 0x2, 0x61, 0x0, 0x64, - 0x2, 0x85, 0xff, 0xec, 0x2, 0x61, 0x0, 0x64, 0x2, 0x61, 0x0, 0x64, 0x1, 0x70, 0x0, 0x4d, - 0x1, 0x74, 0x0, 0x4d, 0x1, 0x75, 0x0, 0x4d, 0x1, 0x6c, 0x0, 0x4d, 0x2, 0xfa, 0x0, 0x5f, - 0x2, 0xfa, 0x0, 0x5f, 0x3, 0xb7, 0x0, 0x64, 0x2, 0xfa, 0x0, 0x5f, 0x2, 0xd9, 0x0, 0x6e, - 0x2, 0xd9, 0x0, 0x6e, 0x2, 0xd9, 0x0, 0x6e, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x7b, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, - 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, - 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, - 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, - 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, - 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, - 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, - 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, - 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, - 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, 0x0, 0x49, 0x0, 0x4a, - 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, - 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, - 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x82, - 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8d, 0x0, 0x8e, - 0x0, 0x90, 0x0, 0x91, 0x0, 0x96, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, - 0x0, 0xa3, 0x0, 0xa6, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, - 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, - 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, - 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xda, 0x0, 0xdb, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, - 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe4, 0x0, 0xe5, 0x1, 0x2, 0x0, 0x62, 0x0, 0x63, - 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, - 0x0, 0x6c, 0x0, 0x6d, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, - 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, - 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x83, 0x0, 0x8a, - 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8f, 0x0, 0x92, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x97, - 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9f, 0x0, 0xa4, 0x0, 0xa5, - 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb8, 0x0, 0xb9, - 0x0, 0xba, 0x0, 0xbb, 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, - 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, - 0x0, 0xd5, 0x0, 0xd6, 0x3, 0x44, 0x45, 0x4c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x24, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x3, 0x0, 0x1, - 0x0, 0x0, 0x1, 0x24, 0x0, 0x0, 0x1, 0x6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x3, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, - 0x9, 0x7f, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x7e, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x63, 0x64, 0x80, 0x6d, - 0x74, 0x65, 0x81, 0xa, 0x7c, 0x75, 0x82, 0x83, 0x84, 0x85, 0x0, 0x7a, 0x62, 0x86, 0x87, 0x0, - 0x67, 0x66, 0x88, 0x89, 0x7d, 0x76, 0x77, 0x8a, 0x0, 0x72, 0x0, 0x43, 0x69, 0x8c, 0x8d, 0x8e, - 0x8f, 0x90, 0x6a, 0x0, 0x91, 0x92, 0x0, 0x93, 0x94, 0x95, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x0, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0x78, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x8b, - 0x0, 0x0, 0x0, 0x71, 0x79, 0x68, 0x96, 0x97, 0x98, 0x99, 0x0, 0x0, 0x0, 0x4, 0x3, 0x6a, - 0x0, 0x0, 0x0, 0x62, 0x0, 0x40, 0x0, 0x5, 0x0, 0x22, 0x0, 0x7e, 0x0, 0xa5, 0x0, 0xac, - 0x0, 0xb1, 0x0, 0xb8, 0x0, 0xbb, 0x0, 0xcf, 0x0, 0xd6, 0x0, 0xdc, 0x0, 0xef, 0x0, 0xfc, - 0x0, 0xff, 0x1, 0x31, 0x1, 0x53, 0x1, 0x61, 0x1, 0x78, 0x1, 0x92, 0x2, 0xc7, 0x2, 0xc9, - 0x2, 0xdd, 0x3, 0x94, 0x3, 0xa9, 0x3, 0xbc, 0x3, 0xc0, 0x20, 0x10, 0x20, 0x14, 0x20, 0x1a, - 0x20, 0x1e, 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x3a, 0x20, 0x44, 0x21, 0x22, 0x21, 0x26, - 0x22, 0x2, 0x22, 0x6, 0x22, 0xf, 0x22, 0x11, 0x22, 0x1a, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, - 0x22, 0x60, 0x22, 0x65, 0x22, 0xf2, 0x25, 0xca, 0xf0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x20, - 0x0, 0xa0, 0x0, 0xa7, 0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, 0x0, 0xbf, 0x0, 0xd1, 0x0, 0xd8, - 0x0, 0xdf, 0x0, 0xf1, 0x0, 0xff, 0x1, 0x31, 0x1, 0x52, 0x1, 0x60, 0x1, 0x78, 0x1, 0x92, - 0x2, 0xc6, 0x2, 0xc9, 0x2, 0xd8, 0x3, 0x94, 0x3, 0xa9, 0x3, 0xbc, 0x3, 0xc0, 0x20, 0x10, - 0x20, 0x13, 0x20, 0x18, 0x20, 0x1c, 0x20, 0x20, 0x20, 0x26, 0x20, 0x30, 0x20, 0x39, 0x20, 0x44, - 0x21, 0x22, 0x21, 0x26, 0x22, 0x2, 0x22, 0x6, 0x22, 0xf, 0x22, 0x11, 0x22, 0x19, 0x22, 0x1e, - 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, 0x22, 0xf2, 0x25, 0xca, 0xf0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x62, 0x1, 0x1e, 0x1, 0x28, 0x1, 0x32, 0x1, 0x38, 0x1, 0x40, 0x1, 0x42, - 0x1, 0x62, 0x1, 0x6c, 0x1, 0x74, 0x1, 0x94, 0x1, 0xaa, 0x1, 0xaa, 0x1, 0xaa, 0x1, 0xac, - 0x1, 0xae, 0x1, 0xae, 0x1, 0xae, 0x1, 0xb0, 0x1, 0xb0, 0x1, 0xba, 0x1, 0xba, 0x1, 0xba, - 0x1, 0xba, 0x1, 0xba, 0x1, 0xba, 0x1, 0xbc, 0x1, 0xc0, 0x1, 0xc4, 0x1, 0xc8, 0x1, 0xc8, - 0x1, 0xc8, 0x1, 0xca, 0x1, 0xca, 0x1, 0xca, 0x1, 0xca, 0x1, 0xca, 0x1, 0xca, 0x1, 0xca, - 0x1, 0xca, 0x1, 0xcc, 0x1, 0xcc, 0x1, 0xcc, 0x1, 0xcc, 0x1, 0xcc, 0x1, 0xce, 0x1, 0xce, - 0x1, 0xce, 0xff, 0xff, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, - 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, - 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, - 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, - 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, - 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, - 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, - 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, - 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, - 0x0, 0x49, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, - 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, - 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, - 0x0, 0x61, 0x0, 0xcd, 0x0, 0x73, 0x0, 0x63, 0x0, 0x64, 0x0, 0x81, 0x0, 0x6d, 0x0, 0x65, - 0x0, 0x6a, 0x0, 0xbb, 0x0, 0x6e, 0x0, 0x75, 0x0, 0xc9, 0x0, 0xba, 0x0, 0x8e, 0x0, 0xb9, - 0x0, 0xbf, 0x0, 0x69, 0x0, 0xc2, 0x0, 0x67, 0x0, 0x87, 0x0, 0x92, 0x0, 0x6f, 0x0, 0x76, - 0x0, 0x72, 0x0, 0xce, 0x0, 0xd7, 0x0, 0xd5, 0x0, 0xcf, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x6b, - 0x0, 0x9b, 0x0, 0xd9, 0x0, 0x9c, 0x0, 0xd6, 0x0, 0xd8, 0x0, 0xdd, 0x0, 0xda, 0x0, 0xdb, - 0x0, 0xdc, 0x0, 0x9d, 0x0, 0xe1, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xd0, 0x0, 0x9e, 0x0, 0x6c, - 0x0, 0xe4, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0x9f, 0x0, 0x68, 0x0, 0xa1, 0x0, 0xa0, 0x0, 0xa2, - 0x0, 0xa4, 0x0, 0xa3, 0x0, 0xa5, 0x0, 0x70, 0x0, 0xa6, 0x0, 0xa8, 0x0, 0xa7, 0x0, 0xa9, - 0x0, 0xaa, 0x0, 0xac, 0x0, 0xab, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb1, 0x0, 0xb0, - 0x0, 0xb2, 0x0, 0xb4, 0x0, 0xb3, 0x0, 0xd1, 0x0, 0x71, 0x0, 0xb6, 0x0, 0xb5, 0x0, 0xb7, - 0x0, 0xb8, 0x0, 0xd3, 0x0, 0x8b, 0x0, 0x78, 0x0, 0x79, 0x0, 0x96, 0x0, 0x97, 0x0, 0xd4, - 0x0, 0x74, 0x0, 0x8c, 0x0, 0x95, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x91, 0x0, 0x94, - 0x0, 0x8d, 0x0, 0x93, 0x0, 0xcc, 0x0, 0xc8, 0x0, 0xc2, 0x0, 0xc6, 0x0, 0x10, 0x0, 0x7a, - 0x0, 0x7b, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x88, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x89, 0x0, 0x62, - 0x0, 0x86, 0x0, 0x66, 0x0, 0x77, 0x0, 0x8a, 0x0, 0x82, 0x0, 0x83, 0x0, 0x80, 0x0, 0xbc, - 0x0, 0xc8, 0x0, 0xc3, 0x0, 0xcc, 0x0, 0xc5, 0x0, 0xc4, 0x0, 0x87, 0x0, 0xca, 0x0, 0xbe, - 0x0, 0xc7, 0x0, 0xcb, 0x0, 0xbd, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xcb, 0x0, 0xd2, 0x0, 0xe0, - 0x0, 0x84, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3e, 0xea, - 0x0, 0x1, 0xa, 0x7a, 0x0, 0x42, 0x0, 0xb, 0x3e, 0x9a, 0x0, 0x7, 0x0, 0x16, 0xff, 0x9c, - 0x0, 0x7, 0x0, 0x17, 0xff, 0xce, 0x0, 0x7, 0x0, 0x18, 0xff, 0xc4, 0x0, 0x7, 0x0, 0x1a, - 0xff, 0xc4, 0x0, 0xa, 0x0, 0x56, 0xff, 0xc4, 0x0, 0xb, 0x0, 0x16, 0xff, 0xc4, 0x0, 0xb, - 0x0, 0x17, 0xff, 0xce, 0x0, 0xb, 0x0, 0x18, 0xff, 0xce, 0x0, 0x12, 0x0, 0x13, 0xff, 0xb0, - 0x0, 0x12, 0x0, 0x14, 0xff, 0xb0, 0x0, 0x12, 0x0, 0x15, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x16, - 0xff, 0x60, 0x0, 0x12, 0x0, 0x17, 0xff, 0x6a, 0x0, 0x12, 0x0, 0x18, 0xff, 0x6a, 0x0, 0x12, - 0x0, 0x19, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x1a, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x1b, 0xff, 0xce, - 0x0, 0x12, 0x0, 0x1c, 0xff, 0xce, 0x0, 0x12, 0x0, 0x24, 0xff, 0x88, 0x0, 0x12, 0x0, 0x25, - 0xff, 0xc4, 0x0, 0x12, 0x0, 0x26, 0xff, 0xb0, 0x0, 0x12, 0x0, 0x27, 0xff, 0xc4, 0x0, 0x12, - 0x0, 0x28, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x29, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x2a, 0xff, 0xb0, - 0x0, 0x12, 0x0, 0x2b, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x2e, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x2f, - 0xff, 0xc4, 0x0, 0x12, 0x0, 0x30, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x31, 0xff, 0xc4, 0x0, 0x12, - 0x0, 0x32, 0xff, 0xb0, 0x0, 0x12, 0x0, 0x33, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x34, 0xff, 0xb0, - 0x0, 0x12, 0x0, 0x35, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x44, 0xff, 0x9c, 0x0, 0x12, 0x0, 0x46, - 0xff, 0x9c, 0x0, 0x12, 0x0, 0x47, 0xff, 0x9c, 0x0, 0x12, 0x0, 0x48, 0xff, 0x9c, 0x0, 0x12, - 0x0, 0x4a, 0xff, 0x9c, 0x0, 0x12, 0x0, 0x50, 0xff, 0xb0, 0x0, 0x12, 0x0, 0x51, 0xff, 0xb0, - 0x0, 0x12, 0x0, 0x52, 0xff, 0x9c, 0x0, 0x12, 0x0, 0x54, 0xff, 0x9c, 0x0, 0x12, 0x0, 0x57, - 0xff, 0xce, 0x0, 0x12, 0x0, 0x58, 0xff, 0xce, 0x0, 0x12, 0x0, 0x70, 0xff, 0x9c, 0x0, 0x12, - 0x0, 0x78, 0xff, 0xb0, 0x0, 0x12, 0x0, 0x99, 0xff, 0x88, 0x0, 0x12, 0x0, 0x9a, 0xff, 0x88, - 0x0, 0x12, 0x0, 0x9b, 0xff, 0xb0, 0x0, 0x12, 0x0, 0x9c, 0xff, 0xc4, 0x0, 0x12, 0x0, 0x9e, - 0xff, 0xb0, 0x0, 0x12, 0x0, 0xa0, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xa1, 0xff, 0x9c, 0x0, 0x12, - 0x0, 0xa2, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xa3, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xa4, 0xff, 0x9c, - 0x0, 0x12, 0x0, 0xa5, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xa6, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xa7, - 0xff, 0x9c, 0x0, 0x12, 0x0, 0xa8, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xa9, 0xff, 0x9c, 0x0, 0x12, - 0x0, 0xaa, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xb0, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xb1, 0xff, 0x9c, - 0x0, 0x12, 0x0, 0xb2, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xb3, 0xff, 0x9c, 0x0, 0x12, 0x0, 0xb4, - 0xff, 0x9c, 0x0, 0x12, 0x0, 0xce, 0xff, 0x88, 0x0, 0x12, 0x0, 0xcf, 0xff, 0x88, 0x0, 0x12, - 0x0, 0xd0, 0xff, 0xb0, 0x0, 0x12, 0x0, 0xd5, 0xff, 0x88, 0x0, 0x12, 0x0, 0xd6, 0xff, 0xc4, - 0x0, 0x12, 0x0, 0xd7, 0xff, 0x88, 0x0, 0x12, 0x0, 0xd8, 0xff, 0xc4, 0x0, 0x12, 0x0, 0xd9, - 0xff, 0xc4, 0x0, 0x12, 0x0, 0xde, 0xff, 0xb0, 0x0, 0x12, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x12, - 0x0, 0xe1, 0xff, 0xb0, 0x0, 0x13, 0x0, 0x15, 0xff, 0xc4, 0x0, 0x13, 0x0, 0x16, 0xff, 0x9c, - 0x0, 0x13, 0x0, 0x17, 0xff, 0xb0, 0x0, 0x13, 0x0, 0x18, 0xff, 0xc4, 0x0, 0x13, 0x0, 0x1a, - 0xff, 0xc4, 0x0, 0x14, 0x0, 0x16, 0xff, 0x74, 0x0, 0x14, 0x0, 0x18, 0xff, 0xa6, 0x0, 0x14, - 0x0, 0x1a, 0xff, 0xc4, 0x0, 0x14, 0x0, 0x1b, 0xff, 0xec, 0x0, 0x14, 0x0, 0x1c, 0xff, 0xec, - 0x0, 0x15, 0x0, 0x16, 0xff, 0x88, 0x0, 0x15, 0x0, 0x17, 0xff, 0xc4, 0x0, 0x15, 0x0, 0x18, - 0xff, 0xb0, 0x0, 0x15, 0x0, 0x1a, 0xff, 0xc4, 0x0, 0x16, 0x0, 0x15, 0xff, 0xc4, 0x0, 0x16, - 0x0, 0x16, 0xff, 0xba, 0x0, 0x16, 0x0, 0x17, 0xff, 0xce, 0x0, 0x16, 0x0, 0x18, 0xff, 0xc4, - 0x0, 0x16, 0x0, 0x1a, 0xff, 0xce, 0x0, 0x17, 0x0, 0x16, 0xff, 0x9c, 0x0, 0x17, 0x0, 0x18, - 0xff, 0xd8, 0x0, 0x17, 0x0, 0x1a, 0xff, 0xd8, 0x0, 0x18, 0x0, 0x15, 0xff, 0xd8, 0x0, 0x18, - 0x0, 0x16, 0xff, 0xba, 0x0, 0x18, 0x0, 0x17, 0xff, 0xd8, 0x0, 0x19, 0x0, 0x15, 0xff, 0xe2, - 0x0, 0x19, 0x0, 0x16, 0xff, 0x88, 0x0, 0x19, 0x0, 0x17, 0xff, 0xd8, 0x0, 0x19, 0x0, 0x18, - 0xff, 0xd8, 0x0, 0x19, 0x0, 0x1a, 0xff, 0xb0, 0x0, 0x1a, 0x0, 0x13, 0xff, 0xce, 0x0, 0x1a, - 0x0, 0x14, 0xff, 0xc4, 0x0, 0x1a, 0x0, 0x15, 0xff, 0xb0, 0x0, 0x1a, 0x0, 0x16, 0xff, 0x88, - 0x0, 0x1a, 0x0, 0x17, 0xff, 0x88, 0x0, 0x1a, 0x0, 0x18, 0xff, 0xb0, 0x0, 0x1a, 0x0, 0x19, - 0xff, 0xd8, 0x0, 0x1a, 0x0, 0x1b, 0xff, 0xd8, 0x0, 0x1b, 0x0, 0x16, 0xff, 0x88, 0x0, 0x1b, - 0x0, 0x17, 0xff, 0xc4, 0x0, 0x1b, 0x0, 0x18, 0xff, 0xba, 0x0, 0x1b, 0x0, 0x1a, 0xff, 0xd8, - 0x0, 0x1c, 0x0, 0x16, 0xff, 0x88, 0x0, 0x1c, 0x0, 0x17, 0xff, 0xd8, 0x0, 0x1c, 0x0, 0x18, - 0xff, 0xc4, 0x0, 0x1c, 0x0, 0x1a, 0xff, 0xc4, 0x0, 0x24, 0x0, 0x24, 0x0, 0x28, 0x0, 0x24, - 0x0, 0x26, 0xff, 0xe2, 0x0, 0x24, 0x0, 0x2d, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x37, 0xff, 0xc4, - 0x0, 0x24, 0x0, 0x39, 0xff, 0xdd, 0x0, 0x24, 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x24, 0x0, 0x3c, - 0xff, 0xb5, 0x0, 0x24, 0x0, 0x3d, 0x0, 0x14, 0x0, 0x24, 0x0, 0x59, 0x0, 0x14, 0x0, 0x24, - 0x0, 0x5a, 0x0, 0x14, 0x0, 0x24, 0x0, 0x5b, 0x0, 0x28, 0x0, 0x24, 0x0, 0x5c, 0x0, 0xf, - 0x0, 0x24, 0x0, 0x99, 0x0, 0x28, 0x0, 0x24, 0x0, 0x9a, 0x0, 0x28, 0x0, 0x24, 0x0, 0x9b, - 0xff, 0xe2, 0x0, 0x24, 0x0, 0xce, 0x0, 0x28, 0x0, 0x24, 0x0, 0xcf, 0x0, 0x28, 0x0, 0x24, - 0x0, 0xd3, 0x0, 0xf, 0x0, 0x24, 0x0, 0xd4, 0xff, 0xb5, 0x0, 0x24, 0x0, 0xd5, 0x0, 0x28, - 0x0, 0x24, 0x0, 0xd7, 0x0, 0x28, 0x0, 0x25, 0x0, 0x39, 0xff, 0xec, 0x0, 0x25, 0x0, 0x3c, - 0xff, 0xd8, 0x0, 0x25, 0x0, 0x44, 0x0, 0x14, 0x0, 0x25, 0x0, 0x46, 0x0, 0x14, 0x0, 0x25, - 0x0, 0x47, 0x0, 0x14, 0x0, 0x25, 0x0, 0x48, 0x0, 0x14, 0x0, 0x25, 0x0, 0x4a, 0x0, 0x14, - 0x0, 0x25, 0x0, 0x52, 0x0, 0x14, 0x0, 0x25, 0x0, 0x54, 0x0, 0x14, 0x0, 0x25, 0x0, 0x70, - 0x0, 0x14, 0x0, 0x25, 0x0, 0xa0, 0x0, 0x14, 0x0, 0x25, 0x0, 0xa1, 0x0, 0x14, 0x0, 0x25, - 0x0, 0xa2, 0x0, 0x14, 0x0, 0x25, 0x0, 0xa3, 0x0, 0x14, 0x0, 0x25, 0x0, 0xa4, 0x0, 0x14, - 0x0, 0x25, 0x0, 0xa5, 0x0, 0x14, 0x0, 0x25, 0x0, 0xa6, 0x0, 0x14, 0x0, 0x25, 0x0, 0xa7, - 0x0, 0x14, 0x0, 0x25, 0x0, 0xa8, 0x0, 0x14, 0x0, 0x25, 0x0, 0xa9, 0x0, 0x14, 0x0, 0x25, - 0x0, 0xaa, 0x0, 0x14, 0x0, 0x25, 0x0, 0xb0, 0x0, 0x14, 0x0, 0x25, 0x0, 0xb1, 0x0, 0x14, - 0x0, 0x25, 0x0, 0xb2, 0x0, 0x14, 0x0, 0x25, 0x0, 0xb3, 0x0, 0x14, 0x0, 0x25, 0x0, 0xb4, - 0x0, 0x14, 0x0, 0x25, 0x0, 0xd4, 0xff, 0xd8, 0x0, 0x26, 0x0, 0x22, 0x0, 0x32, 0x0, 0x26, - 0x0, 0x24, 0x0, 0x1e, 0x0, 0x26, 0x0, 0x36, 0x0, 0x1e, 0x0, 0x26, 0x0, 0x3a, 0x0, 0x1e, - 0x0, 0x26, 0x0, 0x3b, 0x0, 0x28, 0x0, 0x26, 0x0, 0x3d, 0x0, 0x28, 0x0, 0x26, 0x0, 0x7f, - 0x0, 0x28, 0x0, 0x26, 0x0, 0x99, 0x0, 0x1e, 0x0, 0x26, 0x0, 0x9a, 0x0, 0x1e, 0x0, 0x26, - 0x0, 0xac, 0x0, 0xf, 0x0, 0x26, 0x0, 0xad, 0x0, 0x37, 0x0, 0x26, 0x0, 0xae, 0x0, 0x3c, - 0x0, 0x26, 0x0, 0xbc, 0x0, 0x3c, 0x0, 0x26, 0x0, 0xce, 0x0, 0x1e, 0x0, 0x26, 0x0, 0xcf, - 0x0, 0x1e, 0x0, 0x26, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0x26, 0x0, 0xd7, 0x0, 0x1e, 0x0, 0x27, - 0x0, 0x24, 0xff, 0xec, 0x0, 0x27, 0x0, 0x39, 0xff, 0xec, 0x0, 0x27, 0x0, 0x3b, 0xff, 0xec, - 0x0, 0x27, 0x0, 0x3c, 0xff, 0xce, 0x0, 0x27, 0x0, 0x44, 0x0, 0xf, 0x0, 0x27, 0x0, 0x46, - 0x0, 0xf, 0x0, 0x27, 0x0, 0x47, 0x0, 0xf, 0x0, 0x27, 0x0, 0x48, 0x0, 0xf, 0x0, 0x27, - 0x0, 0x4a, 0x0, 0xf, 0x0, 0x27, 0x0, 0x52, 0x0, 0xf, 0x0, 0x27, 0x0, 0x54, 0x0, 0xf, - 0x0, 0x27, 0x0, 0x58, 0x0, 0x14, 0x0, 0x27, 0x0, 0x70, 0x0, 0xf, 0x0, 0x27, 0x0, 0x99, - 0xff, 0xec, 0x0, 0x27, 0x0, 0x9a, 0xff, 0xec, 0x0, 0x27, 0x0, 0xa0, 0x0, 0xf, 0x0, 0x27, - 0x0, 0xa1, 0x0, 0xf, 0x0, 0x27, 0x0, 0xa2, 0x0, 0xf, 0x0, 0x27, 0x0, 0xa3, 0x0, 0xf, - 0x0, 0x27, 0x0, 0xa4, 0x0, 0xf, 0x0, 0x27, 0x0, 0xa5, 0x0, 0xf, 0x0, 0x27, 0x0, 0xa6, - 0x0, 0xf, 0x0, 0x27, 0x0, 0xa7, 0x0, 0xf, 0x0, 0x27, 0x0, 0xa8, 0x0, 0xf, 0x0, 0x27, - 0x0, 0xa9, 0x0, 0xf, 0x0, 0x27, 0x0, 0xaa, 0x0, 0xf, 0x0, 0x27, 0x0, 0xb0, 0x0, 0xf, - 0x0, 0x27, 0x0, 0xb1, 0x0, 0xf, 0x0, 0x27, 0x0, 0xb2, 0x0, 0xf, 0x0, 0x27, 0x0, 0xb3, - 0x0, 0xf, 0x0, 0x27, 0x0, 0xb4, 0x0, 0xf, 0x0, 0x27, 0x0, 0xb5, 0x0, 0x14, 0x0, 0x27, - 0x0, 0xb6, 0x0, 0x14, 0x0, 0x27, 0x0, 0xb7, 0x0, 0x14, 0x0, 0x27, 0x0, 0xb8, 0x0, 0x14, - 0x0, 0x27, 0x0, 0xce, 0xff, 0xec, 0x0, 0x27, 0x0, 0xcf, 0xff, 0xec, 0x0, 0x27, 0x0, 0xd4, - 0xff, 0xce, 0x0, 0x27, 0x0, 0xd5, 0xff, 0xec, 0x0, 0x27, 0x0, 0xd7, 0xff, 0xec, 0x0, 0x28, - 0x0, 0x22, 0x0, 0x28, 0x0, 0x28, 0x0, 0x24, 0x0, 0x1e, 0x0, 0x28, 0x0, 0x26, 0xff, 0xec, - 0x0, 0x28, 0x0, 0x2a, 0xff, 0xec, 0x0, 0x28, 0x0, 0x32, 0xff, 0xec, 0x0, 0x28, 0x0, 0x34, - 0xff, 0xec, 0x0, 0x28, 0x0, 0x37, 0x0, 0x1e, 0x0, 0x28, 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x28, - 0x0, 0x44, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x46, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x47, 0xff, 0xf1, - 0x0, 0x28, 0x0, 0x48, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x52, - 0xff, 0xf1, 0x0, 0x28, 0x0, 0x54, 0xff, 0xf1, 0x0, 0x28, 0x0, 0x55, 0x0, 0x14, 0x0, 0x28, - 0x0, 0x5b, 0x0, 0x32, 0x0, 0x28, 0x0, 0x6c, 0xff, 0xec, 0x0, 0x28, 0x0, 0x70, 0xff, 0xf1, - 0x0, 0x28, 0x0, 0x78, 0xff, 0xec, 0x0, 0x28, 0x0, 0x99, 0x0, 0x1e, 0x0, 0x28, 0x0, 0x9a, - 0x0, 0x1e, 0x0, 0x28, 0x0, 0x9b, 0xff, 0xec, 0x0, 0x28, 0x0, 0x9e, 0xff, 0xec, 0x0, 0x28, - 0x0, 0xa0, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xa2, 0xff, 0xf1, - 0x0, 0x28, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xa5, - 0xff, 0xf1, 0x0, 0x28, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0x28, - 0x0, 0xa8, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xaa, 0xff, 0xf1, - 0x0, 0x28, 0x0, 0xae, 0x0, 0x14, 0x0, 0x28, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb1, - 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x28, - 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x28, 0x0, 0xbc, 0x0, 0x64, 0x0, 0x28, 0x0, 0xce, 0x0, 0x1e, - 0x0, 0x28, 0x0, 0xcf, 0x0, 0x1e, 0x0, 0x28, 0x0, 0xd0, 0xff, 0xec, 0x0, 0x28, 0x0, 0xd5, - 0x0, 0x1e, 0x0, 0x28, 0x0, 0xd7, 0x0, 0x1e, 0x0, 0x28, 0x0, 0xde, 0xff, 0xec, 0x0, 0x28, - 0x0, 0xdf, 0xff, 0xec, 0x0, 0x28, 0x0, 0xe1, 0xff, 0xec, 0x0, 0x29, 0x0, 0x22, 0x0, 0x3c, - 0x0, 0x29, 0x0, 0x24, 0xff, 0xc4, 0x0, 0x29, 0x0, 0x37, 0x0, 0x50, 0x0, 0x29, 0x0, 0x39, - 0x0, 0x28, 0x0, 0x29, 0x0, 0x3a, 0x0, 0x28, 0x0, 0x29, 0x0, 0x3b, 0x0, 0x28, 0x0, 0x29, - 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x29, 0x0, 0x3d, 0x0, 0x14, 0x0, 0x29, 0x0, 0x44, 0xff, 0xec, - 0x0, 0x29, 0x0, 0x46, 0xff, 0xec, 0x0, 0x29, 0x0, 0x47, 0xff, 0xec, 0x0, 0x29, 0x0, 0x48, - 0xff, 0xec, 0x0, 0x29, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x29, 0x0, 0x52, 0xff, 0xec, 0x0, 0x29, - 0x0, 0x54, 0xff, 0xec, 0x0, 0x29, 0x0, 0x55, 0xff, 0xec, 0x0, 0x29, 0x0, 0x5c, 0x0, 0x14, - 0x0, 0x29, 0x0, 0x70, 0xff, 0xec, 0x0, 0x29, 0x0, 0x7d, 0x0, 0x28, 0x0, 0x29, 0x0, 0x7f, - 0x0, 0x28, 0x0, 0x29, 0x0, 0x99, 0xff, 0xc4, 0x0, 0x29, 0x0, 0x9a, 0xff, 0xc4, 0x0, 0x29, - 0x0, 0xa0, 0xff, 0xec, 0x0, 0x29, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x29, 0x0, 0xa2, 0xff, 0xec, - 0x0, 0x29, 0x0, 0xa3, 0xff, 0xec, 0x0, 0x29, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x29, 0x0, 0xa5, - 0xff, 0xec, 0x0, 0x29, 0x0, 0xa6, 0xff, 0xec, 0x0, 0x29, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x29, - 0x0, 0xa8, 0xff, 0xec, 0x0, 0x29, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x29, 0x0, 0xaa, 0xff, 0xec, - 0x0, 0x29, 0x0, 0xac, 0x0, 0x1e, 0x0, 0x29, 0x0, 0xad, 0x0, 0x1e, 0x0, 0x29, 0x0, 0xae, - 0x0, 0x28, 0x0, 0x29, 0x0, 0xb0, 0xff, 0xec, 0x0, 0x29, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x29, - 0x0, 0xb2, 0xff, 0xec, 0x0, 0x29, 0x0, 0xb3, 0xff, 0xec, 0x0, 0x29, 0x0, 0xb4, 0xff, 0xec, - 0x0, 0x29, 0x0, 0xbc, 0x0, 0x64, 0x0, 0x29, 0x0, 0xce, 0xff, 0xc4, 0x0, 0x29, 0x0, 0xcf, - 0xff, 0xc4, 0x0, 0x29, 0x0, 0xd3, 0x0, 0x14, 0x0, 0x29, 0x0, 0xd5, 0xff, 0xc4, 0x0, 0x29, - 0x0, 0xd7, 0xff, 0xc4, 0x0, 0x2a, 0x0, 0x2d, 0xff, 0xce, 0x0, 0x2a, 0x0, 0x37, 0xff, 0xe2, - 0x0, 0x2a, 0x0, 0x39, 0xff, 0xd8, 0x0, 0x2a, 0x0, 0x3c, 0xff, 0xd8, 0x0, 0x2a, 0x0, 0xd4, - 0xff, 0xd8, 0x0, 0x2b, 0x0, 0xb, 0x0, 0x5a, 0x0, 0x2b, 0x0, 0x16, 0xff, 0x9c, 0x0, 0x2b, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x2c, 0x0, 0x22, 0x0, 0x14, 0x0, 0x2c, 0x0, 0x2d, 0xff, 0xd8, - 0x0, 0x2c, 0x0, 0xbc, 0x0, 0x32, 0x0, 0x2e, 0x0, 0x24, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x26, - 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x2a, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x32, 0xff, 0xd8, 0x0, 0x2e, - 0x0, 0x34, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x39, 0x0, 0x14, 0x0, 0x2e, 0x0, 0x3a, 0x0, 0x1e, - 0x0, 0x2e, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x2e, 0x0, 0x3c, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x3d, - 0x0, 0x28, 0x0, 0x2e, 0x0, 0x78, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x99, 0x0, 0x28, 0x0, 0x2e, - 0x0, 0x9a, 0x0, 0x28, 0x0, 0x2e, 0x0, 0x9b, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0x9e, 0xff, 0xd8, - 0x0, 0x2e, 0x0, 0xbc, 0x0, 0x3c, 0x0, 0x2e, 0x0, 0xce, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xcf, - 0x0, 0x28, 0x0, 0x2e, 0x0, 0xd0, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0xd4, 0x0, 0x28, 0x0, 0x2e, - 0x0, 0xd5, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xd7, 0x0, 0x28, 0x0, 0x2e, 0x0, 0xde, 0xff, 0xd8, - 0x0, 0x2e, 0x0, 0xdf, 0xff, 0xd8, 0x0, 0x2e, 0x0, 0xe1, 0xff, 0xd8, 0x0, 0x2f, 0x0, 0x24, - 0x0, 0x3c, 0x0, 0x2f, 0x0, 0x26, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x2a, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0x32, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x34, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x36, 0x0, 0x14, - 0x0, 0x2f, 0x0, 0x37, 0xff, 0xb0, 0x0, 0x2f, 0x0, 0x38, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x39, - 0xff, 0x9c, 0x0, 0x2f, 0x0, 0x3a, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x2f, - 0x0, 0x3c, 0xff, 0x88, 0x0, 0x2f, 0x0, 0x3d, 0x0, 0x32, 0x0, 0x2f, 0x0, 0x4c, 0x0, 0x28, - 0x0, 0x2f, 0x0, 0x6c, 0xff, 0xe7, 0x0, 0x2f, 0x0, 0x78, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x99, - 0x0, 0x3c, 0x0, 0x2f, 0x0, 0x9a, 0x0, 0x3c, 0x0, 0x2f, 0x0, 0x9b, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0x9e, 0xff, 0xce, 0x0, 0x2f, 0x0, 0x9f, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xab, 0x0, 0x28, - 0x0, 0x2f, 0x0, 0xac, 0x0, 0x28, 0x0, 0x2f, 0x0, 0xad, 0x0, 0x28, 0x0, 0x2f, 0x0, 0xae, - 0x0, 0x28, 0x0, 0x2f, 0x0, 0xce, 0x0, 0x3c, 0x0, 0x2f, 0x0, 0xcf, 0x0, 0x3c, 0x0, 0x2f, - 0x0, 0xd0, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xd4, 0xff, 0x88, 0x0, 0x2f, 0x0, 0xd5, 0x0, 0x3c, - 0x0, 0x2f, 0x0, 0xd7, 0x0, 0x3c, 0x0, 0x2f, 0x0, 0xde, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xdf, - 0xff, 0xce, 0x0, 0x2f, 0x0, 0xe1, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xe2, 0xff, 0xce, 0x0, 0x2f, - 0x0, 0xe3, 0xff, 0xce, 0x0, 0x2f, 0x0, 0xe4, 0xff, 0xce, 0x0, 0x30, 0x0, 0xb, 0x0, 0x5a, - 0x0, 0x30, 0x0, 0x16, 0xff, 0x9c, 0x0, 0x30, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x31, 0x0, 0xb, - 0x0, 0x5a, 0x0, 0x31, 0x0, 0x16, 0xff, 0x9c, 0x0, 0x31, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x32, - 0x0, 0x25, 0xff, 0xec, 0x0, 0x32, 0x0, 0x26, 0x0, 0x1e, 0x0, 0x32, 0x0, 0x27, 0xff, 0xec, - 0x0, 0x32, 0x0, 0x28, 0xff, 0xec, 0x0, 0x32, 0x0, 0x29, 0xff, 0xec, 0x0, 0x32, 0x0, 0x2a, - 0x0, 0x1e, 0x0, 0x32, 0x0, 0x2b, 0xff, 0xec, 0x0, 0x32, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x32, - 0x0, 0x2e, 0xff, 0xec, 0x0, 0x32, 0x0, 0x2f, 0xff, 0xec, 0x0, 0x32, 0x0, 0x30, 0xff, 0xec, - 0x0, 0x32, 0x0, 0x31, 0xff, 0xec, 0x0, 0x32, 0x0, 0x32, 0x0, 0x1e, 0x0, 0x32, 0x0, 0x33, - 0xff, 0xec, 0x0, 0x32, 0x0, 0x34, 0x0, 0x1e, 0x0, 0x32, 0x0, 0x35, 0xff, 0xec, 0x0, 0x32, - 0x0, 0x37, 0xff, 0xc4, 0x0, 0x32, 0x0, 0x39, 0xff, 0xe2, 0x0, 0x32, 0x0, 0x3c, 0xff, 0xce, - 0x0, 0x32, 0x0, 0x45, 0x0, 0x19, 0x0, 0x32, 0x0, 0x59, 0x0, 0x14, 0x0, 0x32, 0x0, 0x5a, - 0x0, 0x14, 0x0, 0x32, 0x0, 0x5c, 0x0, 0x14, 0x0, 0x32, 0x0, 0x78, 0x0, 0x1e, 0x0, 0x32, - 0x0, 0x9b, 0x0, 0x1e, 0x0, 0x32, 0x0, 0x9e, 0x0, 0x1e, 0x0, 0x32, 0x0, 0xd0, 0x0, 0x1e, - 0x0, 0x32, 0x0, 0xd3, 0x0, 0x14, 0x0, 0x32, 0x0, 0xd4, 0xff, 0xce, 0x0, 0x32, 0x0, 0xde, - 0x0, 0x1e, 0x0, 0x32, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0x32, 0x0, 0xe1, 0x0, 0x1e, 0x0, 0x33, - 0x0, 0x22, 0x0, 0x28, 0x0, 0x33, 0x0, 0x24, 0xff, 0xb0, 0x0, 0x33, 0x0, 0x44, 0xff, 0xec, - 0x0, 0x33, 0x0, 0x46, 0xff, 0xec, 0x0, 0x33, 0x0, 0x47, 0xff, 0xec, 0x0, 0x33, 0x0, 0x48, - 0xff, 0xec, 0x0, 0x33, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x33, 0x0, 0x52, 0xff, 0xec, 0x0, 0x33, - 0x0, 0x54, 0xff, 0xec, 0x0, 0x33, 0x0, 0x5c, 0x0, 0x32, 0x0, 0x33, 0x0, 0x70, 0xff, 0xec, - 0x0, 0x33, 0x0, 0x99, 0xff, 0xb0, 0x0, 0x33, 0x0, 0x9a, 0xff, 0xb0, 0x0, 0x33, 0x0, 0xa0, - 0xff, 0xec, 0x0, 0x33, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x33, - 0x0, 0xa3, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa5, 0xff, 0xec, - 0x0, 0x33, 0x0, 0xa6, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x33, 0x0, 0xa8, - 0xff, 0xec, 0x0, 0x33, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x33, 0x0, 0xaa, 0xff, 0xec, 0x0, 0x33, - 0x0, 0xab, 0xff, 0xec, 0x0, 0x33, 0x0, 0xad, 0x0, 0x14, 0x0, 0x33, 0x0, 0xae, 0x0, 0x14, - 0x0, 0x33, 0x0, 0xb0, 0xff, 0xec, 0x0, 0x33, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x33, 0x0, 0xb2, - 0xff, 0xec, 0x0, 0x33, 0x0, 0xb3, 0xff, 0xec, 0x0, 0x33, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x33, - 0x0, 0xce, 0xff, 0xb0, 0x0, 0x33, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x33, 0x0, 0xd3, 0x0, 0x32, - 0x0, 0x33, 0x0, 0xd5, 0xff, 0xb0, 0x0, 0x33, 0x0, 0xd7, 0xff, 0xb0, 0x0, 0x34, 0x0, 0x24, - 0x0, 0x14, 0x0, 0x34, 0x0, 0x26, 0x0, 0x1e, 0x0, 0x34, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0x34, - 0x0, 0x32, 0x0, 0x1e, 0x0, 0x34, 0x0, 0x34, 0x0, 0x1e, 0x0, 0x34, 0x0, 0x37, 0xff, 0xd8, - 0x0, 0x34, 0x0, 0x3b, 0x0, 0x28, 0x0, 0x34, 0x0, 0x3c, 0xff, 0xd8, 0x0, 0x34, 0x0, 0x3d, - 0x0, 0x14, 0x0, 0x34, 0x0, 0x44, 0x0, 0x14, 0x0, 0x34, 0x0, 0x46, 0x0, 0x14, 0x0, 0x34, - 0x0, 0x47, 0x0, 0x14, 0x0, 0x34, 0x0, 0x48, 0x0, 0x14, 0x0, 0x34, 0x0, 0x4a, 0x0, 0x14, - 0x0, 0x34, 0x0, 0x4c, 0x0, 0x14, 0x0, 0x34, 0x0, 0x52, 0x0, 0x14, 0x0, 0x34, 0x0, 0x54, - 0x0, 0x14, 0x0, 0x34, 0x0, 0x70, 0x0, 0x14, 0x0, 0x34, 0x0, 0x78, 0x0, 0x1e, 0x0, 0x34, - 0x0, 0x99, 0x0, 0x14, 0x0, 0x34, 0x0, 0x9a, 0x0, 0x14, 0x0, 0x34, 0x0, 0x9b, 0x0, 0x1e, - 0x0, 0x34, 0x0, 0x9e, 0x0, 0x1e, 0x0, 0x34, 0x0, 0xa0, 0x0, 0x14, 0x0, 0x34, 0x0, 0xa1, - 0x0, 0x14, 0x0, 0x34, 0x0, 0xa2, 0x0, 0x14, 0x0, 0x34, 0x0, 0xa3, 0x0, 0x14, 0x0, 0x34, - 0x0, 0xa4, 0x0, 0x14, 0x0, 0x34, 0x0, 0xa5, 0x0, 0x14, 0x0, 0x34, 0x0, 0xa6, 0x0, 0x14, - 0x0, 0x34, 0x0, 0xa7, 0x0, 0x14, 0x0, 0x34, 0x0, 0xa8, 0x0, 0x14, 0x0, 0x34, 0x0, 0xa9, - 0x0, 0x14, 0x0, 0x34, 0x0, 0xaa, 0x0, 0x14, 0x0, 0x34, 0x0, 0xab, 0x0, 0x14, 0x0, 0x34, - 0x0, 0xac, 0x0, 0x14, 0x0, 0x34, 0x0, 0xad, 0x0, 0x14, 0x0, 0x34, 0x0, 0xb0, 0x0, 0x14, - 0x0, 0x34, 0x0, 0xb1, 0x0, 0x14, 0x0, 0x34, 0x0, 0xb2, 0x0, 0x14, 0x0, 0x34, 0x0, 0xb3, - 0x0, 0x14, 0x0, 0x34, 0x0, 0xb4, 0x0, 0x14, 0x0, 0x34, 0x0, 0xce, 0x0, 0x14, 0x0, 0x34, - 0x0, 0xcf, 0x0, 0x14, 0x0, 0x34, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0x34, 0x0, 0xd4, 0xff, 0xd8, - 0x0, 0x34, 0x0, 0xd5, 0x0, 0x14, 0x0, 0x34, 0x0, 0xd7, 0x0, 0x14, 0x0, 0x34, 0x0, 0xde, - 0x0, 0x1e, 0x0, 0x34, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0x34, 0x0, 0xe1, 0x0, 0x1e, 0x0, 0x35, - 0x0, 0x22, 0x0, 0x1e, 0x0, 0x35, 0x0, 0x24, 0x0, 0x28, 0x0, 0x35, 0x0, 0x3b, 0x0, 0x32, - 0x0, 0x35, 0x0, 0x3c, 0xff, 0xec, 0x0, 0x35, 0x0, 0x5c, 0x0, 0x28, 0x0, 0x35, 0x0, 0x99, - 0x0, 0x28, 0x0, 0x35, 0x0, 0x9a, 0x0, 0x28, 0x0, 0x35, 0x0, 0xce, 0x0, 0x28, 0x0, 0x35, - 0x0, 0xcf, 0x0, 0x28, 0x0, 0x35, 0x0, 0xd3, 0x0, 0x28, 0x0, 0x35, 0x0, 0xd4, 0xff, 0xec, - 0x0, 0x35, 0x0, 0xd5, 0x0, 0x28, 0x0, 0x35, 0x0, 0xd7, 0x0, 0x28, 0x0, 0x36, 0x0, 0x22, - 0x0, 0x28, 0x0, 0x36, 0x0, 0x25, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x36, - 0x0, 0x27, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x28, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x29, 0xff, 0xe7, - 0x0, 0x36, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x36, 0x0, 0x2b, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x2c, - 0xff, 0xe7, 0x0, 0x36, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x36, 0x0, 0x2e, 0xff, 0xe7, 0x0, 0x36, - 0x0, 0x2f, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x30, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x31, 0xff, 0xe7, - 0x0, 0x36, 0x0, 0x32, 0xff, 0xe2, 0x0, 0x36, 0x0, 0x33, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x34, - 0xff, 0xe2, 0x0, 0x36, 0x0, 0x35, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x39, 0xff, 0xe2, 0x0, 0x36, - 0x0, 0x3c, 0xff, 0xec, 0x0, 0x36, 0x0, 0x46, 0xff, 0xec, 0x0, 0x36, 0x0, 0x4b, 0xff, 0xec, - 0x0, 0x36, 0x0, 0x50, 0xff, 0xec, 0x0, 0x36, 0x0, 0x51, 0xff, 0xec, 0x0, 0x36, 0x0, 0x57, - 0xff, 0xe7, 0x0, 0x36, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x36, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0x36, - 0x0, 0x9c, 0xff, 0xe7, 0x0, 0x36, 0x0, 0x9e, 0xff, 0xe2, 0x0, 0x36, 0x0, 0xd0, 0xff, 0xe2, - 0x0, 0x36, 0x0, 0xd6, 0xff, 0xe7, 0x0, 0x36, 0x0, 0xd8, 0xff, 0xe7, 0x0, 0x36, 0x0, 0xd9, - 0xff, 0xe7, 0x0, 0x36, 0x0, 0xda, 0xff, 0xe7, 0x0, 0x36, 0x0, 0xdb, 0xff, 0xec, 0x0, 0x36, - 0x0, 0xdd, 0xff, 0xe2, 0x0, 0x36, 0x0, 0xde, 0xff, 0xe2, 0x0, 0x36, 0x0, 0xdf, 0xff, 0xe2, - 0x0, 0x36, 0x0, 0xe1, 0xff, 0xe2, 0x0, 0x37, 0x0, 0x4, 0x0, 0x46, 0x0, 0x37, 0x0, 0xa, - 0x0, 0xc8, 0x0, 0x37, 0x0, 0x22, 0x0, 0xc8, 0x0, 0x37, 0x0, 0x24, 0x0, 0x14, 0x0, 0x37, - 0x0, 0x25, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x26, 0x0, 0x28, 0x0, 0x37, 0x0, 0x27, 0x0, 0x5a, - 0x0, 0x37, 0x0, 0x28, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x29, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x2a, - 0x0, 0x28, 0x0, 0x37, 0x0, 0x2b, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x2c, 0x0, 0x5a, 0x0, 0x37, - 0x0, 0x2d, 0x0, 0x3c, 0x0, 0x37, 0x0, 0x2e, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x2f, 0x0, 0x5a, - 0x0, 0x37, 0x0, 0x30, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x31, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x32, - 0x0, 0x28, 0x0, 0x37, 0x0, 0x33, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x34, 0x0, 0x28, 0x0, 0x37, - 0x0, 0x35, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x36, 0x0, 0x78, 0x0, 0x37, 0x0, 0x37, 0x0, 0xbe, - 0x0, 0x37, 0x0, 0x38, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x39, 0x0, 0xa0, 0x0, 0x37, 0x0, 0x3a, - 0x0, 0x96, 0x0, 0x37, 0x0, 0x3b, 0x0, 0x96, 0x0, 0x37, 0x0, 0x3c, 0x0, 0xb4, 0x0, 0x37, - 0x0, 0x3d, 0x0, 0x8c, 0x0, 0x37, 0x0, 0x46, 0x0, 0x32, 0x0, 0x37, 0x0, 0x47, 0x0, 0x32, - 0x0, 0x37, 0x0, 0x4a, 0x0, 0x32, 0x0, 0x37, 0x0, 0x4b, 0x0, 0x64, 0x0, 0x37, 0x0, 0x4c, - 0x0, 0x78, 0x0, 0x37, 0x0, 0x54, 0x0, 0x32, 0x0, 0x37, 0x0, 0x55, 0x0, 0xa, 0x0, 0x37, - 0x0, 0x5c, 0x0, 0xa, 0x0, 0x37, 0x0, 0x70, 0x0, 0x32, 0x0, 0x37, 0x0, 0x78, 0x0, 0x28, - 0x0, 0x37, 0x0, 0x7d, 0x0, 0xa0, 0x0, 0x37, 0x0, 0x7f, 0x0, 0xa0, 0x0, 0x37, 0x0, 0x99, - 0x0, 0x14, 0x0, 0x37, 0x0, 0x9a, 0x0, 0x14, 0x0, 0x37, 0x0, 0x9b, 0x0, 0x28, 0x0, 0x37, - 0x0, 0x9c, 0x0, 0x5a, 0x0, 0x37, 0x0, 0x9e, 0x0, 0x28, 0x0, 0x37, 0x0, 0x9f, 0x0, 0x5a, - 0x0, 0x37, 0x0, 0xa1, 0x0, 0x14, 0x0, 0x37, 0x0, 0xa2, 0x0, 0x32, 0x0, 0x37, 0x0, 0xa3, - 0x0, 0x32, 0x0, 0x37, 0x0, 0xa4, 0x0, 0x32, 0x0, 0x37, 0x0, 0xa5, 0x0, 0x32, 0x0, 0x37, - 0x0, 0xa6, 0x0, 0x32, 0x0, 0x37, 0x0, 0xa8, 0x0, 0x1e, 0x0, 0x37, 0x0, 0xa9, 0x0, 0x32, - 0x0, 0x37, 0x0, 0xaa, 0x0, 0x32, 0x0, 0x37, 0x0, 0xab, 0x0, 0x50, 0x0, 0x37, 0x0, 0xac, - 0x0, 0x96, 0x0, 0x37, 0x0, 0xad, 0x0, 0xa0, 0x0, 0x37, 0x0, 0xae, 0x0, 0xb4, 0x0, 0x37, - 0x0, 0xb1, 0x0, 0x1e, 0x0, 0x37, 0x0, 0xb2, 0x0, 0x32, 0x0, 0x37, 0x0, 0xb3, 0x0, 0x32, - 0x0, 0x37, 0x0, 0xb4, 0x0, 0x3c, 0x0, 0x37, 0x0, 0xb8, 0x0, 0x1e, 0x0, 0x37, 0x0, 0xbc, - 0x0, 0xf0, 0x0, 0x37, 0x0, 0xce, 0x0, 0x14, 0x0, 0x37, 0x0, 0xcf, 0x0, 0x14, 0x0, 0x37, - 0x0, 0xd0, 0x0, 0x28, 0x0, 0x37, 0x0, 0xd3, 0x0, 0x78, 0x0, 0x37, 0x0, 0xd4, 0x0, 0xb4, - 0x0, 0x37, 0x0, 0xd5, 0x0, 0x14, 0x0, 0x37, 0x0, 0xd6, 0x0, 0x5a, 0x0, 0x37, 0x0, 0xd7, - 0x0, 0x14, 0x0, 0x37, 0x0, 0xd8, 0x0, 0x5a, 0x0, 0x37, 0x0, 0xd9, 0x0, 0x5a, 0x0, 0x37, - 0x0, 0xde, 0x0, 0x28, 0x0, 0x37, 0x0, 0xdf, 0x0, 0x28, 0x0, 0x37, 0x0, 0xe1, 0x0, 0x28, - 0x0, 0x37, 0x0, 0xe2, 0x0, 0x5a, 0x0, 0x37, 0x0, 0xe3, 0x0, 0x5a, 0x0, 0x37, 0x0, 0xe4, - 0x0, 0x5a, 0x0, 0x38, 0x0, 0x4, 0xff, 0xc4, 0x0, 0x38, 0x0, 0x24, 0xff, 0xce, 0x0, 0x38, - 0x0, 0x3b, 0xff, 0xe2, 0x0, 0x38, 0x0, 0x44, 0xff, 0xec, 0x0, 0x38, 0x0, 0x46, 0xff, 0xec, - 0x0, 0x38, 0x0, 0x47, 0xff, 0xec, 0x0, 0x38, 0x0, 0x48, 0xff, 0xec, 0x0, 0x38, 0x0, 0x4a, - 0xff, 0xec, 0x0, 0x38, 0x0, 0x50, 0xff, 0xec, 0x0, 0x38, 0x0, 0x51, 0xff, 0xec, 0x0, 0x38, - 0x0, 0x52, 0xff, 0xec, 0x0, 0x38, 0x0, 0x54, 0xff, 0xec, 0x0, 0x38, 0x0, 0x70, 0xff, 0xec, - 0x0, 0x38, 0x0, 0x99, 0xff, 0xce, 0x0, 0x38, 0x0, 0x9a, 0xff, 0xce, 0x0, 0x38, 0x0, 0xa0, - 0xff, 0xec, 0x0, 0x38, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x38, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x38, - 0x0, 0xa3, 0xff, 0xec, 0x0, 0x38, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x38, 0x0, 0xa5, 0xff, 0xec, - 0x0, 0x38, 0x0, 0xa6, 0xff, 0xec, 0x0, 0x38, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x38, 0x0, 0xa8, - 0xff, 0xec, 0x0, 0x38, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x38, 0x0, 0xaa, 0xff, 0xec, 0x0, 0x38, - 0x0, 0xb0, 0xff, 0xec, 0x0, 0x38, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x38, 0x0, 0xb2, 0xff, 0xec, - 0x0, 0x38, 0x0, 0xb3, 0xff, 0xec, 0x0, 0x38, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x38, 0x0, 0xbc, - 0x0, 0x32, 0x0, 0x38, 0x0, 0xce, 0xff, 0xce, 0x0, 0x38, 0x0, 0xcf, 0xff, 0xce, 0x0, 0x38, - 0x0, 0xd5, 0xff, 0xce, 0x0, 0x38, 0x0, 0xd7, 0xff, 0xce, 0x0, 0x39, 0x0, 0xd, 0x0, 0x32, - 0x0, 0x39, 0x0, 0x22, 0x0, 0x64, 0x0, 0x39, 0x0, 0x24, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x2d, - 0xff, 0xe2, 0x0, 0x39, 0x0, 0x36, 0x0, 0x14, 0x0, 0x39, 0x0, 0x37, 0x0, 0x50, 0x0, 0x39, - 0x0, 0x39, 0x0, 0x3c, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x46, 0x0, 0x39, 0x0, 0x3b, 0x0, 0x28, - 0x0, 0x39, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x19, 0x0, 0x39, 0x0, 0x44, - 0xff, 0xec, 0x0, 0x39, 0x0, 0x45, 0x0, 0x32, 0x0, 0x39, 0x0, 0x46, 0xff, 0xec, 0x0, 0x39, - 0x0, 0x47, 0xff, 0xec, 0x0, 0x39, 0x0, 0x48, 0xff, 0xec, 0x0, 0x39, 0x0, 0x4a, 0xff, 0xec, - 0x0, 0x39, 0x0, 0x4f, 0x0, 0x1e, 0x0, 0x39, 0x0, 0x52, 0xff, 0xec, 0x0, 0x39, 0x0, 0x54, - 0xff, 0xec, 0x0, 0x39, 0x0, 0x55, 0xff, 0xd8, 0x0, 0x39, 0x0, 0x56, 0xff, 0xec, 0x0, 0x39, - 0x0, 0x5c, 0x0, 0x32, 0x0, 0x39, 0x0, 0x70, 0xff, 0xec, 0x0, 0x39, 0x0, 0x7d, 0x0, 0x3c, - 0x0, 0x39, 0x0, 0x7f, 0x0, 0x3c, 0x0, 0x39, 0x0, 0x99, 0xff, 0xe2, 0x0, 0x39, 0x0, 0x9a, - 0xff, 0xe2, 0x0, 0x39, 0x0, 0xa0, 0xff, 0xec, 0x0, 0x39, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x39, - 0x0, 0xa2, 0xff, 0xec, 0x0, 0x39, 0x0, 0xa3, 0xff, 0xec, 0x0, 0x39, 0x0, 0xa4, 0xff, 0xec, - 0x0, 0x39, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x39, 0x0, 0xa6, 0xff, 0xec, 0x0, 0x39, 0x0, 0xa7, - 0xff, 0xec, 0x0, 0x39, 0x0, 0xa8, 0xff, 0xec, 0x0, 0x39, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x39, - 0x0, 0xaa, 0xff, 0xec, 0x0, 0x39, 0x0, 0xab, 0xff, 0xf1, 0x0, 0x39, 0x0, 0xac, 0x0, 0x37, - 0x0, 0x39, 0x0, 0xad, 0x0, 0x28, 0x0, 0x39, 0x0, 0xae, 0x0, 0x41, 0x0, 0x39, 0x0, 0xb0, - 0xff, 0xec, 0x0, 0x39, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x39, 0x0, 0xb2, 0xff, 0xec, 0x0, 0x39, - 0x0, 0xb3, 0xff, 0xec, 0x0, 0x39, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x39, 0x0, 0xbc, 0x0, 0x78, - 0x0, 0x39, 0x0, 0xce, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xcf, 0xff, 0xe2, 0x0, 0x39, 0x0, 0xd3, - 0x0, 0x32, 0x0, 0x39, 0x0, 0xd4, 0x0, 0x3c, 0x0, 0x39, 0x0, 0xd5, 0xff, 0xe2, 0x0, 0x39, - 0x0, 0xd7, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0xd, 0x0, 0x32, 0x0, 0x3a, 0x0, 0x22, 0x0, 0x78, - 0x0, 0x3a, 0x0, 0x24, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x25, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x26, - 0x0, 0xf, 0x0, 0x3a, 0x0, 0x27, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x28, 0x0, 0x14, 0x0, 0x3a, - 0x0, 0x29, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x2a, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x2b, 0x0, 0x14, - 0x0, 0x3a, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x3a, 0x0, 0x2e, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x2f, - 0x0, 0x14, 0x0, 0x3a, 0x0, 0x30, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x31, 0x0, 0x14, 0x0, 0x3a, - 0x0, 0x32, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x33, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x34, 0x0, 0xf, - 0x0, 0x3a, 0x0, 0x35, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x37, 0x0, 0x50, 0x0, 0x3a, 0x0, 0x39, - 0x0, 0x3c, 0x0, 0x3a, 0x0, 0x3a, 0x0, 0x3c, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x32, 0x0, 0x3a, - 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x3a, 0x0, 0x3d, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x44, 0x0, 0xf, - 0x0, 0x3a, 0x0, 0x46, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x47, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x48, - 0x0, 0xf, 0x0, 0x3a, 0x0, 0x4a, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x4c, 0x0, 0x14, 0x0, 0x3a, - 0x0, 0x52, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x54, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x55, 0x0, 0xa, - 0x0, 0x3a, 0x0, 0x59, 0x0, 0x2d, 0x0, 0x3a, 0x0, 0x5c, 0x0, 0x2d, 0x0, 0x3a, 0x0, 0x70, - 0x0, 0xf, 0x0, 0x3a, 0x0, 0x78, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x7d, 0x0, 0x50, 0x0, 0x3a, - 0x0, 0x7f, 0x0, 0x3c, 0x0, 0x3a, 0x0, 0x99, 0xff, 0xec, 0x0, 0x3a, 0x0, 0x9a, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0x9b, 0x0, 0xf, 0x0, 0x3a, 0x0, 0x9c, 0x0, 0x14, 0x0, 0x3a, 0x0, 0x9e, - 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa0, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa1, 0x0, 0xf, 0x0, 0x3a, - 0x0, 0xa2, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa3, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa4, 0x0, 0xf, - 0x0, 0x3a, 0x0, 0xa5, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa6, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa7, - 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa8, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xa9, 0x0, 0xf, 0x0, 0x3a, - 0x0, 0xaa, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xac, 0x0, 0x32, 0x0, 0x3a, 0x0, 0xad, 0x0, 0x3c, - 0x0, 0x3a, 0x0, 0xae, 0x0, 0x46, 0x0, 0x3a, 0x0, 0xb0, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xb1, - 0x0, 0xf, 0x0, 0x3a, 0x0, 0xb2, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xb3, 0x0, 0xf, 0x0, 0x3a, - 0x0, 0xb4, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xbc, 0x0, 0x78, 0x0, 0x3a, 0x0, 0xce, 0xff, 0xec, - 0x0, 0x3a, 0x0, 0xcf, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xd0, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xd3, - 0x0, 0x2d, 0x0, 0x3a, 0x0, 0xd4, 0x0, 0x3c, 0x0, 0x3a, 0x0, 0xd5, 0xff, 0xec, 0x0, 0x3a, - 0x0, 0xd6, 0x0, 0x14, 0x0, 0x3a, 0x0, 0xd7, 0xff, 0xec, 0x0, 0x3a, 0x0, 0xd8, 0x0, 0x14, - 0x0, 0x3a, 0x0, 0xd9, 0x0, 0x14, 0x0, 0x3a, 0x0, 0xde, 0x0, 0xf, 0x0, 0x3a, 0x0, 0xdf, - 0x0, 0xf, 0x0, 0x3a, 0x0, 0xe1, 0x0, 0xf, 0x0, 0x3b, 0x0, 0xd, 0x0, 0x32, 0x0, 0x3b, - 0x0, 0x22, 0x0, 0x64, 0x0, 0x3b, 0x0, 0x24, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0x2d, 0xff, 0xe2, - 0x0, 0x3b, 0x0, 0x32, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x37, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0x39, - 0x0, 0x28, 0x0, 0x3b, 0x0, 0x3a, 0x0, 0x1e, 0x0, 0x3b, 0x0, 0x3b, 0x0, 0x32, 0x0, 0x3b, - 0x0, 0x3c, 0x0, 0x28, 0x0, 0x3b, 0x0, 0x3d, 0x0, 0x1e, 0x0, 0x3b, 0x0, 0x44, 0xff, 0xec, - 0x0, 0x3b, 0x0, 0x46, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x47, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x48, - 0xff, 0xec, 0x0, 0x3b, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x4c, 0x0, 0x14, 0x0, 0x3b, - 0x0, 0x52, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x54, 0xff, 0xec, 0x0, 0x3b, 0x0, 0x70, 0xff, 0xec, - 0x0, 0x3b, 0x0, 0x7d, 0x0, 0x28, 0x0, 0x3b, 0x0, 0x7f, 0x0, 0x32, 0x0, 0x3b, 0x0, 0x99, - 0x0, 0x3c, 0x0, 0x3b, 0x0, 0x9a, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0xa0, 0xff, 0xec, 0x0, 0x3b, - 0x0, 0xa1, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xa3, 0xff, 0xec, - 0x0, 0x3b, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xa6, - 0xff, 0xec, 0x0, 0x3b, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xa8, 0xff, 0xec, 0x0, 0x3b, - 0x0, 0xa9, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xaa, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xac, 0x0, 0x28, - 0x0, 0x3b, 0x0, 0xad, 0x0, 0x1e, 0x0, 0x3b, 0x0, 0xae, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0xb0, - 0xff, 0xec, 0x0, 0x3b, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xb2, 0xff, 0xec, 0x0, 0x3b, - 0x0, 0xb3, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x3b, 0x0, 0xbc, 0x0, 0x78, - 0x0, 0x3b, 0x0, 0xce, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0xcf, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0xd3, - 0x0, 0x14, 0x0, 0x3b, 0x0, 0xd4, 0x0, 0x28, 0x0, 0x3b, 0x0, 0xd5, 0x0, 0x3c, 0x0, 0x3b, - 0x0, 0xd7, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0xd, 0x0, 0x64, 0x0, 0x3c, 0x0, 0x22, 0x0, 0x96, - 0x0, 0x3c, 0x0, 0x24, 0xff, 0xe7, 0x0, 0x3c, 0x0, 0x25, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x26, - 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x27, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x28, 0x0, 0x1e, 0x0, 0x3c, - 0x0, 0x29, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x2b, 0x0, 0x1e, - 0x0, 0x3c, 0x0, 0x2c, 0x0, 0x28, 0x0, 0x3c, 0x0, 0x2e, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x2f, - 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x30, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x31, 0x0, 0x1e, 0x0, 0x3c, - 0x0, 0x32, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x33, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x34, 0x0, 0x1e, - 0x0, 0x3c, 0x0, 0x35, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x36, 0x0, 0x28, 0x0, 0x3c, 0x0, 0x37, - 0x0, 0x78, 0x0, 0x3c, 0x0, 0x38, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x39, 0x0, 0x64, 0x0, 0x3c, - 0x0, 0x3a, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x3b, 0x0, 0x50, 0x0, 0x3c, 0x0, 0x3c, 0x0, 0x64, - 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x5f, 0x0, 0x3c, 0x0, 0x44, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x46, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0x47, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x48, 0xff, 0xec, 0x0, 0x3c, - 0x0, 0x4a, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x4c, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x52, 0xff, 0xec, - 0x0, 0x3c, 0x0, 0x54, 0xff, 0xec, 0x0, 0x3c, 0x0, 0x59, 0x0, 0x32, 0x0, 0x3c, 0x0, 0x70, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0x78, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x7d, 0x0, 0x78, 0x0, 0x3c, - 0x0, 0x7f, 0x0, 0x78, 0x0, 0x3c, 0x0, 0x99, 0xff, 0xe7, 0x0, 0x3c, 0x0, 0x9a, 0xff, 0xe7, - 0x0, 0x3c, 0x0, 0x9b, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x9c, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x9e, - 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x9f, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xa0, 0xff, 0xec, 0x0, 0x3c, - 0x0, 0xa1, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa3, 0xff, 0xec, - 0x0, 0x3c, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa6, - 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xa8, 0xff, 0xec, 0x0, 0x3c, - 0x0, 0xa9, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xaa, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xab, 0x0, 0x1e, - 0x0, 0x3c, 0x0, 0xac, 0x0, 0x64, 0x0, 0x3c, 0x0, 0xad, 0x0, 0x64, 0x0, 0x3c, 0x0, 0xae, - 0x0, 0x78, 0x0, 0x3c, 0x0, 0xb0, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x3c, - 0x0, 0xb2, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xb3, 0xff, 0xec, 0x0, 0x3c, 0x0, 0xb4, 0xff, 0xec, - 0x0, 0x3c, 0x0, 0xbc, 0x0, 0x96, 0x0, 0x3c, 0x0, 0xce, 0xff, 0xe7, 0x0, 0x3c, 0x0, 0xcf, - 0xff, 0xe7, 0x0, 0x3c, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0xd5, 0xff, 0xe7, 0x0, 0x3c, - 0x0, 0xd6, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0xd7, 0xff, 0xe7, 0x0, 0x3c, 0x0, 0xd8, 0x0, 0x1e, - 0x0, 0x3c, 0x0, 0xd9, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0xda, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0xdb, - 0x0, 0x28, 0x0, 0x3c, 0x0, 0xdc, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xdd, 0x0, 0x1e, 0x0, 0x3c, - 0x0, 0xde, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0xe1, 0x0, 0x1e, - 0x0, 0x3c, 0x0, 0xe2, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xe3, 0x0, 0x32, 0x0, 0x3c, 0x0, 0xe4, - 0x0, 0x32, 0x0, 0x3d, 0x0, 0x22, 0x0, 0x78, 0x0, 0x3d, 0x0, 0x24, 0x0, 0x3c, 0x0, 0x3d, - 0x0, 0x26, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x2a, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x32, 0xff, 0xe2, - 0x0, 0x3d, 0x0, 0x34, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x36, 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x37, - 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x39, 0x0, 0x19, 0x0, 0x3d, 0x0, 0x3a, 0x0, 0x28, 0x0, 0x3d, - 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3c, 0x0, 0x32, 0x0, 0x3d, 0x0, 0x3d, 0x0, 0x28, - 0x0, 0x3d, 0x0, 0x4c, 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x78, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0x7d, - 0x0, 0x32, 0x0, 0x3d, 0x0, 0x7f, 0x0, 0x32, 0x0, 0x3d, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0x3d, - 0x0, 0x9e, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0xac, 0x0, 0x28, 0x0, 0x3d, 0x0, 0xad, 0x0, 0x32, - 0x0, 0x3d, 0x0, 0xae, 0x0, 0x37, 0x0, 0x3d, 0x0, 0xbc, 0x0, 0x78, 0x0, 0x3d, 0x0, 0xd0, - 0xff, 0xe2, 0x0, 0x3d, 0x0, 0xd4, 0x0, 0x32, 0x0, 0x3d, 0x0, 0xde, 0xff, 0xe2, 0x0, 0x3d, - 0x0, 0xdf, 0xff, 0xe2, 0x0, 0x3d, 0x0, 0xe1, 0xff, 0xe2, 0x0, 0x44, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0x44, 0x0, 0x46, 0xff, 0xf1, 0x0, 0x44, 0x0, 0x47, 0xff, 0xf1, 0x0, 0x44, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0x44, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x44, 0x0, 0x52, 0xff, 0xf1, 0x0, 0x44, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0x44, 0x0, 0x70, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0x44, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0x44, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0x44, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0x44, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0x44, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0x44, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x44, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x45, 0x0, 0x44, 0x0, 0xf, - 0x0, 0x45, 0x0, 0x46, 0x0, 0xf, 0x0, 0x45, 0x0, 0x47, 0x0, 0xf, 0x0, 0x45, 0x0, 0x48, - 0x0, 0xf, 0x0, 0x45, 0x0, 0x4a, 0x0, 0xf, 0x0, 0x45, 0x0, 0x52, 0x0, 0xf, 0x0, 0x45, - 0x0, 0x54, 0x0, 0xf, 0x0, 0x45, 0x0, 0x70, 0x0, 0xf, 0x0, 0x45, 0x0, 0xa0, 0x0, 0xf, - 0x0, 0x45, 0x0, 0xa1, 0x0, 0xf, 0x0, 0x45, 0x0, 0xa2, 0x0, 0xf, 0x0, 0x45, 0x0, 0xa3, - 0x0, 0xf, 0x0, 0x45, 0x0, 0xa4, 0x0, 0xf, 0x0, 0x45, 0x0, 0xa5, 0x0, 0xf, 0x0, 0x45, - 0x0, 0xa6, 0x0, 0xf, 0x0, 0x45, 0x0, 0xa7, 0x0, 0xf, 0x0, 0x45, 0x0, 0xa8, 0x0, 0xf, - 0x0, 0x45, 0x0, 0xa9, 0x0, 0xf, 0x0, 0x45, 0x0, 0xaa, 0x0, 0xf, 0x0, 0x45, 0x0, 0xb0, - 0x0, 0xf, 0x0, 0x45, 0x0, 0xb1, 0x0, 0xf, 0x0, 0x45, 0x0, 0xb2, 0x0, 0xf, 0x0, 0x45, - 0x0, 0xb3, 0x0, 0xf, 0x0, 0x45, 0x0, 0xb4, 0x0, 0xf, 0x0, 0x46, 0x0, 0x4b, 0xff, 0xf1, - 0x0, 0x46, 0x0, 0x55, 0x0, 0x14, 0x0, 0x46, 0x0, 0x56, 0x0, 0x14, 0x0, 0x46, 0x0, 0x59, - 0x0, 0x14, 0x0, 0x46, 0x0, 0x5b, 0x0, 0x32, 0x0, 0x46, 0x0, 0x5d, 0x0, 0x14, 0x0, 0x47, - 0x0, 0x44, 0xff, 0xf1, 0x0, 0x47, 0x0, 0x46, 0xff, 0xf1, 0x0, 0x47, 0x0, 0x47, 0xff, 0xf1, - 0x0, 0x47, 0x0, 0x48, 0xff, 0xf1, 0x0, 0x47, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x47, 0x0, 0x52, - 0xff, 0xf1, 0x0, 0x47, 0x0, 0x54, 0xff, 0xf1, 0x0, 0x47, 0x0, 0x56, 0xff, 0xec, 0x0, 0x47, - 0x0, 0x70, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa1, 0xff, 0xf1, - 0x0, 0x47, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa4, - 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0x47, - 0x0, 0xa7, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xa9, 0xff, 0xf1, - 0x0, 0x47, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xb1, - 0xff, 0xf1, 0x0, 0x47, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0x47, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x47, - 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x49, 0x0, 0xd, 0x0, 0x32, 0x0, 0x49, 0x0, 0x22, 0x0, 0x50, - 0x0, 0x49, 0x0, 0x44, 0xff, 0xec, 0x0, 0x49, 0x0, 0x46, 0xff, 0xec, 0x0, 0x49, 0x0, 0x47, - 0xff, 0xec, 0x0, 0x49, 0x0, 0x48, 0xff, 0xec, 0x0, 0x49, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x49, - 0x0, 0x4f, 0x0, 0x14, 0x0, 0x49, 0x0, 0x52, 0xff, 0xec, 0x0, 0x49, 0x0, 0x54, 0xff, 0xec, - 0x0, 0x49, 0x0, 0x57, 0x0, 0x14, 0x0, 0x49, 0x0, 0x59, 0x0, 0x32, 0x0, 0x49, 0x0, 0x5a, - 0x0, 0x28, 0x0, 0x49, 0x0, 0x5c, 0x0, 0x32, 0x0, 0x49, 0x0, 0x5d, 0xff, 0xf6, 0x0, 0x49, - 0x0, 0x70, 0xff, 0xec, 0x0, 0x49, 0x0, 0x7d, 0x0, 0x46, 0x0, 0x49, 0x0, 0xa0, 0xff, 0xec, - 0x0, 0x49, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x49, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x49, 0x0, 0xa3, - 0xff, 0xec, 0x0, 0x49, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x49, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x49, - 0x0, 0xa6, 0xff, 0xec, 0x0, 0x49, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x49, 0x0, 0xa8, 0xff, 0xec, - 0x0, 0x49, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x49, 0x0, 0xaa, 0xff, 0xec, 0x0, 0x49, 0x0, 0xb0, - 0xff, 0xec, 0x0, 0x49, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x49, 0x0, 0xb2, 0xff, 0xec, 0x0, 0x49, - 0x0, 0xb3, 0xff, 0xec, 0x0, 0x49, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x49, 0x0, 0xbc, 0x0, 0x64, - 0x0, 0x4a, 0x0, 0x44, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x46, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x47, - 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x48, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x4a, - 0x0, 0x4c, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x4e, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x50, 0xff, 0xec, - 0x0, 0x4a, 0x0, 0x51, 0xff, 0xec, 0x0, 0x4a, 0x0, 0x52, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x54, - 0xff, 0xf1, 0x0, 0x4a, 0x0, 0x56, 0xff, 0xec, 0x0, 0x4a, 0x0, 0x70, 0xff, 0xf1, 0x0, 0x4a, - 0x0, 0xa0, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xa2, 0xff, 0xf1, - 0x0, 0x4a, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xa5, - 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0x4a, - 0x0, 0xa8, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xaa, 0xff, 0xf1, - 0x0, 0x4a, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xb2, - 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x4a, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x4b, - 0x0, 0x56, 0xff, 0xec, 0x0, 0x4c, 0x0, 0x55, 0x0, 0x14, 0x0, 0x4c, 0x0, 0x56, 0x0, 0x14, - 0x0, 0x4c, 0x0, 0x5b, 0x0, 0x32, 0x0, 0x4e, 0x0, 0x44, 0xff, 0xec, 0x0, 0x4e, 0x0, 0x46, - 0xff, 0xec, 0x0, 0x4e, 0x0, 0x47, 0xff, 0xec, 0x0, 0x4e, 0x0, 0x48, 0xff, 0xec, 0x0, 0x4e, - 0x0, 0x4a, 0xff, 0xec, 0x0, 0x4e, 0x0, 0x52, 0xff, 0xec, 0x0, 0x4e, 0x0, 0x54, 0xff, 0xec, - 0x0, 0x4e, 0x0, 0x59, 0x0, 0x1e, 0x0, 0x4e, 0x0, 0x5a, 0x0, 0x14, 0x0, 0x4e, 0x0, 0x5b, - 0x0, 0x28, 0x0, 0x4e, 0x0, 0x5c, 0x0, 0x1e, 0x0, 0x4e, 0x0, 0x70, 0xff, 0xec, 0x0, 0x4e, - 0x0, 0xa0, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xa2, 0xff, 0xec, - 0x0, 0x4e, 0x0, 0xa3, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xa5, - 0xff, 0xec, 0x0, 0x4e, 0x0, 0xa6, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x4e, - 0x0, 0xa8, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xaa, 0xff, 0xec, - 0x0, 0x4e, 0x0, 0xb0, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xb2, - 0xff, 0xec, 0x0, 0x4e, 0x0, 0xb3, 0xff, 0xec, 0x0, 0x4e, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x4e, - 0x0, 0xd3, 0x0, 0x1e, 0x0, 0x4f, 0x0, 0x44, 0xff, 0xec, 0x0, 0x4f, 0x0, 0x46, 0xff, 0xec, - 0x0, 0x4f, 0x0, 0x47, 0xff, 0xec, 0x0, 0x4f, 0x0, 0x48, 0xff, 0xec, 0x0, 0x4f, 0x0, 0x4a, - 0xff, 0xec, 0x0, 0x4f, 0x0, 0x52, 0xff, 0xec, 0x0, 0x4f, 0x0, 0x54, 0xff, 0xec, 0x0, 0x4f, - 0x0, 0x5b, 0x0, 0x14, 0x0, 0x4f, 0x0, 0x70, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xa0, 0xff, 0xec, - 0x0, 0x4f, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xa3, - 0xff, 0xec, 0x0, 0x4f, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x4f, - 0x0, 0xa6, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xa8, 0xff, 0xec, - 0x0, 0x4f, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xaa, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xb0, - 0xff, 0xec, 0x0, 0x4f, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xb2, 0xff, 0xec, 0x0, 0x4f, - 0x0, 0xb3, 0xff, 0xec, 0x0, 0x4f, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x52, 0x0, 0x44, 0x0, 0xf, - 0x0, 0x52, 0x0, 0x46, 0x0, 0xf, 0x0, 0x52, 0x0, 0x47, 0x0, 0xf, 0x0, 0x52, 0x0, 0x48, - 0x0, 0xf, 0x0, 0x52, 0x0, 0x4a, 0x0, 0xf, 0x0, 0x52, 0x0, 0x52, 0x0, 0xf, 0x0, 0x52, - 0x0, 0x54, 0x0, 0xf, 0x0, 0x52, 0x0, 0x70, 0x0, 0xf, 0x0, 0x52, 0x0, 0xa0, 0x0, 0xf, - 0x0, 0x52, 0x0, 0xa1, 0x0, 0xf, 0x0, 0x52, 0x0, 0xa2, 0x0, 0xf, 0x0, 0x52, 0x0, 0xa3, - 0x0, 0xf, 0x0, 0x52, 0x0, 0xa4, 0x0, 0xf, 0x0, 0x52, 0x0, 0xa5, 0x0, 0xf, 0x0, 0x52, - 0x0, 0xa6, 0x0, 0xf, 0x0, 0x52, 0x0, 0xa7, 0x0, 0xf, 0x0, 0x52, 0x0, 0xa8, 0x0, 0xf, - 0x0, 0x52, 0x0, 0xa9, 0x0, 0xf, 0x0, 0x52, 0x0, 0xaa, 0x0, 0xf, 0x0, 0x52, 0x0, 0xb0, - 0x0, 0xf, 0x0, 0x52, 0x0, 0xb1, 0x0, 0xf, 0x0, 0x52, 0x0, 0xb2, 0x0, 0xf, 0x0, 0x52, - 0x0, 0xb3, 0x0, 0xf, 0x0, 0x52, 0x0, 0xb4, 0x0, 0xf, 0x0, 0x53, 0x0, 0x44, 0x0, 0xf, - 0x0, 0x53, 0x0, 0x45, 0x0, 0x19, 0x0, 0x53, 0x0, 0x46, 0x0, 0xf, 0x0, 0x53, 0x0, 0x47, - 0x0, 0xf, 0x0, 0x53, 0x0, 0x48, 0x0, 0xf, 0x0, 0x53, 0x0, 0x4a, 0x0, 0xf, 0x0, 0x53, - 0x0, 0x52, 0x0, 0xf, 0x0, 0x53, 0x0, 0x54, 0x0, 0xf, 0x0, 0x53, 0x0, 0x70, 0x0, 0xf, - 0x0, 0x53, 0x0, 0xa0, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa1, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa2, - 0x0, 0xf, 0x0, 0x53, 0x0, 0xa3, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa4, 0x0, 0xf, 0x0, 0x53, - 0x0, 0xa5, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa6, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa7, 0x0, 0xf, - 0x0, 0x53, 0x0, 0xa8, 0x0, 0xf, 0x0, 0x53, 0x0, 0xa9, 0x0, 0xf, 0x0, 0x53, 0x0, 0xaa, - 0x0, 0xf, 0x0, 0x53, 0x0, 0xb0, 0x0, 0xf, 0x0, 0x53, 0x0, 0xb1, 0x0, 0xf, 0x0, 0x53, - 0x0, 0xb2, 0x0, 0xf, 0x0, 0x53, 0x0, 0xb3, 0x0, 0xf, 0x0, 0x53, 0x0, 0xb4, 0x0, 0xf, - 0x0, 0x54, 0x0, 0x59, 0x0, 0xf, 0x0, 0x54, 0x0, 0x5c, 0x0, 0x1e, 0x0, 0x54, 0x0, 0xd3, - 0x0, 0x1e, 0x0, 0x55, 0x0, 0x44, 0xff, 0xec, 0x0, 0x55, 0x0, 0x46, 0xff, 0xec, 0x0, 0x55, - 0x0, 0x47, 0xff, 0xec, 0x0, 0x55, 0x0, 0x48, 0xff, 0xec, 0x0, 0x55, 0x0, 0x49, 0x0, 0x14, - 0x0, 0x55, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x55, 0x0, 0x52, 0xff, 0xec, 0x0, 0x55, 0x0, 0x54, - 0xff, 0xec, 0x0, 0x55, 0x0, 0x56, 0x0, 0x14, 0x0, 0x55, 0x0, 0x57, 0x0, 0x14, 0x0, 0x55, - 0x0, 0x59, 0x0, 0x3c, 0x0, 0x55, 0x0, 0x5a, 0x0, 0x3c, 0x0, 0x55, 0x0, 0x5b, 0x0, 0x14, - 0x0, 0x55, 0x0, 0x5c, 0x0, 0x46, 0x0, 0x55, 0x0, 0x70, 0xff, 0xec, 0x0, 0x55, 0x0, 0xa0, - 0xff, 0xec, 0x0, 0x55, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x55, 0x0, 0xa2, 0xff, 0xec, 0x0, 0x55, - 0x0, 0xa3, 0xff, 0xec, 0x0, 0x55, 0x0, 0xa4, 0xff, 0xec, 0x0, 0x55, 0x0, 0xa5, 0xff, 0xec, - 0x0, 0x55, 0x0, 0xa6, 0xff, 0xec, 0x0, 0x55, 0x0, 0xa7, 0xff, 0xec, 0x0, 0x55, 0x0, 0xa8, - 0xff, 0xec, 0x0, 0x55, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x55, 0x0, 0xaa, 0xff, 0xec, 0x0, 0x55, - 0x0, 0xb0, 0xff, 0xec, 0x0, 0x55, 0x0, 0xb1, 0xff, 0xec, 0x0, 0x55, 0x0, 0xb2, 0xff, 0xec, - 0x0, 0x55, 0x0, 0xb3, 0xff, 0xec, 0x0, 0x55, 0x0, 0xb4, 0xff, 0xec, 0x0, 0x55, 0x0, 0xd3, - 0x0, 0x46, 0x0, 0x56, 0x0, 0x5b, 0x0, 0x1e, 0x0, 0x57, 0x0, 0x44, 0xff, 0xf1, 0x0, 0x57, - 0x0, 0x46, 0xff, 0xf1, 0x0, 0x57, 0x0, 0x47, 0xff, 0xf1, 0x0, 0x57, 0x0, 0x48, 0xff, 0xf1, - 0x0, 0x57, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x57, 0x0, 0x52, 0xff, 0xf1, 0x0, 0x57, 0x0, 0x54, - 0xff, 0xf1, 0x0, 0x57, 0x0, 0x59, 0x0, 0xf, 0x0, 0x57, 0x0, 0x5c, 0x0, 0x14, 0x0, 0x57, - 0x0, 0x70, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa1, 0xff, 0xf1, - 0x0, 0x57, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa4, - 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0x57, - 0x0, 0xa7, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xa9, 0xff, 0xf1, - 0x0, 0x57, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xb1, - 0xff, 0xf1, 0x0, 0x57, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x57, - 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x57, 0x0, 0xd3, 0x0, 0x14, 0x0, 0x58, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0x58, 0x0, 0x46, 0xff, 0xf1, 0x0, 0x58, 0x0, 0x47, 0xff, 0xf1, 0x0, 0x58, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0x58, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0x58, 0x0, 0x52, 0xff, 0xf1, 0x0, 0x58, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0x58, 0x0, 0x70, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0x58, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0x58, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0x58, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0x58, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0x58, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0x58, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x58, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x59, 0x0, 0x44, 0x0, 0xa, - 0x0, 0x59, 0x0, 0x46, 0x0, 0xa, 0x0, 0x59, 0x0, 0x47, 0x0, 0xa, 0x0, 0x59, 0x0, 0x48, - 0x0, 0xa, 0x0, 0x59, 0x0, 0x4a, 0x0, 0xa, 0x0, 0x59, 0x0, 0x52, 0x0, 0xa, 0x0, 0x59, - 0x0, 0x54, 0x0, 0xa, 0x0, 0x59, 0x0, 0x55, 0xff, 0xf1, 0x0, 0x59, 0x0, 0x59, 0x0, 0x28, - 0x0, 0x59, 0x0, 0x5a, 0x0, 0x1e, 0x0, 0x59, 0x0, 0x5c, 0x0, 0x28, 0x0, 0x59, 0x0, 0x5d, - 0xff, 0xec, 0x0, 0x59, 0x0, 0x70, 0x0, 0xa, 0x0, 0x59, 0x0, 0xa0, 0x0, 0xa, 0x0, 0x59, - 0x0, 0xa1, 0x0, 0xa, 0x0, 0x59, 0x0, 0xa2, 0x0, 0xa, 0x0, 0x59, 0x0, 0xa3, 0x0, 0xa, - 0x0, 0x59, 0x0, 0xa4, 0x0, 0xa, 0x0, 0x59, 0x0, 0xa5, 0x0, 0xa, 0x0, 0x59, 0x0, 0xa6, - 0x0, 0xa, 0x0, 0x59, 0x0, 0xa7, 0x0, 0xa, 0x0, 0x59, 0x0, 0xa8, 0x0, 0xa, 0x0, 0x59, - 0x0, 0xa9, 0x0, 0xa, 0x0, 0x59, 0x0, 0xaa, 0x0, 0xa, 0x0, 0x59, 0x0, 0xb0, 0x0, 0xa, - 0x0, 0x59, 0x0, 0xb1, 0x0, 0xa, 0x0, 0x59, 0x0, 0xb2, 0x0, 0xa, 0x0, 0x59, 0x0, 0xb3, - 0x0, 0xa, 0x0, 0x59, 0x0, 0xb4, 0x0, 0xa, 0x0, 0x59, 0x0, 0xd3, 0x0, 0x28, 0x0, 0x5a, - 0x0, 0x44, 0x0, 0xa, 0x0, 0x5a, 0x0, 0x46, 0x0, 0xa, 0x0, 0x5a, 0x0, 0x47, 0x0, 0xa, - 0x0, 0x5a, 0x0, 0x48, 0x0, 0xa, 0x0, 0x5a, 0x0, 0x4a, 0x0, 0xa, 0x0, 0x5a, 0x0, 0x52, - 0x0, 0xa, 0x0, 0x5a, 0x0, 0x54, 0x0, 0xa, 0x0, 0x5a, 0x0, 0x59, 0x0, 0x28, 0x0, 0x5a, - 0x0, 0x5a, 0x0, 0x1e, 0x0, 0x5a, 0x0, 0x5c, 0x0, 0x28, 0x0, 0x5a, 0x0, 0x5d, 0xff, 0xf1, - 0x0, 0x5a, 0x0, 0x70, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa0, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa1, - 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa2, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa3, 0x0, 0xa, 0x0, 0x5a, - 0x0, 0xa4, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa5, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa6, 0x0, 0xa, - 0x0, 0x5a, 0x0, 0xa7, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa8, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xa9, - 0x0, 0xa, 0x0, 0x5a, 0x0, 0xaa, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xb0, 0x0, 0xa, 0x0, 0x5a, - 0x0, 0xb1, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xb2, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xb3, 0x0, 0xa, - 0x0, 0x5a, 0x0, 0xb4, 0x0, 0xa, 0x0, 0x5a, 0x0, 0xd3, 0x0, 0x28, 0x0, 0x5b, 0x0, 0x4a, - 0xff, 0xec, 0x0, 0x5b, 0x0, 0x59, 0x0, 0x28, 0x0, 0x5b, 0x0, 0x5a, 0x0, 0x14, 0x0, 0x5b, - 0x0, 0x5b, 0x0, 0x28, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x23, 0x0, 0x5b, 0x0, 0xd3, 0x0, 0x23, - 0x0, 0x5c, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x5c, 0x0, 0x59, 0x0, 0x28, 0x0, 0x5c, 0x0, 0x5a, - 0x0, 0x1e, 0x0, 0x5c, 0x0, 0x5c, 0x0, 0x1e, 0x0, 0x5c, 0x0, 0x5d, 0xff, 0xec, 0x0, 0x5c, - 0x0, 0xd3, 0x0, 0x1e, 0x0, 0x5d, 0x0, 0x44, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0x46, 0xff, 0xdd, - 0x0, 0x5d, 0x0, 0x47, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0x48, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0x4a, - 0xff, 0xdd, 0x0, 0x5d, 0x0, 0x52, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0x54, 0xff, 0xdd, 0x0, 0x5d, - 0x0, 0x70, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa0, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa1, 0xff, 0xdd, - 0x0, 0x5d, 0x0, 0xa2, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa3, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa4, - 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa5, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa6, 0xff, 0xdd, 0x0, 0x5d, - 0x0, 0xa7, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa8, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xa9, 0xff, 0xdd, - 0x0, 0x5d, 0x0, 0xaa, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xb0, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xb1, - 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xb2, 0xff, 0xdd, 0x0, 0x5d, 0x0, 0xb3, 0xff, 0xdd, 0x0, 0x5d, - 0x0, 0xb4, 0xff, 0xdd, 0x0, 0x64, 0x0, 0x16, 0xff, 0x88, 0x0, 0x64, 0x0, 0x18, 0xff, 0xb0, - 0x0, 0x64, 0x0, 0x1a, 0xff, 0x9c, 0x0, 0x68, 0x0, 0x44, 0x0, 0x14, 0x0, 0x68, 0x0, 0x46, - 0x0, 0x14, 0x0, 0x68, 0x0, 0x47, 0x0, 0x14, 0x0, 0x68, 0x0, 0x48, 0x0, 0x14, 0x0, 0x68, - 0x0, 0x4a, 0x0, 0x14, 0x0, 0x68, 0x0, 0x4c, 0x0, 0x14, 0x0, 0x68, 0x0, 0x52, 0x0, 0x14, - 0x0, 0x68, 0x0, 0x54, 0x0, 0x14, 0x0, 0x68, 0x0, 0x70, 0x0, 0x14, 0x0, 0x68, 0x0, 0x8b, - 0x0, 0x14, 0x0, 0x68, 0x0, 0xa0, 0x0, 0x14, 0x0, 0x68, 0x0, 0xa1, 0x0, 0x14, 0x0, 0x68, - 0x0, 0xa2, 0x0, 0x14, 0x0, 0x68, 0x0, 0xa3, 0x0, 0x14, 0x0, 0x68, 0x0, 0xa4, 0x0, 0x14, - 0x0, 0x68, 0x0, 0xa5, 0x0, 0x14, 0x0, 0x68, 0x0, 0xa6, 0x0, 0x14, 0x0, 0x68, 0x0, 0xa7, - 0x0, 0x14, 0x0, 0x68, 0x0, 0xa8, 0x0, 0x14, 0x0, 0x68, 0x0, 0xa9, 0x0, 0x14, 0x0, 0x68, - 0x0, 0xaa, 0x0, 0x14, 0x0, 0x68, 0x0, 0xab, 0x0, 0x14, 0x0, 0x68, 0x0, 0xac, 0x0, 0x14, - 0x0, 0x68, 0x0, 0xad, 0x0, 0x14, 0x0, 0x68, 0x0, 0xae, 0x0, 0x14, 0x0, 0x68, 0x0, 0xb0, - 0x0, 0x14, 0x0, 0x68, 0x0, 0xb1, 0x0, 0x14, 0x0, 0x68, 0x0, 0xb2, 0x0, 0x14, 0x0, 0x68, - 0x0, 0xb3, 0x0, 0x14, 0x0, 0x68, 0x0, 0xb4, 0x0, 0x14, 0x0, 0x6d, 0x0, 0x8, 0x0, 0x50, - 0x0, 0x74, 0x0, 0x68, 0xff, 0xa6, 0x0, 0x7c, 0x0, 0x24, 0xff, 0x38, 0x0, 0x7c, 0x0, 0x25, - 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x26, 0xff, 0x88, 0x0, 0x7c, 0x0, 0x27, 0xff, 0xb0, 0x0, 0x7c, - 0x0, 0x28, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x29, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x2a, 0xff, 0x88, - 0x0, 0x7c, 0x0, 0x2b, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x2c, 0xff, 0x9c, 0x0, 0x7c, 0x0, 0x2d, - 0xff, 0x7e, 0x0, 0x7c, 0x0, 0x2e, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x7c, - 0x0, 0x30, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x31, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x32, 0xff, 0x88, - 0x0, 0x7c, 0x0, 0x33, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x34, 0xff, 0x88, 0x0, 0x7c, 0x0, 0x35, - 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x36, 0xff, 0xba, 0x0, 0x7c, 0x0, 0x38, 0xff, 0xb0, 0x0, 0x7c, - 0x0, 0x3b, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x3d, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x44, 0xff, 0xb0, - 0x0, 0x7c, 0x0, 0x46, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x47, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x48, - 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x4a, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x4c, 0xff, 0xc4, 0x0, 0x7c, - 0x0, 0x4d, 0xff, 0xc4, 0x0, 0x7c, 0x0, 0x4f, 0xff, 0xe2, 0x0, 0x7c, 0x0, 0x52, 0xff, 0xb0, - 0x0, 0x7c, 0x0, 0x54, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x55, 0xff, 0xc4, 0x0, 0x7c, 0x0, 0x56, - 0xff, 0xc4, 0x0, 0x7c, 0x0, 0x58, 0xff, 0xc4, 0x0, 0x7c, 0x0, 0x5d, 0xff, 0xb0, 0x0, 0x7c, - 0x0, 0x70, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x78, 0xff, 0x88, 0x0, 0x7c, 0x0, 0x99, 0xff, 0x38, - 0x0, 0x7c, 0x0, 0x9a, 0xff, 0x38, 0x0, 0x7c, 0x0, 0x9b, 0xff, 0x88, 0x0, 0x7c, 0x0, 0x9c, - 0xff, 0xb0, 0x0, 0x7c, 0x0, 0x9e, 0xff, 0x88, 0x0, 0x7c, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x7c, - 0x0, 0xa0, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xa1, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xa2, 0xff, 0xb0, - 0x0, 0x7c, 0x0, 0xa3, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xa4, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xa5, - 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xa6, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xa7, 0xff, 0xb0, 0x0, 0x7c, - 0x0, 0xa8, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xa9, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xaa, 0xff, 0xb0, - 0x0, 0x7c, 0x0, 0xab, 0xff, 0xa6, 0x0, 0x7c, 0x0, 0xb0, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xb1, - 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xb2, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xb3, 0xff, 0xb0, 0x0, 0x7c, - 0x0, 0xb4, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xb5, 0xff, 0xc4, 0x0, 0x7c, 0x0, 0xb6, 0xff, 0xc4, - 0x0, 0x7c, 0x0, 0xb7, 0xff, 0xc4, 0x0, 0x7c, 0x0, 0xb8, 0xff, 0xc4, 0x0, 0x7c, 0x0, 0xce, - 0xff, 0x38, 0x0, 0x7c, 0x0, 0xcf, 0xff, 0x38, 0x0, 0x7c, 0x0, 0xd0, 0xff, 0x88, 0x0, 0x7c, - 0x0, 0xd5, 0xff, 0x38, 0x0, 0x7c, 0x0, 0xd6, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xd7, 0xff, 0x38, - 0x0, 0x7c, 0x0, 0xd8, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xd9, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xde, - 0xff, 0x88, 0x0, 0x7c, 0x0, 0xdf, 0xff, 0x88, 0x0, 0x7c, 0x0, 0xe1, 0xff, 0x88, 0x0, 0x7c, - 0x0, 0xe2, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xe3, 0xff, 0xb0, 0x0, 0x7c, 0x0, 0xe4, 0xff, 0xb0, - 0x0, 0x7e, 0x0, 0x24, 0xff, 0x38, 0x0, 0x7e, 0x0, 0x25, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x26, - 0xff, 0x88, 0x0, 0x7e, 0x0, 0x27, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x28, 0xff, 0xb0, 0x0, 0x7e, - 0x0, 0x29, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x2a, 0xff, 0x88, 0x0, 0x7e, 0x0, 0x2b, 0xff, 0xb0, - 0x0, 0x7e, 0x0, 0x2e, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x30, - 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x31, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x32, 0xff, 0x88, 0x0, 0x7e, - 0x0, 0x33, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x34, 0xff, 0x88, 0x0, 0x7e, 0x0, 0x35, 0xff, 0xb0, - 0x0, 0x7e, 0x0, 0x38, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x44, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x46, - 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x47, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x48, 0xff, 0xb0, 0x0, 0x7e, - 0x0, 0x4a, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x52, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x54, 0xff, 0xb0, - 0x0, 0x7e, 0x0, 0x58, 0xff, 0xc4, 0x0, 0x7e, 0x0, 0x70, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x78, - 0xff, 0x88, 0x0, 0x7e, 0x0, 0x99, 0xff, 0x38, 0x0, 0x7e, 0x0, 0x9a, 0xff, 0x38, 0x0, 0x7e, - 0x0, 0x9b, 0xff, 0x88, 0x0, 0x7e, 0x0, 0x9c, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0x9e, 0xff, 0x88, - 0x0, 0x7e, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa0, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa1, - 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa2, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa3, 0xff, 0xb0, 0x0, 0x7e, - 0x0, 0xa4, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa5, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa6, 0xff, 0xb0, - 0x0, 0x7e, 0x0, 0xa7, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa8, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xa9, - 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xaa, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xb0, 0xff, 0xb0, 0x0, 0x7e, - 0x0, 0xb1, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xb2, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xb3, 0xff, 0xb0, - 0x0, 0x7e, 0x0, 0xb4, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xb5, 0xff, 0xc4, 0x0, 0x7e, 0x0, 0xb6, - 0xff, 0xc4, 0x0, 0x7e, 0x0, 0xb7, 0xff, 0xc4, 0x0, 0x7e, 0x0, 0xb8, 0xff, 0xc4, 0x0, 0x7e, - 0x0, 0xce, 0xff, 0x38, 0x0, 0x7e, 0x0, 0xcf, 0xff, 0x38, 0x0, 0x7e, 0x0, 0xd0, 0xff, 0x88, - 0x0, 0x7e, 0x0, 0xd5, 0xff, 0x38, 0x0, 0x7e, 0x0, 0xd6, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xd7, - 0xff, 0x38, 0x0, 0x7e, 0x0, 0xd8, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xd9, 0xff, 0xb0, 0x0, 0x7e, - 0x0, 0xde, 0xff, 0x88, 0x0, 0x7e, 0x0, 0xdf, 0xff, 0x88, 0x0, 0x7e, 0x0, 0xe1, 0xff, 0x88, - 0x0, 0x7e, 0x0, 0xe2, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xe3, 0xff, 0xb0, 0x0, 0x7e, 0x0, 0xe4, - 0xff, 0xb0, 0x0, 0x99, 0x0, 0x24, 0x0, 0x28, 0x0, 0x99, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x99, - 0x0, 0x2d, 0xff, 0xdd, 0x0, 0x99, 0x0, 0x37, 0xff, 0xc4, 0x0, 0x99, 0x0, 0x39, 0xff, 0xdd, - 0x0, 0x99, 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x99, 0x0, 0x3c, 0xff, 0xb5, 0x0, 0x99, 0x0, 0x3d, - 0x0, 0x14, 0x0, 0x99, 0x0, 0x59, 0x0, 0x14, 0x0, 0x99, 0x0, 0x5a, 0x0, 0x14, 0x0, 0x99, - 0x0, 0x5b, 0x0, 0x28, 0x0, 0x99, 0x0, 0x5c, 0x0, 0xf, 0x0, 0x99, 0x0, 0x99, 0x0, 0x28, - 0x0, 0x99, 0x0, 0x9a, 0x0, 0x28, 0x0, 0x99, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0x99, 0x0, 0xce, - 0x0, 0x28, 0x0, 0x99, 0x0, 0xcf, 0x0, 0x28, 0x0, 0x99, 0x0, 0xd3, 0x0, 0xf, 0x0, 0x99, - 0x0, 0xd4, 0xff, 0xb5, 0x0, 0x99, 0x0, 0xd5, 0x0, 0x28, 0x0, 0x99, 0x0, 0xd7, 0x0, 0x28, - 0x0, 0x9a, 0x0, 0x24, 0x0, 0x28, 0x0, 0x9a, 0x0, 0x26, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0x2d, - 0xff, 0xdd, 0x0, 0x9a, 0x0, 0x37, 0xff, 0xc4, 0x0, 0x9a, 0x0, 0x39, 0xff, 0xdd, 0x0, 0x9a, - 0x0, 0x3b, 0x0, 0x1e, 0x0, 0x9a, 0x0, 0x3c, 0xff, 0xb5, 0x0, 0x9a, 0x0, 0x3d, 0x0, 0x14, - 0x0, 0x9a, 0x0, 0x59, 0x0, 0x14, 0x0, 0x9a, 0x0, 0x5a, 0x0, 0x14, 0x0, 0x9a, 0x0, 0x5b, - 0x0, 0x28, 0x0, 0x9a, 0x0, 0x5c, 0x0, 0xf, 0x0, 0x9a, 0x0, 0x99, 0x0, 0x28, 0x0, 0x9a, - 0x0, 0x9a, 0x0, 0x28, 0x0, 0x9a, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0x9a, 0x0, 0xce, 0x0, 0x28, - 0x0, 0x9a, 0x0, 0xcf, 0x0, 0x28, 0x0, 0x9a, 0x0, 0xd3, 0x0, 0xf, 0x0, 0x9a, 0x0, 0xd4, - 0xff, 0xb5, 0x0, 0x9a, 0x0, 0xd5, 0x0, 0x28, 0x0, 0x9a, 0x0, 0xd7, 0x0, 0x28, 0x0, 0x9b, - 0x0, 0x24, 0x0, 0x1e, 0x0, 0x9b, 0x0, 0x36, 0x0, 0x1e, 0x0, 0x9b, 0x0, 0x3a, 0x0, 0x1e, - 0x0, 0x9b, 0x0, 0x3b, 0x0, 0x28, 0x0, 0x9b, 0x0, 0x3d, 0x0, 0x28, 0x0, 0x9b, 0x0, 0x99, - 0x0, 0x1e, 0x0, 0x9b, 0x0, 0x9a, 0x0, 0x1e, 0x0, 0x9b, 0x0, 0xce, 0x0, 0x1e, 0x0, 0x9b, - 0x0, 0xcf, 0x0, 0x1e, 0x0, 0x9b, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0x9b, 0x0, 0xd7, 0x0, 0x1e, - 0x0, 0x9c, 0x0, 0x24, 0x0, 0x1e, 0x0, 0x9c, 0x0, 0x26, 0xff, 0xec, 0x0, 0x9c, 0x0, 0x2a, - 0xff, 0xec, 0x0, 0x9c, 0x0, 0x32, 0xff, 0xec, 0x0, 0x9c, 0x0, 0x34, 0xff, 0xec, 0x0, 0x9c, - 0x0, 0x37, 0x0, 0x1e, 0x0, 0x9c, 0x0, 0x44, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0x46, 0xff, 0xf1, - 0x0, 0x9c, 0x0, 0x47, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0x48, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0x4a, - 0xff, 0xf1, 0x0, 0x9c, 0x0, 0x52, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0x54, 0xff, 0xf1, 0x0, 0x9c, - 0x0, 0x55, 0x0, 0x14, 0x0, 0x9c, 0x0, 0x5b, 0x0, 0x32, 0x0, 0x9c, 0x0, 0x6c, 0xff, 0xec, - 0x0, 0x9c, 0x0, 0x70, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0x78, 0xff, 0xec, 0x0, 0x9c, 0x0, 0x99, - 0x0, 0x1e, 0x0, 0x9c, 0x0, 0x9a, 0x0, 0x1e, 0x0, 0x9c, 0x0, 0x9b, 0xff, 0xec, 0x0, 0x9c, - 0x0, 0x9e, 0xff, 0xec, 0x0, 0x9c, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xa1, 0xff, 0xf1, - 0x0, 0x9c, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xa4, - 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0x9c, - 0x0, 0xa7, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xa9, 0xff, 0xf1, - 0x0, 0x9c, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xb1, - 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0x9c, - 0x0, 0xb4, 0xff, 0xf1, 0x0, 0x9c, 0x0, 0xce, 0x0, 0x1e, 0x0, 0x9c, 0x0, 0xcf, 0x0, 0x1e, - 0x0, 0x9c, 0x0, 0xd0, 0xff, 0xec, 0x0, 0x9c, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0x9c, 0x0, 0xd7, - 0x0, 0x1e, 0x0, 0x9c, 0x0, 0xde, 0xff, 0xec, 0x0, 0x9c, 0x0, 0xdf, 0xff, 0xec, 0x0, 0x9c, - 0x0, 0xe1, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x25, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x26, 0x0, 0x1e, - 0x0, 0x9e, 0x0, 0x27, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x28, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x29, - 0xff, 0xec, 0x0, 0x9e, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0x9e, 0x0, 0x2b, 0xff, 0xec, 0x0, 0x9e, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x9e, 0x0, 0x2e, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x2f, 0xff, 0xec, - 0x0, 0x9e, 0x0, 0x30, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x31, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x32, - 0x0, 0x1e, 0x0, 0x9e, 0x0, 0x33, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x34, 0x0, 0x1e, 0x0, 0x9e, - 0x0, 0x35, 0xff, 0xec, 0x0, 0x9e, 0x0, 0x37, 0xff, 0xc4, 0x0, 0x9e, 0x0, 0x39, 0xff, 0xe2, - 0x0, 0x9e, 0x0, 0x3c, 0xff, 0xce, 0x0, 0x9e, 0x0, 0x45, 0x0, 0x19, 0x0, 0x9e, 0x0, 0x59, - 0x0, 0x14, 0x0, 0x9e, 0x0, 0x5a, 0x0, 0x14, 0x0, 0x9e, 0x0, 0x5c, 0x0, 0x14, 0x0, 0x9e, - 0x0, 0x78, 0x0, 0x1e, 0x0, 0x9e, 0x0, 0x9b, 0x0, 0x1e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x1e, - 0x0, 0x9e, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0x9e, 0x0, 0xd3, 0x0, 0x14, 0x0, 0x9e, 0x0, 0xd4, - 0xff, 0xce, 0x0, 0x9e, 0x0, 0xde, 0x0, 0x1e, 0x0, 0x9e, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0x9e, - 0x0, 0xe1, 0x0, 0x1e, 0x0, 0x9f, 0x0, 0x24, 0xff, 0xce, 0x0, 0x9f, 0x0, 0x44, 0xff, 0xec, - 0x0, 0x9f, 0x0, 0x46, 0xff, 0xec, 0x0, 0x9f, 0x0, 0x47, 0xff, 0xec, 0x0, 0x9f, 0x0, 0x48, - 0xff, 0xec, 0x0, 0x9f, 0x0, 0x4a, 0xff, 0xec, 0x0, 0x9f, 0x0, 0x50, 0xff, 0xec, 0x0, 0x9f, - 0x0, 0x51, 0xff, 0xec, 0x0, 0x9f, 0x0, 0x52, 0xff, 0xec, 0x0, 0x9f, 0x0, 0x54, 0xff, 0xec, - 0x0, 0x9f, 0x0, 0x70, 0xff, 0xec, 0x0, 0x9f, 0x0, 0x99, 0xff, 0xce, 0x0, 0x9f, 0x0, 0x9a, - 0xff, 0xce, 0x0, 0x9f, 0x0, 0xa0, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xa1, 0xff, 0xec, 0x0, 0x9f, - 0x0, 0xa2, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xa3, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xa4, 0xff, 0xec, - 0x0, 0x9f, 0x0, 0xa5, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xa6, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xa7, - 0xff, 0xec, 0x0, 0x9f, 0x0, 0xa8, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xa9, 0xff, 0xec, 0x0, 0x9f, - 0x0, 0xaa, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xb0, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xb1, 0xff, 0xec, - 0x0, 0x9f, 0x0, 0xb2, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xb3, 0xff, 0xec, 0x0, 0x9f, 0x0, 0xb4, - 0xff, 0xec, 0x0, 0x9f, 0x0, 0xce, 0xff, 0xce, 0x0, 0x9f, 0x0, 0xcf, 0xff, 0xce, 0x0, 0x9f, - 0x0, 0xd5, 0xff, 0xce, 0x0, 0x9f, 0x0, 0xd7, 0xff, 0xce, 0x0, 0xa0, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0xa0, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0x47, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0xa0, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0x52, 0xff, 0xf1, 0x0, 0xa0, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0x70, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0xa0, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xa0, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0xa0, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xa0, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xa0, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0xa1, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0x47, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0xa1, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0x52, 0xff, 0xf1, 0x0, 0xa1, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0x70, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0xa1, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xa1, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0xa1, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xa1, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xa1, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0xa2, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0x47, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0xa2, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0x52, 0xff, 0xf1, 0x0, 0xa2, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0x70, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0xa2, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xa2, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0xa2, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xa2, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xa2, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0xa3, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0x47, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0xa3, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0x52, 0xff, 0xf1, 0x0, 0xa3, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0x70, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0xa3, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xa3, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0xa3, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xa3, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xa3, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0xa4, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0x47, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0xa4, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0x52, 0xff, 0xf1, 0x0, 0xa4, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0x70, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0xa4, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xa4, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0xa4, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xa4, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xa4, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0x44, 0xff, 0xf1, - 0x0, 0xa5, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0x47, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0x48, - 0xff, 0xf1, 0x0, 0xa5, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0x52, 0xff, 0xf1, 0x0, 0xa5, - 0x0, 0x54, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0x70, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xa0, 0xff, 0xf1, - 0x0, 0xa5, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xa3, - 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xa5, - 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xa8, 0xff, 0xf1, - 0x0, 0xa5, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xb0, - 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xa5, - 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xa5, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xa6, 0x0, 0x4b, 0xff, 0xf1, - 0x0, 0xa6, 0x0, 0x55, 0x0, 0x14, 0x0, 0xa6, 0x0, 0x59, 0x0, 0x14, 0x0, 0xa6, 0x0, 0x5b, - 0x0, 0x32, 0x0, 0xab, 0x0, 0x55, 0x0, 0x14, 0x0, 0xab, 0x0, 0x56, 0x0, 0x14, 0x0, 0xab, - 0x0, 0x5b, 0x0, 0x32, 0x0, 0xab, 0x0, 0x7d, 0x0, 0x1e, 0x0, 0xac, 0x0, 0x55, 0x0, 0x14, - 0x0, 0xac, 0x0, 0x56, 0x0, 0x14, 0x0, 0xac, 0x0, 0x5b, 0x0, 0x32, 0x0, 0xad, 0x0, 0x55, - 0x0, 0x14, 0x0, 0xad, 0x0, 0x56, 0x0, 0x14, 0x0, 0xad, 0x0, 0x5b, 0x0, 0x28, 0x0, 0xae, - 0x0, 0x55, 0x0, 0x14, 0x0, 0xae, 0x0, 0x56, 0x0, 0x14, 0x0, 0xae, 0x0, 0x5b, 0x0, 0x32, - 0x0, 0xb0, 0x0, 0x44, 0x0, 0xf, 0x0, 0xb0, 0x0, 0x46, 0x0, 0xf, 0x0, 0xb0, 0x0, 0x47, - 0x0, 0xf, 0x0, 0xb0, 0x0, 0x48, 0x0, 0xf, 0x0, 0xb0, 0x0, 0x4a, 0x0, 0xf, 0x0, 0xb0, - 0x0, 0x52, 0x0, 0xf, 0x0, 0xb0, 0x0, 0x54, 0x0, 0xf, 0x0, 0xb0, 0x0, 0x70, 0x0, 0xf, - 0x0, 0xb0, 0x0, 0xa0, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xa1, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xa2, - 0x0, 0xf, 0x0, 0xb0, 0x0, 0xa3, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xa4, 0x0, 0xf, 0x0, 0xb0, - 0x0, 0xa5, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xa6, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xa7, 0x0, 0xf, - 0x0, 0xb0, 0x0, 0xa8, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xa9, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xaa, - 0x0, 0xf, 0x0, 0xb0, 0x0, 0xb0, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xf, 0x0, 0xb0, - 0x0, 0xb2, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xb3, 0x0, 0xf, 0x0, 0xb0, 0x0, 0xb4, 0x0, 0xf, - 0x0, 0xb1, 0x0, 0x44, 0x0, 0xf, 0x0, 0xb1, 0x0, 0x46, 0x0, 0xf, 0x0, 0xb1, 0x0, 0x47, - 0x0, 0xf, 0x0, 0xb1, 0x0, 0x48, 0x0, 0xf, 0x0, 0xb1, 0x0, 0x4a, 0x0, 0xf, 0x0, 0xb1, - 0x0, 0x52, 0x0, 0xf, 0x0, 0xb1, 0x0, 0x54, 0x0, 0xf, 0x0, 0xb1, 0x0, 0x70, 0x0, 0xf, - 0x0, 0xb1, 0x0, 0xa0, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xa1, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xa2, - 0x0, 0xf, 0x0, 0xb1, 0x0, 0xa3, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xa4, 0x0, 0xf, 0x0, 0xb1, - 0x0, 0xa5, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xa6, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xa7, 0x0, 0xf, - 0x0, 0xb1, 0x0, 0xa8, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xa9, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xaa, - 0x0, 0xf, 0x0, 0xb1, 0x0, 0xb0, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xb1, 0x0, 0xf, 0x0, 0xb1, - 0x0, 0xb2, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xb3, 0x0, 0xf, 0x0, 0xb1, 0x0, 0xb4, 0x0, 0xf, - 0x0, 0xb2, 0x0, 0x44, 0x0, 0xf, 0x0, 0xb2, 0x0, 0x46, 0x0, 0xf, 0x0, 0xb2, 0x0, 0x47, - 0x0, 0xf, 0x0, 0xb2, 0x0, 0x48, 0x0, 0xf, 0x0, 0xb2, 0x0, 0x4a, 0x0, 0xf, 0x0, 0xb2, - 0x0, 0x52, 0x0, 0xf, 0x0, 0xb2, 0x0, 0x54, 0x0, 0xf, 0x0, 0xb2, 0x0, 0x70, 0x0, 0xf, - 0x0, 0xb2, 0x0, 0xa0, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xa1, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xa2, - 0x0, 0xf, 0x0, 0xb2, 0x0, 0xa3, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xa4, 0x0, 0xf, 0x0, 0xb2, - 0x0, 0xa5, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xa6, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xa7, 0x0, 0xf, - 0x0, 0xb2, 0x0, 0xa8, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xa9, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xaa, - 0x0, 0xf, 0x0, 0xb2, 0x0, 0xb0, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xb1, 0x0, 0xf, 0x0, 0xb2, - 0x0, 0xb2, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xf, 0x0, 0xb2, 0x0, 0xb4, 0x0, 0xf, - 0x0, 0xb3, 0x0, 0x44, 0x0, 0xf, 0x0, 0xb3, 0x0, 0x46, 0x0, 0xf, 0x0, 0xb3, 0x0, 0x47, - 0x0, 0xf, 0x0, 0xb3, 0x0, 0x48, 0x0, 0xf, 0x0, 0xb3, 0x0, 0x4a, 0x0, 0xf, 0x0, 0xb3, - 0x0, 0x52, 0x0, 0xf, 0x0, 0xb3, 0x0, 0x54, 0x0, 0xf, 0x0, 0xb3, 0x0, 0x70, 0x0, 0xf, - 0x0, 0xb3, 0x0, 0xa0, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xa1, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xa2, - 0x0, 0xf, 0x0, 0xb3, 0x0, 0xa3, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xa4, 0x0, 0xf, 0x0, 0xb3, - 0x0, 0xa5, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xa6, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xa7, 0x0, 0xf, - 0x0, 0xb3, 0x0, 0xa8, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xa9, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xaa, - 0x0, 0xf, 0x0, 0xb3, 0x0, 0xb0, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xb1, 0x0, 0xf, 0x0, 0xb3, - 0x0, 0xb2, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xb3, 0x0, 0xf, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xf, - 0x0, 0xb4, 0x0, 0x44, 0x0, 0xf, 0x0, 0xb4, 0x0, 0x46, 0x0, 0xf, 0x0, 0xb4, 0x0, 0x47, - 0x0, 0xf, 0x0, 0xb4, 0x0, 0x48, 0x0, 0xf, 0x0, 0xb4, 0x0, 0x4a, 0x0, 0xf, 0x0, 0xb4, - 0x0, 0x52, 0x0, 0xf, 0x0, 0xb4, 0x0, 0x54, 0x0, 0xf, 0x0, 0xb4, 0x0, 0x70, 0x0, 0xf, - 0x0, 0xb4, 0x0, 0xa0, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xa1, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xa2, - 0x0, 0xf, 0x0, 0xb4, 0x0, 0xa3, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xa4, 0x0, 0xf, 0x0, 0xb4, - 0x0, 0xa5, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xa6, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xa7, 0x0, 0xf, - 0x0, 0xb4, 0x0, 0xa8, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xa9, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xaa, - 0x0, 0xf, 0x0, 0xb4, 0x0, 0xb0, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xb1, 0x0, 0xf, 0x0, 0xb4, - 0x0, 0xb2, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xb3, 0x0, 0xf, 0x0, 0xb4, 0x0, 0xb4, 0x0, 0xf, - 0x0, 0xb5, 0x0, 0x44, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0x47, - 0xff, 0xf1, 0x0, 0xb5, 0x0, 0x48, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xb5, - 0x0, 0x52, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0x54, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0x70, 0xff, 0xf1, - 0x0, 0xb5, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xa2, - 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xb5, - 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xa7, 0xff, 0xf1, - 0x0, 0xb5, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xaa, - 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xb5, - 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xb5, 0x0, 0xb4, 0xff, 0xf1, - 0x0, 0xb6, 0x0, 0x44, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0x47, - 0xff, 0xf1, 0x0, 0xb6, 0x0, 0x48, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xb6, - 0x0, 0x52, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0x54, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0x70, 0xff, 0xf1, - 0x0, 0xb6, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xa2, - 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xb6, - 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xa7, 0xff, 0xf1, - 0x0, 0xb6, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xaa, - 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xb6, - 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xb6, 0x0, 0xb4, 0xff, 0xf1, - 0x0, 0xb7, 0x0, 0x44, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0x47, - 0xff, 0xf1, 0x0, 0xb7, 0x0, 0x48, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xb7, - 0x0, 0x52, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0x54, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0x70, 0xff, 0xf1, - 0x0, 0xb7, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xa2, - 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xb7, - 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xa7, 0xff, 0xf1, - 0x0, 0xb7, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xaa, - 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xb7, - 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xb7, 0x0, 0xb4, 0xff, 0xf1, - 0x0, 0xb8, 0x0, 0x44, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0x47, - 0xff, 0xf1, 0x0, 0xb8, 0x0, 0x48, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xb8, - 0x0, 0x52, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0x54, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0x70, 0xff, 0xf1, - 0x0, 0xb8, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xa2, - 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xb8, - 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xa7, 0xff, 0xf1, - 0x0, 0xb8, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xaa, - 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xb8, - 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xb8, 0x0, 0xb4, 0xff, 0xf1, - 0x0, 0xce, 0x0, 0x24, 0x0, 0x28, 0x0, 0xce, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xce, 0x0, 0x2d, - 0xff, 0xdd, 0x0, 0xce, 0x0, 0x37, 0xff, 0xc4, 0x0, 0xce, 0x0, 0x39, 0xff, 0xdd, 0x0, 0xce, - 0x0, 0x3b, 0x0, 0x1e, 0x0, 0xce, 0x0, 0x3c, 0xff, 0xb5, 0x0, 0xce, 0x0, 0x3d, 0x0, 0x14, - 0x0, 0xce, 0x0, 0x59, 0x0, 0x14, 0x0, 0xce, 0x0, 0x5a, 0x0, 0x14, 0x0, 0xce, 0x0, 0x5b, - 0x0, 0x28, 0x0, 0xce, 0x0, 0x5c, 0x0, 0xf, 0x0, 0xce, 0x0, 0x99, 0x0, 0x28, 0x0, 0xce, - 0x0, 0x9a, 0x0, 0x28, 0x0, 0xce, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0xce, 0x0, 0xce, 0x0, 0x28, - 0x0, 0xce, 0x0, 0xcf, 0x0, 0x28, 0x0, 0xce, 0x0, 0xd3, 0x0, 0xf, 0x0, 0xce, 0x0, 0xd4, - 0xff, 0xb5, 0x0, 0xce, 0x0, 0xd5, 0x0, 0x28, 0x0, 0xce, 0x0, 0xd7, 0x0, 0x28, 0x0, 0xcf, - 0x0, 0x24, 0x0, 0x28, 0x0, 0xcf, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xcf, 0x0, 0x2d, 0xff, 0xdd, - 0x0, 0xcf, 0x0, 0x37, 0xff, 0xc4, 0x0, 0xcf, 0x0, 0x39, 0xff, 0xdd, 0x0, 0xcf, 0x0, 0x3b, - 0x0, 0x1e, 0x0, 0xcf, 0x0, 0x3c, 0xff, 0xb5, 0x0, 0xcf, 0x0, 0x3d, 0x0, 0x14, 0x0, 0xcf, - 0x0, 0x59, 0x0, 0x14, 0x0, 0xcf, 0x0, 0x5a, 0x0, 0x14, 0x0, 0xcf, 0x0, 0x5b, 0x0, 0x28, - 0x0, 0xcf, 0x0, 0x5c, 0x0, 0xf, 0x0, 0xcf, 0x0, 0x99, 0x0, 0x28, 0x0, 0xcf, 0x0, 0x9a, - 0x0, 0x28, 0x0, 0xcf, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0xcf, 0x0, 0xce, 0x0, 0x28, 0x0, 0xcf, - 0x0, 0xcf, 0x0, 0x28, 0x0, 0xcf, 0x0, 0xd3, 0x0, 0xf, 0x0, 0xcf, 0x0, 0xd4, 0xff, 0xb5, - 0x0, 0xcf, 0x0, 0xd5, 0x0, 0x28, 0x0, 0xcf, 0x0, 0xd7, 0x0, 0x28, 0x0, 0xd0, 0x0, 0x25, - 0xff, 0xec, 0x0, 0xd0, 0x0, 0x26, 0x0, 0x1e, 0x0, 0xd0, 0x0, 0x27, 0xff, 0xec, 0x0, 0xd0, - 0x0, 0x28, 0xff, 0xec, 0x0, 0xd0, 0x0, 0x29, 0xff, 0xec, 0x0, 0xd0, 0x0, 0x2a, 0x0, 0x1e, - 0x0, 0xd0, 0x0, 0x2b, 0xff, 0xec, 0x0, 0xd0, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xd0, 0x0, 0x2e, - 0xff, 0xec, 0x0, 0xd0, 0x0, 0x2f, 0xff, 0xec, 0x0, 0xd0, 0x0, 0x30, 0xff, 0xec, 0x0, 0xd0, - 0x0, 0x31, 0xff, 0xec, 0x0, 0xd0, 0x0, 0x32, 0x0, 0x1e, 0x0, 0xd0, 0x0, 0x33, 0xff, 0xec, - 0x0, 0xd0, 0x0, 0x34, 0x0, 0x1e, 0x0, 0xd0, 0x0, 0x35, 0xff, 0xec, 0x0, 0xd0, 0x0, 0x37, - 0xff, 0xc4, 0x0, 0xd0, 0x0, 0x39, 0xff, 0xe2, 0x0, 0xd0, 0x0, 0x3c, 0xff, 0xce, 0x0, 0xd0, - 0x0, 0x45, 0x0, 0x19, 0x0, 0xd0, 0x0, 0x59, 0x0, 0x14, 0x0, 0xd0, 0x0, 0x5a, 0x0, 0x14, - 0x0, 0xd0, 0x0, 0x5c, 0x0, 0x14, 0x0, 0xd0, 0x0, 0x78, 0x0, 0x1e, 0x0, 0xd0, 0x0, 0x9b, - 0x0, 0x1e, 0x0, 0xd0, 0x0, 0x9e, 0x0, 0x1e, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0xd0, - 0x0, 0xd3, 0x0, 0x14, 0x0, 0xd0, 0x0, 0xd4, 0xff, 0xce, 0x0, 0xd0, 0x0, 0xde, 0x0, 0x1e, - 0x0, 0xd0, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0xd0, 0x0, 0xe1, 0x0, 0x1e, 0x0, 0xd3, 0x0, 0x59, - 0x0, 0x28, 0x0, 0xd3, 0x0, 0x5a, 0x0, 0x1e, 0x0, 0xd3, 0x0, 0x5c, 0x0, 0x1e, 0x0, 0xd3, - 0x0, 0x5d, 0xff, 0xec, 0x0, 0xd3, 0x0, 0xd3, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x22, 0x0, 0x78, - 0x0, 0xd4, 0x0, 0x24, 0xff, 0xe7, 0x0, 0xd4, 0x0, 0x25, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x26, - 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x27, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x28, 0x0, 0x1e, 0x0, 0xd4, - 0x0, 0x29, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x2b, 0x0, 0x1e, - 0x0, 0xd4, 0x0, 0x2e, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x2f, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x30, - 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x31, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x32, 0x0, 0x1e, 0x0, 0xd4, - 0x0, 0x33, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x34, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x35, 0x0, 0x1e, - 0x0, 0xd4, 0x0, 0x37, 0x0, 0x78, 0x0, 0xd4, 0x0, 0x38, 0x0, 0x32, 0x0, 0xd4, 0x0, 0x39, - 0x0, 0x64, 0x0, 0xd4, 0x0, 0x3a, 0x0, 0x5a, 0x0, 0xd4, 0x0, 0x3c, 0x0, 0x64, 0x0, 0xd4, - 0x0, 0x3d, 0x0, 0x5a, 0x0, 0xd4, 0x0, 0x44, 0xff, 0xec, 0x0, 0xd4, 0x0, 0x46, 0xff, 0xec, - 0x0, 0xd4, 0x0, 0x47, 0xff, 0xec, 0x0, 0xd4, 0x0, 0x48, 0xff, 0xec, 0x0, 0xd4, 0x0, 0x4a, - 0xff, 0xec, 0x0, 0xd4, 0x0, 0x52, 0xff, 0xec, 0x0, 0xd4, 0x0, 0x54, 0xff, 0xec, 0x0, 0xd4, - 0x0, 0x70, 0xff, 0xec, 0x0, 0xd4, 0x0, 0x78, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x7d, 0x0, 0x78, - 0x0, 0xd4, 0x0, 0x7f, 0x0, 0x78, 0x0, 0xd4, 0x0, 0x99, 0xff, 0xe7, 0x0, 0xd4, 0x0, 0x9a, - 0xff, 0xe7, 0x0, 0xd4, 0x0, 0x9b, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x9c, 0x0, 0x1e, 0x0, 0xd4, - 0x0, 0x9e, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0x9f, 0x0, 0x32, 0x0, 0xd4, 0x0, 0xa0, 0xff, 0xec, - 0x0, 0xd4, 0x0, 0xa1, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xa2, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xa3, - 0xff, 0xec, 0x0, 0xd4, 0x0, 0xa4, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xa5, 0xff, 0xec, 0x0, 0xd4, - 0x0, 0xa6, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xa7, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xa8, 0xff, 0xec, - 0x0, 0xd4, 0x0, 0xa9, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xaa, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xb0, - 0xff, 0xec, 0x0, 0xd4, 0x0, 0xb1, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xb2, 0xff, 0xec, 0x0, 0xd4, - 0x0, 0xb3, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xb4, 0xff, 0xec, 0x0, 0xd4, 0x0, 0xce, 0xff, 0xe7, - 0x0, 0xd4, 0x0, 0xcf, 0xff, 0xe7, 0x0, 0xd4, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0xd4, - 0x0, 0x64, 0x0, 0xd4, 0x0, 0xd5, 0xff, 0xe7, 0x0, 0xd4, 0x0, 0xd6, 0x0, 0x1e, 0x0, 0xd4, - 0x0, 0xd7, 0xff, 0xe7, 0x0, 0xd4, 0x0, 0xd8, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0xd9, 0x0, 0x1e, - 0x0, 0xd4, 0x0, 0xda, 0x0, 0x28, 0x0, 0xd4, 0x0, 0xdb, 0x0, 0x28, 0x0, 0xd4, 0x0, 0xdc, - 0x0, 0x32, 0x0, 0xd4, 0x0, 0xdd, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0xde, 0x0, 0x1e, 0x0, 0xd4, - 0x0, 0xdf, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0xe1, 0x0, 0x1e, 0x0, 0xd4, 0x0, 0xe2, 0x0, 0x32, - 0x0, 0xd4, 0x0, 0xe3, 0x0, 0x32, 0x0, 0xd4, 0x0, 0xe4, 0x0, 0x32, 0x0, 0xd5, 0x0, 0x24, - 0x0, 0x28, 0x0, 0xd5, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xd5, 0x0, 0x2d, 0xff, 0xdd, 0x0, 0xd5, - 0x0, 0x37, 0xff, 0xc4, 0x0, 0xd5, 0x0, 0x39, 0xff, 0xdd, 0x0, 0xd5, 0x0, 0x3b, 0x0, 0x1e, - 0x0, 0xd5, 0x0, 0x3c, 0xff, 0xb5, 0x0, 0xd5, 0x0, 0x3d, 0x0, 0x14, 0x0, 0xd5, 0x0, 0x59, - 0x0, 0x14, 0x0, 0xd5, 0x0, 0x5a, 0x0, 0x14, 0x0, 0xd5, 0x0, 0x5b, 0x0, 0x28, 0x0, 0xd5, - 0x0, 0x5c, 0x0, 0xf, 0x0, 0xd5, 0x0, 0x99, 0x0, 0x28, 0x0, 0xd5, 0x0, 0x9a, 0x0, 0x28, - 0x0, 0xd5, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0xd5, 0x0, 0xce, 0x0, 0x28, 0x0, 0xd5, 0x0, 0xcf, - 0x0, 0x28, 0x0, 0xd5, 0x0, 0xd3, 0x0, 0xf, 0x0, 0xd5, 0x0, 0xd4, 0xff, 0xb5, 0x0, 0xd5, - 0x0, 0xd5, 0x0, 0x28, 0x0, 0xd5, 0x0, 0xd7, 0x0, 0x28, 0x0, 0xd6, 0x0, 0x24, 0x0, 0x1e, - 0x0, 0xd6, 0x0, 0x26, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x2a, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x32, - 0xff, 0xec, 0x0, 0xd6, 0x0, 0x34, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x37, 0x0, 0x1e, 0x0, 0xd6, - 0x0, 0x44, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0x47, 0xff, 0xf1, - 0x0, 0xd6, 0x0, 0x48, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0x52, - 0xff, 0xf1, 0x0, 0xd6, 0x0, 0x54, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0x55, 0x0, 0x14, 0x0, 0xd6, - 0x0, 0x5b, 0x0, 0x32, 0x0, 0xd6, 0x0, 0x6c, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x70, 0xff, 0xf1, - 0x0, 0xd6, 0x0, 0x78, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x99, 0x0, 0x1e, 0x0, 0xd6, 0x0, 0x9a, - 0x0, 0x1e, 0x0, 0xd6, 0x0, 0x9b, 0xff, 0xec, 0x0, 0xd6, 0x0, 0x9e, 0xff, 0xec, 0x0, 0xd6, - 0x0, 0xa0, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xa2, 0xff, 0xf1, - 0x0, 0xd6, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xa5, - 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xd6, - 0x0, 0xa8, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xaa, 0xff, 0xf1, - 0x0, 0xd6, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xb2, - 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xd6, 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xd6, - 0x0, 0xce, 0x0, 0x1e, 0x0, 0xd6, 0x0, 0xcf, 0x0, 0x1e, 0x0, 0xd6, 0x0, 0xd0, 0xff, 0xec, - 0x0, 0xd6, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0xd6, 0x0, 0xd7, 0x0, 0x1e, 0x0, 0xd6, 0x0, 0xde, - 0xff, 0xec, 0x0, 0xd6, 0x0, 0xdf, 0xff, 0xec, 0x0, 0xd6, 0x0, 0xe1, 0xff, 0xec, 0x0, 0xd7, - 0x0, 0x24, 0x0, 0x28, 0x0, 0xd7, 0x0, 0x26, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0x2d, 0xff, 0xdd, - 0x0, 0xd7, 0x0, 0x37, 0xff, 0xc4, 0x0, 0xd7, 0x0, 0x39, 0xff, 0xdd, 0x0, 0xd7, 0x0, 0x3b, - 0x0, 0x1e, 0x0, 0xd7, 0x0, 0x3c, 0xff, 0xb5, 0x0, 0xd7, 0x0, 0x3d, 0x0, 0x14, 0x0, 0xd7, - 0x0, 0x59, 0x0, 0x14, 0x0, 0xd7, 0x0, 0x5a, 0x0, 0x14, 0x0, 0xd7, 0x0, 0x5b, 0x0, 0x28, - 0x0, 0xd7, 0x0, 0x5c, 0x0, 0xf, 0x0, 0xd7, 0x0, 0x99, 0x0, 0x28, 0x0, 0xd7, 0x0, 0x9a, - 0x0, 0x28, 0x0, 0xd7, 0x0, 0x9b, 0xff, 0xe2, 0x0, 0xd7, 0x0, 0xce, 0x0, 0x28, 0x0, 0xd7, - 0x0, 0xcf, 0x0, 0x28, 0x0, 0xd7, 0x0, 0xd3, 0x0, 0xf, 0x0, 0xd7, 0x0, 0xd4, 0xff, 0xb5, - 0x0, 0xd7, 0x0, 0xd5, 0x0, 0x28, 0x0, 0xd7, 0x0, 0xd7, 0x0, 0x28, 0x0, 0xd8, 0x0, 0x24, - 0x0, 0x1e, 0x0, 0xd8, 0x0, 0x26, 0xff, 0xec, 0x0, 0xd8, 0x0, 0x2a, 0xff, 0xec, 0x0, 0xd8, - 0x0, 0x32, 0xff, 0xec, 0x0, 0xd8, 0x0, 0x34, 0xff, 0xec, 0x0, 0xd8, 0x0, 0x37, 0x0, 0x1e, - 0x0, 0xd8, 0x0, 0x44, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0x46, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0x47, - 0xff, 0xf1, 0x0, 0xd8, 0x0, 0x48, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0x4a, 0xff, 0xf1, 0x0, 0xd8, - 0x0, 0x52, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0x54, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0x55, 0x0, 0x14, - 0x0, 0xd8, 0x0, 0x5b, 0x0, 0x32, 0x0, 0xd8, 0x0, 0x6c, 0xff, 0xec, 0x0, 0xd8, 0x0, 0x70, - 0xff, 0xf1, 0x0, 0xd8, 0x0, 0x78, 0xff, 0xec, 0x0, 0xd8, 0x0, 0x99, 0x0, 0x1e, 0x0, 0xd8, - 0x0, 0x9a, 0x0, 0x1e, 0x0, 0xd8, 0x0, 0x9b, 0xff, 0xec, 0x0, 0xd8, 0x0, 0x9e, 0xff, 0xec, - 0x0, 0xd8, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xa1, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xa2, - 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xa4, 0xff, 0xf1, 0x0, 0xd8, - 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xa7, 0xff, 0xf1, - 0x0, 0xd8, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xa9, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xaa, - 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xb1, 0xff, 0xf1, 0x0, 0xd8, - 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xd8, 0x0, 0xb4, 0xff, 0xf1, - 0x0, 0xd8, 0x0, 0xce, 0x0, 0x1e, 0x0, 0xd8, 0x0, 0xcf, 0x0, 0x1e, 0x0, 0xd8, 0x0, 0xd0, - 0xff, 0xec, 0x0, 0xd8, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0xd8, 0x0, 0xd7, 0x0, 0x1e, 0x0, 0xd8, - 0x0, 0xde, 0xff, 0xec, 0x0, 0xd8, 0x0, 0xdf, 0xff, 0xec, 0x0, 0xd8, 0x0, 0xe1, 0xff, 0xec, - 0x0, 0xd9, 0x0, 0x24, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x26, 0xff, 0xec, 0x0, 0xd9, 0x0, 0x2a, - 0xff, 0xec, 0x0, 0xd9, 0x0, 0x32, 0xff, 0xec, 0x0, 0xd9, 0x0, 0x34, 0xff, 0xec, 0x0, 0xd9, - 0x0, 0x37, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x44, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0x46, 0xff, 0xf1, - 0x0, 0xd9, 0x0, 0x47, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0x48, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0x4a, - 0xff, 0xf1, 0x0, 0xd9, 0x0, 0x52, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0x54, 0xff, 0xf1, 0x0, 0xd9, - 0x0, 0x55, 0x0, 0x14, 0x0, 0xd9, 0x0, 0x5b, 0x0, 0x32, 0x0, 0xd9, 0x0, 0x6c, 0xff, 0xec, - 0x0, 0xd9, 0x0, 0x70, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0x78, 0xff, 0xec, 0x0, 0xd9, 0x0, 0x99, - 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x9a, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0x9b, 0xff, 0xec, 0x0, 0xd9, - 0x0, 0x9e, 0xff, 0xec, 0x0, 0xd9, 0x0, 0xa0, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xa1, 0xff, 0xf1, - 0x0, 0xd9, 0x0, 0xa2, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xa3, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xa4, - 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xa5, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xa6, 0xff, 0xf1, 0x0, 0xd9, - 0x0, 0xa7, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xa8, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xa9, 0xff, 0xf1, - 0x0, 0xd9, 0x0, 0xaa, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xb0, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xb1, - 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xb2, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xb3, 0xff, 0xf1, 0x0, 0xd9, - 0x0, 0xb4, 0xff, 0xf1, 0x0, 0xd9, 0x0, 0xce, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0xcf, 0x0, 0x1e, - 0x0, 0xd9, 0x0, 0xd0, 0xff, 0xec, 0x0, 0xd9, 0x0, 0xd5, 0x0, 0x1e, 0x0, 0xd9, 0x0, 0xd7, - 0x0, 0x1e, 0x0, 0xd9, 0x0, 0xde, 0xff, 0xec, 0x0, 0xd9, 0x0, 0xdf, 0xff, 0xec, 0x0, 0xd9, - 0x0, 0xe1, 0xff, 0xec, 0x0, 0xda, 0x0, 0x22, 0x0, 0x28, 0x0, 0xda, 0x0, 0x2d, 0xff, 0xe2, - 0x0, 0xdb, 0x0, 0x22, 0x0, 0x28, 0x0, 0xdb, 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdc, 0x0, 0x22, - 0x0, 0x28, 0x0, 0xdc, 0x0, 0x2d, 0xff, 0xd8, 0x0, 0xdd, 0x0, 0x22, 0x0, 0x1e, 0x0, 0xdd, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xde, 0x0, 0x25, 0xff, 0xec, 0x0, 0xde, 0x0, 0x26, 0x0, 0x1e, - 0x0, 0xde, 0x0, 0x27, 0xff, 0xec, 0x0, 0xde, 0x0, 0x28, 0xff, 0xec, 0x0, 0xde, 0x0, 0x29, - 0xff, 0xec, 0x0, 0xde, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0xde, 0x0, 0x2b, 0xff, 0xec, 0x0, 0xde, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xde, 0x0, 0x2e, 0xff, 0xec, 0x0, 0xde, 0x0, 0x2f, 0xff, 0xec, - 0x0, 0xde, 0x0, 0x30, 0xff, 0xec, 0x0, 0xde, 0x0, 0x31, 0xff, 0xec, 0x0, 0xde, 0x0, 0x32, - 0x0, 0x1e, 0x0, 0xde, 0x0, 0x33, 0xff, 0xec, 0x0, 0xde, 0x0, 0x34, 0x0, 0x1e, 0x0, 0xde, - 0x0, 0x35, 0xff, 0xec, 0x0, 0xde, 0x0, 0x37, 0xff, 0xc4, 0x0, 0xde, 0x0, 0x39, 0xff, 0xe2, - 0x0, 0xde, 0x0, 0x3c, 0xff, 0xce, 0x0, 0xde, 0x0, 0x45, 0x0, 0x19, 0x0, 0xde, 0x0, 0x59, - 0x0, 0x14, 0x0, 0xde, 0x0, 0x5a, 0x0, 0x14, 0x0, 0xde, 0x0, 0x5c, 0x0, 0x14, 0x0, 0xde, - 0x0, 0x78, 0x0, 0x1e, 0x0, 0xde, 0x0, 0x9b, 0x0, 0x1e, 0x0, 0xde, 0x0, 0x9e, 0x0, 0x1e, - 0x0, 0xde, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0xde, 0x0, 0xd3, 0x0, 0x14, 0x0, 0xde, 0x0, 0xd4, - 0xff, 0xce, 0x0, 0xde, 0x0, 0xde, 0x0, 0x1e, 0x0, 0xde, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0xde, - 0x0, 0xe1, 0x0, 0x1e, 0x0, 0xdf, 0x0, 0x25, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x26, 0x0, 0x1e, - 0x0, 0xdf, 0x0, 0x27, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x28, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x29, - 0xff, 0xec, 0x0, 0xdf, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0xdf, 0x0, 0x2b, 0xff, 0xec, 0x0, 0xdf, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xdf, 0x0, 0x2e, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x2f, 0xff, 0xec, - 0x0, 0xdf, 0x0, 0x30, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x31, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x32, - 0x0, 0x1e, 0x0, 0xdf, 0x0, 0x33, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x34, 0x0, 0x1e, 0x0, 0xdf, - 0x0, 0x35, 0xff, 0xec, 0x0, 0xdf, 0x0, 0x37, 0xff, 0xc4, 0x0, 0xdf, 0x0, 0x39, 0xff, 0xe2, - 0x0, 0xdf, 0x0, 0x3c, 0xff, 0xce, 0x0, 0xdf, 0x0, 0x45, 0x0, 0x19, 0x0, 0xdf, 0x0, 0x59, - 0x0, 0x14, 0x0, 0xdf, 0x0, 0x5a, 0x0, 0x14, 0x0, 0xdf, 0x0, 0x5c, 0x0, 0x14, 0x0, 0xdf, - 0x0, 0x78, 0x0, 0x1e, 0x0, 0xdf, 0x0, 0x9b, 0x0, 0x1e, 0x0, 0xdf, 0x0, 0x9e, 0x0, 0x1e, - 0x0, 0xdf, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0xdf, 0x0, 0xd3, 0x0, 0x14, 0x0, 0xdf, 0x0, 0xd4, - 0xff, 0xce, 0x0, 0xdf, 0x0, 0xde, 0x0, 0x1e, 0x0, 0xdf, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0xdf, - 0x0, 0xe1, 0x0, 0x1e, 0x0, 0xe1, 0x0, 0x25, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x26, 0x0, 0x1e, - 0x0, 0xe1, 0x0, 0x27, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x28, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x29, - 0xff, 0xec, 0x0, 0xe1, 0x0, 0x2a, 0x0, 0x1e, 0x0, 0xe1, 0x0, 0x2b, 0xff, 0xec, 0x0, 0xe1, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0xe1, 0x0, 0x2e, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x2f, 0xff, 0xec, - 0x0, 0xe1, 0x0, 0x30, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x31, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x32, - 0x0, 0x1e, 0x0, 0xe1, 0x0, 0x33, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x34, 0x0, 0x1e, 0x0, 0xe1, - 0x0, 0x35, 0xff, 0xec, 0x0, 0xe1, 0x0, 0x37, 0xff, 0xc4, 0x0, 0xe1, 0x0, 0x39, 0xff, 0xe2, - 0x0, 0xe1, 0x0, 0x3c, 0xff, 0xce, 0x0, 0xe1, 0x0, 0x45, 0x0, 0x19, 0x0, 0xe1, 0x0, 0x59, - 0x0, 0x14, 0x0, 0xe1, 0x0, 0x5a, 0x0, 0x14, 0x0, 0xe1, 0x0, 0x5c, 0x0, 0x14, 0x0, 0xe1, - 0x0, 0x78, 0x0, 0x1e, 0x0, 0xe1, 0x0, 0x9b, 0x0, 0x1e, 0x0, 0xe1, 0x0, 0x9e, 0x0, 0x1e, - 0x0, 0xe1, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0xe1, 0x0, 0xd3, 0x0, 0x14, 0x0, 0xe1, 0x0, 0xd4, - 0xff, 0xce, 0x0, 0xe1, 0x0, 0xde, 0x0, 0x1e, 0x0, 0xe1, 0x0, 0xdf, 0x0, 0x1e, 0x0, 0xe1, - 0x0, 0xe1, 0x0, 0x1e, 0x0, 0xe2, 0x0, 0x24, 0xff, 0xce, 0x0, 0xe2, 0x0, 0x44, 0xff, 0xec, - 0x0, 0xe2, 0x0, 0x46, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x47, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x48, - 0xff, 0xec, 0x0, 0xe2, 0x0, 0x4a, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x50, 0xff, 0xec, 0x0, 0xe2, - 0x0, 0x51, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x52, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x54, 0xff, 0xec, - 0x0, 0xe2, 0x0, 0x70, 0xff, 0xec, 0x0, 0xe2, 0x0, 0x99, 0xff, 0xce, 0x0, 0xe2, 0x0, 0x9a, - 0xff, 0xce, 0x0, 0xe2, 0x0, 0xa0, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xa1, 0xff, 0xec, 0x0, 0xe2, - 0x0, 0xa2, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xa3, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xa4, 0xff, 0xec, - 0x0, 0xe2, 0x0, 0xa5, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xa6, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xa7, - 0xff, 0xec, 0x0, 0xe2, 0x0, 0xa8, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xa9, 0xff, 0xec, 0x0, 0xe2, - 0x0, 0xaa, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xb0, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xb1, 0xff, 0xec, - 0x0, 0xe2, 0x0, 0xb2, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xb3, 0xff, 0xec, 0x0, 0xe2, 0x0, 0xb4, - 0xff, 0xec, 0x0, 0xe2, 0x0, 0xce, 0xff, 0xce, 0x0, 0xe2, 0x0, 0xcf, 0xff, 0xce, 0x0, 0xe2, - 0x0, 0xd5, 0xff, 0xce, 0x0, 0xe2, 0x0, 0xd7, 0xff, 0xce, 0x0, 0xe3, 0x0, 0x24, 0xff, 0xce, - 0x0, 0xe3, 0x0, 0x44, 0xff, 0xec, 0x0, 0xe3, 0x0, 0x46, 0xff, 0xec, 0x0, 0xe3, 0x0, 0x47, - 0xff, 0xec, 0x0, 0xe3, 0x0, 0x48, 0xff, 0xec, 0x0, 0xe3, 0x0, 0x4a, 0xff, 0xec, 0x0, 0xe3, - 0x0, 0x50, 0xff, 0xec, 0x0, 0xe3, 0x0, 0x51, 0xff, 0xec, 0x0, 0xe3, 0x0, 0x52, 0xff, 0xec, - 0x0, 0xe3, 0x0, 0x54, 0xff, 0xec, 0x0, 0xe3, 0x0, 0x70, 0xff, 0xec, 0x0, 0xe3, 0x0, 0x99, - 0xff, 0xce, 0x0, 0xe3, 0x0, 0x9a, 0xff, 0xce, 0x0, 0xe3, 0x0, 0xa0, 0xff, 0xec, 0x0, 0xe3, - 0x0, 0xa1, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xa2, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xa3, 0xff, 0xec, - 0x0, 0xe3, 0x0, 0xa4, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xa5, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xa6, - 0xff, 0xec, 0x0, 0xe3, 0x0, 0xa7, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xa8, 0xff, 0xec, 0x0, 0xe3, - 0x0, 0xa9, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xaa, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xb0, 0xff, 0xec, - 0x0, 0xe3, 0x0, 0xb1, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xb2, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xb3, - 0xff, 0xec, 0x0, 0xe3, 0x0, 0xb4, 0xff, 0xec, 0x0, 0xe3, 0x0, 0xce, 0xff, 0xce, 0x0, 0xe3, - 0x0, 0xcf, 0xff, 0xce, 0x0, 0xe3, 0x0, 0xd5, 0xff, 0xce, 0x0, 0xe3, 0x0, 0xd7, 0xff, 0xce, - 0x0, 0xe4, 0x0, 0x24, 0xff, 0xce, 0x0, 0xe4, 0x0, 0x44, 0xff, 0xec, 0x0, 0xe4, 0x0, 0x46, - 0xff, 0xec, 0x0, 0xe4, 0x0, 0x47, 0xff, 0xec, 0x0, 0xe4, 0x0, 0x48, 0xff, 0xec, 0x0, 0xe4, - 0x0, 0x4a, 0xff, 0xec, 0x0, 0xe4, 0x0, 0x50, 0xff, 0xec, 0x0, 0xe4, 0x0, 0x51, 0xff, 0xec, - 0x0, 0xe4, 0x0, 0x52, 0xff, 0xec, 0x0, 0xe4, 0x0, 0x54, 0xff, 0xec, 0x0, 0xe4, 0x0, 0x70, - 0xff, 0xec, 0x0, 0xe4, 0x0, 0x99, 0xff, 0xce, 0x0, 0xe4, 0x0, 0x9a, 0xff, 0xce, 0x0, 0xe4, - 0x0, 0xa0, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xa1, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xa2, 0xff, 0xec, - 0x0, 0xe4, 0x0, 0xa3, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xa4, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xa5, - 0xff, 0xec, 0x0, 0xe4, 0x0, 0xa6, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xa7, 0xff, 0xec, 0x0, 0xe4, - 0x0, 0xa8, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xa9, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xaa, 0xff, 0xec, - 0x0, 0xe4, 0x0, 0xb0, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xb1, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xb2, - 0xff, 0xec, 0x0, 0xe4, 0x0, 0xb3, 0xff, 0xec, 0x0, 0xe4, 0x0, 0xb4, 0xff, 0xec, 0x0, 0xe4, - 0x0, 0xce, 0xff, 0xce, 0x0, 0xe4, 0x0, 0xcf, 0xff, 0xce, 0x0, 0xe4, 0x0, 0xd5, 0xff, 0xce, - 0x0, 0xe4, 0x0, 0xd7, 0xff, 0xce, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xe8, - 0x9, 0xc, 0x5, 0x0, 0x2, 0x2, 0x4, 0x3, 0x6, 0x6, 0x8, 0x8, 0x2, 0x3, 0x4, 0x5, - 0x5, 0x3, 0x3, 0x2, 0x5, 0x6, 0x4, 0x5, 0x6, 0x6, 0x5, 0x5, 0x5, 0x5, 0x5, 0x3, - 0x3, 0x6, 0x6, 0x6, 0x5, 0x9, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x7, 0x7, 0x3, 0x3, - 0x6, 0x5, 0x8, 0x7, 0x7, 0x6, 0x7, 0x6, 0x5, 0x4, 0x7, 0x5, 0x8, 0x5, 0x5, 0x5, - 0x4, 0x4, 0x4, 0x4, 0x5, 0x3, 0x5, 0x5, 0x4, 0x5, 0x5, 0x3, 0x5, 0x5, 0x2, 0x2, - 0x5, 0x2, 0x8, 0x5, 0x5, 0x5, 0x5, 0x4, 0x4, 0x3, 0x5, 0x4, 0x7, 0x4, 0x4, 0x4, - 0x3, 0x3, 0x3, 0x3, 0x5, 0x4, 0x6, 0x5, 0x4, 0x5, 0x5, 0x2, 0x3, 0x8, 0x7, 0x5, - 0x4, 0x4, 0x7, 0x5, 0x4, 0x2, 0x5, 0x6, 0x6, 0x8, 0x9, 0x8, 0x5, 0x6, 0x4, 0x5, - 0x3, 0x3, 0x5, 0x7, 0x4, 0x4, 0x5, 0x5, 0x6, 0x2, 0x2, 0x4, 0xc, 0x3, 0x4, 0x4, - 0x3, 0x4, 0x2, 0x3, 0x3, 0x5, 0x3, 0x4, 0x6, 0x4, 0x5, 0x6, 0x6, 0x6, 0x5, 0x7, - 0x7, 0x7, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x5, 0x5, 0x5, 0x5, 0x2, 0x2, 0x2, - 0x2, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x9, 0x9, 0x8, 0x5, - 0x3, 0x5, 0x7, 0x7, 0x6, 0x3, 0x4, 0x7, 0x5, 0x4, 0x3, 0x5, 0x9, 0xc, 0x7, 0x3, - 0x6, 0x6, 0x7, 0x4, 0x3, 0x4, 0x5, 0x6, 0x5, 0x6, 0x5, 0x5, 0x3, 0x3, 0x3, 0x3, - 0x7, 0x7, 0x9, 0x7, 0x7, 0x7, 0x7, 0x0, 0xa, 0xe, 0x5, 0x0, 0x3, 0x3, 0x4, 0x3, - 0x7, 0x7, 0x9, 0x9, 0x3, 0x3, 0x4, 0x6, 0x5, 0x3, 0x3, 0x3, 0x5, 0x6, 0x5, 0x6, - 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, 0x7, 0x6, 0x7, 0x5, 0xa, 0x6, 0x7, - 0x6, 0x7, 0x6, 0x6, 0x8, 0x7, 0x4, 0x3, 0x7, 0x5, 0x9, 0x8, 0x8, 0x6, 0x8, 0x7, - 0x6, 0x4, 0x7, 0x6, 0x9, 0x6, 0x5, 0x6, 0x4, 0x5, 0x5, 0x4, 0x5, 0x3, 0x6, 0x5, - 0x4, 0x6, 0x5, 0x3, 0x6, 0x6, 0x3, 0x3, 0x5, 0x3, 0x9, 0x6, 0x5, 0x5, 0x5, 0x4, - 0x4, 0x3, 0x6, 0x4, 0x7, 0x5, 0x4, 0x5, 0x3, 0x3, 0x4, 0x4, 0x6, 0x5, 0x7, 0x5, - 0x4, 0x6, 0x5, 0x3, 0x4, 0x9, 0x8, 0x6, 0x4, 0x4, 0x8, 0x6, 0x5, 0x3, 0x6, 0x7, - 0x7, 0x8, 0xa, 0x8, 0x5, 0x7, 0x4, 0x5, 0x3, 0x3, 0x5, 0x8, 0x5, 0x4, 0x6, 0x6, - 0x7, 0x3, 0x2, 0x5, 0xe, 0x3, 0x4, 0x4, 0x4, 0x4, 0x2, 0x3, 0x3, 0x5, 0x3, 0x4, - 0x6, 0x4, 0x6, 0x7, 0x6, 0x6, 0x6, 0x8, 0x8, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, - 0x4, 0x5, 0x5, 0x5, 0x5, 0x3, 0x3, 0x3, 0x3, 0x6, 0x5, 0x5, 0x5, 0x5, 0x5, 0x6, - 0x6, 0x6, 0x6, 0x5, 0xa, 0xa, 0x9, 0x5, 0x3, 0x5, 0x8, 0x8, 0x7, 0x3, 0x5, 0x8, - 0x6, 0x5, 0x3, 0x5, 0xa, 0xd, 0x8, 0x3, 0x6, 0x7, 0x8, 0x5, 0x3, 0x4, 0x5, 0x6, - 0x6, 0x6, 0x6, 0x6, 0x4, 0x4, 0x4, 0x4, 0x8, 0x8, 0xa, 0x8, 0x7, 0x7, 0x7, 0x0, - 0xb, 0xf, 0x6, 0x0, 0x3, 0x3, 0x5, 0x4, 0x8, 0x7, 0x9, 0xa, 0x3, 0x4, 0x4, 0x6, - 0x6, 0x3, 0x4, 0x3, 0x6, 0x7, 0x5, 0x7, 0x7, 0x7, 0x6, 0x7, 0x6, 0x7, 0x6, 0x3, - 0x3, 0x7, 0x7, 0x7, 0x6, 0xb, 0x7, 0x7, 0x7, 0x8, 0x7, 0x6, 0x8, 0x8, 0x4, 0x4, - 0x7, 0x6, 0x9, 0x8, 0x8, 0x7, 0x8, 0x7, 0x6, 0x5, 0x8, 0x6, 0xa, 0x6, 0x6, 0x6, - 0x5, 0x5, 0x5, 0x4, 0x6, 0x3, 0x6, 0x6, 0x5, 0x6, 0x6, 0x3, 0x6, 0x6, 0x3, 0x3, - 0x6, 0x3, 0xa, 0x7, 0x6, 0x6, 0x6, 0x4, 0x5, 0x4, 0x6, 0x5, 0x8, 0x5, 0x5, 0x5, - 0x4, 0x4, 0x4, 0x4, 0x6, 0x5, 0x7, 0x6, 0x4, 0x6, 0x6, 0x3, 0x4, 0xa, 0x8, 0x7, - 0x5, 0x5, 0x8, 0x6, 0x5, 0x3, 0x6, 0x8, 0x7, 0x9, 0xb, 0x9, 0x6, 0x7, 0x5, 0x6, - 0x3, 0x4, 0x6, 0x9, 0x5, 0x5, 0x6, 0x6, 0x7, 0x3, 0x3, 0x5, 0xf, 0x3, 0x4, 0x5, - 0x4, 0x5, 0x3, 0x3, 0x3, 0x6, 0x3, 0x4, 0x7, 0x5, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, - 0x8, 0x8, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, 0x3, - 0x3, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0xb, 0xb, 0xa, 0x6, - 0x3, 0x6, 0x8, 0x8, 0x7, 0x3, 0x5, 0x8, 0x7, 0x5, 0x3, 0x6, 0xb, 0xf, 0x9, 0x3, - 0x7, 0x7, 0x8, 0x5, 0x3, 0x5, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x4, 0x4, 0x4, 0x4, - 0x8, 0x8, 0xa, 0x8, 0x8, 0x8, 0x8, 0x0, 0xc, 0x10, 0x6, 0x0, 0x3, 0x3, 0x5, 0x4, - 0x8, 0x8, 0xa, 0xb, 0x3, 0x4, 0x5, 0x7, 0x6, 0x4, 0x4, 0x3, 0x6, 0x8, 0x6, 0x7, - 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x4, 0x4, 0x8, 0x7, 0x8, 0x6, 0xc, 0x8, 0x8, - 0x8, 0x9, 0x7, 0x7, 0x9, 0x9, 0x4, 0x4, 0x8, 0x7, 0xa, 0x9, 0x9, 0x8, 0x9, 0x8, - 0x7, 0x5, 0x9, 0x7, 0xb, 0x7, 0x6, 0x7, 0x5, 0x6, 0x6, 0x5, 0x6, 0x4, 0x7, 0x6, - 0x5, 0x7, 0x6, 0x4, 0x7, 0x7, 0x3, 0x3, 0x6, 0x3, 0xb, 0x7, 0x6, 0x6, 0x7, 0x5, - 0x5, 0x4, 0x7, 0x5, 0x9, 0x6, 0x5, 0x6, 0x4, 0x4, 0x5, 0x4, 0x7, 0x5, 0x8, 0x7, - 0x5, 0x7, 0x6, 0x3, 0x5, 0xb, 0x9, 0x7, 0x5, 0x5, 0x9, 0x7, 0x6, 0x3, 0x7, 0x8, - 0x8, 0xa, 0xc, 0xa, 0x6, 0x8, 0x5, 0x6, 0x3, 0x4, 0x6, 0x9, 0x5, 0x5, 0x7, 0x7, - 0x8, 0x3, 0x3, 0x6, 0x10, 0x3, 0x5, 0x5, 0x4, 0x5, 0x3, 0x4, 0x3, 0x6, 0x3, 0x5, - 0x7, 0x5, 0x7, 0x8, 0x8, 0x8, 0x7, 0x9, 0x9, 0x9, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, - 0x5, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, 0x3, 0x3, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x7, - 0x7, 0x7, 0x7, 0x6, 0xc, 0xc, 0xb, 0x6, 0x4, 0x6, 0x9, 0x9, 0x8, 0x4, 0x6, 0x9, - 0x7, 0x6, 0x4, 0x6, 0xc, 0x10, 0xa, 0x4, 0x8, 0x8, 0x9, 0x6, 0x4, 0x5, 0x6, 0x8, - 0x7, 0x8, 0x7, 0x7, 0x4, 0x4, 0x4, 0x4, 0x9, 0x9, 0xb, 0x9, 0x9, 0x9, 0x9, 0x0, - 0xd, 0x12, 0x7, 0x0, 0x3, 0x3, 0x6, 0x4, 0x9, 0x9, 0xb, 0xc, 0x4, 0x4, 0x5, 0x7, - 0x7, 0x4, 0x4, 0x3, 0x7, 0x8, 0x6, 0x8, 0x8, 0x8, 0x8, 0x8, 0x7, 0x8, 0x8, 0x4, - 0x4, 0x9, 0x8, 0x9, 0x7, 0xd, 0x8, 0x9, 0x8, 0x9, 0x8, 0x8, 0xa, 0xa, 0x5, 0x4, - 0x9, 0x7, 0xb, 0xa, 0xa, 0x8, 0xa, 0x9, 0x8, 0x6, 0xa, 0x7, 0xc, 0x8, 0x7, 0x7, - 0x5, 0x6, 0x6, 0x5, 0x7, 0x4, 0x7, 0x7, 0x6, 0x7, 0x7, 0x4, 0x7, 0x8, 0x3, 0x3, - 0x7, 0x3, 0xc, 0x8, 0x7, 0x7, 0x7, 0x5, 0x6, 0x4, 0x7, 0x6, 0x9, 0x6, 0x6, 0x6, - 0x4, 0x4, 0x5, 0x5, 0x7, 0x6, 0x9, 0x7, 0x5, 0x7, 0x7, 0x3, 0x5, 0xc, 0xa, 0x8, - 0x6, 0x6, 0xa, 0x7, 0x6, 0x4, 0x7, 0x9, 0x9, 0xb, 0xd, 0xb, 0x7, 0x9, 0x6, 0x7, - 0x4, 0x5, 0x7, 0xa, 0x6, 0x5, 0x8, 0x7, 0x9, 0x3, 0x3, 0x6, 0x12, 0x4, 0x5, 0x5, - 0x5, 0x6, 0x3, 0x4, 0x4, 0x7, 0x4, 0x5, 0x8, 0x6, 0x8, 0x9, 0x8, 0x8, 0x8, 0xa, - 0xa, 0x9, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7, 0x7, 0x3, 0x3, 0x3, - 0x3, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0xd, 0xd, 0xc, 0x7, - 0x4, 0x7, 0xa, 0xa, 0x9, 0x4, 0x6, 0xa, 0x8, 0x6, 0x4, 0x7, 0xc, 0x11, 0xa, 0x4, - 0x8, 0x9, 0xa, 0x6, 0x4, 0x6, 0x7, 0x8, 0x8, 0x8, 0x8, 0x8, 0x5, 0x5, 0x5, 0x5, - 0xa, 0xa, 0xc, 0xa, 0x9, 0x9, 0x9, 0x0, 0xe, 0x13, 0x7, 0x0, 0x4, 0x4, 0x6, 0x5, - 0xa, 0x9, 0xc, 0xd, 0x4, 0x5, 0x6, 0x8, 0x7, 0x4, 0x5, 0x4, 0x7, 0x9, 0x7, 0x8, - 0x9, 0x9, 0x8, 0x8, 0x8, 0x8, 0x8, 0x4, 0x4, 0x9, 0x9, 0x9, 0x7, 0xe, 0x9, 0x9, - 0x9, 0xa, 0x9, 0x8, 0xb, 0xa, 0x5, 0x5, 0x9, 0x8, 0xc, 0xb, 0xb, 0x9, 0xb, 0x9, - 0x8, 0x6, 0xa, 0x8, 0xc, 0x8, 0x7, 0x8, 0x6, 0x7, 0x7, 0x6, 0x7, 0x4, 0x8, 0x7, - 0x6, 0x8, 0x7, 0x4, 0x8, 0x8, 0x4, 0x4, 0x7, 0x4, 0xc, 0x8, 0x7, 0x7, 0x8, 0x5, - 0x6, 0x5, 0x8, 0x6, 0xa, 0x6, 0x6, 0x6, 0x5, 0x5, 0x5, 0x5, 0x8, 0x6, 0x9, 0x8, - 0x5, 0x8, 0x7, 0x4, 0x5, 0xd, 0xb, 0x8, 0x6, 0x6, 0xb, 0x8, 0x7, 0x4, 0x8, 0xa, - 0x9, 0xc, 0xe, 0xc, 0x7, 0x9, 0x6, 0x7, 0x4, 0x5, 0x7, 0xb, 0x6, 0x6, 0x8, 0x8, - 0x9, 0x4, 0x3, 0x7, 0x13, 0x4, 0x6, 0x6, 0x5, 0x6, 0x3, 0x4, 0x4, 0x7, 0x4, 0x6, - 0x9, 0x6, 0x8, 0x9, 0x9, 0x9, 0x9, 0xb, 0xb, 0xa, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, - 0x6, 0x7, 0x7, 0x7, 0x7, 0x4, 0x4, 0x4, 0x4, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, - 0x8, 0x8, 0x8, 0x7, 0xe, 0xe, 0xd, 0x7, 0x4, 0x8, 0xb, 0xb, 0x9, 0x4, 0x6, 0xb, - 0x8, 0x7, 0x4, 0x7, 0xd, 0x13, 0xb, 0x4, 0x9, 0x9, 0xb, 0x7, 0x4, 0x6, 0x7, 0x9, - 0x9, 0x9, 0x9, 0x9, 0x5, 0x5, 0x5, 0x5, 0xb, 0xb, 0xd, 0xb, 0xa, 0xa, 0xa, 0x0, - 0xf, 0x14, 0x8, 0x0, 0x4, 0x4, 0x7, 0x5, 0xb, 0xa, 0xd, 0xd, 0x4, 0x5, 0x6, 0x8, - 0x8, 0x5, 0x5, 0x4, 0x8, 0xa, 0x7, 0x9, 0x9, 0x9, 0x9, 0x9, 0x8, 0x9, 0x9, 0x5, - 0x5, 0xa, 0x9, 0xa, 0x8, 0xf, 0xa, 0xa, 0x9, 0xb, 0x9, 0x9, 0xb, 0xb, 0x6, 0x5, - 0xa, 0x8, 0xd, 0xb, 0xc, 0xa, 0xc, 0xa, 0x9, 0x6, 0xb, 0x9, 0xd, 0x9, 0x8, 0x8, - 0x6, 0x7, 0x7, 0x6, 0x8, 0x5, 0x9, 0x8, 0x7, 0x8, 0x8, 0x5, 0x9, 0x9, 0x4, 0x4, - 0x8, 0x4, 0xd, 0x9, 0x8, 0x8, 0x8, 0x6, 0x6, 0x5, 0x9, 0x7, 0xb, 0x7, 0x7, 0x7, - 0x5, 0x5, 0x6, 0x5, 0x8, 0x7, 0xa, 0x8, 0x6, 0x8, 0x8, 0x4, 0x6, 0xd, 0xc, 0x9, - 0x7, 0x6, 0xb, 0x8, 0x7, 0x4, 0x8, 0xa, 0xa, 0xd, 0xf, 0xd, 0x8, 0xa, 0x7, 0x8, - 0x4, 0x5, 0x8, 0xc, 0x7, 0x6, 0x9, 0x9, 0xa, 0x4, 0x4, 0x7, 0x14, 0x4, 0x6, 0x6, - 0x5, 0x7, 0x4, 0x5, 0x4, 0x8, 0x4, 0x6, 0x9, 0x7, 0x9, 0xa, 0xa, 0x9, 0x9, 0xc, - 0xb, 0xb, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x7, 0x8, 0x8, 0x8, 0x8, 0x4, 0x4, 0x4, - 0x4, 0x9, 0x8, 0x8, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x9, 0x7, 0xf, 0xf, 0xd, 0x8, - 0x5, 0x8, 0xc, 0xc, 0xa, 0x5, 0x7, 0xb, 0x9, 0x7, 0x5, 0x8, 0xe, 0x14, 0xc, 0x5, - 0xa, 0xa, 0xb, 0x7, 0x5, 0x7, 0x8, 0xa, 0x9, 0xa, 0x9, 0x9, 0x6, 0x6, 0x6, 0x5, - 0xb, 0xb, 0xe, 0xb, 0xb, 0xb, 0xb, 0x0, 0x10, 0x16, 0x8, 0x0, 0x4, 0x4, 0x7, 0x5, - 0xb, 0xb, 0xe, 0xe, 0x4, 0x5, 0x6, 0x9, 0x8, 0x5, 0x5, 0x4, 0x9, 0xa, 0x8, 0xa, - 0xa, 0xa, 0x9, 0xa, 0x9, 0xa, 0x9, 0x5, 0x5, 0xb, 0xa, 0xb, 0x8, 0x10, 0xa, 0xb, - 0xa, 0xb, 0xa, 0x9, 0xc, 0xc, 0x6, 0x5, 0xb, 0x9, 0xe, 0xc, 0xc, 0xa, 0xc, 0xa, - 0x9, 0x7, 0xc, 0x9, 0xe, 0x9, 0x8, 0x9, 0x7, 0x8, 0x8, 0x6, 0x8, 0x5, 0x9, 0x8, - 0x7, 0x9, 0x8, 0x5, 0x9, 0x9, 0x4, 0x4, 0x8, 0x4, 0xe, 0xa, 0x8, 0x9, 0x9, 0x6, - 0x7, 0x5, 0x9, 0x7, 0xc, 0x7, 0x7, 0x7, 0x5, 0x6, 0x6, 0x6, 0x9, 0x7, 0xb, 0x9, - 0x6, 0x9, 0x8, 0x4, 0x6, 0xe, 0xc, 0xa, 0x7, 0x7, 0xc, 0x9, 0x8, 0x4, 0x9, 0xb, - 0xa, 0xe, 0x10, 0xd, 0x8, 0xa, 0x7, 0x8, 0x5, 0x6, 0x9, 0xd, 0x7, 0x7, 0x9, 0x9, - 0xa, 0x4, 0x4, 0x8, 0x16, 0x5, 0x6, 0x7, 0x6, 0x7, 0x4, 0x5, 0x5, 0x8, 0x5, 0x6, - 0xa, 0x7, 0xa, 0xb, 0xa, 0xa, 0xa, 0xc, 0xc, 0xc, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, - 0x7, 0x8, 0x8, 0x8, 0x8, 0x4, 0x4, 0x4, 0x4, 0xa, 0x8, 0x8, 0x8, 0x8, 0x8, 0x9, - 0x9, 0x9, 0x9, 0x8, 0x10, 0x10, 0xe, 0x9, 0x5, 0x9, 0xc, 0xc, 0xb, 0x5, 0x7, 0xc, - 0x9, 0x8, 0x5, 0x8, 0xf, 0x15, 0xd, 0x5, 0xa, 0xb, 0xc, 0x8, 0x5, 0x7, 0x8, 0xa, - 0xa, 0xa, 0xa, 0xa, 0x6, 0x6, 0x6, 0x6, 0xc, 0xc, 0xf, 0xc, 0xc, 0xc, 0xc, 0x0, - 0x11, 0x17, 0x9, 0x0, 0x5, 0x5, 0x8, 0x6, 0xc, 0xc, 0xe, 0xf, 0x5, 0x6, 0x7, 0x9, - 0x9, 0x5, 0x6, 0x4, 0x9, 0xb, 0x8, 0xa, 0xb, 0xb, 0xa, 0xa, 0xa, 0xa, 0xa, 0x5, - 0x5, 0xb, 0xa, 0xb, 0x9, 0x11, 0xb, 0xc, 0xb, 0xc, 0xa, 0xa, 0xd, 0xd, 0x6, 0x6, - 0xb, 0x9, 0xf, 0xd, 0xd, 0xb, 0xd, 0xb, 0xa, 0x7, 0xc, 0xa, 0xf, 0xa, 0x9, 0xa, - 0x7, 0x8, 0x8, 0x7, 0x9, 0x5, 0xa, 0x9, 0x7, 0xa, 0x9, 0x5, 0xa, 0xa, 0x4, 0x4, - 0x9, 0x4, 0xf, 0xa, 0x9, 0x9, 0x9, 0x7, 0x7, 0x6, 0xa, 0x8, 0xc, 0x8, 0x8, 0x8, - 0x6, 0x6, 0x6, 0x6, 0xa, 0x8, 0xb, 0x9, 0x7, 0x9, 0x9, 0x5, 0x6, 0xf, 0xd, 0xa, - 0x7, 0x7, 0xd, 0xa, 0x8, 0x5, 0x9, 0xc, 0xb, 0xe, 0x11, 0xe, 0x9, 0xb, 0x7, 0x9, - 0x5, 0x6, 0x9, 0xd, 0x8, 0x7, 0xa, 0xa, 0xb, 0x4, 0x4, 0x8, 0x17, 0x5, 0x7, 0x7, - 0x6, 0x8, 0x4, 0x5, 0x5, 0x9, 0x5, 0x7, 0xa, 0x7, 0xa, 0xb, 0xb, 0xb, 0xa, 0xd, - 0xd, 0xc, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x7, 0x9, 0x9, 0x9, 0x9, 0x5, 0x4, 0x5, - 0x5, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0x8, 0x11, 0x11, 0xf, 0x9, - 0x5, 0x9, 0xd, 0xd, 0xc, 0x5, 0x8, 0xd, 0xa, 0x8, 0x5, 0x9, 0x10, 0x17, 0xe, 0x5, - 0xb, 0xb, 0xd, 0x8, 0x5, 0x8, 0x9, 0xb, 0xa, 0xb, 0xa, 0xa, 0x6, 0x6, 0x6, 0x6, - 0xd, 0xd, 0x10, 0xd, 0xc, 0xc, 0xc, 0x0, 0x12, 0x19, 0x9, 0x0, 0x5, 0x5, 0x8, 0x6, - 0xd, 0xc, 0xf, 0x10, 0x5, 0x6, 0x7, 0xa, 0x9, 0x6, 0x6, 0x5, 0xa, 0xc, 0x9, 0xb, - 0xb, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0x6, 0x6, 0xc, 0xb, 0xc, 0x9, 0x12, 0xc, 0xc, - 0xb, 0xd, 0xb, 0xb, 0xe, 0xd, 0x7, 0x6, 0xc, 0xa, 0x10, 0xe, 0xe, 0xc, 0xe, 0xc, - 0xb, 0x8, 0xd, 0xa, 0x10, 0xb, 0x9, 0xa, 0x7, 0x9, 0x9, 0x7, 0x9, 0x6, 0xa, 0x9, - 0x8, 0xa, 0x9, 0x6, 0xa, 0xb, 0x5, 0x5, 0x9, 0x5, 0x10, 0xb, 0x9, 0xa, 0xa, 0x7, - 0x8, 0x6, 0xa, 0x8, 0xd, 0x8, 0x8, 0x8, 0x6, 0x6, 0x7, 0x7, 0xa, 0x8, 0xc, 0xa, - 0x7, 0xa, 0x9, 0x5, 0x7, 0x10, 0xe, 0xb, 0x8, 0x8, 0xe, 0xa, 0x9, 0x5, 0xa, 0xd, - 0xc, 0xf, 0x12, 0xf, 0x9, 0xc, 0x8, 0x9, 0x5, 0x6, 0xa, 0xe, 0x8, 0x7, 0xa, 0xa, - 0xc, 0x5, 0x4, 0x8, 0x19, 0x5, 0x7, 0x8, 0x7, 0x8, 0x4, 0x6, 0x5, 0x9, 0x5, 0x7, - 0xb, 0x8, 0xb, 0xc, 0xc, 0xb, 0xb, 0xe, 0xe, 0xd, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, - 0x8, 0x9, 0x9, 0x9, 0x9, 0x5, 0x5, 0x5, 0x5, 0xb, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, - 0xa, 0xa, 0xa, 0x9, 0x12, 0x12, 0x10, 0xa, 0x6, 0xa, 0xe, 0xe, 0xc, 0x6, 0x8, 0xe, - 0xb, 0x9, 0x6, 0x9, 0x11, 0x18, 0xe, 0x6, 0xc, 0xc, 0xe, 0x9, 0x6, 0x8, 0x9, 0xc, - 0xb, 0xc, 0xb, 0xb, 0x7, 0x7, 0x7, 0x7, 0xe, 0xe, 0x11, 0xe, 0xd, 0xd, 0xd, 0x0, - 0x13, 0x1a, 0xa, 0x0, 0x5, 0x5, 0x8, 0x6, 0xd, 0xd, 0x10, 0x11, 0x5, 0x6, 0x8, 0xb, - 0xa, 0x6, 0x6, 0x5, 0xa, 0xc, 0x9, 0xb, 0xc, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 0x6, - 0x6, 0xd, 0xc, 0xd, 0xa, 0x13, 0xc, 0xd, 0xc, 0xe, 0xc, 0xb, 0xe, 0xe, 0x7, 0x6, - 0xd, 0xa, 0x10, 0xf, 0xf, 0xc, 0xf, 0xc, 0xb, 0x8, 0xe, 0xb, 0x11, 0xb, 0xa, 0xb, - 0x8, 0x9, 0x9, 0x7, 0xa, 0x6, 0xb, 0xa, 0x8, 0xb, 0xa, 0x6, 0xb, 0xb, 0x5, 0x5, - 0xa, 0x5, 0x11, 0xb, 0xa, 0xa, 0xa, 0x7, 0x8, 0x6, 0xb, 0x8, 0xe, 0x9, 0x8, 0x9, - 0x6, 0x7, 0x7, 0x7, 0xb, 0x9, 0xd, 0xa, 0x7, 0xb, 0xa, 0x5, 0x7, 0x11, 0xf, 0xb, - 0x8, 0x8, 0xe, 0xb, 0x9, 0x5, 0xb, 0xd, 0xc, 0x10, 0x13, 0x10, 0xa, 0xc, 0x8, 0xa, - 0x5, 0x7, 0xa, 0xf, 0x9, 0x8, 0xb, 0xb, 0xc, 0x5, 0x5, 0x9, 0x1a, 0x5, 0x7, 0x8, - 0x7, 0x9, 0x5, 0x6, 0x5, 0xa, 0x5, 0x7, 0xc, 0x8, 0xb, 0xd, 0xc, 0xc, 0xc, 0xf, - 0xe, 0xe, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0x8, 0xa, 0xa, 0xa, 0xa, 0x5, 0x5, 0x5, - 0x5, 0xc, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0xb, 0xb, 0x9, 0x13, 0x13, 0x11, 0xa, - 0x6, 0xa, 0xf, 0xf, 0xd, 0x6, 0x9, 0xf, 0xb, 0x9, 0x6, 0xa, 0x12, 0x19, 0xf, 0x6, - 0xc, 0xd, 0xe, 0x9, 0x6, 0x8, 0xa, 0xc, 0xc, 0xc, 0xc, 0xc, 0x7, 0x7, 0x7, 0x7, - 0xe, 0xe, 0x12, 0xe, 0xe, 0xe, 0xe, 0x0, 0x14, 0x1b, 0xa, 0x0, 0x5, 0x5, 0x9, 0x7, - 0xe, 0xe, 0x11, 0x12, 0x5, 0x7, 0x8, 0xb, 0xa, 0x6, 0x7, 0x5, 0xb, 0xd, 0xa, 0xc, - 0xd, 0xc, 0xc, 0xc, 0xb, 0xc, 0xc, 0x6, 0x6, 0xd, 0xc, 0xd, 0xa, 0x14, 0xd, 0xe, - 0xd, 0xe, 0xc, 0xc, 0xf, 0xf, 0x7, 0x7, 0xd, 0xb, 0x11, 0xf, 0xf, 0xd, 0xf, 0xd, - 0xc, 0x9, 0xf, 0xb, 0x12, 0xc, 0xa, 0xb, 0x8, 0x9, 0x9, 0x8, 0xb, 0x6, 0xb, 0xa, - 0x9, 0xb, 0xa, 0x6, 0xb, 0xc, 0x5, 0x5, 0xa, 0x5, 0x12, 0xc, 0xa, 0xb, 0xb, 0x8, - 0x9, 0x7, 0xb, 0x9, 0xe, 0x9, 0x9, 0x9, 0x7, 0x7, 0x8, 0x7, 0xb, 0x9, 0xd, 0xb, - 0x8, 0xb, 0xa, 0x5, 0x8, 0x12, 0xf, 0xc, 0x9, 0x9, 0xf, 0xb, 0xa, 0x5, 0xb, 0xe, - 0xd, 0x11, 0x14, 0x11, 0xb, 0xd, 0x9, 0xa, 0x6, 0x7, 0xb, 0x10, 0x9, 0x8, 0xc, 0xb, - 0xd, 0x5, 0x5, 0x9, 0x1b, 0x6, 0x8, 0x8, 0x7, 0x9, 0x5, 0x6, 0x6, 0xa, 0x6, 0x8, - 0xc, 0x9, 0xc, 0xd, 0xd, 0xd, 0xc, 0xf, 0xf, 0xf, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, - 0x9, 0xa, 0xa, 0xa, 0xa, 0x5, 0x5, 0x5, 0x5, 0xc, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, - 0xb, 0xb, 0xb, 0xa, 0x14, 0x14, 0x12, 0xb, 0x6, 0xb, 0xf, 0xf, 0xe, 0x6, 0x9, 0xf, - 0xc, 0xa, 0x6, 0xa, 0x13, 0x1b, 0x10, 0x6, 0xd, 0xd, 0xf, 0xa, 0x6, 0x9, 0xa, 0xd, - 0xc, 0xd, 0xc, 0xc, 0x7, 0x7, 0x7, 0x7, 0xf, 0xf, 0x13, 0xf, 0xf, 0xf, 0xf, 0x0, - 0x15, 0x1d, 0xb, 0x0, 0x6, 0x6, 0x9, 0x7, 0xf, 0xe, 0x12, 0x13, 0x6, 0x7, 0x8, 0xc, - 0xb, 0x7, 0x7, 0x5, 0xb, 0xe, 0xa, 0xd, 0xd, 0xd, 0xc, 0xc, 0xc, 0xd, 0xc, 0x7, - 0x6, 0xe, 0xd, 0xe, 0xb, 0x15, 0xe, 0xe, 0xd, 0xf, 0xd, 0xc, 0x10, 0x10, 0x8, 0x7, - 0xe, 0xb, 0x12, 0x10, 0x10, 0xd, 0x10, 0xe, 0xc, 0x9, 0xf, 0xc, 0x13, 0xc, 0xb, 0xc, - 0x9, 0xa, 0xa, 0x8, 0xb, 0x6, 0xc, 0xb, 0x9, 0xc, 0xb, 0x6, 0xc, 0xc, 0x6, 0x6, - 0xb, 0x6, 0x13, 0xd, 0xb, 0xb, 0xb, 0x8, 0x9, 0x7, 0xc, 0x9, 0xf, 0xa, 0x9, 0xa, - 0x7, 0x7, 0x8, 0x8, 0xc, 0xa, 0xe, 0xc, 0x8, 0xc, 0xb, 0x6, 0x8, 0x13, 0x10, 0xd, - 0x9, 0x9, 0x10, 0xc, 0xa, 0x6, 0xc, 0xf, 0xe, 0x12, 0x15, 0x12, 0xb, 0xe, 0x9, 0xb, - 0x6, 0x7, 0xb, 0x11, 0xa, 0x9, 0xc, 0xc, 0xe, 0x5, 0x5, 0xa, 0x1d, 0x6, 0x8, 0x9, - 0x8, 0x9, 0x5, 0x7, 0x6, 0xb, 0x6, 0x8, 0xd, 0x9, 0xd, 0xe, 0xe, 0xd, 0xd, 0x10, - 0x10, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0x9, 0xb, 0xb, 0xb, 0xb, 0x6, 0x6, 0x6, - 0x6, 0xd, 0xb, 0xb, 0xb, 0xb, 0xb, 0xc, 0xc, 0xc, 0xc, 0xa, 0x15, 0x15, 0x13, 0xb, - 0x7, 0xb, 0x10, 0x10, 0xe, 0x7, 0xa, 0x10, 0xc, 0xa, 0x7, 0xb, 0x14, 0x1c, 0x11, 0x7, - 0xe, 0xe, 0x10, 0xa, 0x7, 0x9, 0xb, 0xe, 0xd, 0xe, 0xd, 0xd, 0x8, 0x8, 0x8, 0x8, - 0x10, 0x10, 0x14, 0x10, 0xf, 0xf, 0xf, 0x0, 0x16, 0x1e, 0xb, 0x0, 0x6, 0x6, 0xa, 0x7, - 0xf, 0xf, 0x13, 0x14, 0x6, 0x7, 0x9, 0xc, 0xb, 0x7, 0x7, 0x6, 0xc, 0xe, 0xb, 0xd, - 0xe, 0xe, 0xd, 0xd, 0xc, 0xd, 0xd, 0x7, 0x7, 0xf, 0xd, 0xf, 0xb, 0x16, 0xe, 0xf, - 0xe, 0x10, 0xe, 0xd, 0x11, 0x10, 0x8, 0x7, 0xf, 0xc, 0x13, 0x11, 0x11, 0xe, 0x11, 0xe, - 0xd, 0x9, 0x10, 0xc, 0x13, 0xd, 0xb, 0xc, 0x9, 0xa, 0xa, 0x9, 0xc, 0x7, 0xd, 0xc, - 0xa, 0xc, 0xb, 0x7, 0xd, 0xd, 0x6, 0x6, 0xb, 0x6, 0x13, 0xd, 0xb, 0xc, 0xc, 0x9, - 0x9, 0x7, 0xd, 0xa, 0x10, 0xa, 0xa, 0xa, 0x7, 0x8, 0x8, 0x8, 0xc, 0xa, 0xf, 0xc, - 0x9, 0xc, 0xc, 0x6, 0x8, 0x14, 0x11, 0xd, 0xa, 0x9, 0x11, 0xc, 0xb, 0x6, 0xc, 0xf, - 0xe, 0x13, 0x16, 0x12, 0xc, 0xe, 0xa, 0xb, 0x6, 0x8, 0xc, 0x11, 0xa, 0x9, 0xd, 0xd, - 0xe, 0x6, 0x5, 0xa, 0x1e, 0x6, 0x9, 0x9, 0x8, 0xa, 0x5, 0x7, 0x6, 0xb, 0x6, 0x9, - 0xe, 0xa, 0xd, 0xf, 0xe, 0xe, 0xd, 0x11, 0x11, 0x10, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, - 0xa, 0xb, 0xb, 0xb, 0xb, 0x6, 0x6, 0x6, 0x6, 0xd, 0xb, 0xb, 0xb, 0xb, 0xb, 0xd, - 0xd, 0xd, 0xd, 0xb, 0x16, 0x16, 0x14, 0xc, 0x7, 0xc, 0x11, 0x11, 0xf, 0x7, 0xa, 0x11, - 0xd, 0xa, 0x7, 0xb, 0x15, 0x1d, 0x12, 0x7, 0xe, 0xf, 0x11, 0xa, 0x7, 0xa, 0xb, 0xe, - 0xd, 0xe, 0xd, 0xd, 0x8, 0x8, 0x8, 0x8, 0x11, 0x11, 0x15, 0x11, 0x10, 0x10, 0x10, 0x0, - 0x17, 0x1f, 0xc, 0x0, 0x6, 0x6, 0xa, 0x8, 0x10, 0x10, 0x14, 0x15, 0x6, 0x8, 0x9, 0xd, - 0xc, 0x7, 0x8, 0x6, 0xc, 0xf, 0xb, 0xe, 0xe, 0xe, 0xe, 0xe, 0xd, 0xe, 0xd, 0x7, - 0x7, 0xf, 0xe, 0xf, 0xc, 0x17, 0xf, 0x10, 0xe, 0x10, 0xe, 0xd, 0x11, 0x11, 0x8, 0x8, - 0xf, 0xd, 0x14, 0x12, 0x12, 0xf, 0x12, 0xf, 0xe, 0xa, 0x11, 0xd, 0x14, 0xd, 0xc, 0xd, - 0xa, 0xb, 0xb, 0x9, 0xc, 0x7, 0xd, 0xc, 0xa, 0xd, 0xc, 0x7, 0xd, 0xe, 0x6, 0x6, - 0xc, 0x6, 0x14, 0xe, 0xc, 0xc, 0xd, 0x9, 0xa, 0x8, 0xd, 0xa, 0x11, 0xb, 0xa, 0xb, - 0x8, 0x8, 0x9, 0x8, 0xd, 0xb, 0xf, 0xd, 0x9, 0xd, 0xc, 0x6, 0x9, 0x15, 0x12, 0xe, - 0xa, 0xa, 0x11, 0xd, 0xb, 0x6, 0xd, 0x10, 0xf, 0x13, 0x17, 0x13, 0xc, 0xf, 0xa, 0xc, - 0x7, 0x8, 0xc, 0x12, 0xa, 0x9, 0xd, 0xd, 0xf, 0x6, 0x6, 0xb, 0x1f, 0x7, 0x9, 0xa, - 0x8, 0xa, 0x6, 0x7, 0x6, 0xc, 0x6, 0x9, 0xe, 0xa, 0xe, 0xf, 0xf, 0xe, 0xe, 0x12, - 0x12, 0x11, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xa, 0xc, 0xc, 0xc, 0xc, 0x6, 0x6, 0x6, - 0x6, 0xe, 0xc, 0xc, 0xc, 0xc, 0xc, 0xd, 0xd, 0xd, 0xd, 0xb, 0x17, 0x17, 0x15, 0xc, - 0x7, 0xc, 0x12, 0x12, 0x10, 0x7, 0xb, 0x12, 0xe, 0xb, 0x7, 0xc, 0x16, 0x1f, 0x12, 0x7, - 0xf, 0xf, 0x12, 0xb, 0x7, 0xa, 0xc, 0xf, 0xe, 0xf, 0xe, 0xe, 0x8, 0x9, 0x9, 0x8, - 0x12, 0x12, 0x16, 0x12, 0x11, 0x11, 0x11, 0x0, 0x18, 0x21, 0xc, 0x0, 0x6, 0x6, 0xb, 0x8, - 0x11, 0x10, 0x14, 0x16, 0x7, 0x8, 0xa, 0xd, 0xc, 0x8, 0x8, 0x6, 0xd, 0x10, 0xc, 0xe, - 0xf, 0xf, 0xe, 0xe, 0xd, 0xe, 0xe, 0x7, 0x7, 0x10, 0xf, 0x10, 0xc, 0x18, 0xf, 0x10, - 0xf, 0x11, 0xf, 0xe, 0x12, 0x12, 0x9, 0x8, 0x10, 0xd, 0x15, 0x12, 0x12, 0xf, 0x12, 0x10, - 0xe, 0xa, 0x12, 0xe, 0x15, 0xe, 0xc, 0xd, 0xa, 0xb, 0xb, 0x9, 0xd, 0x7, 0xe, 0xd, - 0xb, 0xe, 0xc, 0x7, 0xe, 0xe, 0x6, 0x6, 0xc, 0x6, 0x15, 0xe, 0xc, 0xd, 0xd, 0x9, - 0xa, 0x8, 0xe, 0xb, 0x11, 0xb, 0xb, 0xb, 0x8, 0x8, 0x9, 0x9, 0xd, 0xb, 0x10, 0xd, - 0x9, 0xd, 0xd, 0x6, 0x9, 0x15, 0x12, 0xe, 0xb, 0xa, 0x12, 0xd, 0xb, 0x7, 0xd, 0x11, - 0x10, 0x14, 0x18, 0x14, 0xd, 0x10, 0xa, 0xc, 0x7, 0x8, 0xd, 0x13, 0xb, 0xa, 0xe, 0xe, - 0x10, 0x6, 0x6, 0xb, 0x21, 0x7, 0x9, 0xa, 0x9, 0xb, 0x6, 0x8, 0x7, 0xc, 0x7, 0x9, - 0xf, 0xa, 0xe, 0x10, 0xf, 0xf, 0xf, 0x12, 0x12, 0x11, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, - 0xb, 0xc, 0xc, 0xc, 0xc, 0x6, 0x6, 0x6, 0x6, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xe, - 0xe, 0xe, 0xe, 0xc, 0x18, 0x18, 0x16, 0xd, 0x7, 0xd, 0x12, 0x12, 0x10, 0x7, 0xb, 0x12, - 0xe, 0xb, 0x7, 0xc, 0x17, 0x20, 0x13, 0x7, 0xf, 0x10, 0x12, 0xb, 0x7, 0xb, 0xc, 0x10, - 0xf, 0xf, 0xf, 0xf, 0x9, 0x9, 0x9, 0x9, 0x12, 0x12, 0x17, 0x12, 0x11, 0x11, 0x11, 0x0, - 0x0, 0x0, 0x1, 0xb9, 0x1, 0x90, 0x0, 0x5, 0x0, 0x1, 0x2, 0xbc, 0x2, 0x8a, 0x0, 0x0, - 0x0, 0x8f, 0x2, 0xbc, 0x2, 0x8a, 0x0, 0x0, 0x1, 0xc5, 0x0, 0x32, 0x1, 0x3, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0x6c, 0x74, 0x73, 0x0, 0x40, - 0x0, 0x20, 0xf0, 0x2, 0x3, 0xe8, 0xfe, 0xd8, 0x0, 0x0, 0x3, 0xe8, 0x1, 0x28, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x61, 0xbc, 0x73, 0xa7, 0x5f, 0xf, 0x3c, 0xf5, - 0x0, 0x0, 0x3, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xba, 0x76, 0x9e, 0x52, 0x0, 0x0, 0x0, 0x0, - 0xba, 0x76, 0x9e, 0x52, 0xff, 0xb5, 0xfe, 0xd8, 0x5, 0x1, 0x3, 0xe8, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3, 0xe8, 0xfe, 0xd8, - 0x0, 0x0, 0x5, 0x56, 0xff, 0xb5, 0xff, 0x38, 0x5, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe5, 0x0, 0x1, 0x0, 0x0, - 0x0, 0xe5, 0x0, 0x88, 0x0, 0x1c, 0x0, 0x42, 0x0, 0x4, 0x0, 0x2, 0x0, 0x8, 0x0, 0x40, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x85, 0x1, 0x1c, 0x0, 0x2, 0x0, 0x1 -}; - -#endif diff --git a/libs/libRocket/Source/Debugger/Geometry.cpp b/libs/libRocket/Source/Debugger/Geometry.cpp deleted file mode 100644 index 158af4dfd77..00000000000 --- a/libs/libRocket/Source/Debugger/Geometry.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "Geometry.h" -#include "../../Include/Rocket/Core.h" - -namespace Rocket { -namespace Debugger { - -static Core::Context* context; - -Geometry::Geometry() -{ -} - -void Geometry::SetContext(Core::Context* _context) -{ - context = _context; -} - -// Renders a one-pixel rectangular outline. -void Geometry::RenderOutline(const Core::Vector2f& origin, const Core::Vector2f& dimensions, const Core::Colourb& colour, float width) -{ - if (context == NULL) - return; - - Core::RenderInterface* render_interface = context->GetRenderInterface(); - - Core::Vertex vertices[4 * 4]; - int indices[6 * 4]; - - Core::GeometryUtilities::GenerateQuad(vertices + 0, indices + 0, Core::Vector2f(0, 0), Core::Vector2f(dimensions.x, width), colour, 0); - Core::GeometryUtilities::GenerateQuad(vertices + 4, indices + 6, Core::Vector2f(0, dimensions.y - width), Core::Vector2f(dimensions.x, width), colour, 4); - Core::GeometryUtilities::GenerateQuad(vertices + 8, indices + 12, Core::Vector2f(0, 0), Core::Vector2f(width, dimensions.y), colour, 8); - Core::GeometryUtilities::GenerateQuad(vertices + 12, indices + 18, Core::Vector2f(dimensions.x - width, 0), Core::Vector2f(width, dimensions.y), colour, 12); - - render_interface->RenderGeometry(vertices, 4 * 4, indices, 6 * 4, 0, origin); -} - -// Renders a box. -void Geometry::RenderBox(const Core::Vector2f& origin, const Core::Vector2f& dimensions, const Core::Colourb& colour) -{ - if (context == NULL) - return; - - Core::RenderInterface* render_interface = context->GetRenderInterface(); - - Core::Vertex vertices[4]; - int indices[6]; - - Core::GeometryUtilities::GenerateQuad(vertices, indices, Core::Vector2f(0, 0), Core::Vector2f(dimensions.x, dimensions.y), colour, 0); - - render_interface->RenderGeometry(vertices, 4, indices, 6, 0, origin); -} - -// Renders a box with a hole in the middle. -void Geometry::RenderBox(const Core::Vector2f& origin, const Core::Vector2f& dimensions, const Core::Vector2f& hole_origin, const Core::Vector2f& hole_dimensions, const Core::Colourb& colour) -{ - // Top box. - float top_y_dimensions = hole_origin.y - origin.y; - if (top_y_dimensions > 0) - { - RenderBox(origin, Core::Vector2f(dimensions.x, top_y_dimensions), colour); - } - - // Bottom box. - float bottom_y_dimensions = (origin.y + dimensions.y) - (hole_origin.y + hole_dimensions.y); - if (bottom_y_dimensions > 0) - { - RenderBox(Core::Vector2f(origin.x, hole_origin.y + hole_dimensions.y), Core::Vector2f(dimensions.x, bottom_y_dimensions), colour); - } - - // Left box. - float left_x_dimensions = hole_origin.x - origin.x; - if (left_x_dimensions > 0) - { - RenderBox(Core::Vector2f(origin.x, hole_origin.y), Core::Vector2f(left_x_dimensions, hole_dimensions.y), colour); - } - - // Right box. - float right_x_dimensions = (origin.x + dimensions.x) - (hole_origin.x + hole_dimensions.x); - if (right_x_dimensions > 0) - { - RenderBox(Core::Vector2f(hole_origin.x + hole_dimensions.x, hole_origin.y), Core::Vector2f(right_x_dimensions, hole_dimensions.y), colour); - } -} - -} -} diff --git a/libs/libRocket/Source/Debugger/Geometry.h b/libs/libRocket/Source/Debugger/Geometry.h deleted file mode 100644 index a8b8f050618..00000000000 --- a/libs/libRocket/Source/Debugger/Geometry.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERGEOMETRY_H -#define ROCKETDEBUGGERGEOMETRY_H - -#include "../../Include/Rocket/Core/Types.h" - -namespace Rocket { - -namespace Core { - class Context; -} - -namespace Debugger { - -/** - Helper class for generating geometry for the debugger. - - @author Peter Curry - */ - -class Geometry -{ -public: - // Set the context to render through. - static void SetContext(Core::Context* context); - - // Renders a one-pixel rectangular outline. - static void RenderOutline(const Core::Vector2f& origin, const Core::Vector2f& dimensions, const Core::Colourb& colour, float width); - // Renders a box. - static void RenderBox(const Core::Vector2f& origin, const Core::Vector2f& dimensions, const Core::Colourb& colour); - // Renders a box with a hole in the middle. - static void RenderBox(const Core::Vector2f& origin, const Core::Vector2f& dimensions, const Core::Vector2f& hole_origin, const Core::Vector2f& hole_dimensions, const Core::Colourb& colour); - -private: - Geometry(); -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Debugger/InfoSource.h b/libs/libRocket/Source/Debugger/InfoSource.h deleted file mode 100644 index 95fbab3baef..00000000000 --- a/libs/libRocket/Source/Debugger/InfoSource.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -static const char* info_rcss = -"body\n" -"{\n" -" width: 250px;\n" -" min-width: 250px;\n" -" min-height: 150px;\n" -" margin-top: 42px;\n" -" margin-right: 20px;\n" -" margin-left: auto;\n" -"}\n" -"div#content\n" -"{\n" -" height: auto;\n" -" max-height: 500px;\n" -"}\n" -"div#content div div\n" -"{\n" -" font-size: 10;\n" -"}\n" -"div#ancestors p:hover,\n" -"div#children p:hover\n" -"{\n" -" background-color: #ddd;\n" -"}\n" -"scrollbarvertical\n" -"{\n" -" scrollbar-margin: 0px;\n" -"}\n"; - -static const char* info_rml = -"

\n" -" \n" -"
X
\n" -"
Element Information
\n" -"
\n" -"

\n" -"
\n" -"
\n" -"

Attributes

\n" -"
\n" -"
\n" -"
\n" -"
\n" -"

Properties

\n" -"
\n" -"
\n" -"
\n" -"
\n" -"

Position

\n" -"
\n" -"
\n" -"
\n" -"
\n" -"

Ancestors

\n" -"
\n" -"
\n" -"
\n" -"
\n" -"

Children

\n" -"
\n" -"
\n" -"
\n" -"
\n"; diff --git a/libs/libRocket/Source/Debugger/LogSource.h b/libs/libRocket/Source/Debugger/LogSource.h deleted file mode 100644 index aa0bb19cec2..00000000000 --- a/libs/libRocket/Source/Debugger/LogSource.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -static const char* log_rcss = -"body\n" -"{\n" -" width: 400px;\n" -" height: 300px;\n" -" min-width: 200px;\n" -" min-height: 150px;\n" -" top: 42;\n" -" left: 20;\n" -"}\n" -"div#tools\n" -"{\n" -" float: right;\n" -" width: 137px;\n" -"}\n" -"div.log-entry\n" -"{\n" -" margin: 3px 2px;\n" -"}\n" -"div.log-entry div.icon\n" -"{\n" -" float: left;\n" -" display: block;\n" -" width: 18px;\n" -" height: 18px;\n" -" text-align: center;\n" -" border-width: 1px;\n" -" margin-right: 5px;\n" -" font-weight: bold;\n" -"}\n" -"div.button\n" -"{\n" -" display: inline-block;" -" width: 30px;\n" -" text-align: center;\n" -" border-width: 1px;\n" -" font-weight: bold;\n" -" margin-right: 3px;\n" -"}\n" -"div.button.last\n" -"{\n" -" margin-right: 0px;\n" -"}\n" -"div.log-entry p.message\n" -"{\n" -" display: block;\n" -" margin-left: 20px;\n" -"}\n"; - -static const char* log_rml = -"

\n" -" \n" -"
X
\n" -"
\n" -"
On
\n" -"
On
\n" -"
Off
\n" -"
On
\n" -"
\n" -"
Event Log
\n" -"
\n" -"

\n" -"
\n" -" No messages in log.\n" -"
\n" -""; diff --git a/libs/libRocket/Source/Debugger/MenuSource.h b/libs/libRocket/Source/Debugger/MenuSource.h deleted file mode 100644 index dacd924b894..00000000000 --- a/libs/libRocket/Source/Debugger/MenuSource.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -static const char* menu_rcss = -"body\n" -"{\n" -" width: 100%;\n" -" height: 32px;\n" -" position: absolute;\n" -" z-index: top;\n" -" background: #888;\n" -" font-family: Lacuna;\n" -" font-size: 14px;\n" -" color: black;\n" -"}\n" -"div\n" -"{\n" -" display: block;\n" -"}\n" -"div#button-group\n" -"{\n" -" margin-top: 4px;\n" -"}\n" -"button\n" -"{\n" -" border-width: 1px;\n" -" border-color: #666;\n" -" background: #ddd;\n" -" margin-left: 6px;\n" -" display: inline-block;\n" -" width: 100px;\n" -" text-align: center;\n" -"}\n" -"button:hover\n" -"{\n" -" background: #eee;\n" -"}\n" -"div#version-info\n" -"{\n" -" padding: 0px;\n" -" margin-top: 0px;\n" -" font-size: 20px;\n" -" float: right;\n" -" margin-right: 20px;\n" -" width: 200px;" -" text-align: right;" -" color: white;\n" -"}\n" -"span#version-number\n" -"{\n" -" font-size: 15px;\n" -"}\n" -; - -static const char* menu_rml = -"
libRocket
\n" -"
\n" -" \n" -" \n" -" \n" -"
\n"; diff --git a/libs/libRocket/Source/Debugger/Plugin.cpp b/libs/libRocket/Source/Debugger/Plugin.cpp deleted file mode 100644 index 285c2d4a22a..00000000000 --- a/libs/libRocket/Source/Debugger/Plugin.cpp +++ /dev/null @@ -1,409 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "Plugin.h" -#include "../../Include/Rocket/Core/Types.h" -#include "../../Include/Rocket/Core.h" -#include "ElementContextHook.h" -#include "ElementInfo.h" -#include "ElementLog.h" -#include "FontSource.h" -#include "Geometry.h" -#include "MenuSource.h" -#include "SystemInterface.h" -#include - -namespace Rocket { -namespace Debugger { - -Plugin* Plugin::instance = NULL; - -Plugin::Plugin() -{ - ROCKET_ASSERT(instance == NULL); - instance = this; - host_context = NULL; - debug_context = NULL; - log_hook = NULL; - - menu_element = NULL; - info_element = NULL; - log_element = NULL; - - render_outlines = false; -} - -Plugin::~Plugin() -{ - instance = NULL; -} - -// Initialises the debugging tools into the given context. -bool Plugin::Initialise(Core::Context* context) -{ - host_context = context; - Geometry::SetContext(context); - - if (!LoadFont()) - { - Core::Log::Message(Core::Log::LT_ERROR, "Failed to initialise debugger, unable to load font."); - return false; - } - - if (!LoadMenuElement() || - !LoadInfoElement() || - !LoadLogElement()) - { - Core::Log::Message(Core::Log::LT_ERROR, "Failed to initialise debugger, error while load debugger elements."); - return false; - } - - Core::Factory::RegisterElementInstancer("debug-hook", new Core::ElementInstancerGeneric< ElementContextHook >())->RemoveReference(); - - return true; -} - -// Sets the context to be debugged. -bool Plugin::SetContext(Core::Context* context) -{ - // Remove the debug hook from the old context. - if (debug_context != NULL && - hook_element != NULL) - { - debug_context->UnloadDocument(hook_element); - hook_element->RemoveReference(); - hook_element = NULL; - } - - // Add the debug hook into the new context. - if (context != NULL) - { - Core::ElementDocument* element = context->CreateDocument("debug-hook"); - if (element == NULL) - return false; - - hook_element = dynamic_cast< ElementContextHook* >(element); - if (hook_element == NULL) - { - element->RemoveReference(); - context->UnloadDocument(element); - return false; - } - - hook_element->Initialise(this); - } - - // Attach the info element to the new context. - if (info_element != NULL) - { - if (debug_context != NULL) - { - debug_context->RemoveEventListener("click", info_element, true); - debug_context->RemoveEventListener("mouseover", info_element, true); - } - - if (context != NULL) - { - context->AddEventListener("click", info_element, true); - context->AddEventListener("mouseover", info_element, true); - } - - info_element->Reset(); - } - - debug_context = context; - return true; -} - -// Sets the visibility of the debugger. -void Plugin::SetVisible(bool visibility) -{ - if (visibility) - menu_element->SetProperty("visibility", "visible"); - else - menu_element->SetProperty("visibility", "hidden"); -} - -// Returns the visibility of the debugger. -bool Plugin::IsVisible() -{ - return menu_element->IsVisible(); -} - -// Renders any debug elements in the debug context. -void Plugin::Render() -{ - // Render the outlines of the debug context's elements. - if (render_outlines && - debug_context != NULL) - { - for (int i = 0; i < debug_context->GetNumDocuments(); ++i) - { - Core::ElementDocument* document = debug_context->GetDocument(i); - if (document->GetId().Find("rkt-debug-") == 0) - continue; - - std::stack< Core::Element* > element_stack; - element_stack.push(document); - - while (!element_stack.empty()) - { - Core::Element* element = element_stack.top(); - element_stack.pop(); - if (element->IsVisible()) - { - for (int j = 0; j < element->GetNumBoxes(); ++j) - { - const Core::Box& box = element->GetBox(j); - Geometry::RenderOutline(element->GetAbsoluteOffset(Core::Box::BORDER) + box.GetPosition(Core::Box::BORDER), box.GetSize(Core::Box::BORDER), Core::Colourb(255, 0, 0, 128), 1); - } - - for (int j = 0; j < element->GetNumChildren(); ++j) - element_stack.push(element->GetChild(j)); - } - } - } - } - - // Render the info element's boxes. - if (info_element != NULL && - info_element->IsVisible()) - { - info_element->RenderHoverElement(); - info_element->RenderSourceElement(); - } -} - -// Called when Rocket shuts down. -void Plugin::OnShutdown() -{ - // Release the elements before we leak track, this ensures the debugger hook has been cleared - // and that we don't try send the messages to the debug log window - ReleaseElements(); - - if (!elements.empty()) - { - Core::Log::Message(Core::Log::LT_WARNING, "%u leaked elements detected.", elements.size()); - - int count = 0; - for (ElementInstanceMap::iterator i = elements.begin(); i != elements.end(); ++i) - Core::Log::Message(Core::Log::LT_WARNING, "\t(%d) %s -> %s", count++, (*i)->GetTagName().CString(), (*i)->GetAddress().CString()); - } - - delete this; -} - -// Called whenever a Rocket context is destroyed. -void Plugin::OnContextDestroy(Core::Context* context) -{ - if (context == debug_context) - { - // The context we're debugging is being destroyed, so we need to remove our debug hook elements. - SetContext(NULL); - } - - if (context == host_context) - { - // Our host is being destroyed, so we need to shut down the debugger. - - ReleaseElements(); - - Geometry::SetContext(NULL); - context = NULL; - } -} - -// Called whenever an element is created. -void Plugin::OnElementCreate(Core::Element* element) -{ - // Store the stack addresses for this frame. - elements.insert(element); -} - -// Called whenever an element is destroyed. -void Plugin::OnElementDestroy(Core::Element* element) -{ - elements.erase(element); - - if (info_element != NULL) - info_element->OnElementDestroy(element); -} - -// Event handler for events from the debugger elements. -void Plugin::ProcessEvent(Core::Event& event) -{ - if (event == "click") - { - if (event.GetTargetElement()->GetId() == "event-log-button") - { - if (log_element->IsVisible()) - log_element->SetProperty("visibility", "hidden"); - else - log_element->SetProperty("visibility", "visible"); - } - else if (event.GetTargetElement()->GetId() == "debug-info-button") - { - if (info_element->IsVisible()) - info_element->SetProperty("visibility", "hidden"); - else - info_element->SetProperty("visibility", "visible"); - } - else if (event.GetTargetElement()->GetId() == "outlines-button") - { - render_outlines = !render_outlines; - } - } -} - -Plugin* Plugin::GetInstance() -{ - return instance; -} - -bool Plugin::LoadFont() -{ - return (Core::FontDatabase::LoadFontFace(lacuna_regular, sizeof(lacuna_regular) / sizeof(unsigned char), "Lacuna", Core::Font::STYLE_NORMAL, Core::Font::WEIGHT_NORMAL) && - Core::FontDatabase::LoadFontFace(lacuna_italic, sizeof(lacuna_italic) / sizeof(unsigned char), "Lacuna", Core::Font::STYLE_ITALIC, Core::Font::WEIGHT_NORMAL)); -} - -bool Plugin::LoadMenuElement() -{ - menu_element = host_context->CreateDocument(); - if (menu_element == NULL) - return false; - - menu_element->SetId("rkt-debug-menu"); - menu_element->SetProperty("visibility", "hidden"); - menu_element->SetInnerRML(menu_rml); - - // Remove our reference on the document. - menu_element->RemoveReference(); - - Core::StyleSheet* style_sheet = Core::Factory::InstanceStyleSheetString(menu_rcss); - if (style_sheet == NULL) - { - host_context->UnloadDocument(menu_element); - menu_element = NULL; - - return false; - } - - menu_element->SetStyleSheet(style_sheet); - style_sheet->RemoveReference(); - menu_element->AddReference(); - - // Set the version info in the menu. - menu_element->GetElementById("version-number")->SetInnerRML("v" + Rocket::Core::GetVersion()); - - // Attach to the buttons. - Core::Element* event_log_button = menu_element->GetElementById("event-log-button"); - event_log_button->AddEventListener("click", this); - - Core::Element* element_info_button = menu_element->GetElementById("debug-info-button"); - element_info_button->AddEventListener("click", this); - - Core::Element* outlines_button = menu_element->GetElementById("outlines-button"); - outlines_button->AddEventListener("click", this); - - return true; -} - -bool Plugin::LoadInfoElement() -{ - Core::Factory::RegisterElementInstancer("debug-info", new Core::ElementInstancerGeneric< ElementInfo >())->RemoveReference(); - info_element = dynamic_cast< ElementInfo* >(host_context->CreateDocument("debug-info")); - if (info_element == NULL) - return false; - - info_element->SetProperty("visibility", "hidden"); - - if (!info_element->Initialise()) - { - info_element->RemoveReference(); - host_context->UnloadDocument(info_element); - info_element = NULL; - - return false; - } - - return true; -} - -bool Plugin::LoadLogElement() -{ - Core::Factory::RegisterElementInstancer("debug-log", new Core::ElementInstancerGeneric< ElementLog >())->RemoveReference(); - log_element = dynamic_cast< ElementLog* >(host_context->CreateDocument("debug-log")); - if (log_element == NULL) - return false; - - log_element->SetProperty("visibility", "hidden"); - - if (!log_element->Initialise()) - { - log_element->RemoveReference(); - host_context->UnloadDocument(log_element); - log_element = NULL; - - return false; - } - - // Make the system interface; this will trap the log messages for us. - log_hook = new SystemInterface(log_element); - - return true; -} - -void Plugin::ReleaseElements() -{ - if (menu_element) - { - menu_element->RemoveReference(); - menu_element = NULL; - } - - if (info_element) - { - info_element->RemoveReference(); - info_element = NULL; - } - - if (log_element) - { - log_element->RemoveReference(); - log_element = NULL; - delete log_hook; - } - - if (hook_element) - { - hook_element->RemoveReference(); - hook_element = NULL; - } -} - -} -} diff --git a/libs/libRocket/Source/Debugger/Plugin.h b/libs/libRocket/Source/Debugger/Plugin.h deleted file mode 100644 index 1bc96190146..00000000000 --- a/libs/libRocket/Source/Debugger/Plugin.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERPLUGIN_H -#define ROCKETDEBUGGERPLUGIN_H - -#include "../../Include/Rocket/Core/EventListener.h" -#include "../../Include/Rocket/Core/Plugin.h" -#include - -namespace Rocket { -namespace Core { - -class ElementDocument; - -} - -namespace Debugger { - -class ElementLog; -class ElementInfo; -class ElementContextHook; -class SystemInterface; - -/** - Rocket plugin interface for the debugger. - - @author Robert Curry - */ - -class Plugin : public Core::Plugin, public Core::EventListener -{ -public: - Plugin(); - virtual ~Plugin(); - - /// Initialises the debugging tools into the given context. - /// @param[in] context The context to load the tools into. - /// @return True on success, false if an error occured. - bool Initialise(Core::Context* context); - - /// Sets the context to be debugged. - /// @param[in] context The context to be debugged. - /// @return True if the debugger is initialised and the context was switched, false otherwise.. - bool SetContext(Core::Context* context); - - /// Sets the visibility of the debugger. - /// @param[in] visibility True to show the debugger, false to hide it. - void SetVisible(bool visibility); - /// Returns the visibility of the debugger. - /// @return True if the debugger is visible, false if not. - bool IsVisible(); - - /// Renders any debug elements in the debug context. - void Render(); - - /// Called when Rocket shuts down. - virtual void OnShutdown(); - - /// Called whenever a Rocket context is destroyed. - /// @param[in] context The destroyed context. - virtual void OnContextDestroy(Core::Context* context); - - /// Called whenever an element is created. - /// @param[in] element The created element. - virtual void OnElementCreate(Core::Element* element); - /// Called whenever an element is destroyed. - /// @param[in] element The destroyed element. - virtual void OnElementDestroy(Core::Element* element); - - /// Event handler for events from the debugger elements. - /// @param[in] event The event to process. - virtual void ProcessEvent(Core::Event& event); - - /// Access the singleton instance of the debugger - /// @return NULL or an instance of the plugin - static Plugin* GetInstance(); - -private: - bool LoadFont(); - bool LoadMenuElement(); - bool LoadInfoElement(); - bool LoadLogElement(); - bool LoadHookElement(); - - // Release all loaded elements - void ReleaseElements(); - - // The context hosting the debug documents. - Core::Context* host_context; - // The context we're debugging. - Core::Context* debug_context; - - // The debug elements. - Core::ElementDocument* menu_element; - ElementInfo* info_element; - ElementLog* log_element; - ElementContextHook* hook_element; - SystemInterface* log_hook; - - bool render_outlines; - - // Keep track of instanced elements for leak tracking. - typedef std::set< Core::Element* > ElementInstanceMap; - ElementInstanceMap elements; - - // Singleton instance - static Plugin* instance; -}; - -} -} - -#endif diff --git a/libs/libRocket/Source/Debugger/SystemInterface.cpp b/libs/libRocket/Source/Debugger/SystemInterface.cpp deleted file mode 100644 index 99bc8e98ff4..00000000000 --- a/libs/libRocket/Source/Debugger/SystemInterface.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "SystemInterface.h" -#include "../../Include/Rocket/Core.h" -#include "ElementLog.h" - -namespace Rocket { -namespace Debugger { - -SystemInterface::SystemInterface(ElementLog* _log) -{ - log = _log; - application_interface = Core::GetSystemInterface(); - application_interface->AddReference(); - Core::SetSystemInterface(this); -} - -SystemInterface::~SystemInterface() -{ - Core::SetSystemInterface(application_interface); - application_interface->RemoveReference(); -} - -// Get the number of seconds elapsed since the start of the application. -float SystemInterface::GetElapsedTime() -{ - return application_interface->GetElapsedTime(); -} - -// Translate the input string into the translated string. -int SystemInterface::TranslateString(Core::String& translated, const Core::String& input) -{ - return application_interface->TranslateString(translated, input); -} - -// Log the specified message. -bool SystemInterface::LogMessage(Core::Log::Type type, const Core::String& message) -{ - log->AddLogMessage(type, message); - - return application_interface->LogMessage(type, message); -} - -// Activate keyboard (for touchscreen devices) -void SystemInterface::ActivateKeyboard() -{ - application_interface->ActivateKeyboard(); -} - -// Deactivate keyboard (for touchscreen devices) -void SystemInterface::DeactivateKeyboard() -{ - application_interface->DeactivateKeyboard(); -} - -} -} diff --git a/libs/libRocket/Source/Debugger/SystemInterface.h b/libs/libRocket/Source/Debugger/SystemInterface.h deleted file mode 100644 index df3e6decf17..00000000000 --- a/libs/libRocket/Source/Debugger/SystemInterface.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef ROCKETDEBUGGERSYSTEMINTERFACE_H -#define ROCKETDEBUGGERSYSTEMINTERFACE_H - -#include "../../Include/Rocket/Core/SystemInterface.h" - -namespace Rocket { -namespace Debugger { - -class ElementLog; - -/** - The log interface the debugger installs into Rocket. This is a pass-through interface, so it holds onto the - application's system interface and passes all the calls through. - - @author Peter Curry - */ - -class SystemInterface : public Core::SystemInterface -{ -public: - /// Instances a new debugging log interface. - /// @param[in] log The logging element to send messages to. - SystemInterface(ElementLog* log); - virtual ~SystemInterface(); - - /// Get the number of seconds elapsed since the start of the application. - /// @return Elapsed time, in seconds. - virtual float GetElapsedTime(); - - /// Translate the input string into the translated string. - /// @param[out] translated Translated string ready for display. - /// @param[in] input String as received from XML. - /// @return Number of translations that occured. - virtual int TranslateString(Core::String& translated, const Core::String& input); - - /// Log the specified message. - /// @param[in] type Type of log message, ERROR, WARNING, etc. - /// @param[in] message Message to log. - /// @return True to continue execution, false to break into the debugger. - virtual bool LogMessage(Core::Log::Type type, const Core::String& message); - - /// Activate keyboard (for touchscreen devices) - virtual void ActivateKeyboard(); - - /// Deactivate keyboard (for touchscreen devices) - virtual void DeactivateKeyboard(); -private: - Core::SystemInterface* application_interface; - ElementLog* log; -}; - -} -} - -#endif diff --git a/src/cgame/cg_event.cpp b/src/cgame/cg_event.cpp index d74613ad4b8..e8173afcf34 100644 --- a/src/cgame/cg_event.cpp +++ b/src/cgame/cg_event.cpp @@ -511,17 +511,6 @@ static void CG_Obituary( entityState_t *ent ) if ( message ) { - // shouldn't need to do this here, but it avoids - char attackerClassName[ 64 ]; - - if ( attackerClass == -1 ) - { - *attackerClassName = 0; - } - else - { - Q_strncpyz( attackerClassName, _( BG_ClassModelConfig( attackerClass )->humanName ), sizeof( attackerClassName ) ); - } // Argument order: victim, attacker, [class,] [assistant]. Each has team tag first. if ( messageSuicide && attacker == target ) @@ -532,7 +521,7 @@ static void CG_Obituary( entityState_t *ent ) { if ( attackerClass != -1 ) { - Log::Notice( messageAssisted, teamTag[ ci->team ], targetName, teamTag[ attackerTeam ], attackerName, attackerClassName, teamTag[ assistantTeam ], assistantName ); + Log::Notice( messageAssisted, teamTag[ ci->team ], targetName, teamTag[ attackerTeam ], attackerName, BG_ClassModelConfig( attackerClass )->humanName, teamTag[ assistantTeam ], assistantName ); } else { @@ -541,7 +530,14 @@ static void CG_Obituary( entityState_t *ent ) } else { - Log::Notice( message, teamTag[ ci->team ], targetName, teamTag[ attackerTeam ], attackerName ); + if ( attackerClass != -1 ) + { + Log::Notice( message, teamTag[ ci->team ], targetName, teamTag[ attackerTeam ], attackerName, BG_ClassModelConfig( attackerClass )->humanName ); + } + else + { + Log::Notice( message, teamTag[ ci->team ], targetName, teamTag[ attackerTeam ], attackerName ); + } } if ( attackerTeam == ci->team && attacker == cg.clientNum && attacker != target )