diff --git a/.gitignore b/.gitignore index 58bab1d4..b6d9b21b 100755 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ /gamefilesd/res/icon.png /gamefileshf.zip /gamefileshf/res/icon.png +/fantasycore.zip /hellfire /hellfire.* /hfmonk diff --git a/BUILD.txt b/BUILD.txt index a6c8aad3..87721b32 100755 --- a/BUILD.txt +++ b/BUILD.txt @@ -7,6 +7,7 @@ The provided project expects the following folders in the root of the project to build properly. /PhysicsFS - https://icculus.org/physfs + version >= 2.1 Compile using MinSizeRel. /SFML - http://www.sfml-dev.org/ @@ -49,7 +50,7 @@ swscale-3.dll (FFmpeg 2) Linux To compile in Linux (Ubuntu), you need gcc or clang with C++17 support -and to have both PhysicsFS and SFML 2.5 installed. +and to have both PhysicsFS >= 2.1 and SFML >= 2.5 installed. sudo apt install libphysfs-dev sudo apt install libsfml-dev @@ -71,3 +72,8 @@ cmake CMakeLists.txt -DDGENGINE_MOVIE_SUPPORT:BOOL=FALSE Both PhysicsFS and SFML must be installed. FFmpeg is also required for movie support. + +Clang variant bug + +There's a bug in clang which affects libstdc++'s . +I you get errors with clang, use -stdlib=libc++ instead. diff --git a/CMakeLists.txt b/CMakeLists.txt index 74da2e27..0c4a28da 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,10 @@ cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) project(DGEngine) -if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++") + add_definitions(-Wall -stdlib=libc++) +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(NOT BEOS) add_definitions(-Wall) endif() @@ -16,7 +19,7 @@ if(DGENGINE_MOVIE_SUPPORT) find_package(FFmpeg COMPONENTS avcodec avformat avutil swscale) endif() find_package(PhysFS REQUIRED) -find_package(SFML 2.4 REQUIRED system window graphics network audio) +find_package(SFML 2.5 REQUIRED system window graphics network audio) include_directories(./src) @@ -38,6 +41,7 @@ set(SOURCE_FILES src/BitmapText.h src/Button.cpp src/Button.h + src/CachedImagePack.cpp src/CachedImagePack.h src/Circle.cpp src/Circle.h @@ -57,12 +61,14 @@ set(SOURCE_FILES src/Game.h src/GameUtils.cpp src/GameUtils.h + src/IfCondition.cpp + src/IfCondition.h src/IgnoreResource.h src/Image.cpp src/Image.h - src/Image2.h src/ImageUtils.cpp src/ImageUtils.h + src/InputEvent.h src/InputText.cpp src/InputText.h src/LoadingScreen.cpp @@ -73,10 +79,6 @@ set(SOURCE_FILES src/Min.h src/Movie2.cpp src/Movie2.h - src/Music2.cpp - src/Music2.h - src/MusicLoops.cpp - src/MusicLoops.h src/Palette.cpp src/Palette.h src/Pcx.cpp @@ -90,20 +92,18 @@ set(SOURCE_FILES src/ResourceManager.h src/ScrollableText.cpp src/ScrollableText.h - src/SFMLUtils.cpp - src/SFMLUtils.h src/Shaders.cpp src/Shaders.h src/Sol.cpp src/Sol.h - src/Sprite2.h src/StreamReader.h src/StringButton.cpp src/StringButton.h src/StringText.cpp src/StringText.h - src/Text2.cpp - src/Text2.h + src/Text.cpp + src/Text.h + src/TextureInfo.h src/TextUtils.cpp src/TextUtils.h src/TileSet.cpp @@ -112,8 +112,6 @@ set(SOURCE_FILES src/Variable.cpp src/Variable.h src/VarOrPredicate.h - src/View2.cpp - src/View2.h src/Actions/ActAction.h src/Actions/ActAudio.h src/Actions/ActButton.h @@ -123,6 +121,7 @@ set(SOURCE_FILES src/Actions/ActEvent.h src/Actions/ActFade.h src/Actions/ActFocus.h + src/Actions/ActFont.h src/Actions/ActGame.h src/Actions/ActImage.h src/Actions/ActInputText.h @@ -146,30 +145,34 @@ set(SOURCE_FILES src/Actions/ActVariable.h src/Actions/ActVisibility.h src/endian/big_endian.hpp - src/endian/helpers.hpp src/endian/is_big_endian.hpp src/endian/little_endian.hpp - src/endian/stream.hpp src/endian/stream_reader.hpp src/endian/stream_writer.hpp - src/Game/BaseClass.cpp - src/Game/BaseClass.h + src/endian/detail/helpers.hpp + src/endian/detail/stream.hpp + src/Game/BaseClassActions.cpp + src/Game/BaseClassActions.h + src/Game/BaseClassDefaults.h src/Game/BaseLevelObject.cpp src/Game/BaseLevelObject.h + src/Game/Classifier.cpp + src/Game/Classifier.h + src/Game/Classifiers.h src/Game/Formula.cpp src/Game/Formula.h src/Game/fsa.h + src/Game/GameHashes.h src/Game/GameProperties.cpp src/Game/GameProperties.h + src/Game/Inventories.h + src/Game/Inventory.cpp + src/Game/Inventory.h src/Game/Item.cpp src/Game/Item.h src/Game/ItemClass.cpp src/Game/ItemClass.h - src/Game/ItemCollection.cpp - src/Game/ItemCollection.h src/Game/ItemLocation.h - src/Game/ItemProperties.h - src/Game/ItemTypes.h src/Game/ItemXY.h src/Game/Level.cpp src/Game/Level.h @@ -180,9 +183,8 @@ set(SOURCE_FILES src/Game/LevelMap.cpp src/Game/LevelMap.h src/Game/LevelObject.h + src/Game/LevelObjectClass.h src/Game/MapCoord.h - src/Game/Namer.cpp - src/Game/Namer.h src/Game/Number.h src/Game/PairXY.h src/Game/PathFinder.cpp @@ -195,6 +197,10 @@ set(SOURCE_FILES src/Game/Quest.h src/Game/SimpleLevelObject.cpp src/Game/SimpleLevelObject.h + src/Game/Spell.cpp + src/Game/Spell.h + src/Game/SpellClass.cpp + src/Game/SpellClass.h src/Game/stlastar.h src/Game/Save/SaveItem.cpp src/Game/Save/SaveItem.h @@ -202,8 +208,11 @@ set(SOURCE_FILES src/Game/Save/SaveLevel.h src/Game/Save/SavePlayer.cpp src/Game/Save/SavePlayer.h + src/Game/Save/SaveProperties.h src/Game/Save/SaveSimpleLevelObject.cpp src/Game/Save/SaveSimpleLevelObject.h + src/Game/Save/SaveUtils.cpp + src/Game/Save/SaveUtils.h src/gsl/gsl src/gsl/gsl_algorithm src/gsl/gsl_assert @@ -288,6 +297,8 @@ set(SOURCE_FILES src/Parser/ParseTexturePack.h src/Parser/ParseVariable.cpp src/Parser/ParseVariable.h + src/Parser/Game/ParseClassifier.cpp + src/Parser/Game/ParseClassifier.h src/Parser/Game/ParseItem.cpp src/Parser/Game/ParseItem.h src/Parser/Game/ParseItemClass.cpp @@ -296,14 +307,18 @@ set(SOURCE_FILES src/Parser/Game/ParseLevel.h src/Parser/Game/ParseLevelObject.cpp src/Parser/Game/ParseLevelObject.h - src/Parser/Game/ParseNamer.cpp - src/Parser/Game/ParseNamer.h + src/Parser/Game/ParseLevelObjectClass.cpp + src/Parser/Game/ParseLevelObjectClass.h src/Parser/Game/ParsePlayer.cpp src/Parser/Game/ParsePlayer.h src/Parser/Game/ParsePlayerClass.cpp src/Parser/Game/ParsePlayerClass.h src/Parser/Game/ParseQuest.cpp src/Parser/Game/ParseQuest.h + src/Parser/Game/ParseSpell.cpp + src/Parser/Game/ParseSpell.h + src/Parser/Game/ParseSpellClass.cpp + src/Parser/Game/ParseSpellClass.h src/Parser/Utils/ParseUtils.cpp src/Parser/Utils/ParseUtils.h src/Parser/Utils/ParseUtilsIdx.cpp @@ -315,6 +330,7 @@ set(SOURCE_FILES src/Predicates/Predicate.h src/Predicates/PredIO.h src/Predicates/PredItem.h + src/Predicates/PredLevelObject.h src/Predicates/PredPlayer.h src/rapidjson/allocators.h src/rapidjson/document.h @@ -351,6 +367,19 @@ set(SOURCE_FILES src/rapidjson/internal/swap.h src/rapidjson/msinttypes/inttypes.h src/rapidjson/msinttypes/stdint.h + src/SFML/Image2.h + src/SFML/Music2.cpp + src/SFML/Music2.h + src/SFML/MusicLoops.cpp + src/SFML/MusicLoops.h + src/SFML/SFMLUtils.cpp + src/SFML/SFMLUtils.h + src/SFML/Sprite2.cpp + src/SFML/Sprite2.h + src/SFML/View2.cpp + src/SFML/View2.h + src/TexturePacks/BitmapFontTexturePack.cpp + src/TexturePacks/BitmapFontTexturePack.h src/TexturePacks/CachedTexturePack.cpp src/TexturePacks/CachedTexturePack.h src/TexturePacks/IndexedTexturePack.cpp @@ -363,8 +392,10 @@ set(SOURCE_FILES src/TexturePacks/TexturePack.h src/TexturePacks/VectorTexturePack.cpp src/TexturePacks/VectorTexturePack.h + src/Utils/FixedMap.h src/Utils/Helper2D.h src/Utils/iterator_tpl.h + src/Utils/LRUCache.h src/Utils/ReverseIterable.h src/Utils/Utils.cpp src/Utils/Utils.h @@ -376,22 +407,16 @@ if(FFmpeg_FOUND) src/sfeMovie/AudioStream.hpp src/sfeMovie/Demuxer.cpp src/sfeMovie/Demuxer.hpp - src/sfeMovie/Macros.cpp - src/sfeMovie/Macros.hpp src/sfeMovie/Movie.cpp src/sfeMovie/Movie.hpp src/sfeMovie/MovieImpl.cpp src/sfeMovie/MovieImpl.hpp src/sfeMovie/Stream.cpp src/sfeMovie/Stream.hpp - src/sfeMovie/StreamSelection.cpp src/sfeMovie/StreamSelection.hpp src/sfeMovie/Timer.cpp src/sfeMovie/Timer.hpp - src/sfeMovie/TimerPriorities.cpp src/sfeMovie/TimerPriorities.hpp - src/sfeMovie/Utilities.cpp - src/sfeMovie/Utilities.hpp src/sfeMovie/VideoStream.cpp src/sfeMovie/VideoStream.hpp ) diff --git a/DGEngine.vcxproj b/DGEngine.vcxproj index 55993bde..d4ea69b8 100755 --- a/DGEngine.vcxproj +++ b/DGEngine.vcxproj @@ -37,6 +37,7 @@ + @@ -44,18 +45,18 @@ - + + + - - @@ -64,7 +65,11 @@ + + + + @@ -78,17 +83,18 @@ - - + - + + + @@ -131,21 +137,22 @@ - - - - - + + + + + - + + @@ -156,7 +163,6 @@ - @@ -168,6 +174,7 @@ + @@ -199,10 +206,10 @@ - + + - @@ -210,25 +217,27 @@ - + + + + - + + + - - - + - @@ -238,30 +247,37 @@ + + - + + + - + - + + - + + + @@ -301,21 +317,19 @@ + - - - @@ -328,20 +342,24 @@ - - + + + + + - - + + + @@ -351,13 +369,14 @@ + + - @@ -398,7 +417,7 @@ Application true - LLVM-vs2017 + llvm MultiByte @@ -513,6 +532,8 @@ .\src;.\SFML\include;.\PhysicsFS\src;.\FFmpeg\include;%(AdditionalIncludeDirectories) USE_SFML_MOVIE_STUB;%(PreprocessorDefinitions) -Xclang "-std=c++17" %(AdditionalOptions) + false + stdcpp17 true @@ -581,7 +602,7 @@ No true true - flac.lib;freetype.lib;gdi32.lib;jpeg.lib;ogg.lib;openal32.lib;opengl32.lib;winmm.lib;ws2_32.lib;sfml-audio-s.lib;sfml-graphics-s.lib;sfml-main.lib;sfml-network-s.lib;sfml-system-s.lib;sfml-window-s.lib;vorbis.lib;vorbisenc.lib;vorbisfile.lib;physfs-static.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;%(AdditionalDependencies) + flac.lib;freetype.lib;gdi32.lib;ogg.lib;openal32.lib;opengl32.lib;winmm.lib;ws2_32.lib;sfml-audio-s.lib;sfml-graphics-s.lib;sfml-main.lib;sfml-network-s.lib;sfml-system-s.lib;sfml-window-s.lib;vorbis.lib;vorbisenc.lib;vorbisfile.lib;physfs-static.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;%(AdditionalDependencies) .\SFML\lib;.\PhysicsFS\MinSizeRel;.\FFmpeg\lib;%(AdditionalLibraryDirectories) Windows diff --git a/android/jni/Android.mk b/android/jni/Android.mk index a5d700f4..f2cdc922 100755 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -24,6 +24,7 @@ LOCAL_SRC_FILES += BitmapText.cpp LOCAL_SRC_FILES += BitmapText.h LOCAL_SRC_FILES += Button.cpp LOCAL_SRC_FILES += Button.h +LOCAL_SRC_FILES += CachedImagePack.cpp LOCAL_SRC_FILES += CachedImagePack.h LOCAL_SRC_FILES += Circle.cpp LOCAL_SRC_FILES += Circle.h @@ -43,12 +44,14 @@ LOCAL_SRC_FILES += Game.cpp LOCAL_SRC_FILES += Game.h LOCAL_SRC_FILES += GameUtils.cpp LOCAL_SRC_FILES += GameUtils.h +LOCAL_SRC_FILES += IfCondition.cpp +LOCAL_SRC_FILES += IfCondition.h LOCAL_SRC_FILES += IgnoreResource.h LOCAL_SRC_FILES += Image.cpp LOCAL_SRC_FILES += Image.h -LOCAL_SRC_FILES += Image2.h LOCAL_SRC_FILES += ImageUtils.cpp LOCAL_SRC_FILES += ImageUtils.h +LOCAL_SRC_FILES += InputEvent.h LOCAL_SRC_FILES += InputText.cpp LOCAL_SRC_FILES += InputText.h LOCAL_SRC_FILES += LoadingScreen.cpp @@ -59,10 +62,6 @@ LOCAL_SRC_FILES += Min.cpp LOCAL_SRC_FILES += Min.h LOCAL_SRC_FILES += Movie2.cpp LOCAL_SRC_FILES += Movie2.h -LOCAL_SRC_FILES += Music2.cpp -LOCAL_SRC_FILES += Music2.h -LOCAL_SRC_FILES += MusicLoops.cpp -LOCAL_SRC_FILES += MusicLoops.h LOCAL_SRC_FILES += Palette.cpp LOCAL_SRC_FILES += Palette.h LOCAL_SRC_FILES += Pcx.cpp @@ -76,20 +75,18 @@ LOCAL_SRC_FILES += ResourceManager.cpp LOCAL_SRC_FILES += ResourceManager.h LOCAL_SRC_FILES += ScrollableText.cpp LOCAL_SRC_FILES += ScrollableText.h -LOCAL_SRC_FILES += SFMLUtils.cpp -LOCAL_SRC_FILES += SFMLUtils.h LOCAL_SRC_FILES += Shaders.cpp LOCAL_SRC_FILES += Shaders.h LOCAL_SRC_FILES += Sol.cpp LOCAL_SRC_FILES += Sol.h -LOCAL_SRC_FILES += Sprite2.h LOCAL_SRC_FILES += StreamReader.h LOCAL_SRC_FILES += StringButton.cpp LOCAL_SRC_FILES += StringButton.h LOCAL_SRC_FILES += StringText.cpp LOCAL_SRC_FILES += StringText.h -LOCAL_SRC_FILES += Text2.cpp -LOCAL_SRC_FILES += Text2.h +LOCAL_SRC_FILES += Text.cpp +LOCAL_SRC_FILES += Text.h +LOCAL_SRC_FILES += TextureInfo.h LOCAL_SRC_FILES += TextUtils.cpp LOCAL_SRC_FILES += TextUtils.h LOCAL_SRC_FILES += TileSet.cpp @@ -98,8 +95,6 @@ LOCAL_SRC_FILES += UIObject.h LOCAL_SRC_FILES += Variable.cpp LOCAL_SRC_FILES += Variable.h LOCAL_SRC_FILES += VarOrPredicate.h -LOCAL_SRC_FILES += View2.cpp -LOCAL_SRC_FILES += View2.h LOCAL_SRC_FILES += Actions/ActAction.h LOCAL_SRC_FILES += Actions/ActAudio.h LOCAL_SRC_FILES += Actions/ActButton.h @@ -109,6 +104,7 @@ LOCAL_SRC_FILES += Actions/ActDrawable.h LOCAL_SRC_FILES += Actions/ActEvent.h LOCAL_SRC_FILES += Actions/ActFade.h LOCAL_SRC_FILES += Actions/ActFocus.h +LOCAL_SRC_FILES += Actions/ActFont.h LOCAL_SRC_FILES += Actions/ActGame.h LOCAL_SRC_FILES += Actions/ActImage.h LOCAL_SRC_FILES += Actions/ActInputText.h @@ -132,30 +128,34 @@ LOCAL_SRC_FILES += Actions/ActText.h LOCAL_SRC_FILES += Actions/ActVariable.h LOCAL_SRC_FILES += Actions/ActVisibility.h LOCAL_SRC_FILES += endian/big_endian.hpp -LOCAL_SRC_FILES += endian/helpers.hpp LOCAL_SRC_FILES += endian/is_big_endian.hpp LOCAL_SRC_FILES += endian/little_endian.hpp -LOCAL_SRC_FILES += endian/stream.hpp LOCAL_SRC_FILES += endian/stream_reader.hpp LOCAL_SRC_FILES += endian/stream_writer.hpp -LOCAL_SRC_FILES += Game/BaseClass.cpp -LOCAL_SRC_FILES += Game/BaseClass.h +LOCAL_SRC_FILES += endian/detail/helpers.hpp +LOCAL_SRC_FILES += endian/detail/stream.hpp +LOCAL_SRC_FILES += Game/BaseClassActions.cpp +LOCAL_SRC_FILES += Game/BaseClassActions.h +LOCAL_SRC_FILES += Game/BaseClassDefaults.h LOCAL_SRC_FILES += Game/BaseLevelObject.cpp LOCAL_SRC_FILES += Game/BaseLevelObject.h +LOCAL_SRC_FILES += Game/Classifier.cpp +LOCAL_SRC_FILES += Game/Classifier.h +LOCAL_SRC_FILES += Game/Classifiers.h LOCAL_SRC_FILES += Game/Formula.cpp LOCAL_SRC_FILES += Game/Formula.h LOCAL_SRC_FILES += Game/fsa.h +LOCAL_SRC_FILES += Game/GameHashes.h LOCAL_SRC_FILES += Game/GameProperties.cpp LOCAL_SRC_FILES += Game/GameProperties.h +LOCAL_SRC_FILES += Game/Inventories.h +LOCAL_SRC_FILES += Game/Inventory.cpp +LOCAL_SRC_FILES += Game/Inventory.h LOCAL_SRC_FILES += Game/Item.cpp LOCAL_SRC_FILES += Game/Item.h LOCAL_SRC_FILES += Game/ItemClass.cpp LOCAL_SRC_FILES += Game/ItemClass.h -LOCAL_SRC_FILES += Game/ItemCollection.cpp -LOCAL_SRC_FILES += Game/ItemCollection.h LOCAL_SRC_FILES += Game/ItemLocation.h -LOCAL_SRC_FILES += Game/ItemProperties.h -LOCAL_SRC_FILES += Game/ItemTypes.h LOCAL_SRC_FILES += Game/ItemXY.h LOCAL_SRC_FILES += Game/Level.cpp LOCAL_SRC_FILES += Game/Level.h @@ -166,9 +166,8 @@ LOCAL_SRC_FILES += Game/LevelHelper.h LOCAL_SRC_FILES += Game/LevelMap.cpp LOCAL_SRC_FILES += Game/LevelMap.h LOCAL_SRC_FILES += Game/LevelObject.h +LOCAL_SRC_FILES += Game/LevelObjectClass.h LOCAL_SRC_FILES += Game/MapCoord.h -LOCAL_SRC_FILES += Game/Namer.cpp -LOCAL_SRC_FILES += Game/Namer.h LOCAL_SRC_FILES += Game/Number.h LOCAL_SRC_FILES += Game/PairXY.h LOCAL_SRC_FILES += Game/PathFinder.cpp @@ -181,6 +180,10 @@ LOCAL_SRC_FILES += Game/Quest.cpp LOCAL_SRC_FILES += Game/Quest.h LOCAL_SRC_FILES += Game/SimpleLevelObject.cpp LOCAL_SRC_FILES += Game/SimpleLevelObject.h +LOCAL_SRC_FILES += Game/Spell.cpp +LOCAL_SRC_FILES += Game/Spell.h +LOCAL_SRC_FILES += Game/SpellClass.cpp +LOCAL_SRC_FILES += Game/SpellClass.h LOCAL_SRC_FILES += Game/stlastar.h LOCAL_SRC_FILES += Game/Save/SaveItem.cpp LOCAL_SRC_FILES += Game/Save/SaveItem.h @@ -188,8 +191,11 @@ LOCAL_SRC_FILES += Game/Save/SaveLevel.cpp LOCAL_SRC_FILES += Game/Save/SaveLevel.h LOCAL_SRC_FILES += Game/Save/SavePlayer.cpp LOCAL_SRC_FILES += Game/Save/SavePlayer.h +LOCAL_SRC_FILES += Game/Save/SaveProperties.h LOCAL_SRC_FILES += Game/Save/SaveSimpleLevelObject.cpp LOCAL_SRC_FILES += Game/Save/SaveSimpleLevelObject.h +LOCAL_SRC_FILES += Game/Save/SaveUtils.cpp +LOCAL_SRC_FILES += Game/Save/SaveUtils.h LOCAL_SRC_FILES += gsl/gsl LOCAL_SRC_FILES += gsl/gsl_algorithm LOCAL_SRC_FILES += gsl/gsl_assert @@ -274,6 +280,8 @@ LOCAL_SRC_FILES += Parser/ParseTexturePack.cpp LOCAL_SRC_FILES += Parser/ParseTexturePack.h LOCAL_SRC_FILES += Parser/ParseVariable.cpp LOCAL_SRC_FILES += Parser/ParseVariable.h +LOCAL_SRC_FILES += Parser/Game/ParseClassifier.cpp +LOCAL_SRC_FILES += Parser/Game/ParseClassifier.h LOCAL_SRC_FILES += Parser/Game/ParseItem.cpp LOCAL_SRC_FILES += Parser/Game/ParseItem.h LOCAL_SRC_FILES += Parser/Game/ParseItemClass.cpp @@ -282,14 +290,18 @@ LOCAL_SRC_FILES += Parser/Game/ParseLevel.cpp LOCAL_SRC_FILES += Parser/Game/ParseLevel.h LOCAL_SRC_FILES += Parser/Game/ParseLevelObject.cpp LOCAL_SRC_FILES += Parser/Game/ParseLevelObject.h -LOCAL_SRC_FILES += Parser/Game/ParseNamer.cpp -LOCAL_SRC_FILES += Parser/Game/ParseNamer.h +LOCAL_SRC_FILES += Parser/Game/ParseLevelObjectClass.cpp +LOCAL_SRC_FILES += Parser/Game/ParseLevelObjectClass.h LOCAL_SRC_FILES += Parser/Game/ParsePlayer.cpp LOCAL_SRC_FILES += Parser/Game/ParsePlayer.h LOCAL_SRC_FILES += Parser/Game/ParsePlayerClass.cpp LOCAL_SRC_FILES += Parser/Game/ParsePlayerClass.h LOCAL_SRC_FILES += Parser/Game/ParseQuest.cpp LOCAL_SRC_FILES += Parser/Game/ParseQuest.h +LOCAL_SRC_FILES += Parser/Game/ParseSpell.cpp +LOCAL_SRC_FILES += Parser/Game/ParseSpell.h +LOCAL_SRC_FILES += Parser/Game/ParseSpellClass.cpp +LOCAL_SRC_FILES += Parser/Game/ParseSpellClass.h LOCAL_SRC_FILES += Parser/Utils/ParseUtils.cpp LOCAL_SRC_FILES += Parser/Utils/ParseUtils.h LOCAL_SRC_FILES += Parser/Utils/ParseUtilsIdx.cpp @@ -301,6 +313,7 @@ LOCAL_SRC_FILES += Parser/Utils/ParseUtilsVal.h LOCAL_SRC_FILES += Predicates/Predicate.h LOCAL_SRC_FILES += Predicates/PredIO.h LOCAL_SRC_FILES += Predicates/PredItem.h +LOCAL_SRC_FILES += Predicates/PredLevelObject.h LOCAL_SRC_FILES += Predicates/PredPlayer.h LOCAL_SRC_FILES += rapidjson/allocators.h LOCAL_SRC_FILES += rapidjson/document.h @@ -337,6 +350,19 @@ LOCAL_SRC_FILES += rapidjson/internal/strtod.h LOCAL_SRC_FILES += rapidjson/internal/swap.h LOCAL_SRC_FILES += rapidjson/msinttypes/inttypes.h LOCAL_SRC_FILES += rapidjson/msinttypes/stdint.h +LOCAL_SRC_FILES += SFML/Image2.h +LOCAL_SRC_FILES += SFML/Music2.cpp +LOCAL_SRC_FILES += SFML/Music2.h +LOCAL_SRC_FILES += SFML/MusicLoops.cpp +LOCAL_SRC_FILES += SFML/MusicLoops.h +LOCAL_SRC_FILES += SFML/SFMLUtils.cpp +LOCAL_SRC_FILES += SFML/SFMLUtils.h +LOCAL_SRC_FILES += SFML/Sprite2.cpp +LOCAL_SRC_FILES += SFML/Sprite2.h +LOCAL_SRC_FILES += SFML/View2.cpp +LOCAL_SRC_FILES += SFML/View2.h +LOCAL_SRC_FILES += TexturePacks/BitmapFontTexturePack.cpp +LOCAL_SRC_FILES += TexturePacks/BitmapFontTexturePack.h LOCAL_SRC_FILES += TexturePacks/CachedTexturePack.cpp LOCAL_SRC_FILES += TexturePacks/CachedTexturePack.h LOCAL_SRC_FILES += TexturePacks/IndexedTexturePack.cpp @@ -349,8 +375,10 @@ LOCAL_SRC_FILES += TexturePacks/TexturePack.cpp LOCAL_SRC_FILES += TexturePacks/TexturePack.h LOCAL_SRC_FILES += TexturePacks/VectorTexturePack.cpp LOCAL_SRC_FILES += TexturePacks/VectorTexturePack.h +LOCAL_SRC_FILES += Utils/FixedMap.h LOCAL_SRC_FILES += Utils/Helper2D.h LOCAL_SRC_FILES += Utils/iterator_tpl.h +LOCAL_SRC_FILES += Utils/LRUCache.h LOCAL_SRC_FILES += Utils/ReverseIterable.h LOCAL_SRC_FILES += Utils/Utils.cpp LOCAL_SRC_FILES += Utils/Utils.h diff --git a/gamefilesd/level/afterLevelLoad.json b/gamefilesd/level/afterLevelLoad.json index e2d09152..fbac3751 100755 --- a/gamefilesd/level/afterLevelLoad.json +++ b/gamefilesd/level/afterLevelLoad.json @@ -2,21 +2,22 @@ "action": [ { "name": "if.notEqual", - "param1": "{1}", + "param1": "%currentLevel.path%", "param2": "town", "then": { "name": "player.setRestStatus", "status": 1 }, "else": { "name": "player.setRestStatus", "status": 0 } }, "updateLifeManaOrbs", "updatePlayerTexture", + "updateCharPoints", + "updateMap", { "name": "if.equal", - "param1": "{2}", + "param1": "{1}", "param2": "positionPlayer", - "then": { "name": "load", "file": ["level/positionPlayer.json", "{3}"] } + "then": { "name": "load", "file": ["level/positionPlayer.json", "{2}"] } } ], "load": "ui/level/char/updateVisiblePanels.json", - "load": "level/playOrStopMusic.json", - "load": ["level/setMapAction.json", "{1}"] + "load": "level/playOrStopMusic.json" } \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap0.json b/gamefilesd/level/automap/l1/automap0.json new file mode 100755 index 00000000..2d67cc20 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap0.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap0", + "texture": "automap", + "rects": [ + { "rect": [516, 0, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 9, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 18, 17, 9], "offset": [ 0, -3] }, + { "rect": [516, 27, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 36, 17, 9], "offset": [ 0, -7] }, + { "rect": [507, 66, 27, 13], "offset": [ 1, -8] }, + { "rect": [516, 45, 17, 9], "offset": [ 0, -7] }, + { "rect": [405, 230, 5, 9], "offset": [ 0, 0] }, + { "rect": [264, 198, 9, 5], "offset": [-4, -2] }, + { "rect": [264, 215, 9, 5], "offset": [-4, -4] }, + { "rect": [264, 232, 9, 5], "offset": [-4, -6] }, + { "rect": [405, 197, 5, 9], "offset": [ 0, -8] }, + { "rect": [264, 249, 9, 5], "offset": [ 4, -6] }, + { "rect": [264, 266, 9, 5], "offset": [ 4, -4] }, + { "rect": [264, 283, 9, 5], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap10.json b/gamefilesd/level/automap/l1/automap10.json new file mode 100755 index 00000000..e4441557 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap10.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap10", + "texture": "automap", + "rects": [ + { "rect": [408, 0, 33, 17], "offset": [ 0, -7] }, + { "rect": [408, 17, 33, 17], "offset": [ 0, -7] }, + { "rect": [408, 34, 33, 17], "offset": [ 0, -3] }, + { "rect": [408, 51, 33, 17], "offset": [ 0, -7] }, + { "rect": [408, 68, 33, 17], "offset": [ 0, -7] }, + { "rect": [416, 117, 55, 27], "offset": [ 1, -8] }, + { "rect": [408, 85, 33, 17], "offset": [ 0, -7] }, + { "rect": [377, 230, 9, 17], "offset": [ 0, 0] }, + { "rect": [208, 198, 17, 9], "offset": [-4, -2] }, + { "rect": [208, 215, 17, 9], "offset": [-4, -4] }, + { "rect": [208, 232, 17, 9], "offset": [-4, -6] }, + { "rect": [377, 197, 9, 17], "offset": [ 0, -8] }, + { "rect": [208, 249, 17, 9], "offset": [ 4, -6] }, + { "rect": [208, 266, 17, 9], "offset": [ 4, -4] }, + { "rect": [208, 283, 17, 9], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap13.json b/gamefilesd/level/automap/l1/automap13.json new file mode 100755 index 00000000..c3eb778c --- /dev/null +++ b/gamefilesd/level/automap/l1/automap13.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap13", + "texture": "automap", + "rects": [ + { "rect": [371, 0, 37, 19], "offset": [ 0, -7] }, + { "rect": [371, 19, 37, 19], "offset": [ 0, -7] }, + { "rect": [371, 38, 37, 19], "offset": [ 0, -3] }, + { "rect": [371, 57, 37, 19], "offset": [ 0, -7] }, + { "rect": [371, 76, 37, 19], "offset": [ 0, -7] }, + { "rect": [471, 117, 63, 31], "offset": [ 1, -8] }, + { "rect": [371, 95, 37, 19], "offset": [ 0, -7] }, + { "rect": [368, 230, 9, 19], "offset": [ 0, 0] }, + { "rect": [189, 198, 19, 10], "offset": [-4, -2] }, + { "rect": [189, 215, 19, 10], "offset": [-4, -4] }, + { "rect": [189, 232, 19, 10], "offset": [-4, -6] }, + { "rect": [368, 197, 9, 19], "offset": [ 0, -8] }, + { "rect": [189, 249, 19, 10], "offset": [ 4, -6] }, + { "rect": [189, 266, 19, 10], "offset": [ 4, -4] }, + { "rect": [189, 283, 19, 10], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap15.json b/gamefilesd/level/automap/l1/automap15.json new file mode 100755 index 00000000..7b5c8cca --- /dev/null +++ b/gamefilesd/level/automap/l1/automap15.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap15", + "texture": "automap", + "rects": [ + { "rect": [330, 0, 41, 21], "offset": [ 0, -7] }, + { "rect": [330, 21, 41, 21], "offset": [ 0, -7] }, + { "rect": [330, 42, 41, 21], "offset": [ 0, -3] }, + { "rect": [330, 63, 41, 21], "offset": [ 0, -7] }, + { "rect": [330, 84, 41, 21], "offset": [ 0, -7] }, + { "rect": [180, 163, 69, 34], "offset": [ 1, -8] }, + { "rect": [330, 105, 41, 21], "offset": [ 0, -7] }, + { "rect": [357, 230, 11, 21], "offset": [ 0, 0] }, + { "rect": [168, 198, 21, 11], "offset": [-4, -2] }, + { "rect": [168, 215, 21, 11], "offset": [-4, -4] }, + { "rect": [168, 232, 21, 11], "offset": [-4, -6] }, + { "rect": [357, 197, 11, 21], "offset": [ 0, -8] }, + { "rect": [168, 249, 21, 11], "offset": [ 4, -6] }, + { "rect": [168, 266, 21, 11], "offset": [ 4, -4] }, + { "rect": [168, 283, 21, 11], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap18.json b/gamefilesd/level/automap/l1/automap18.json new file mode 100755 index 00000000..7a608de5 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap18.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap18", + "texture": "automap", + "rects": [ + { "rect": [285, 0, 45, 23], "offset": [ 0, -7] }, + { "rect": [285, 23, 45, 23], "offset": [ 0, -7] }, + { "rect": [285, 46, 45, 23], "offset": [ 0, -3] }, + { "rect": [285, 69, 45, 23], "offset": [ 0, -7] }, + { "rect": [285, 92, 45, 23], "offset": [ 0, -7] }, + { "rect": [249, 158, 77, 39], "offset": [ 1, -8] }, + { "rect": [285, 115, 45, 23], "offset": [ 0, -7] }, + { "rect": [346, 230, 11, 23], "offset": [ 0, 0] }, + { "rect": [145, 198, 23, 12], "offset": [-4, -2] }, + { "rect": [145, 215, 23, 12], "offset": [-4, -4] }, + { "rect": [145, 232, 23, 12], "offset": [-4, -6] }, + { "rect": [346, 197, 11, 23], "offset": [ 0, -8] }, + { "rect": [145, 249, 23, 12], "offset": [ 4, -6] }, + { "rect": [145, 266, 23, 12], "offset": [ 4, -4] }, + { "rect": [145, 283, 23, 12], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap20.json b/gamefilesd/level/automap/l1/automap20.json new file mode 100755 index 00000000..532f1df2 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap20.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap20", + "texture": "automap", + "rects": [ + { "rect": [236, 0, 49, 25], "offset": [ 0, -7] }, + { "rect": [236, 25, 49, 25], "offset": [ 0, -7] }, + { "rect": [236, 50, 49, 25], "offset": [ 0, -3] }, + { "rect": [236, 75, 49, 25], "offset": [ 0, -7] }, + { "rect": [236, 100, 49, 25], "offset": [ 0, -7] }, + { "rect": [429, 256, 83, 41], "offset": [ 1, -8] }, + { "rect": [236, 125, 49, 25], "offset": [ 0, -7] }, + { "rect": [333, 230, 13, 25], "offset": [ 0, 0] }, + { "rect": [120, 198, 25, 13], "offset": [-4, -2] }, + { "rect": [120, 215, 25, 13], "offset": [-4, -4] }, + { "rect": [120, 232, 25, 13], "offset": [-4, -6] }, + { "rect": [333, 197, 13, 25], "offset": [ 0, -8] }, + { "rect": [120, 249, 25, 13], "offset": [ 4, -6] }, + { "rect": [120, 266, 25, 13], "offset": [ 4, -4] }, + { "rect": [120, 283, 25, 13], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap23.json b/gamefilesd/level/automap/l1/automap23.json new file mode 100755 index 00000000..b72cbae4 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap23.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap23", + "texture": "automap", + "rects": [ + { "rect": [183, 0, 53, 27], "offset": [ 0, -7] }, + { "rect": [183, 27, 53, 27], "offset": [ 0, -7] }, + { "rect": [183, 54, 53, 27], "offset": [ 0, -3] }, + { "rect": [183, 81, 53, 27], "offset": [ 0, -7] }, + { "rect": [183, 108, 53, 27], "offset": [ 0, -7] }, + { "rect": [338, 255, 91, 45], "offset": [ 1, -8] }, + { "rect": [183, 135, 53, 27], "offset": [ 0, -7] }, + { "rect": [320, 230, 13, 27], "offset": [ 0, 0] }, + { "rect": [93, 198, 27, 14], "offset": [-4, -2] }, + { "rect": [93, 215, 27, 14], "offset": [-4, -4] }, + { "rect": [93, 232, 27, 14], "offset": [-4, -6] }, + { "rect": [320, 197, 13, 27], "offset": [ 0, -8] }, + { "rect": [93, 249, 27, 14], "offset": [ 4, -6] }, + { "rect": [93, 266, 27, 14], "offset": [ 4, -4] }, + { "rect": [93, 283, 27, 14], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap25.json b/gamefilesd/level/automap/l1/automap25.json new file mode 100755 index 00000000..f2cdb27a --- /dev/null +++ b/gamefilesd/level/automap/l1/automap25.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap25", + "texture": "automap", + "rects": [ + { "rect": [126, 0, 57, 29], "offset": [ 0, -7] }, + { "rect": [126, 29, 57, 29], "offset": [ 0, -7] }, + { "rect": [126, 58, 57, 29], "offset": [ 0, -3] }, + { "rect": [126, 87, 57, 29], "offset": [ 0, -7] }, + { "rect": [126, 116, 57, 29], "offset": [ 0, -7] }, + { "rect": [326, 149, 97, 48], "offset": [ 1, -8] }, + { "rect": [126, 145, 57, 29], "offset": [ 0, -7] }, + { "rect": [305, 230, 15, 29], "offset": [ 0, 0] }, + { "rect": [64, 198, 29, 15], "offset": [-4, -2] }, + { "rect": [64, 215, 29, 15], "offset": [-4, -4] }, + { "rect": [64, 232, 29, 15], "offset": [-4, -6] }, + { "rect": [305, 197, 15, 29], "offset": [ 0, -8] }, + { "rect": [64, 249, 29, 15], "offset": [ 4, -6] }, + { "rect": [64, 266, 29, 15], "offset": [ 4, -4] }, + { "rect": [64, 283, 29, 15], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap28.json b/gamefilesd/level/automap/l1/automap28.json new file mode 100755 index 00000000..fe92eb8a --- /dev/null +++ b/gamefilesd/level/automap/l1/automap28.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap28", + "texture": "automap", + "rects": [ + { "rect": [ 65, 0, 61, 31], "offset": [ 0, -30] }, + { "rect": [ 65, 31, 61, 31], "offset": [ 0, -30] }, + { "rect": [ 65, 62, 61, 31], "offset": [ 0, -14] }, + { "rect": [ 65, 93, 61, 31], "offset": [ 0, -30] }, + { "rect": [ 65, 124, 61, 31], "offset": [ 0, -30] }, + { "rect": [429, 203, 105, 53], "offset": [ 1, -31] }, + { "rect": [ 65, 155, 61, 31], "offset": [ 0, -30] }, + { "rect": [290, 230, 15, 31], "offset": [ 0, 0] }, + { "rect": [ 33, 198, 31, 16], "offset": [-15, -7] }, + { "rect": [ 33, 215, 31, 16], "offset": [-15, -15] }, + { "rect": [ 33, 232, 31, 16], "offset": [-15, -23] }, + { "rect": [290, 197, 15, 31], "offset": [ 0, -30] }, + { "rect": [ 33, 249, 31, 16], "offset": [ 15, -23] }, + { "rect": [ 33, 266, 31, 16], "offset": [ 15, -15] }, + { "rect": [ 33, 283, 31, 16], "offset": [ 15, -7] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap3.json b/gamefilesd/level/automap/l1/automap3.json new file mode 100755 index 00000000..1cc90be1 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap3.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap3", + "texture": "automap", + "rects": [ + { "rect": [495, 0, 21, 11], "offset": [ 0, -9] }, + { "rect": [495, 11, 21, 11], "offset": [ 0, -9] }, + { "rect": [495, 22, 21, 11], "offset": [ 0, -5] }, + { "rect": [495, 33, 21, 11], "offset": [ 0, -9] }, + { "rect": [495, 44, 21, 11], "offset": [ 0, -9] }, + { "rect": [499, 79, 35, 18], "offset": [ 2, -9] }, + { "rect": [495, 55, 21, 11], "offset": [ 0, -9] }, + { "rect": [400, 230, 5, 11], "offset": [ 0, 0] }, + { "rect": [253, 198, 11, 6], "offset": [-4, -3] }, + { "rect": [253, 215, 11, 6], "offset": [-4, -5] }, + { "rect": [253, 232, 11, 6], "offset": [-4, -7] }, + { "rect": [400, 197, 5, 11], "offset": [ 0, -9] }, + { "rect": [253, 249, 11, 6], "offset": [ 4, -7] }, + { "rect": [253, 266, 11, 6], "offset": [ 4, -5] }, + { "rect": [253, 283, 11, 6], "offset": [ 4, -3] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap30.json b/gamefilesd/level/automap/l1/automap30.json new file mode 100755 index 00000000..580da5f1 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap30.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap30", + "texture": "automap", + "rects": [ + { "rect": [ 0, 0, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 33, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 66, 65, 33], "offset": [ 0, -15] }, + { "rect": [ 0, 99, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 132, 65, 33], "offset": [ 0, -31] }, + { "rect": [423, 148, 111, 55], "offset": [ 1, -32] }, + { "rect": [ 0, 165, 65, 33], "offset": [ 0, -31] }, + { "rect": [273, 230, 17, 33], "offset": [ 0, 0] }, + { "rect": [ 0, 198, 33, 17], "offset": [-16, -8] }, + { "rect": [ 0, 215, 33, 17], "offset": [-16, -16] }, + { "rect": [ 0, 232, 33, 17], "offset": [-16, -24] }, + { "rect": [273, 197, 17, 33], "offset": [ 0, -32] }, + { "rect": [ 0, 249, 33, 17], "offset": [ 16, -24] }, + { "rect": [ 0, 266, 33, 17], "offset": [ 16, -16] }, + { "rect": [ 0, 283, 33, 17], "offset": [ 16, -8] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap5.json b/gamefilesd/level/automap/l1/automap5.json new file mode 100755 index 00000000..a36cd9f3 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap5.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap5", + "texture": "automap", + "rects": [ + { "rect": [470, 0, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 13, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 26, 25, 13], "offset": [ 0, -5] }, + { "rect": [470, 39, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 52, 25, 13], "offset": [ 0, -11] }, + { "rect": [493, 97, 41, 20], "offset": [ 1, -12] }, + { "rect": [470, 65, 25, 13], "offset": [ 0, -11] }, + { "rect": [393, 230, 7, 13], "offset": [ 0, 0] }, + { "rect": [240, 198, 13, 7], "offset": [-4, -2] }, + { "rect": [240, 215, 13, 7], "offset": [-4, -4] }, + { "rect": [240, 232, 13, 7], "offset": [-4, -6] }, + { "rect": [393, 197, 7, 13], "offset": [ 0, -8] }, + { "rect": [240, 249, 13, 7], "offset": [ 4, -6] }, + { "rect": [240, 266, 13, 7], "offset": [ 4, -4] }, + { "rect": [240, 283, 13, 7], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/automap8.json b/gamefilesd/level/automap/l1/automap8.json new file mode 100755 index 00000000..b3228c65 --- /dev/null +++ b/gamefilesd/level/automap/l1/automap8.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l1Automap8", + "texture": "automap", + "rects": [ + { "rect": [441, 0, 29, 15], "offset": [ 0, -13] }, + { "rect": [441, 15, 29, 15], "offset": [ 0, -13] }, + { "rect": [441, 30, 29, 15], "offset": [ 0, -6] }, + { "rect": [441, 45, 29, 15], "offset": [ 0, -13] }, + { "rect": [441, 60, 29, 15], "offset": [ 0, -13] }, + { "rect": [444, 92, 49, 25], "offset": [ 2, -13] }, + { "rect": [441, 75, 29, 15], "offset": [ 0, -13] }, + { "rect": [386, 230, 7, 15], "offset": [ 0, 0] }, + { "rect": [225, 198, 15, 8], "offset": [-4, -2] }, + { "rect": [225, 215, 15, 8], "offset": [-4, -4] }, + { "rect": [225, 232, 15, 8], "offset": [-4, -6] }, + { "rect": [386, 197, 7, 15], "offset": [ 0, -8] }, + { "rect": [225, 249, 15, 8], "offset": [ 4, -6] }, + { "rect": [225, 266, 15, 8], "offset": [ 4, -4] }, + { "rect": [225, 283, 15, 8], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [9, 2], + [14, 0], + [15, 2], + [16, 2], + [19, 2], + [20, 2], + [21, 2], + [23, 2], + [24, 2], + [30, 6], + [31, 1], + [32, 6], + [34, 0], + [35, 6], + [38, 1], + [39, 6], + [43, 4], + [45, 3], + [47, 0], + [48, 1], + [50, 2], + [56, 2], + [57, 1], + [61, 2], + [62, 1], + [64, 2], + [106, 0], + [107, 1], + [111, 1], + [114, 5], + [126, 0], + [129, 5], + [133, 0], + [137, 0], + [138, 1], + [169, 0], + [174, 1], + [176, 1], + [190, 1], + [192, 1], + [197, 0], + [201, 0], + [203, 0], + [205, 1], + [207, 1], + [208, 2], + [227, 1], + [229, 0], + [231, 1], + [233, 0], + [235, 1], + [237, 0], + [239, 1], + [241, 0], + [243, 0], + [245, 0], + [247, 2], + [253, 2], + [256, 1], + [257, 2], + [260, 1], + [319, 1], + [322, 0], + [323, 2], + [332, 0], + [357, 1], + [361, 1], + [364, 0], + [365, 1], + [368, 0], + [372, 0], + [392, 4], + [394, 3], + [407, 4], + [417, 4], + [420, 3], + [421, 6], + [422, 6], + [424, 6], + [425, 6], + [426, 6], + [427, 6], + [437, 6], + [438, 1], + [439, 6], + [441, 0], + [442, 6], + [445, 1], + [449, 2], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l1/load.json b/gamefilesd/level/automap/l1/load.json new file mode 100755 index 00000000..b06a6635 --- /dev/null +++ b/gamefilesd/level/automap/l1/load.json @@ -0,0 +1,57 @@ +{ + "texturePack": [ + { + "id": "automap0", + "fromId": "l1Automap0" + }, + { + "id": "automap1", + "fromId": "l1Automap3" + }, + { + "id": "automap2", + "fromId": "l1Automap5" + }, + { + "id": "automap3", + "fromId": "l1Automap8" + }, + { + "id": "automap4", + "fromId": "l1Automap10" + }, + { + "id": "automap5", + "fromId": "l1Automap13" + }, + { + "id": "automap6", + "fromId": "l1Automap15" + }, + { + "id": "automap7", + "fromId": "l1Automap18" + }, + { + "id": "automap8", + "fromId": "l1Automap20" + }, + { + "id": "automap9", + "fromId": "l1Automap23" + }, + { + "id": "automap10", + "fromId": "l1Automap25" + }, + { + "id": "automap11", + "fromId": "l1Automap28" + }, + { + "id": "automap12", + "fromId": "l1Automap30" + } + ], + "action": "updateAutomapZoom" +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l2/automap0.json b/gamefilesd/level/automap/l2/automap0.json new file mode 100755 index 00000000..b03a237b --- /dev/null +++ b/gamefilesd/level/automap/l2/automap0.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l2Automap0", + "texture": "automap", + "rects": [ + { "rect": [516, 0, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 9, 17, 9], "offset": [-8, -3] }, + { "rect": [516, 18, 17, 9], "offset": [ 0, -3] }, + { "rect": [516, 27, 17, 9], "offset": [ 8, -3] }, + { "rect": [516, 36, 17, 9], "offset": [-8, -3] }, + { "rect": [507, 66, 27, 13], "offset": [-7, 4] }, + { "rect": [516, 45, 17, 9], "offset": [ 0, -7] }, + { "rect": [405, 230, 5, 9], "offset": [ 0, 0] }, + { "rect": [264, 198, 9, 5], "offset": [-4, -2] }, + { "rect": [264, 215, 9, 5], "offset": [-4, -4] }, + { "rect": [264, 232, 9, 5], "offset": [-4, -6] }, + { "rect": [405, 197, 5, 9], "offset": [ 0, -8] }, + { "rect": [264, 249, 9, 5], "offset": [ 4, -6] }, + { "rect": [264, 266, 9, 5], "offset": [ 4, -4] }, + { "rect": [264, 283, 9, 5], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [0, 1], + [5, 0], + [12, 4], + [16, 3], + [24, 1], + [28, 1], + [29, 0], + [33, 0], + [36, 1], + [37, 6], + [39, 6], + [41, 0], + [42, 6], + [43, 6], + [44, 1], + [45, 0], + [47, 1], + [50, 0], + [51, 6], + [53, 6], + [59, 1], + [63, 1], + [68, 0], + [72, 0], + [75, 1], + [79, 1], + [85, 1], + [89, 1], + [93, 1], + [98, 0], + [103, 0], + [107, 0], + [111, 0], + [126, 1], + [127, 0], + [130, 2], + [137, 2], + [133, 2], + [140, 2], + [142, 1], + [169, 1], + [173, 1], + [177, 4], + [181, 1], + [182, 0], + [186, 0], + [190, 0], + [194, 0], + [233, 1], + [237, 1], + [241, 1], + [253, 0], + [257, 0], + [261, 0], + [265, 5], + [268, 5], + [274, 1], + [278, 1], + [282, 1], + [291, 0], + [295, 0], + [299, 0], + [302, 1], + [303, 0], + [413, 1], + [417, 1], + [422, 0], + [426, 0], + [445, 1], + [449, 1], + [454, 0], + [458, 0], + [477, 1], + [481, 1], + [494, 0], + [498, 0], + [509, 1], + [514, 0], + [519, 1], + [520, 6], + [522, 6], + [524, 0], + [525, 6], + [527, 1], + [528, 0], + [530, 1], + [533, 0], + [537, 4], + [539, 3], + [550, 4], + [557, 5], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l2/automap30.json b/gamefilesd/level/automap/l2/automap30.json new file mode 100755 index 00000000..271af849 --- /dev/null +++ b/gamefilesd/level/automap/l2/automap30.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l2Automap30", + "texture": "automap", + "rects": [ + { "rect": [ 0, 0, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 33, 65, 33], "offset": [-32, -15] }, + { "rect": [ 0, 66, 65, 33], "offset": [ 0, -15] }, + { "rect": [ 0, 99, 65, 33], "offset": [ 32, -15] }, + { "rect": [ 0, 132, 65, 33], "offset": [-32, -15] }, + { "rect": [423, 148, 111, 55], "offset": [-31, 16] }, + { "rect": [ 0, 165, 65, 33], "offset": [ 0, -31] }, + { "rect": [273, 230, 17, 33], "offset": [ 0, 0] }, + { "rect": [ 0, 198, 33, 17], "offset": [-16, -8] }, + { "rect": [ 0, 215, 33, 17], "offset": [-16, -16] }, + { "rect": [ 0, 232, 33, 17], "offset": [-16, -24] }, + { "rect": [273, 197, 17, 33], "offset": [ 0, -32] }, + { "rect": [ 0, 249, 33, 17], "offset": [ 16, -24] }, + { "rect": [ 0, 266, 33, 17], "offset": [ 16, -16] }, + { "rect": [ 0, 283, 33, 17], "offset": [ 16, -8] } + ], + "textureIndexes": [ + [0, 1], + [5, 0], + [12, 4], + [16, 3], + [24, 1], + [28, 1], + [29, 0], + [33, 0], + [36, 1], + [37, 6], + [39, 6], + [41, 0], + [42, 6], + [43, 6], + [44, 1], + [45, 0], + [47, 1], + [50, 0], + [51, 6], + [53, 6], + [59, 1], + [63, 1], + [68, 0], + [72, 0], + [75, 1], + [79, 1], + [85, 1], + [89, 1], + [93, 1], + [98, 0], + [103, 0], + [107, 0], + [111, 0], + [126, 1], + [127, 0], + [130, 2], + [137, 2], + [133, 2], + [140, 2], + [142, 1], + [169, 1], + [173, 1], + [177, 4], + [181, 1], + [182, 0], + [186, 0], + [190, 0], + [194, 0], + [233, 1], + [237, 1], + [241, 1], + [253, 0], + [257, 0], + [261, 0], + [265, 5], + [268, 5], + [274, 1], + [278, 1], + [282, 1], + [291, 0], + [295, 0], + [299, 0], + [302, 1], + [303, 0], + [413, 1], + [417, 1], + [422, 0], + [426, 0], + [445, 1], + [449, 1], + [454, 0], + [458, 0], + [477, 1], + [481, 1], + [494, 0], + [498, 0], + [509, 1], + [514, 0], + [519, 1], + [520, 6], + [522, 6], + [524, 0], + [525, 6], + [527, 1], + [528, 0], + [530, 1], + [533, 0], + [537, 4], + [539, 3], + [550, 4], + [557, 5], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l2/automap5.json b/gamefilesd/level/automap/l2/automap5.json new file mode 100755 index 00000000..9c7f581b --- /dev/null +++ b/gamefilesd/level/automap/l2/automap5.json @@ -0,0 +1,124 @@ +{ + "texturePack": { + "id": "l2Automap5", + "texture": "automap", + "rects": [ + { "rect": [470, 0, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 13, 25, 13], "offset": [-12, -5] }, + { "rect": [470, 26, 25, 13], "offset": [ 0, -5] }, + { "rect": [470, 39, 25, 13], "offset": [ 12, -5] }, + { "rect": [470, 52, 25, 13], "offset": [-12, -5] }, + { "rect": [493, 97, 41, 20], "offset": [-11, 6] }, + { "rect": [470, 65, 25, 13], "offset": [ 0, -11] }, + { "rect": [393, 230, 7, 13], "offset": [ 0, 0] }, + { "rect": [240, 198, 13, 7], "offset": [ -4, -2] }, + { "rect": [240, 215, 13, 7], "offset": [ -4, -4] }, + { "rect": [240, 232, 13, 7], "offset": [ -4, -6] }, + { "rect": [393, 197, 7, 13], "offset": [ 0, -8] }, + { "rect": [240, 249, 13, 7], "offset": [ 4, -6] }, + { "rect": [240, 266, 13, 7], "offset": [ 4, -4] }, + { "rect": [240, 283, 13, 7], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [0, 1], + [5, 0], + [12, 4], + [16, 3], + [24, 1], + [28, 1], + [29, 0], + [33, 0], + [36, 1], + [37, 6], + [39, 6], + [41, 0], + [42, 6], + [43, 6], + [44, 1], + [45, 0], + [47, 1], + [50, 0], + [51, 6], + [53, 6], + [59, 1], + [63, 1], + [68, 0], + [72, 0], + [75, 1], + [79, 1], + [85, 1], + [89, 1], + [93, 1], + [98, 0], + [103, 0], + [107, 0], + [111, 0], + [126, 1], + [127, 0], + [130, 2], + [137, 2], + [133, 2], + [140, 2], + [142, 1], + [169, 1], + [173, 1], + [177, 4], + [181, 1], + [182, 0], + [186, 0], + [190, 0], + [194, 0], + [233, 1], + [237, 1], + [241, 1], + [253, 0], + [257, 0], + [261, 0], + [265, 5], + [268, 5], + [274, 1], + [278, 1], + [282, 1], + [291, 0], + [295, 0], + [299, 0], + [302, 1], + [303, 0], + [413, 1], + [417, 1], + [422, 0], + [426, 0], + [445, 1], + [449, 1], + [454, 0], + [458, 0], + [477, 1], + [481, 1], + [494, 0], + [498, 0], + [509, 1], + [514, 0], + [519, 1], + [520, 6], + [522, 6], + [524, 0], + [525, 6], + [527, 1], + [528, 0], + [530, 1], + [533, 0], + [537, 4], + [539, 3], + [550, 4], + [557, 5], + [1024, 7], + [1025, 8], + [1026, 9], + [1027, 10], + [1028, 11], + [1029, 12], + [1030, 13], + [1031, 14] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l2/load.json b/gamefilesd/level/automap/l2/load.json new file mode 100755 index 00000000..0d22604e --- /dev/null +++ b/gamefilesd/level/automap/l2/load.json @@ -0,0 +1,57 @@ +{ + "texturePack": [ + { + "id": "automap0", + "fromId": "l2Automap0" + }, + { + "id": "automap1", + "fromId": "l2Automap3" + }, + { + "id": "automap2", + "fromId": "l2Automap5" + }, + { + "id": "automap3", + "fromId": "l2Automap8" + }, + { + "id": "automap4", + "fromId": "l2Automap10" + }, + { + "id": "automap5", + "fromId": "l2Automap13" + }, + { + "id": "automap6", + "fromId": "l2Automap15" + }, + { + "id": "automap7", + "fromId": "l2Automap18" + }, + { + "id": "automap8", + "fromId": "l2Automap20" + }, + { + "id": "automap9", + "fromId": "l2Automap23" + }, + { + "id": "automap10", + "fromId": "l2Automap25" + }, + { + "id": "automap11", + "fromId": "l2Automap28" + }, + { + "id": "automap12", + "fromId": "l2Automap30" + } + ], + "action": "updateAutomapZoom" +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l3/automap0.json b/gamefilesd/level/automap/l3/automap0.json new file mode 100755 index 00000000..f85ab0aa --- /dev/null +++ b/gamefilesd/level/automap/l3/automap0.json @@ -0,0 +1,190 @@ +{ + "texturePack": { + "id": "l3Automap0", + "texture": "automap", + "rects": [ + { "rect": [516, 0, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 9, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 18, 17, 9], "offset": [ 0, -3] }, + { "rect": [516, 27, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 36, 17, 9], "offset": [ 0, -7] }, + { "rect": [507, 66, 27, 13], "offset": [ 1, 0] }, + { "rect": [516, 45, 17, 9], "offset": [ 0, -7] }, + { "rect": [524, 0, 9, 9], "offset": [ 7, -7] }, + { "rect": [524, 9, 9, 9], "offset": [ 0, -3] }, + { "rect": [516, 18, 17, 5], "offset": [ 0, -7] }, + { "rect": [524, 0, 9, 9], "offset": [-1, -11] }, + { "rect": [524, 9, 9, 9], "offset": [ 8, -7] }, + { "rect": [507, 66, 27, 13], "offset": [-7, -4] }, + { "rect": [405, 230, 5, 9], "offset": [ 0, 0] }, + { "rect": [264, 198, 9, 5], "offset": [-4, -2] }, + { "rect": [264, 215, 9, 5], "offset": [-4, -4] }, + { "rect": [264, 232, 9, 5], "offset": [-4, -6] }, + { "rect": [405, 197, 5, 9], "offset": [ 0, -8] }, + { "rect": [264, 249, 9, 5], "offset": [ 4, -6] }, + { "rect": [264, 266, 9, 5], "offset": [ 4, -4] }, + { "rect": [264, 283, 9, 5], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [0, 1], + [2, 7], + [3, 7], + [6, 0], + [7, 7], + [8, 0], + [9, 8], + [11, 8], + [13, 1], + [15, 8], + [19, 9], + [21, 1], + [22, 0], + [27, 6], + [28, 6], + [29, 6], + [30, 6], + [33, 1], + [35, 0], + [36, 7], + [39, 7], + [40, 7], + [41, 1], + [48, 7], + [53, 8], + [89, 1], + [91, 0], + [147, 0], + [148, 0], + [150, 1], + [152, 8], + [161, 1], + [163, 1], + [165, 1], + [167, 5], + [169, 5], + [171, 5], + [174, 10], + [177, 6], + [178, 6], + [179, 6], + [180, 6], + [181, 6], + [182, 6], + [183, 2], + [187, 2], + [191, 2], + [243, 2], + [249, 1], + [251, 0], + [252, 0], + [314, 1], + [316, 6], + [317, 6], + [319, 0], + [320, 1], + [323, 0], + [326, 6], + [327, 6], + [328, 6], + [329, 6], + [330, 6], + [331, 6], + [334, 1], + [336, 6], + [337, 6], + [338, 6], + [340, 0], + [341, 1], + [343, 7], + [344, 7], + [347, 6], + [348, 6], + [349, 6], + [350, 6], + [351, 6], + [352, 6], + [353, 6], + [354, 6], + [355, 6], + [356, 6], + [357, 6], + [358, 6], + [359, 6], + [360, 6], + [361, 6], + [362, 6], + [363, 6], + [364, 6], + [365, 8], + [367, 7], + [378, 1], + [371, 0], + [372, 7], + [373, 0], + [374, 8], + [376, 8], + [380, 1], + [381, 1], + [382, 0], + [398, 1], + [400, 0], + [401, 7], + [438, 1], + [440, 1], + [442, 1], + [446, 1], + [448, 1], + [450, 1], + [453, 0], + [454, 1], + [456, 0], + [460, 0], + [461, 0], + [464, 0], + [465, 0], + [468, 0], + [469, 0], + [474, 1], + [475, 10], + [476, 0], + [477, 0], + [479, 11], + [480, 8], + [482, 7], + [484, 0], + [485, 7], + [487, 11], + [490, 0], + [498, 0], + [493, 1], + [501, 1], + [505, 1], + [506, 0], + [509, 1], + [510, 7], + [512, 0], + [513, 1], + [514, 1], + [515, 0], + [530, 3], + [533, 4], + [537, 3], + [540, 4], + [550, 12], + [552, 0], + [555, 6], + [556, 6], + [557, 6], + [558, 6], + [559, 6], + [1024, 13], + [1025, 14], + [1026, 15], + [1027, 16], + [1028, 17], + [1029, 18], + [1030, 19], + [1031, 20] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l3/automap30.json b/gamefilesd/level/automap/l3/automap30.json new file mode 100755 index 00000000..bb327e00 --- /dev/null +++ b/gamefilesd/level/automap/l3/automap30.json @@ -0,0 +1,190 @@ +{ + "texturePack": { + "id": "l3Automap30", + "texture": "automap", + "rects": [ + { "rect": [ 0, 0, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 33, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 66, 65, 33], "offset": [ 0, -15] }, + { "rect": [ 0, 99, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 132, 65, 33], "offset": [ 0, -31] }, + { "rect": [423, 148, 111, 55], "offset": [ 1, 0] }, + { "rect": [ 0, 165, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 16, 0, 33, 33], "offset": [ 32, -23] }, + { "rect": [ 16, 33, 33, 33], "offset": [ 0, -23] }, + { "rect": [ 0, 66, 65, 16], "offset": [ 0, -32] }, + { "rect": [ 16, 0, 33, 33], "offset": [ 0, -39] }, + { "rect": [ 16, 33, 33, 33], "offset": [ 32, -39] }, + { "rect": [423, 148, 111, 55], "offset": [-31, -16] }, + { "rect": [273, 230, 17, 33], "offset": [ 0, 0] }, + { "rect": [ 0, 198, 33, 17], "offset": [-16, -8] }, + { "rect": [ 0, 215, 33, 17], "offset": [-16, -16] }, + { "rect": [ 0, 232, 33, 17], "offset": [-16, -24] }, + { "rect": [273, 197, 17, 33], "offset": [ 0, -32] }, + { "rect": [ 0, 249, 33, 17], "offset": [ 16, -24] }, + { "rect": [ 0, 266, 33, 17], "offset": [ 16, -16] }, + { "rect": [ 0, 283, 33, 17], "offset": [ 16, -8] } + ], + "textureIndexes": [ + [0, 1], + [2, 7], + [3, 7], + [6, 0], + [7, 7], + [8, 0], + [9, 8], + [11, 8], + [13, 1], + [15, 8], + [19, 9], + [21, 1], + [22, 0], + [27, 6], + [28, 6], + [29, 6], + [30, 6], + [33, 1], + [35, 0], + [36, 7], + [39, 7], + [40, 7], + [41, 1], + [48, 7], + [53, 8], + [89, 1], + [91, 0], + [147, 0], + [148, 0], + [150, 1], + [152, 8], + [161, 1], + [163, 1], + [165, 1], + [167, 5], + [169, 5], + [171, 5], + [174, 10], + [177, 6], + [178, 6], + [179, 6], + [180, 6], + [181, 6], + [182, 6], + [183, 2], + [187, 2], + [191, 2], + [243, 2], + [249, 1], + [251, 0], + [252, 0], + [314, 1], + [316, 6], + [317, 6], + [319, 0], + [320, 1], + [323, 0], + [326, 6], + [327, 6], + [328, 6], + [329, 6], + [330, 6], + [331, 6], + [334, 1], + [336, 6], + [337, 6], + [338, 6], + [340, 0], + [341, 1], + [343, 7], + [344, 7], + [347, 6], + [348, 6], + [349, 6], + [350, 6], + [351, 6], + [352, 6], + [353, 6], + [354, 6], + [355, 6], + [356, 6], + [357, 6], + [358, 6], + [359, 6], + [360, 6], + [361, 6], + [362, 6], + [363, 6], + [364, 6], + [365, 8], + [367, 7], + [378, 1], + [371, 0], + [372, 7], + [373, 0], + [374, 8], + [376, 8], + [380, 1], + [381, 1], + [382, 0], + [398, 1], + [400, 0], + [401, 7], + [438, 1], + [440, 1], + [442, 1], + [446, 1], + [448, 1], + [450, 1], + [453, 0], + [454, 1], + [456, 0], + [460, 0], + [461, 0], + [464, 0], + [465, 0], + [468, 0], + [469, 0], + [474, 1], + [475, 10], + [476, 0], + [477, 0], + [479, 11], + [480, 8], + [482, 7], + [484, 0], + [485, 7], + [487, 11], + [490, 0], + [498, 0], + [493, 1], + [501, 1], + [505, 1], + [506, 0], + [509, 1], + [510, 7], + [512, 0], + [513, 1], + [514, 1], + [515, 0], + [530, 3], + [533, 4], + [537, 3], + [540, 4], + [550, 12], + [552, 0], + [555, 6], + [556, 6], + [557, 6], + [558, 6], + [559, 6], + [1024, 13], + [1025, 14], + [1026, 15], + [1027, 16], + [1028, 17], + [1029, 18], + [1030, 19], + [1031, 20] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l3/automap5.json b/gamefilesd/level/automap/l3/automap5.json new file mode 100755 index 00000000..5a378761 --- /dev/null +++ b/gamefilesd/level/automap/l3/automap5.json @@ -0,0 +1,190 @@ +{ + "texturePack": { + "id": "l3Automap5", + "texture": "automap", + "rects": [ + { "rect": [470, 0, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 13, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 26, 25, 13], "offset": [ 0, -5] }, + { "rect": [470, 39, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 52, 25, 13], "offset": [ 0, -11] }, + { "rect": [493, 97, 41, 20], "offset": [ 1, 0] }, + { "rect": [470, 65, 25, 13], "offset": [ 0, -11] }, + { "rect": [482, 0, 13, 13], "offset": [ 11, -11] }, + { "rect": [482, 13, 13, 13], "offset": [ 0, -5] }, + { "rect": [470, 26, 25, 6], "offset": [ 0, -12] }, + { "rect": [482, 0, 13, 13], "offset": [ -1, -17] }, + { "rect": [482, 13, 13, 13], "offset": [ 12, -11] }, + { "rect": [493, 97, 41, 20], "offset": [-11, -5] }, + { "rect": [393, 230, 7, 13], "offset": [ 0, 0] }, + { "rect": [240, 198, 13, 7], "offset": [ -4, -2] }, + { "rect": [240, 215, 13, 7], "offset": [ -4, -4] }, + { "rect": [240, 232, 13, 7], "offset": [ -4, -6] }, + { "rect": [393, 197, 7, 13], "offset": [ 0, -8] }, + { "rect": [240, 249, 13, 7], "offset": [ 4, -6] }, + { "rect": [240, 266, 13, 7], "offset": [ 4, -4] }, + { "rect": [240, 283, 13, 7], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [0, 1], + [2, 7], + [3, 7], + [6, 0], + [7, 7], + [8, 0], + [9, 8], + [11, 8], + [13, 1], + [15, 8], + [19, 9], + [21, 1], + [22, 0], + [27, 6], + [28, 6], + [29, 6], + [30, 6], + [33, 1], + [35, 0], + [36, 7], + [39, 7], + [40, 7], + [41, 1], + [48, 7], + [53, 8], + [89, 1], + [91, 0], + [147, 0], + [148, 0], + [150, 1], + [152, 8], + [161, 1], + [163, 1], + [165, 1], + [167, 5], + [169, 5], + [171, 5], + [174, 10], + [177, 6], + [178, 6], + [179, 6], + [180, 6], + [181, 6], + [182, 6], + [183, 2], + [187, 2], + [191, 2], + [243, 2], + [249, 1], + [251, 0], + [252, 0], + [314, 1], + [316, 6], + [317, 6], + [319, 0], + [320, 1], + [323, 0], + [326, 6], + [327, 6], + [328, 6], + [329, 6], + [330, 6], + [331, 6], + [334, 1], + [336, 6], + [337, 6], + [338, 6], + [340, 0], + [341, 1], + [343, 7], + [344, 7], + [347, 6], + [348, 6], + [349, 6], + [350, 6], + [351, 6], + [352, 6], + [353, 6], + [354, 6], + [355, 6], + [356, 6], + [357, 6], + [358, 6], + [359, 6], + [360, 6], + [361, 6], + [362, 6], + [363, 6], + [364, 6], + [365, 8], + [367, 7], + [378, 1], + [371, 0], + [372, 7], + [373, 0], + [374, 8], + [376, 8], + [380, 1], + [381, 1], + [382, 0], + [398, 1], + [400, 0], + [401, 7], + [438, 1], + [440, 1], + [442, 1], + [446, 1], + [448, 1], + [450, 1], + [453, 0], + [454, 1], + [456, 0], + [460, 0], + [461, 0], + [464, 0], + [465, 0], + [468, 0], + [469, 0], + [474, 1], + [475, 10], + [476, 0], + [477, 0], + [479, 11], + [480, 8], + [482, 7], + [484, 0], + [485, 7], + [487, 11], + [490, 0], + [498, 0], + [493, 1], + [501, 1], + [505, 1], + [506, 0], + [509, 1], + [510, 7], + [512, 0], + [513, 1], + [514, 1], + [515, 0], + [530, 3], + [533, 4], + [537, 3], + [540, 4], + [550, 12], + [552, 0], + [555, 6], + [556, 6], + [557, 6], + [558, 6], + [559, 6], + [1024, 13], + [1025, 14], + [1026, 15], + [1027, 16], + [1028, 17], + [1029, 18], + [1030, 19], + [1031, 20] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l3/load.json b/gamefilesd/level/automap/l3/load.json new file mode 100755 index 00000000..0f1ce453 --- /dev/null +++ b/gamefilesd/level/automap/l3/load.json @@ -0,0 +1,57 @@ +{ + "texturePack": [ + { + "id": "automap0", + "fromId": "l3Automap0" + }, + { + "id": "automap1", + "fromId": "l3Automap3" + }, + { + "id": "automap2", + "fromId": "l3Automap5" + }, + { + "id": "automap3", + "fromId": "l3Automap8" + }, + { + "id": "automap4", + "fromId": "l3Automap10" + }, + { + "id": "automap5", + "fromId": "l3Automap13" + }, + { + "id": "automap6", + "fromId": "l3Automap15" + }, + { + "id": "automap7", + "fromId": "l3Automap18" + }, + { + "id": "automap8", + "fromId": "l3Automap20" + }, + { + "id": "automap9", + "fromId": "l3Automap23" + }, + { + "id": "automap10", + "fromId": "l3Automap25" + }, + { + "id": "automap11", + "fromId": "l3Automap28" + }, + { + "id": "automap12", + "fromId": "l3Automap30" + } + ], + "action": "updateAutomapZoom" +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l4/automap0.json b/gamefilesd/level/automap/l4/automap0.json new file mode 100755 index 00000000..5679d808 --- /dev/null +++ b/gamefilesd/level/automap/l4/automap0.json @@ -0,0 +1,121 @@ +{ + "texturePack": { + "id": "l4Automap0", + "texture": "automap", + "rects": [ + { "rect": [516, 0, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 9, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 18, 17, 9], "offset": [ 0, -3] }, + { "rect": [516, 27, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 36, 17, 9], "offset": [ 0, -7] }, + { "rect": [507, 66, 27, 13], "offset": [-7, -4] }, + { "rect": [507, 66, 27, 13], "offset": [-7, 4] }, + { "rect": [516, 45, 17, 9], "offset": [ 0, -7] }, + { "rect": [405, 230, 5, 9], "offset": [ 0, 0] }, + { "rect": [264, 198, 9, 5], "offset": [-4, -2] }, + { "rect": [264, 215, 9, 5], "offset": [-4, -4] }, + { "rect": [264, 232, 9, 5], "offset": [-4, -6] }, + { "rect": [405, 197, 5, 9], "offset": [ 0, -8] }, + { "rect": [264, 249, 9, 5], "offset": [ 4, -6] }, + { "rect": [264, 266, 9, 5], "offset": [ 4, -4] }, + { "rect": [264, 283, 9, 5], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [7, 2], + [22, 1], + [24, 0], + [27, 0], + [28, 1], + [30, 0], + [32, 1], + [38, 0], + [43, 1], + [46, 7], + [47, 1], + [48, 7], + [50, 0], + [51, 7], + [52, 7], + [53, 7], + [54, 7], + [56, 0], + [57, 1], + [59, 0], + [60, 1], + [62, 0], + [63, 1], + [65, 7], + [66, 7], + [69, 1], + [71, 0], + [74, 0], + [75, 7], + [77, 7], + [92, 5], + [96, 5], + [100, 5], + [104, 5], + [108, 5], + [112, 5], + [113, 6], + [117, 6], + [125, 6], + [129, 6], + [133, 6], + [140, 6], + [162, 2], + [166, 2], + [176, 2], + [179, 2], + [189, 1], + [192, 0], + [197, 1], + [200, 0], + [205, 1], + [209, 1], + [212, 0], + [216, 0], + [227, 2], + [244, 0], + [246, 1], + [248, 0], + [249, 1], + [385, 7], + [386, 1], + [387, 7], + [389, 0], + [390, 7], + [391, 7], + [392, 7], + [393, 7], + [395, 0], + [396, 1], + [398, 0], + [399, 1], + [401, 0], + [402, 1], + [404, 7], + [405, 7], + [408, 1], + [413, 0], + [414, 7], + [416, 7], + [431, 5], + [435, 5], + [439, 5], + [443, 5], + [447, 5], + [451, 5], + [1024, 8], + [1025, 9], + [1026, 10], + [1027, 11], + [1028, 12], + [1029, 13], + [1030, 14], + [1031, 15] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l4/automap30.json b/gamefilesd/level/automap/l4/automap30.json new file mode 100755 index 00000000..2954d97e --- /dev/null +++ b/gamefilesd/level/automap/l4/automap30.json @@ -0,0 +1,121 @@ +{ + "texturePack": { + "id": "l4Automap30", + "texture": "automap", + "rects": [ + { "rect": [ 0, 0, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 33, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 66, 65, 33], "offset": [ 0, -15] }, + { "rect": [ 0, 99, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 132, 65, 33], "offset": [ 0, -31] }, + { "rect": [423, 148, 111, 55], "offset": [-31, -16] }, + { "rect": [423, 148, 111, 55], "offset": [-31, 16] }, + { "rect": [ 0, 165, 65, 33], "offset": [ 0, -31] }, + { "rect": [273, 230, 17, 33], "offset": [ 0, 0] }, + { "rect": [ 0, 198, 33, 17], "offset": [-16, -8] }, + { "rect": [ 0, 215, 33, 17], "offset": [-16, -16] }, + { "rect": [ 0, 232, 33, 17], "offset": [-16, -24] }, + { "rect": [273, 197, 17, 33], "offset": [ 0, -32] }, + { "rect": [ 0, 249, 33, 17], "offset": [ 16, -24] }, + { "rect": [ 0, 266, 33, 17], "offset": [ 16, -16] }, + { "rect": [ 0, 283, 33, 17], "offset": [ 16, -8] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [7, 2], + [22, 1], + [24, 0], + [27, 0], + [28, 1], + [30, 0], + [32, 1], + [38, 0], + [43, 1], + [46, 7], + [47, 1], + [48, 7], + [50, 0], + [51, 7], + [52, 7], + [53, 7], + [54, 7], + [56, 0], + [57, 1], + [59, 0], + [60, 1], + [62, 0], + [63, 1], + [65, 7], + [66, 7], + [69, 1], + [71, 0], + [74, 0], + [75, 7], + [77, 7], + [92, 5], + [96, 5], + [100, 5], + [104, 5], + [108, 5], + [112, 5], + [113, 6], + [117, 6], + [125, 6], + [129, 6], + [133, 6], + [140, 6], + [162, 2], + [166, 2], + [176, 2], + [179, 2], + [189, 1], + [192, 0], + [197, 1], + [200, 0], + [205, 1], + [209, 1], + [212, 0], + [216, 0], + [227, 2], + [244, 0], + [246, 1], + [248, 0], + [249, 1], + [385, 7], + [386, 1], + [387, 7], + [389, 0], + [390, 7], + [391, 7], + [392, 7], + [393, 7], + [395, 0], + [396, 1], + [398, 0], + [399, 1], + [401, 0], + [402, 1], + [404, 7], + [405, 7], + [408, 1], + [413, 0], + [414, 7], + [416, 7], + [431, 5], + [435, 5], + [439, 5], + [443, 5], + [447, 5], + [451, 5], + [1024, 8], + [1025, 9], + [1026, 10], + [1027, 11], + [1028, 12], + [1029, 13], + [1030, 14], + [1031, 15] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l4/automap5.json b/gamefilesd/level/automap/l4/automap5.json new file mode 100755 index 00000000..5caa6ed9 --- /dev/null +++ b/gamefilesd/level/automap/l4/automap5.json @@ -0,0 +1,121 @@ +{ + "texturePack": { + "id": "l4Automap5", + "texture": "automap", + "rects": [ + { "rect": [470, 0, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 13, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 26, 25, 13], "offset": [ 0, -5] }, + { "rect": [470, 39, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 52, 25, 13], "offset": [ 0, -11] }, + { "rect": [493, 97, 41, 20], "offset": [-11, -6] }, + { "rect": [493, 97, 41, 20], "offset": [-11, 6] }, + { "rect": [470, 65, 25, 13], "offset": [ 0, -11] }, + { "rect": [393, 230, 7, 13], "offset": [ 0, 0] }, + { "rect": [240, 198, 13, 7], "offset": [-4, -2] }, + { "rect": [240, 215, 13, 7], "offset": [-4, -4] }, + { "rect": [240, 232, 13, 7], "offset": [-4, -6] }, + { "rect": [393, 197, 7, 13], "offset": [ 0, -8] }, + { "rect": [240, 249, 13, 7], "offset": [ 4, -6] }, + { "rect": [240, 266, 13, 7], "offset": [ 4, -4] }, + { "rect": [240, 283, 13, 7], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [7, 2], + [22, 1], + [24, 0], + [27, 0], + [28, 1], + [30, 0], + [32, 1], + [38, 0], + [43, 1], + [46, 7], + [47, 1], + [48, 7], + [50, 0], + [51, 7], + [52, 7], + [53, 7], + [54, 7], + [56, 0], + [57, 1], + [59, 0], + [60, 1], + [62, 0], + [63, 1], + [65, 7], + [66, 7], + [69, 1], + [71, 0], + [74, 0], + [75, 7], + [77, 7], + [92, 5], + [96, 5], + [100, 5], + [104, 5], + [108, 5], + [112, 5], + [113, 6], + [117, 6], + [125, 6], + [129, 6], + [133, 6], + [140, 6], + [162, 2], + [166, 2], + [176, 2], + [179, 2], + [189, 1], + [192, 0], + [197, 1], + [200, 0], + [205, 1], + [209, 1], + [212, 0], + [216, 0], + [227, 2], + [244, 0], + [246, 1], + [248, 0], + [249, 1], + [385, 7], + [386, 1], + [387, 7], + [389, 0], + [390, 7], + [391, 7], + [392, 7], + [393, 7], + [395, 0], + [396, 1], + [398, 0], + [399, 1], + [401, 0], + [402, 1], + [404, 7], + [405, 7], + [408, 1], + [413, 0], + [414, 7], + [416, 7], + [431, 5], + [435, 5], + [439, 5], + [443, 5], + [447, 5], + [451, 5], + [1024, 8], + [1025, 9], + [1026, 10], + [1027, 11], + [1028, 12], + [1029, 13], + [1030, 14], + [1031, 15] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/automap/l4/load.json b/gamefilesd/level/automap/l4/load.json new file mode 100755 index 00000000..858c4bac --- /dev/null +++ b/gamefilesd/level/automap/l4/load.json @@ -0,0 +1,57 @@ +{ + "texturePack": [ + { + "id": "automap0", + "fromId": "l4Automap0" + }, + { + "id": "automap1", + "fromId": "l4Automap3" + }, + { + "id": "automap2", + "fromId": "l4Automap5" + }, + { + "id": "automap3", + "fromId": "l4Automap8" + }, + { + "id": "automap4", + "fromId": "l4Automap10" + }, + { + "id": "automap5", + "fromId": "l4Automap13" + }, + { + "id": "automap6", + "fromId": "l4Automap15" + }, + { + "id": "automap7", + "fromId": "l4Automap18" + }, + { + "id": "automap8", + "fromId": "l4Automap20" + }, + { + "id": "automap9", + "fromId": "l4Automap23" + }, + { + "id": "automap10", + "fromId": "l4Automap25" + }, + { + "id": "automap11", + "fromId": "l4Automap28" + }, + { + "id": "automap12", + "fromId": "l4Automap30" + } + ], + "action": "updateAutomapZoom" +} \ No newline at end of file diff --git a/gamefilesd/level/automap/loadAll.json b/gamefilesd/level/automap/loadAll.json new file mode 100755 index 00000000..6de128a8 --- /dev/null +++ b/gamefilesd/level/automap/loadAll.json @@ -0,0 +1,54 @@ +{ + "load": "level/automap/l1/automap0.json", + "load": "level/automap/l1/automap3.json", + "load": "level/automap/l1/automap5.json", + "load": "level/automap/l1/automap8.json", + "load": "level/automap/l1/automap10.json", + "load": "level/automap/l1/automap13.json", + "load": "level/automap/l1/automap15.json", + "load": "level/automap/l1/automap18.json", + "load": "level/automap/l1/automap20.json", + "load": "level/automap/l1/automap23.json", + "load": "level/automap/l1/automap25.json", + "load": "level/automap/l1/automap28.json", + "load": "level/automap/l1/automap30.json", + "load": "level/automap/l2/automap0.json", + "load": "level/automap/l2/automap3.json", + "load": "level/automap/l2/automap5.json", + "load": "level/automap/l2/automap8.json", + "load": "level/automap/l2/automap10.json", + "load": "level/automap/l2/automap13.json", + "load": "level/automap/l2/automap15.json", + "load": "level/automap/l2/automap18.json", + "load": "level/automap/l2/automap20.json", + "load": "level/automap/l2/automap23.json", + "load": "level/automap/l2/automap25.json", + "load": "level/automap/l2/automap28.json", + "load": "level/automap/l2/automap30.json", + "load": "level/automap/l3/automap0.json", + "load": "level/automap/l3/automap3.json", + "load": "level/automap/l3/automap5.json", + "load": "level/automap/l3/automap8.json", + "load": "level/automap/l3/automap10.json", + "load": "level/automap/l3/automap13.json", + "load": "level/automap/l3/automap15.json", + "load": "level/automap/l3/automap18.json", + "load": "level/automap/l3/automap20.json", + "load": "level/automap/l3/automap23.json", + "load": "level/automap/l3/automap25.json", + "load": "level/automap/l3/automap28.json", + "load": "level/automap/l3/automap30.json", + "load": "level/automap/l4/automap0.json", + "load": "level/automap/l4/automap3.json", + "load": "level/automap/l4/automap5.json", + "load": "level/automap/l4/automap8.json", + "load": "level/automap/l4/automap10.json", + "load": "level/automap/l4/automap13.json", + "load": "level/automap/l4/automap15.json", + "load": "level/automap/l4/automap18.json", + "load": "level/automap/l4/automap20.json", + "load": "level/automap/l4/automap23.json", + "load": "level/automap/l4/automap25.json", + "load": "level/automap/l4/automap28.json", + "load": "level/automap/l4/automap30.json" +} \ No newline at end of file diff --git a/gamefilesd/level/chamberBone/level.json b/gamefilesd/level/chamberBone/level.json new file mode 100755 index 00000000..05cd5ff5 --- /dev/null +++ b/gamefilesd/level/chamberBone/level.json @@ -0,0 +1,27 @@ +{ + "palette": [ + { + "id": "l2_5", + "file": "levels/l2data/l2_5.pal" + } + ], + "load": ["level/l5/l2s.json", "l2_5"], + "level": { + "id": "level", + "palette": "l2_5", + "file": "levels/l2data/l2.cel", + "layers": [ + { "index": 2, "texturePack": "l2s" }, + { "index": 3, "texturePack": "l2s_2" } + ], + "outOfBoundsTileLayer2": 11, + "til": "levels/l2data/l2.til", + "min": "levels/l2data/l2.min", + "minBlocks": 10, + "sol": "levels/l2data/l2.sol" + }, + "load": "level/automap/l2/load.json", + "load": "level/chamberBone/levelObjects.json", + "load": "level/chamberBone/monsters.json", + "load": "level/chamberBone/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/chamberBone/level2.json b/gamefilesd/level/chamberBone/level2.json new file mode 100755 index 00000000..d08e39e1 --- /dev/null +++ b/gamefilesd/level/chamberBone/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "chamberBone", + "name": "Bone Chamber", + "map": { "file": "levels/l2data/bonecha1.dun", "defaultTile": 2 } + }, + "load": "level/chamberBone/levelObjects2.json", + "load": "level/chamberBone/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/chamberBone/levelObjects2.json b/gamefilesd/level/chamberBone/levelObjects2.json new file mode 100755 index 00000000..8f419b9b --- /dev/null +++ b/gamefilesd/level/chamberBone/levelObjects2.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "up", + "class": "levelBackUp", + "mapPosition": [56, 22], + "properties": { + "x": 85, + "y": 86, + "level": 6 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/chamberBone/music.json b/gamefilesd/level/chamberBone/music.json new file mode 100755 index 00000000..9da03bcb --- /dev/null +++ b/gamefilesd/level/chamberBone/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvlb.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/clearPlayers.json b/gamefilesd/level/clearPlayers.json index 52cd5a4c..bc6e104b 100755 --- a/gamefilesd/level/clearPlayers.json +++ b/gamefilesd/level/clearPlayers.json @@ -1,7 +1,7 @@ { "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.id|", + "param1": "%currentLevel.currentPlayer.id%", "param2": "hero", "then": [ { "name": "level.clearPlayers", "index": 1 }, diff --git a/gamefilesd/level/item/actions.json b/gamefilesd/level/item/actions.json new file mode 100755 index 00000000..b2120389 --- /dev/null +++ b/gamefilesd/level/item/actions.json @@ -0,0 +1,97 @@ +{ + "action": [ + { + "name": "action.set", + "id": "pickItemInInventory", + "action": { "name": "sound.play", "id": "invgrab" } + }, + { + "name": "action.set", + "id": "pickItemInventoryFull", + "action": [ + { + "name": "randomList", + "actions": [ + { "name": "sound.play", "id": "cantCarryAnymore" }, + { "name": "sound.play", "id": "haveNoRoom" }, + { "name": "sound.play", "id": "whereWouldIPutThis" } + ] + }, + { "name": "item.executeAction", "action": "levelDrop" } + ] + }, + { + "name": "action.set", + "id": "pickItemInLevelToBeltOrStash", + "action": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.inventory.belt.isFull%", + "param2": false, + "then": [ + { + "name": "item.loadFromLevel", + "inventory": "belt", + "position": "TopLeft", + "onInventoryFull": "pickItemInventoryFull" + }, + "updateBeltItems" + ], + "else": { + "name": "item.loadFromLevel", + "inventory": "stash", + "position": "BottomLeft", + "onInventoryFull": "pickItemInventoryFull" + } + } + }, + { + "name": "action.set", + "id": "pickItemInLevel", + "action": { + "name": "if.equal", + "param1": "%game.hasResource.charPanelInventory%", + "param2": true, + "then": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", + "param2": false, + "then": [ + { "name": "item.loadFromLevel" }, + "updateSelectedItem" + ] + }, + "else": [ + { + "name": "switch", + "param": "%currentLevel.clickedObject.itemType%", + "case": [ + { + "value": "Gold", + "action": { + "name": "item.loadFromLevel", + "inventory": "stash", + "position": "BottomRight", + "onInventoryFull": "pickItemInventoryFull" + } + }, + { + "value": "Potion", + "action": "pickItemInLevelToBeltOrStash" + }, + { + "value": "Scroll", + "action": "pickItemInLevelToBeltOrStash" + } + ], + "default": { + "name": "item.loadFromLevel", + "inventory": "stash", + "position": "TopRight", + "onInventoryFull": "pickItemInventoryFull" + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/item/armors.json b/gamefilesd/level/item/armors.json index feed3966..d8e6fd9f 100755 --- a/gamefilesd/level/item/armors.json +++ b/gamefilesd/level/item/armors.json @@ -241,6 +241,15 @@ "identified": false, "unique": true }, + "actions": { + "levelPick": [ + { + "name": "load", + "file": ["res/player/sound/load.json", 91, "valor", "loadAudio", "currentLevel"] + }, + { "name": "audio.play", "id": "valor", "volume": "%game.soundVolume%" } + ] + }, "prefix": null, "suffix": null } diff --git a/gamefilesd/level/item/baseItems.json b/gamefilesd/level/item/baseItems.json index 34142bc8..f17f23d0 100755 --- a/gamefilesd/level/item/baseItems.json +++ b/gamefilesd/level/item/baseItems.json @@ -8,8 +8,8 @@ "inventoryTextureIndex": 43, "name": "Item", "type": "Item", - "defaultOutline": "%outlineItem%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineItem|", + "outlineIgnore": "0x000000", "defaults": { "identified": true }, @@ -19,7 +19,8 @@ "inventorySize": [1, 1], "actions": { "action": "pickItemInLevel", - "inventoryPick": "pickItemInInventory" + "inventoryPick": "pickItemInInventory", + "levelPick": "clearPanelText" } }, { diff --git a/gamefilesd/level/item/classes.json b/gamefilesd/level/item/classes.json index 98b700a8..c8df8935 100755 --- a/gamefilesd/level/item/classes.json +++ b/gamefilesd/level/item/classes.json @@ -1,112 +1,3 @@ { - "action": [ - { - "name": "if.equal", - "param1": "%beta%", - "param2": true, - "then": [ - { "name": "load", "file": "level/item/itemCelFilesBeta.json" }, - { "name": "load", "file": "level/item/inventoryTexturesBeta.json" } - ], - "else": [ - { "name": "load", "file": "level/item/itemCelFiles.json" }, - { "name": "load", "file": "level/item/inventoryTextures.json" } - ] - }, - { - "name": "action.set", - "id": "pickItemInInventory", - "action": { "name": "sound.play", "id": "invgrab" } - }, - { - "name": "action.set", - "id": "pickItemInventoryFull", - "action": [ - { - "name": "randomList", - "actions": [ - { "name": "sound.play", "id": "cantCarryAnymore" }, - { "name": "sound.play", "id": "haveNoRoom" }, - { "name": "sound.play", "id": "whereWouldIPutThis" } - ] - }, - { "name": "item.executeDropAction" } - ] - }, - { - "name": "action.set", - "id": "pickItemInLevelToBeltOrStash", - "action": { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.inventory.belt.isFull|", - "param2": false, - "then": [ - { - "name": "item.loadFromLevel", - "inventory": "belt", - "position": "TopLeft", - "onInventoryFull": "pickItemInventoryFull" - }, - "updateBeltItems" - ], - "else": { - "name": "item.loadFromLevel", - "inventory": "stash", - "position": "BottomLeft", - "onInventoryFull": "pickItemInventoryFull" - } - } - }, - { - "name": "action.set", - "id": "pickItemInLevel", - "action": { - "name": "if.equal", - "param1": "|game|hasResource.charPanelInventory|", - "param2": true, - "then": [ - { "name": "item.loadFromLevel" }, - "updateSelectedItem" - ], - "else": [ - { - "name": "switch", - "param": "|currentLevel|clickedObject.itemType|", - "case": [ - { - "value": "Gold", - "action": { - "name": "item.loadFromLevel", - "inventory": "stash", - "position": "BottomRight", - "onInventoryFull": "pickItemInventoryFull" - } - }, - { - "value": "Potion", - "action": "pickItemInLevelToBeltOrStash" - }, - { - "value": "Scroll", - "action": "pickItemInLevelToBeltOrStash" - } - ], - "default": { - "name": "item.loadFromLevel", - "inventory": "stash", - "position": "TopRight", - "onInventoryFull": "pickItemInventoryFull" - } - }, - "clearPanelText" - ] - } - } - ], - "load": "level/item/dropTextures.json", - "load": "level/item/prefixes.json", - "load": "level/item/suffixes.json", - "load": "level/item/descriptions.json", - "load": "level/item/descriptionsUnique.json", - "load": "level/item/classes2.json" + "load": "level/item/classesd.json" } \ No newline at end of file diff --git a/gamefilesd/level/item/classesd.json b/gamefilesd/level/item/classesd.json new file mode 100755 index 00000000..e16e8d3f --- /dev/null +++ b/gamefilesd/level/item/classesd.json @@ -0,0 +1,17 @@ +{ + "action": { + "name": "if.equal", + "param1": "%beta%", + "param2": true, + "then": { "name": "load", "file": "level/item/inventoryTexturesBeta.json" }, + "else": { "name": "load", "file": "level/item/inventoryTextures.json" } + }, + "load": "level/item/actions.json", + "load": "level/item/dropTextures.json", + "load": "level/item/prefixes.json", + "load": "level/item/suffixes.json", + "load": "level/item/descriptions.json", + "load": "level/item/descriptionsUnique.json", + "load": "level/item/imageClassifiers.json", + "load": "level/item/classesd2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/item/classes2.json b/gamefilesd/level/item/classesd2.json similarity index 100% rename from gamefilesd/level/item/classes2.json rename to gamefilesd/level/item/classesd2.json diff --git a/gamefilesd/level/item/descriptions.json b/gamefilesd/level/item/descriptions.json index 0d83be58..f268997b 100755 --- a/gamefilesd/level/item/descriptions.json +++ b/gamefilesd/level/item/descriptions.json @@ -1,250 +1,254 @@ { - "namer": [ + "classifier": [ { "id": "armor", - "names": [ + "values": [ { "property": "indestructible", - "value": { "min": true, "max": true, "text": "Armor: %armor% Indestructible" } + "value": { "min": true, "max": true, "value": "Armor: %armor% Indestructible" } }, - { "value": { "text": "Armor: %armor% Dur: %durability%/%durabilityMax%" } } + { "value": { "value": "Armor: %armor% Dur: %durability%/%durabilityMax%" } } ] }, { "id": "indestructible", - "names": "Indestructible" + "values": "Indestructible" }, { "id": "magic", - "names": [ + "values": [ { "property": "identified", - "value": { "min": false, "max": false, "text": "Not Identified" } + "value": { "min": false, "max": false, "value": "Not Identified" } }, { "property": "identified", - "value": { "min": false, "max": false, "text": "" } + "value": { "min": false, "max": false, "value": "" } }, { "property": "magical", - "value": { "min": false, "max": false, "text": "" } + "value": { "min": false, "max": false, "value": "" } }, { "property": "resistAll", "value": [ - { "min": "min", "max": -1, "text": "Resist All : -%resistAll%%" }, - { "min": 1, "max": "max", "text": "Resist All : +%resistAll%%" } + { "min": "min", "max": -1, "value": "Resist All : -%resistAll%%" }, + { "min": 1, "max": "max", "value": "Resist All : +%resistAll%%" } ] }, { "property": "resistMagic", "value": [ - { "min": "min", "max": -1, "text": "Resist Magic : -%resistMagic%%" }, - { "min": 1, "max": "max", "text": "Resist Magic : +%resistMagic%%" } + { "min": "min", "max": -1, "value": "Resist Magic : -%resistMagic%%" }, + { "min": 1, "max": "max", "value": "Resist Magic : +%resistMagic%%" } ] }, { "property": "resistFire", "value": [ - { "min": "min", "max": -1, "text": "Resist Fire : -%resistFire%%" }, - { "min": 1, "max": "max", "text": "Resist Fire : +%resistFire%%" } + { "min": "min", "max": -1, "value": "Resist Fire : -%resistFire%%" }, + { "min": 1, "max": "max", "value": "Resist Fire : +%resistFire%%" } ] }, { "property": "resistLightning", "value": [ - { "min": "min", "max": -1, "text": "Resist Lightning : -%resistLightning%%" }, - { "min": 1, "max": "max", "text": "Resist Lightning : +%resistLightning%%" } + { "min": "min", "max": -1, "value": "Resist Lightning : -%resistLightning%%" }, + { "min": 1, "max": "max", "value": "Resist Lightning : +%resistLightning%%" } ] }, { "property": "toDamage", "value": [ - { "min": "min", "max": -1, "text": "-%toDamage%% to Damage" }, - { "min": 1, "max": "max", "text": "+%toDamage%% to Damage" } + { "min": "min", "max": -1, "value": "-%toDamage%% to Damage" }, + { "min": 1, "max": "max", "value": "+%toDamage%% to Damage" } ] }, { "property": "toHit", "value": [ - { "min": "min", "max": -1, "text": "Chance to Hit : -%toHit%%" }, - { "min": 1, "max": "max", "text": "Chance to Hit : +%toHit%%" } + { "min": "min", "max": -1, "value": "Chance to Hit : -%toHit%%" }, + { "min": 1, "max": "max", "value": "Chance to Hit : +%toHit%%" } ] }, { "property": "toArmor", "value": [ - { "min": "min", "max": -1, "text": "-%toArmor%% Armor" }, - { "min": 1, "max": "max", "text": "+%toArmor%% Armor" } + { "min": "min", "max": -1, "value": "-%toArmor%% Armor" }, + { "min": 1, "max": "max", "value": "+%toArmor%% Armor" } ] }, { "property": "life", "value": [ - { "min": "min", "max": -1, "text": "Hit Points : -%life%" }, - { "min": 1, "max": "max", "text": "Hit Points : +%life%" } + { "min": "min", "max": -1, "value": "Hit Points : -%life%" }, + { "min": 1, "max": "max", "value": "Hit Points : +%life%" } ] }, { "property": "mana", "value": [ - { "min": "min", "max": -1, "text": "Mana : -%mana%" }, - { "min": 1, "max": "max", "text": "Mana : +%mana%" } + { "min": "min", "max": -1, "value": "Mana : -%mana%" }, + { "min": 1, "max": "max", "value": "Mana : +%mana%" } ] }, { "property": "damage", "value": [ - { "min": "min", "max": -2, "text": "Removes %damage% Points from Damage" }, - { "min": -1, "max": -1, "text": "Removes %damage% Point from Damage" }, - { "min": 1, "max": 1, "text": "Adds %damage% Point to Damage" }, - { "min": 2, "max": "max", "text": "Adds %damage% Points to Damage" } + { "min": "min", "max": -2, "value": "Removes %damage% Points from Damage" }, + { "min": -1, "max": -1, "value": "Removes %damage% Point from Damage" }, + { "min": 1, "max": 1, "value": "Adds %damage% Point to Damage" }, + { "min": 2, "max": "max", "value": "Adds %damage% Points to Damage" } ] }, { "property": "allAttributes", "value": [ - { "min": "min", "max": -1, "text": "-%allAttributes%% to All Attributes" }, - { "min": 1, "max": "max", "text": "+%allAttributes%% to All Attributes" } + { "min": "min", "max": -1, "value": "-%allAttributes%% to All Attributes" }, + { "min": 1, "max": "max", "value": "+%allAttributes%% to All Attributes" } ] }, { "property": "strength", "value": [ - { "min": "min", "max": -1, "text": "-%strength% to Strength" }, - { "min": 1, "max": "max", "text": "+%strength% to Strength" } + { "min": "min", "max": -1, "value": "-%strength% to Strength" }, + { "min": 1, "max": "max", "value": "+%strength% to Strength" } ] }, { "property": "magic", "value": [ - { "min": "min", "max": -1, "text": "-%magic% to Magic" }, - { "min": 1, "max": "max", "text": "+%magic% to Magic" } + { "min": "min", "max": -1, "value": "-%magic% to Magic" }, + { "min": 1, "max": "max", "value": "+%magic% to Magic" } ] }, { "property": "dexterity", "value": [ - { "min": "min", "max": -1, "text": "-%dexterity% to Dexterity" }, - { "min": 1, "max": "max", "text": "+%dexterity% to Dexterity" } + { "min": "min", "max": -1, "value": "-%dexterity% to Dexterity" }, + { "min": 1, "max": "max", "value": "+%dexterity% to Dexterity" } ] }, { "property": "vitality", "value": [ - { "min": "min", "max": -1, "text": "-%vitality% to Vitality" }, - { "min": 1, "max": "max", "text": "+%vitality% to Vitality" } + { "min": "min", "max": -1, "value": "-%vitality% to Vitality" }, + { "min": 1, "max": "max", "value": "+%vitality% to Vitality" } ] } ] }, { "id": "noAttributes", - "names": "No Required Attributes" + "values": "No Required Attributes" }, { "id": "potionOfHealing", - "names": "Recover Life" + "values": "Recover Life" }, { "id": "potionOfMana", - "names": "Recover Mana" + "values": "Recover Mana" }, { "id": "potionOfFullHealing", - "names": "Fully Recover Life" + "values": "Fully Recover Life" }, { "id": "potionOfFullMana", - "names": "Fully Recover Mana" + "values": "Fully Recover Mana" }, { "id": "potionOfRejuvenation", - "names": "Recover Life And Mana" + "values": "Recover Life And Mana" }, { "id": "potionOfFullRejuvenation", - "names": "Fully Recover Life And Mana" + "values": "Fully Recover Life And Mana" }, { "id": "required", - "names": [ + "values": [ { "property": "requiredStrength", - "value": { "min": 1, "text": "Required: %requiredStrength% Str" } + "value": { "min": 1, "value": "Required: %requiredStrength% Str" } }, { "property": "requiredMagic", - "value": { "min": 1, "text": "Required: %requiredMagic% Mag" } + "value": { "min": 1, "value": "Required: %requiredMagic% Mag" } }, { "property": "requiredDexterity", - "value": { "min": 1, "text": "Required: %requiredDexterity% Dex" } + "value": { "min": 1, "value": "Required: %requiredDexterity% Dex" } }, { "property": "requiredVitality", - "value": { "min": 1, "text": "Required: %requiredVitality% Vit" } + "value": { "min": 1, "value": "Required: %requiredVitality% Vit" } } ] }, { "id": "requiredStrDex", - "names": [ + "values": [ { "property": "requiredStrength", - "value": { "min": 0, "max": 0, "text": "Required: %requiredDexterity% Dex" } + "value": { "min": 0, "max": 0, "value": "Required: %requiredDexterity% Dex" } }, { "property": "requiredDexterity", - "value": { "min": 1, "text": "Required: %requiredStrength% Str %requiredDexterity% Dex" } + "value": { "min": 1, "value": "Required: %requiredStrength% Str %requiredDexterity% Dex" } }, { "property": "requiredStrength", - "value": { "min": 1, "text": "Required: %requiredStrength% Str" } + "value": { "min": 1, "value": "Required: %requiredStrength% Str" } } ] }, { "id": "requiredStrMag", - "names": [ + "values": [ { "property": "requiredStrength", - "value": { "min": 0, "max": 0, "text": "Required: %requiredMagic% Mag" } + "value": { "min": 0, "max": 0, "value": "Required: %requiredMagic% Mag" } }, { "property": "requiredMagic", - "value": { "min": 1, "text": "Required: %requiredStrength% Str %requiredMagic% Mag" } + "value": { "min": 1, "value": "Required: %requiredStrength% Str %requiredMagic% Mag" } }, { "property": "requiredStrength", - "value": { "min": 1, "text": "Required: %requiredStrength% Str" } + "value": { "min": 1, "value": "Required: %requiredStrength% Str" } } ] }, { "id": "rightClickToRead", - "names": "Right Click to Read" + "values": "Right Click to Read" }, { "id": "rightClickToRead2", - "names": "Right-Click to Read" + "values": "Right-Click to Read" }, { "id": "rightClickToRead3", - "names": "Right-Click to Read, then\nLeft-Click to Target" + "values": "Right-Click to Read, then\nLeft-Click to Target" }, { "id": "rightClickToUse", - "names": "Right Click to Use" + "values": "Right Click to Use" + }, + { + "id": "rightClickToView", + "values": "Right Click to View" }, { "id": "weapon", - "names": [ + "values": [ { "property": "indestructible", - "value": { "min": true, "max": true, "text": "Damage: %damageMin%-%damageMax% Indestructible" } + "value": { "min": true, "max": true, "value": "Damage: %damageMin%-%damageMax% Indestructible" } }, - { "value": { "text": "Damage: %damageMin%-%damageMax% Dur: %durability%/%durabilityMax%" } } + { "value": { "value": "Damage: %damageMin%-%damageMax% Dur: %durability%/%durabilityMax%" } } ] } ] diff --git a/gamefilesd/level/item/descriptionsUnique.json b/gamefilesd/level/item/descriptionsUnique.json index 075a7a94..ff16b250 100755 --- a/gamefilesd/level/item/descriptionsUnique.json +++ b/gamefilesd/level/item/descriptionsUnique.json @@ -1,21 +1,21 @@ { - "namer": [ + "classifier": [ { "id": "unique", - "names": [ + "values": [ { "property": "identified", - "value": { "min": false, "max": false, "text": "Not Identified" } + "value": { "min": false, "max": false, "value": "Not Identified" } }, { "property": "unique", - "value": { "min": true, "max": true, "text": "Unique Item" } + "value": { "min": true, "max": true, "value": "Unique Item" } } ] }, { "id": "arkanesValor", - "names": "Armor Class: %armor%\n+%vitality% to vitality\n%damageFromEnemies% damage from enemies\nfastest hit recovery" + "values": "Armor Class: %armor%\n+%vitality% to vitality\n%damageFromEnemies% damage from enemies\nfastest hit recovery" } ] } \ No newline at end of file diff --git a/gamefilesd/level/item/imageClassifiers.json b/gamefilesd/level/item/imageClassifiers.json new file mode 100755 index 00000000..3e86c051 --- /dev/null +++ b/gamefilesd/level/item/imageClassifiers.json @@ -0,0 +1,13 @@ +{ + "classifier": { + "id": "goldTexture", + "values": { + "property": "quantity", + "value": [ + { "min": "min", "max": 1000, "value": 15 }, + { "min": 1001, "max": 2499, "value": 16 }, + { "min": 2500, "max": "max", "value": 17 } + ] + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/item/misc.json b/gamefilesd/level/item/misc.json index e6efc0df..7c4c477a 100755 --- a/gamefilesd/level/item/misc.json +++ b/gamefilesd/level/item/misc.json @@ -6,12 +6,13 @@ "dropTexturePack": "goldflip", "inventoryTexturePack": "itemIcons", "inventoryTextureIndex": 17, + "inventoryTexture": "goldTexture", "name": "Gold", "shortName": "Gold", "type": "Gold", "defaults": { - "gold": 1, - "goldMax": 5000 + "quantity": 1, + "capacity": 5000 }, "actions": { "levelDrop": { "name": "sound.play", "id": "gold" }, diff --git a/gamefilesd/level/item/prefixes.json b/gamefilesd/level/item/prefixes.json index 9d3e9dbc..8e03dd16 100755 --- a/gamefilesd/level/item/prefixes.json +++ b/gamefilesd/level/item/prefixes.json @@ -1,303 +1,303 @@ { - "namer": [ + "classifier": [ { "id": "armorPrefixes", - "names": [ + "values": [ { "property": "toDamage", "value": [ - { "min": "min", "max": -80, "text": "Useless" }, - { "min": -79, "max": -45, "text": "Bent" }, - { "min": -44, "max": -25, "text": "Weak" }, - { "min": 20, "max": 35, "text": "Jagged" }, - { "min": 36, "max": 50, "text": "Deadly" }, - { "min": 51, "max": 65, "text": "Heavy" }, - { "min": 66, "max": 80, "text": "Vicious" }, - { "min": 81, "max": 95, "text": "Brutal" }, - { "min": 96, "max": 110, "text": "Massive" }, - { "min": 111, "max": 125, "text": "Savage" }, - { "min": 126, "max": 150, "text": "Ruthless" }, - { "min": 151, "max": "max", "text": "Merciless" } + { "min": "min", "max": -80, "value": "Useless" }, + { "min": -79, "max": -45, "value": "Bent" }, + { "min": -44, "max": -25, "value": "Weak" }, + { "min": 20, "max": 35, "value": "Jagged" }, + { "min": 36, "max": 50, "value": "Deadly" }, + { "min": 51, "max": 65, "value": "Heavy" }, + { "min": 66, "max": 80, "value": "Vicious" }, + { "min": 81, "max": 95, "value": "Brutal" }, + { "min": 96, "max": 110, "value": "Massive" }, + { "min": 111, "max": 125, "value": "Savage" }, + { "min": 126, "max": 150, "value": "Ruthless" }, + { "min": 151, "max": "max", "value": "Merciless" } ] }, { "property": "toHit", "value": [ - { "min": "min", "max": -6, "text": "Tin" }, - { "min": -5, "max": -1, "text": "Brass" }, - { "min": 1, "max": 5, "text": "Bronze" }, - { "min": 6, "max": 10, "text": "Iron" }, - { "min": 11, "max": 15, "text": "Steel" }, - { "min": 16, "max": 20, "text": "Silver" }, - { "min": 21, "max": 30, "text": "Gold" }, - { "min": 31, "max": 40, "text": "Platinum" }, - { "min": 41, "max": 60, "text": "Mithril" }, - { "min": 61, "max": 80, "text": "Meteoric" }, - { "min": 81, "max": 100, "text": "Weird" }, - { "min": 101, "max": "max", "text": "Strange" } + { "min": "min", "max": -6, "value": "Tin" }, + { "min": -5, "max": -1, "value": "Brass" }, + { "min": 1, "max": 5, "value": "Bronze" }, + { "min": 6, "max": 10, "value": "Iron" }, + { "min": 11, "max": 15, "value": "Steel" }, + { "min": 16, "max": 20, "value": "Silver" }, + { "min": 21, "max": 30, "value": "Gold" }, + { "min": 31, "max": 40, "value": "Platinum" }, + { "min": 41, "max": 60, "value": "Mithril" }, + { "min": 61, "max": 80, "value": "Meteoric" }, + { "min": 81, "max": 100, "value": "Weird" }, + { "min": 101, "max": "max", "value": "Strange" } ] }, { "property": "toArmor", "value": [ - { "min": "min", "max": -51, "text": "Vulnerable" }, - { "min": -50, "max": -25, "text": "Rusted" }, - { "min": 20, "max": 30, "text": "Fine" }, - { "min": 31, "max": 40, "text": "Strong" }, - { "min": 41, "max": 55, "text": "Grand" }, - { "min": 56, "max": 70, "text": "Valiant" }, - { "min": 71, "max": 90, "text": "Glorious" }, - { "min": 91, "max": 110, "text": "Blessed" }, - { "min": 111, "max": 130, "text": "Saintly" }, - { "min": 131, "max": 150, "text": "Awesome" }, - { "min": 151, "max": 170, "text": "Holy" }, - { "min": 171, "max": "max", "text": "Godly" } + { "min": "min", "max": -51, "value": "Vulnerable" }, + { "min": -50, "max": -25, "value": "Rusted" }, + { "min": 20, "max": 30, "value": "Fine" }, + { "min": 31, "max": 40, "value": "Strong" }, + { "min": 41, "max": 55, "value": "Grand" }, + { "min": 56, "max": 70, "value": "Valiant" }, + { "min": 71, "max": 90, "value": "Glorious" }, + { "min": 91, "max": 110, "value": "Blessed" }, + { "min": 111, "max": 130, "value": "Saintly" }, + { "min": 131, "max": 150, "value": "Awesome" }, + { "min": 151, "max": 170, "value": "Holy" }, + { "min": 171, "max": "max", "value": "Godly" } ] }, { "property": "resistAll", "value": [ - { "min": 10, "max": 15, "text": "Topaz" }, - { "min": 16, "max": 20, "text": "Amber" }, - { "min": 21, "max": 30, "text": "Jade" }, - { "min": 31, "max": 40, "text": "Obsidian" }, - { "min": 41, "max": "max", "text": "Emerald" } + { "min": 10, "max": 15, "value": "Topaz" }, + { "min": 16, "max": 20, "value": "Amber" }, + { "min": 21, "max": 30, "value": "Jade" }, + { "min": 31, "max": 40, "value": "Obsidian" }, + { "min": 41, "max": "max", "value": "Emerald" } ] }, { "property": "resistMagic", "value": [ - { "min": 10, "max": 20, "text": "White" }, - { "min": 21, "max": 30, "text": "Pearl" }, - { "min": 31, "max": 40, "text": "Ivory" }, - { "min": 41, "max": 50, "text": "Crystal" }, - { "min": 51, "max": "max", "text": "Diamond" } + { "min": 10, "max": 20, "value": "White" }, + { "min": 21, "max": 30, "value": "Pearl" }, + { "min": 31, "max": 40, "value": "Ivory" }, + { "min": 41, "max": 50, "value": "Crystal" }, + { "min": 51, "max": "max", "value": "Diamond" } ] }, { "property": "resistFire", "value": [ - { "min": 10, "max": 20, "text": "Red" }, - { "min": 21, "max": 30, "text": "Crimson" }, - { "min": 31, "max": 40, "text": "Burgundy" }, - { "min": 41, "max": 50, "text": "Garnet" }, - { "min": 51, "max": "max", "text": "Ruby" } + { "min": 10, "max": 20, "value": "Red" }, + { "min": 21, "max": 30, "value": "Crimson" }, + { "min": 31, "max": 40, "value": "Burgundy" }, + { "min": 41, "max": 50, "value": "Garnet" }, + { "min": 51, "max": "max", "value": "Ruby" } ] }, { "property": "resistLightning", "value": [ - { "min": 10, "max": 20, "text": "Blue" }, - { "min": 21, "max": 30, "text": "Azure" }, - { "min": 31, "max": 40, "text": "Lapis" }, - { "min": 41, "max": 50, "text": "Cobalt" }, - { "min": 51, "max": "max", "text": "Sapphire" } + { "min": 10, "max": 20, "value": "Blue" }, + { "min": 21, "max": 30, "value": "Azure" }, + { "min": 31, "max": 40, "value": "Lapis" }, + { "min": 41, "max": 50, "value": "Cobalt" }, + { "min": 51, "max": "max", "value": "Sapphire" } ] } ] }, { "id": "goldPrefix", - "names": "%gold%" + "values": "%quantity%" }, { "id": "weaponPrefixes", - "names": [ + "values": [ { "property": "toDamage", "value": [ - { "min": "min", "max": -80, "text": "Useless" }, - { "min": -79, "max": -45, "text": "Bent" }, - { "min": -44, "max": -25, "text": "Weak" }, - { "min": 20, "max": 35, "text": "Jagged" }, - { "min": 36, "max": 50, "text": "Deadly" }, - { "min": 51, "max": 65, "text": "Heavy" }, - { "min": 66, "max": 80, "text": "Vicious" }, - { "min": 81, "max": 95, "text": "Brutal" }, - { "min": 96, "max": 110, "text": "Massive" }, - { "min": 111, "max": 125, "text": "Savage" }, - { "min": 126, "max": 150, "text": "Ruthless" }, - { "min": 151, "max": "max", "text": "Merciless" } + { "min": "min", "max": -80, "value": "Useless" }, + { "min": -79, "max": -45, "value": "Bent" }, + { "min": -44, "max": -25, "value": "Weak" }, + { "min": 20, "max": 35, "value": "Jagged" }, + { "min": 36, "max": 50, "value": "Deadly" }, + { "min": 51, "max": 65, "value": "Heavy" }, + { "min": 66, "max": 80, "value": "Vicious" }, + { "min": 81, "max": 95, "value": "Brutal" }, + { "min": 96, "max": 110, "value": "Massive" }, + { "min": 111, "max": 125, "value": "Savage" }, + { "min": 126, "max": 150, "value": "Ruthless" }, + { "min": 151, "max": "max", "value": "Merciless" } ] }, { "property": "toHit", "value": [ - { "min": "min", "max": -6, "text": "Tin" }, - { "min": -5, "max": -1, "text": "Brass" }, - { "min": 1, "max": 5, "text": "Bronze" }, - { "min": 6, "max": 10, "text": "Iron" }, - { "min": 11, "max": 15, "text": "Steel" }, - { "min": 16, "max": 20, "text": "Silver" }, - { "min": 21, "max": 30, "text": "Gold" }, - { "min": 31, "max": 40, "text": "Platinum" }, - { "min": 41, "max": 60, "text": "Mithril" }, - { "min": 61, "max": 80, "text": "Meteoric" }, - { "min": 81, "max": 100, "text": "Weird" }, - { "min": 101, "max": "max", "text": "Strange" } + { "min": "min", "max": -6, "value": "Tin" }, + { "min": -5, "max": -1, "value": "Brass" }, + { "min": 1, "max": 5, "value": "Bronze" }, + { "min": 6, "max": 10, "value": "Iron" }, + { "min": 11, "max": 15, "value": "Steel" }, + { "min": 16, "max": 20, "value": "Silver" }, + { "min": 21, "max": 30, "value": "Gold" }, + { "min": 31, "max": 40, "value": "Platinum" }, + { "min": 41, "max": 60, "value": "Mithril" }, + { "min": 61, "max": 80, "value": "Meteoric" }, + { "min": 81, "max": 100, "value": "Weird" }, + { "min": 101, "max": "max", "value": "Strange" } ] }, { "property": "toHit", "value": [ - { "min": "min", "max": -6, "text": "Clumsy" }, - { "min": -5, "max": -1, "text": "Dull" }, - { "min": 1, "max": 5, "text": "Sharp" }, - { "min": 6, "max": 10, "text": "Fine" }, - { "min": 11, "max": 15, "text": "Warrior's" }, - { "min": 16, "max": 20, "text": "Soldier's" }, - { "min": 21, "max": 30, "text": "Lord's" }, - { "min": 31, "max": 40, "text": "Knight's" }, - { "min": 41, "max": 50, "text": "Master's" }, - { "min": 51, "max": 75, "text": "Champion's" }, - { "min": 76, "max": "max", "text": "King's" } + { "min": "min", "max": -6, "value": "Clumsy" }, + { "min": -5, "max": -1, "value": "Dull" }, + { "min": 1, "max": 5, "value": "Sharp" }, + { "min": 6, "max": 10, "value": "Fine" }, + { "min": 11, "max": 15, "value": "Warrior's" }, + { "min": 16, "max": 20, "value": "Soldier's" }, + { "min": 21, "max": 30, "value": "Lord's" }, + { "min": 31, "max": 40, "value": "Knight's" }, + { "min": 41, "max": 50, "value": "Master's" }, + { "min": 51, "max": 75, "value": "Champion's" }, + { "min": 76, "max": "max", "value": "King's" } ] }, { "property": "resistAll", "value": [ - { "min": 10, "max": 15, "text": "Topaz" }, - { "min": 16, "max": 20, "text": "Amber" }, - { "min": 21, "max": 30, "text": "Jade" }, - { "min": 31, "max": 40, "text": "Obsidian" }, - { "min": 41, "max": "max", "text": "Emerald" } + { "min": 10, "max": 15, "value": "Topaz" }, + { "min": 16, "max": 20, "value": "Amber" }, + { "min": 21, "max": 30, "value": "Jade" }, + { "min": 31, "max": 40, "value": "Obsidian" }, + { "min": 41, "max": "max", "value": "Emerald" } ] }, { "property": "resistMagic", "value": [ - { "min": 10, "max": 20, "text": "White" }, - { "min": 21, "max": 30, "text": "Pearl" }, - { "min": 31, "max": 40, "text": "Ivory" }, - { "min": 41, "max": 50, "text": "Crystal" }, - { "min": 51, "max": "max", "text": "Diamond" } + { "min": 10, "max": 20, "value": "White" }, + { "min": 21, "max": 30, "value": "Pearl" }, + { "min": 31, "max": 40, "value": "Ivory" }, + { "min": 41, "max": 50, "value": "Crystal" }, + { "min": 51, "max": "max", "value": "Diamond" } ] }, { "property": "resistFire", "value": [ - { "min": 10, "max": 20, "text": "Red" }, - { "min": 21, "max": 30, "text": "Crimson" }, - { "min": 31, "max": 40, "text": "Burgundy" }, - { "min": 41, "max": 50, "text": "Garnet" }, - { "min": 51, "max": "max", "text": "Ruby" } + { "min": 10, "max": 20, "value": "Red" }, + { "min": 21, "max": 30, "value": "Crimson" }, + { "min": 31, "max": 40, "value": "Burgundy" }, + { "min": 41, "max": 50, "value": "Garnet" }, + { "min": 51, "max": "max", "value": "Ruby" } ] }, { "property": "resistLightning", "value": [ - { "min": 10, "max": 20, "text": "Blue" }, - { "min": 21, "max": 30, "text": "Azure" }, - { "min": 31, "max": 40, "text": "Lapis" }, - { "min": 41, "max": 50, "text": "Cobalt" }, - { "min": 51, "max": "max", "text": "Sapphire" } + { "min": 10, "max": 20, "value": "Blue" }, + { "min": 21, "max": 30, "value": "Azure" }, + { "min": 31, "max": 40, "value": "Lapis" }, + { "min": 41, "max": 50, "value": "Cobalt" }, + { "min": 51, "max": "max", "value": "Sapphire" } ] }, { "property": "mana", "value": [ - { "min": "min", "max": -11, "text": "Hyena's" }, - { "min": -10, "max": -1, "text": "Frog's" }, - { "min": 10, "max": 15, "text": "Spider's" }, - { "min": 16, "max": 20, "text": "Raven's" }, - { "min": 21, "max": 30, "text": "Snake's" }, - { "min": 31, "max": 40, "text": "Serpent's" }, - { "min": 41, "max": 50, "text": "Drake's" }, - { "min": 51, "max": 60, "text": "Dragon's" }, - { "min": 61, "max": 80, "text": "Wyrm's" }, - { "min": 81, "max": "max", "text": "Hydra's" } + { "min": "min", "max": -11, "value": "Hyena's" }, + { "min": -10, "max": -1, "value": "Frog's" }, + { "min": 10, "max": 15, "value": "Spider's" }, + { "min": 16, "max": 20, "value": "Raven's" }, + { "min": 21, "max": 30, "value": "Snake's" }, + { "min": 31, "max": 40, "value": "Serpent's" }, + { "min": 41, "max": 50, "value": "Drake's" }, + { "min": 51, "max": 60, "value": "Dragon's" }, + { "min": 61, "max": 80, "value": "Wyrm's" }, + { "min": 81, "max": "max", "value": "Hydra's" } ] }, { "property": "toCharges", "value": [ - { "min": 1, "max": 4, "text": "Plentiful" }, - { "min": 5, "max": 8, "text": "Bountiful" }, - { "min": 9, "max": "max", "text": "Of Bashing" } + { "min": 1, "max": 4, "value": "Plentiful" }, + { "min": 5, "max": 8, "value": "Bountiful" }, + { "min": 9, "max": "max", "value": "Of Bashing" } ] }, { "property": "toSpells", "value": [ - { "min": 1, "max": 1, "text": "Angel's" }, - { "min": 2, "max": "max", "text": "Arch-Angel's" } + { "min": 1, "max": 1, "value": "Angel's" }, + { "min": 2, "max": "max", "value": "Arch-Angel's" } ] } ] }, { "id": "jewelleryPrefixes", - "names": [ + "values": [ { "property": "toHit", "value": [ - { "min": "min", "max": -6, "text": "Tin" }, - { "min": -5, "max": -1, "text": "Brass" }, - { "min": 1, "max": 5, "text": "Bronze" }, - { "min": 6, "max": 10, "text": "Iron" }, - { "min": 11, "max": 15, "text": "Steel" }, - { "min": 16, "max": 20, "text": "Silver" }, - { "min": 21, "max": 30, "text": "Gold" }, - { "min": 31, "max": 40, "text": "Platinum" }, - { "min": 41, "max": 60, "text": "Mithril" }, - { "min": 61, "max": 80, "text": "Meteoric" }, - { "min": 81, "max": 100, "text": "Weird" }, - { "min": 101, "max": "max", "text": "Strange" } + { "min": "min", "max": -6, "value": "Tin" }, + { "min": -5, "max": -1, "value": "Brass" }, + { "min": 1, "max": 5, "value": "Bronze" }, + { "min": 6, "max": 10, "value": "Iron" }, + { "min": 11, "max": 15, "value": "Steel" }, + { "min": 16, "max": 20, "value": "Silver" }, + { "min": 21, "max": 30, "value": "Gold" }, + { "min": 31, "max": 40, "value": "Platinum" }, + { "min": 41, "max": 60, "value": "Mithril" }, + { "min": 61, "max": 80, "value": "Meteoric" }, + { "min": 81, "max": 100, "value": "Weird" }, + { "min": 101, "max": "max", "value": "Strange" } ] }, { "property": "resistAll", "value": [ - { "min": 10, "max": 15, "text": "Topaz" }, - { "min": 16, "max": 20, "text": "Amber" }, - { "min": 21, "max": 30, "text": "Jade" }, - { "min": 31, "max": 40, "text": "Obsidian" }, - { "min": 41, "max": "max", "text": "Emerald" } + { "min": 10, "max": 15, "value": "Topaz" }, + { "min": 16, "max": 20, "value": "Amber" }, + { "min": 21, "max": 30, "value": "Jade" }, + { "min": 31, "max": 40, "value": "Obsidian" }, + { "min": 41, "max": "max", "value": "Emerald" } ] }, { "property": "resistMagic", "value": [ - { "min": 10, "max": 20, "text": "White" }, - { "min": 21, "max": 30, "text": "Pearl" }, - { "min": 31, "max": 40, "text": "Ivory" }, - { "min": 41, "max": 50, "text": "Crystal" }, - { "min": 51, "max": "max", "text": "Diamond" } + { "min": 10, "max": 20, "value": "White" }, + { "min": 21, "max": 30, "value": "Pearl" }, + { "min": 31, "max": 40, "value": "Ivory" }, + { "min": 41, "max": 50, "value": "Crystal" }, + { "min": 51, "max": "max", "value": "Diamond" } ] }, { "property": "resistFire", "value": [ - { "min": 10, "max": 20, "text": "Red" }, - { "min": 21, "max": 30, "text": "Crimson" }, - { "min": 31, "max": 40, "text": "Burgundy" }, - { "min": 41, "max": 50, "text": "Garnet" }, - { "min": 51, "max": "max", "text": "Ruby" } + { "min": 10, "max": 20, "value": "Red" }, + { "min": 21, "max": 30, "value": "Crimson" }, + { "min": 31, "max": 40, "value": "Burgundy" }, + { "min": 41, "max": 50, "value": "Garnet" }, + { "min": 51, "max": "max", "value": "Ruby" } ] }, { "property": "resistLightning", "value": [ - { "min": 10, "max": 20, "text": "Blue" }, - { "min": 21, "max": 30, "text": "Azure" }, - { "min": 31, "max": 40, "text": "Lapis" }, - { "min": 41, "max": 50, "text": "Cobalt" }, - { "min": 51, "max": "max", "text": "Sapphire" } + { "min": 10, "max": 20, "value": "Blue" }, + { "min": 21, "max": 30, "value": "Azure" }, + { "min": 31, "max": 40, "value": "Lapis" }, + { "min": 41, "max": 50, "value": "Cobalt" }, + { "min": 51, "max": "max", "value": "Sapphire" } ] }, { "property": "mana", "value": [ - { "min": "min", "max": -11, "text": "Hyena's" }, - { "min": -10, "max": -1, "text": "Frog's" }, - { "min": 10, "max": 15, "text": "Spider's" }, - { "min": 16, "max": 20, "text": "Raven's" }, - { "min": 21, "max": 30, "text": "Snake's" }, - { "min": 31, "max": 40, "text": "Serpent's" }, - { "min": 41, "max": 50, "text": "Drake's" }, - { "min": 51, "max": 60, "text": "Dragon's" }, - { "min": 61, "max": 80, "text": "Wyrm's" }, - { "min": 81, "max": "max", "text": "Hydra's" } + { "min": "min", "max": -11, "value": "Hyena's" }, + { "min": -10, "max": -1, "value": "Frog's" }, + { "min": 10, "max": 15, "value": "Spider's" }, + { "min": 16, "max": 20, "value": "Raven's" }, + { "min": 21, "max": 30, "value": "Snake's" }, + { "min": 31, "max": 40, "value": "Serpent's" }, + { "min": 41, "max": 50, "value": "Drake's" }, + { "min": 51, "max": 60, "value": "Dragon's" }, + { "min": 61, "max": 80, "value": "Wyrm's" }, + { "min": 81, "max": "max", "value": "Hydra's" } ] } ] diff --git a/gamefilesd/level/item/suffixes.json b/gamefilesd/level/item/suffixes.json index 07b3035a..77cdecb4 100755 --- a/gamefilesd/level/item/suffixes.json +++ b/gamefilesd/level/item/suffixes.json @@ -1,329 +1,329 @@ { - "namer": [ + "classifier": [ { "id": "armorSuffixes", - "names": [ + "values": [ { "property": "allAttributes", "value": [ - { "min": "min", "max": -6, "text": "Of Trouble" }, - { "min": -5, "max": -1, "text": "Of The Pit" }, - { "min": 1, "max": 3, "text": "Of The Sky" }, - { "min": 4, "max": 7, "text": "Of The Moon" }, - { "min": 8, "max": 11, "text": "Of The Stars" }, - { "min": 12, "max": 15, "text": "Of The Heavens" }, - { "min": 16, "max": "max", "text": "Of The Zodiac" } + { "min": "min", "max": -6, "value": "Of Trouble" }, + { "min": -5, "max": -1, "value": "Of The Pit" }, + { "min": 1, "max": 3, "value": "Of The Sky" }, + { "min": 4, "max": 7, "value": "Of The Moon" }, + { "min": 8, "max": 11, "value": "Of The Stars" }, + { "min": 12, "max": 15, "value": "Of The Heavens" }, + { "min": 16, "max": "max", "value": "Of The Zodiac" } ] }, { "property": "strength", "value": [ - { "min": "min", "max": -6, "text": "Of Frailty" }, - { "min": -5, "max": -1, "text": "Of Weakness" }, - { "min": 1, "max": 5, "text": "Of Strength" }, - { "min": 6, "max": 10, "text": "Of Might" }, - { "min": 11, "max": 15, "text": "Of Power" }, - { "min": 16, "max": 20, "text": "Of Giants" }, - { "min": 21, "max": "max", "text": "Of Titans" } + { "min": "min", "max": -6, "value": "Of Frailty" }, + { "min": -5, "max": -1, "value": "Of Weakness" }, + { "min": 1, "max": 5, "value": "Of Strength" }, + { "min": 6, "max": 10, "value": "Of Might" }, + { "min": 11, "max": 15, "value": "Of Power" }, + { "min": 16, "max": 20, "value": "Of Giants" }, + { "min": 21, "max": "max", "value": "Of Titans" } ] }, { "property": "magic", "value": [ - { "min": "min", "max": -6, "text": "Of The Fool" }, - { "min": -5, "max": -1, "text": "Of Dyslexia" }, - { "min": 1, "max": 5, "text": "Of Magic" }, - { "min": 6, "max": 10, "text": "Of The Mind" }, - { "min": 11, "max": 15, "text": "Of Brilliance" }, - { "min": 16, "max": 20, "text": "Of Sorcery" }, - { "min": 21, "max": "max", "text": "Of Wizardry" } + { "min": "min", "max": -6, "value": "Of The Fool" }, + { "min": -5, "max": -1, "value": "Of Dyslexia" }, + { "min": 1, "max": 5, "value": "Of Magic" }, + { "min": 6, "max": 10, "value": "Of The Mind" }, + { "min": 11, "max": 15, "value": "Of Brilliance" }, + { "min": 16, "max": 20, "value": "Of Sorcery" }, + { "min": 21, "max": "max", "value": "Of Wizardry" } ] }, { "property": "dexterity", "value": [ - { "min": "min", "max": -6, "text": "Of Paralysis" }, - { "min": -5, "max": -1, "text": "Of Atrophy" }, - { "min": -1, "max": 5, "text": "Of Dexterity" }, - { "min": 6, "max": 10, "text": "Of Skill" }, - { "min": 11, "max": 15, "text": "Of Accuracy" }, - { "min": 16, "max": 20, "text": "Of Precision" }, - { "min": 21, "max": "max", "text": "Of Perfection" } + { "min": "min", "max": -6, "value": "Of Paralysis" }, + { "min": -5, "max": -1, "value": "Of Atrophy" }, + { "min": -1, "max": 5, "value": "Of Dexterity" }, + { "min": 6, "max": 10, "value": "Of Skill" }, + { "min": 11, "max": 15, "value": "Of Accuracy" }, + { "min": 16, "max": 20, "value": "Of Precision" }, + { "min": 21, "max": "max", "value": "Of Perfection" } ] }, { "property": "vitality", "value": [ - { "min": "min", "max": -6, "text": "Of Illness" }, - { "min": -5, "max": -1, "text": "Of Disease" }, - { "min": -1, "max": 5, "text": "Of Vitality" }, - { "min": 6, "max": 10, "text": "Of Zest" }, - { "min": 11, "max": 15, "text": "Of Vim" }, - { "min": 16, "max": 20, "text": "Of Vigor" }, - { "min": 21, "max": "max", "text": "Of Life" } + { "min": "min", "max": -6, "value": "Of Illness" }, + { "min": -5, "max": -1, "value": "Of Disease" }, + { "min": -1, "max": 5, "value": "Of Vitality" }, + { "min": 6, "max": 10, "value": "Of Zest" }, + { "min": 11, "max": 15, "value": "Of Vim" }, + { "min": 16, "max": 20, "value": "Of Vigor" }, + { "min": 21, "max": "max", "value": "Of Life" } ] }, { "property": "life", "value": [ - { "min": "min", "max": -11, "text": "Of The Vulture" }, - { "min": -10, "max": -1, "text": "Of The Jackal" }, - { "min": 10, "max": 15, "text": "Of The Fox" }, - { "min": 16, "max": 20, "text": "Of The Jaguar" }, - { "min": 21, "max": 30, "text": "Of The Eagle" }, - { "min": 31, "max": 40, "text": "Of The Wolf" }, - { "min": 41, "max": 50, "text": "Of The Tiger" }, - { "min": 51, "max": 60, "text": "Of The Lion" }, - { "min": 61, "max": 80, "text": "Of The Mammoth" }, - { "min": 81, "max": "max", "text": "Of The Whale" } + { "min": "min", "max": -11, "value": "Of The Vulture" }, + { "min": -10, "max": -1, "value": "Of The Jackal" }, + { "min": 10, "max": 15, "value": "Of The Fox" }, + { "min": 16, "max": 20, "value": "Of The Jaguar" }, + { "min": 21, "max": 30, "value": "Of The Eagle" }, + { "min": 31, "max": 40, "value": "Of The Wolf" }, + { "min": 41, "max": 50, "value": "Of The Tiger" }, + { "min": 51, "max": 60, "value": "Of The Lion" }, + { "min": 61, "max": 80, "value": "Of The Mammoth" }, + { "min": 81, "max": "max", "value": "Of The Whale" } ] }, { "property": "hitRecovery", "value": [ - { "min": 1, "max": 25, "text": "Of Balance" }, - { "min": 26, "max": 50, "text": "Of Stability" }, - { "min": 51, "max": "max", "text": "Of Harmony" } + { "min": 1, "max": 25, "value": "Of Balance" }, + { "min": 26, "max": 50, "value": "Of Stability" }, + { "min": 51, "max": "max", "value": "Of Harmony" } ] } ] }, { "id": "goldSuffix", - "names": { - "property": "gold", + "values": { + "property": "quantity", "value": [ - { "min": 1, "max": 1, "text": "Piece" }, - { "min": "min", "max": "max", "text": "Pieces" } + { "min": 1, "max": 1, "value": "Piece" }, + { "min": "min", "max": "max", "value": "Pieces" } ] } }, { "id": "weaponSuffixes", - "names": [ + "values": [ { "property": "allAttributes", "value": [ - { "min": "min", "max": -6, "text": "Of Trouble" }, - { "min": -5, "max": -1, "text": "Of The Pit" }, - { "min": 1, "max": 3, "text": "Of The Sky" }, - { "min": 4, "max": 7, "text": "Of The Moon" }, - { "min": 8, "max": 11, "text": "Of The Stars" }, - { "min": 12, "max": 15, "text": "Of The Heavens" }, - { "min": 16, "max": "max", "text": "Of The Zodiac" } + { "min": "min", "max": -6, "value": "Of Trouble" }, + { "min": -5, "max": -1, "value": "Of The Pit" }, + { "min": 1, "max": 3, "value": "Of The Sky" }, + { "min": 4, "max": 7, "value": "Of The Moon" }, + { "min": 8, "max": 11, "value": "Of The Stars" }, + { "min": 12, "max": 15, "value": "Of The Heavens" }, + { "min": 16, "max": "max", "value": "Of The Zodiac" } ] }, { "property": "strength", "value": [ - { "min": "min", "max": -6, "text": "Of Frailty" }, - { "min": -5, "max": -1, "text": "Of Weakness" }, - { "min": 1, "max": 5, "text": "Of Strength" }, - { "min": 6, "max": 10, "text": "Of Might" }, - { "min": 11, "max": 15, "text": "Of Power" }, - { "min": 16, "max": 20, "text": "Of Giants" }, - { "min": 21, "max": "max", "text": "Of Titans" } + { "min": "min", "max": -6, "value": "Of Frailty" }, + { "min": -5, "max": -1, "value": "Of Weakness" }, + { "min": 1, "max": 5, "value": "Of Strength" }, + { "min": 6, "max": 10, "value": "Of Might" }, + { "min": 11, "max": 15, "value": "Of Power" }, + { "min": 16, "max": 20, "value": "Of Giants" }, + { "min": 21, "max": "max", "value": "Of Titans" } ] }, { "property": "magic", "value": [ - { "min": "min", "max": -6, "text": "Of The Fool" }, - { "min": -5, "max": -1, "text": "Of Dyslexia" }, - { "min": 1, "max": 5, "text": "Of Magic" }, - { "min": 6, "max": 10, "text": "Of The Mind" }, - { "min": 11, "max": 15, "text": "Of Brilliance" }, - { "min": 16, "max": 20, "text": "Of Sorcery" }, - { "min": 21, "max": "max", "text": "Of Wizardry" } + { "min": "min", "max": -6, "value": "Of The Fool" }, + { "min": -5, "max": -1, "value": "Of Dyslexia" }, + { "min": 1, "max": 5, "value": "Of Magic" }, + { "min": 6, "max": 10, "value": "Of The Mind" }, + { "min": 11, "max": 15, "value": "Of Brilliance" }, + { "min": 16, "max": 20, "value": "Of Sorcery" }, + { "min": 21, "max": "max", "value": "Of Wizardry" } ] }, { "property": "dexterity", "value": [ - { "min": "min", "max": -6, "text": "Of Paralysis" }, - { "min": -5, "max": -1, "text": "Of Atrophy" }, - { "min": -1, "max": 5, "text": "Of Dexterity" }, - { "min": 6, "max": 10, "text": "Of Skill" }, - { "min": 11, "max": 15, "text": "Of Accuracy" }, - { "min": 16, "max": 20, "text": "Of Precision" }, - { "min": 21, "max": "max", "text": "Of Perfection" } + { "min": "min", "max": -6, "value": "Of Paralysis" }, + { "min": -5, "max": -1, "value": "Of Atrophy" }, + { "min": -1, "max": 5, "value": "Of Dexterity" }, + { "min": 6, "max": 10, "value": "Of Skill" }, + { "min": 11, "max": 15, "value": "Of Accuracy" }, + { "min": 16, "max": 20, "value": "Of Precision" }, + { "min": 21, "max": "max", "value": "Of Perfection" } ] }, { "property": "vitality", "value": [ - { "min": "min", "max": -6, "text": "Of Illness" }, - { "min": -5, "max": -1, "text": "Of Disease" }, - { "min": -1, "max": 5, "text": "Of Vitality" }, - { "min": 6, "max": 10, "text": "Of Zest" }, - { "min": 11, "max": 15, "text": "Of Vim" }, - { "min": 16, "max": 20, "text": "Of Vigor" }, - { "min": 21, "max": "max", "text": "Of Life" } + { "min": "min", "max": -6, "value": "Of Illness" }, + { "min": -5, "max": -1, "value": "Of Disease" }, + { "min": -1, "max": 5, "value": "Of Vitality" }, + { "min": 6, "max": 10, "value": "Of Zest" }, + { "min": 11, "max": 15, "value": "Of Vim" }, + { "min": 16, "max": 20, "value": "Of Vigor" }, + { "min": 21, "max": "max", "value": "Of Life" } ] }, { "property": "hitStealsLife", "value": [ - { "min": 3, "max": 4, "text": "Of The Leech" }, - { "min": 5, "max": "max", "text": "Of Blood" } + { "min": 3, "max": 4, "value": "Of The Leech" }, + { "min": 5, "max": "max", "value": "Of Blood" } ] }, { "property": "hitStealsMana", "value": [ - { "min": 3, "max": 4, "text": "Of The Bat" }, - { "min": 5, "max": "max", "text": "Of Vampires" } + { "min": 3, "max": 4, "value": "Of The Bat" }, + { "min": 5, "max": "max", "value": "Of Vampires" } ] }, { "property": "attack", "value": [ - { "min": 1, "max": 25, "text": "Of Readiness" }, - { "min": 26, "max": 50, "text": "Of Swiftness" }, - { "min": 51, "max": 75, "text": "Of Speed" }, - { "min": 76, "max": "max", "text": "Of Haste" } + { "min": 1, "max": 25, "value": "Of Readiness" }, + { "min": 26, "max": 50, "value": "Of Swiftness" }, + { "min": 51, "max": 75, "value": "Of Speed" }, + { "min": 76, "max": "max", "value": "Of Haste" } ] }, { "property": "lightRadius", "value": [ - { "min": "min", "max": -40, "text": "Of The Dark" }, - { "min": -39, "max": -20, "text": "Of The Night" }, - { "min": 20, "max": 39, "text": "Of Light" }, - { "min": 40, "max": "max", "text": "Of Radiance" } + { "min": "min", "max": -40, "value": "Of The Dark" }, + { "min": -39, "max": -20, "value": "Of The Night" }, + { "min": 20, "max": 39, "value": "Of Light" }, + { "min": 40, "max": "max", "value": "Of Radiance" } ] }, { "property": "toTargetArmor", "value": [ - { "min": 1, "max": 4, "text": "Of Piercing" }, - { "min": 5, "max": 8, "text": "Of Puncturing" }, - { "min": 9, "max": "max", "text": "Of Bashing" } + { "min": 1, "max": 4, "value": "Of Piercing" }, + { "min": 5, "max": 8, "value": "Of Puncturing" }, + { "min": 9, "max": "max", "value": "Of Bashing" } ] }, { "property": "damage", "value": [ - { "min": 1, "max": 2, "text": "Of Quality" }, - { "min": 3, "max": 5, "text": "Of Maiming" }, - { "min": 6, "max": 8, "text": "Of Slaying" }, - { "min": 9, "max": 12, "text": "Of Gore" }, - { "min": 13, "max": 16, "text": "Of Carnage" }, - { "min": 17, "max": "max", "text": "Of Slaughter" } + { "min": 1, "max": 2, "value": "Of Quality" }, + { "min": 3, "max": 5, "value": "Of Maiming" }, + { "min": 6, "max": 8, "value": "Of Slaying" }, + { "min": 9, "max": 12, "value": "Of Gore" }, + { "min": 13, "max": 16, "value": "Of Carnage" }, + { "min": 17, "max": "max", "value": "Of Slaughter" } ] } ] }, { "id": "jewellerySuffixes", - "names": [ + "values": [ { "property": "allAttributes", "value": [ - { "min": "min", "max": -6, "text": "Of Trouble" }, - { "min": -5, "max": -1, "text": "Of The Pit" }, - { "min": 1, "max": 3, "text": "Of The Sky" }, - { "min": 4, "max": 7, "text": "Of The Moon" }, - { "min": 8, "max": 11, "text": "Of The Stars" }, - { "min": 12, "max": 15, "text": "Of The Heavens" }, - { "min": 16, "max": "max", "text": "Of The Zodiac" } + { "min": "min", "max": -6, "value": "Of Trouble" }, + { "min": -5, "max": -1, "value": "Of The Pit" }, + { "min": 1, "max": 3, "value": "Of The Sky" }, + { "min": 4, "max": 7, "value": "Of The Moon" }, + { "min": 8, "max": 11, "value": "Of The Stars" }, + { "min": 12, "max": 15, "value": "Of The Heavens" }, + { "min": 16, "max": "max", "value": "Of The Zodiac" } ] }, { "property": "strength", "value": [ - { "min": "min", "max": -6, "text": "Of Frailty" }, - { "min": -5, "max": -1, "text": "Of Weakness" }, - { "min": 1, "max": 5, "text": "Of Strength" }, - { "min": 6, "max": 10, "text": "Of Might" }, - { "min": 11, "max": 15, "text": "Of Power" }, - { "min": 16, "max": 20, "text": "Of Giants" }, - { "min": 21, "max": "max", "text": "Of Titans" } + { "min": "min", "max": -6, "value": "Of Frailty" }, + { "min": -5, "max": -1, "value": "Of Weakness" }, + { "min": 1, "max": 5, "value": "Of Strength" }, + { "min": 6, "max": 10, "value": "Of Might" }, + { "min": 11, "max": 15, "value": "Of Power" }, + { "min": 16, "max": 20, "value": "Of Giants" }, + { "min": 21, "max": "max", "value": "Of Titans" } ] }, { "property": "magic", "value": [ - { "min": "min", "max": -6, "text": "Of The Fool" }, - { "min": -5, "max": -1, "text": "Of Dyslexia" }, - { "min": 1, "max": 5, "text": "Of Magic" }, - { "min": 6, "max": 10, "text": "Of The Mind" }, - { "min": 11, "max": 15, "text": "Of Brilliance" }, - { "min": 16, "max": 20, "text": "Of Sorcery" }, - { "min": 21, "max": "max", "text": "Of Wizardry" } + { "min": "min", "max": -6, "value": "Of The Fool" }, + { "min": -5, "max": -1, "value": "Of Dyslexia" }, + { "min": 1, "max": 5, "value": "Of Magic" }, + { "min": 6, "max": 10, "value": "Of The Mind" }, + { "min": 11, "max": 15, "value": "Of Brilliance" }, + { "min": 16, "max": 20, "value": "Of Sorcery" }, + { "min": 21, "max": "max", "value": "Of Wizardry" } ] }, { "property": "dexterity", "value": [ - { "min": "min", "max": -6, "text": "Of Paralysis" }, - { "min": -5, "max": -1, "text": "Of Atrophy" }, - { "min": -1, "max": 5, "text": "Of Dexterity" }, - { "min": 6, "max": 10, "text": "Of Skill" }, - { "min": 11, "max": 15, "text": "Of Accuracy" }, - { "min": 16, "max": 20, "text": "Of Precision" }, - { "min": 21, "max": "max", "text": "Of Perfection" } + { "min": "min", "max": -6, "value": "Of Paralysis" }, + { "min": -5, "max": -1, "value": "Of Atrophy" }, + { "min": -1, "max": 5, "value": "Of Dexterity" }, + { "min": 6, "max": 10, "value": "Of Skill" }, + { "min": 11, "max": 15, "value": "Of Accuracy" }, + { "min": 16, "max": 20, "value": "Of Precision" }, + { "min": 21, "max": "max", "value": "Of Perfection" } ] }, { "property": "vitality", "value": [ - { "min": "min", "max": -6, "text": "Of Illness" }, - { "min": -5, "max": -1, "text": "Of Disease" }, - { "min": -1, "max": 5, "text": "Of Vitality" }, - { "min": 6, "max": 10, "text": "Of Zest" }, - { "min": 11, "max": 15, "text": "Of Vim" }, - { "min": 16, "max": 20, "text": "Of Vigor" }, - { "min": 21, "max": "max", "text": "Of Life" } + { "min": "min", "max": -6, "value": "Of Illness" }, + { "min": -5, "max": -1, "value": "Of Disease" }, + { "min": -1, "max": 5, "value": "Of Vitality" }, + { "min": 6, "max": 10, "value": "Of Zest" }, + { "min": 11, "max": 15, "value": "Of Vim" }, + { "min": 16, "max": 20, "value": "Of Vigor" }, + { "min": 21, "max": "max", "value": "Of Life" } ] }, { "property": "life", "value": [ - { "min": "min", "max": -11, "text": "Of The Vulture" }, - { "min": -10, "max": -1, "text": "Of The Jackal" }, - { "min": 10, "max": 15, "text": "Of The Fox" }, - { "min": 16, "max": 20, "text": "Of The Jaguar" }, - { "min": 21, "max": 30, "text": "Of The Eagle" }, - { "min": 31, "max": 40, "text": "Of The Wolf" }, - { "min": 41, "max": 50, "text": "Of The Tiger" }, - { "min": 51, "max": 60, "text": "Of The Lion" }, - { "min": 61, "max": 80, "text": "Of The Mammoth" }, - { "min": 81, "max": "max", "text": "Of The Whale" } + { "min": "min", "max": -11, "value": "Of The Vulture" }, + { "min": -10, "max": -1, "value": "Of The Jackal" }, + { "min": 10, "max": 15, "value": "Of The Fox" }, + { "min": 16, "max": 20, "value": "Of The Jaguar" }, + { "min": 21, "max": 30, "value": "Of The Eagle" }, + { "min": 31, "max": 40, "value": "Of The Wolf" }, + { "min": 41, "max": 50, "value": "Of The Tiger" }, + { "min": 51, "max": 60, "value": "Of The Lion" }, + { "min": 61, "max": 80, "value": "Of The Mammoth" }, + { "min": 81, "max": "max", "value": "Of The Whale" } ] }, { "property": "hitRecovery", "value": [ - { "min": 1, "max": 25, "text": "Of Balance" }, - { "min": 26, "max": 50, "text": "Of Stability" }, - { "min": 51, "max": "max", "text": "Of Harmony" } + { "min": 1, "max": 25, "value": "Of Balance" }, + { "min": 26, "max": 50, "value": "Of Stability" }, + { "min": 51, "max": "max", "value": "Of Harmony" } ] }, { "property": "lightRadius", "value": [ - { "min": "min", "max": -40, "text": "Of The Dark" }, - { "min": -39, "max": -20, "text": "Of The Night" }, - { "min": 20, "max": 39, "text": "Of Light" }, - { "min": 40, "max": "max", "text": "Of Radiance" } + { "min": "min", "max": -40, "value": "Of The Dark" }, + { "min": -39, "max": -20, "value": "Of The Night" }, + { "min": 20, "max": 39, "value": "Of Light" }, + { "min": 40, "max": "max", "value": "Of Radiance" } ] }, { "property": "damageFromEnemies", "value": [ - { "min": 2, "max": "max", "text": "Of Pain" }, - { "min": 1, "max": 1, "text": "Of Tears" }, - { "min": -1, "max": -1, "text": "Of Health" }, - { "min": -2, "max": -2, "text": "Of Protection" }, - { "min": -3, "max": -3, "text": "Of Absorption" }, - { "min": -4, "max": -4, "text": "Of Deflection" }, - { "min": "min", "max": -5, "text": "Of Osmosis" } + { "min": 2, "max": "max", "value": "Of Pain" }, + { "min": 1, "max": 1, "value": "Of Tears" }, + { "min": -1, "max": -1, "value": "Of Health" }, + { "min": -2, "max": -2, "value": "Of Protection" }, + { "min": -3, "max": -3, "value": "Of Absorption" }, + { "min": -4, "max": -4, "value": "Of Deflection" }, + { "min": "min", "max": -5, "value": "Of Osmosis" } ] }, { "property": "ofThieves", - "value": { "text": "Of Thieves" } + "value": { "value": "Of Thieves" } } ] } diff --git a/gamefilesd/level/l1/l1.json b/gamefilesd/level/l1/l1.json new file mode 100755 index 00000000..cbf59252 --- /dev/null +++ b/gamefilesd/level/l1/l1.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 243, 244, 322, 323, 448, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 298, 299, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 296, 297, 24, 6, 203, 204, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 298, 299, 12, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 201, 202, 5, 6, 41, 31, 1, 2, 346, 347, 296, 297, 21, 2, 293, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 3, 4, 348, 349, 298, 299, 12, 4, 294, 295, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 346, 347, 346, 347, 23, 2, 296, 297, 437, 438, 1, 2, 346, 347, 296, 297, 21, 2, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 348, 349, 348, 349, 7, 4, 298, 299, 439, 440, 3, 4, 348, 349, 298, 299, 12, 4, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 220, 221, 286, 287, 346, 347, 350, 351, 23, 2, 303, 304, 65, 15, 28, 2, 346, 347, 23, 2, 9, 6, 237, 238, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 222, 223, 288, 289, 348, 349, 352, 353, 7, 4, 305, 306, 58, 4, 7, 4, 348, 349, 7, 4, 3, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 350, 351, 262, 263, 346, 347, 350, 351, 124, 290, 296, 297, 392, 2, 216, 217, 350, 351, 346, 347, 392, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 352, 353, 264, 265, 348, 349, 352, 353, 291, 292, 298, 299, 393, 4, 218, 219, 352, 353, 348, 349, 393, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 293, 2, 346, 347, 282, 283, 23, 2, 262, 263, 303, 304, 62, 2, 346, 347, 286, 287, 23, 2, 1, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 294, 295, 348, 349, 7, 4, 7, 4, 264, 265, 305, 306, 63, 4, 348, 349, 288, 289, 7, 4, 3, 4, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 216, 217, 124, 290, 23, 2, 296, 297, 445, 442, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 296, 297, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 218, 219, 291, 292, 7, 4, 298, 299, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 298, 299, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 346, 347, 23, 2, 23, 2, 350, 351, 296, 297, 24, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 9, 6, 5, 6, 5, 6, 5, 6, 28, 2, 220, 221, 303, 304, 65, 15, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 348, 349, 7, 4, 7, 4, 352, 353, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 222, 223, 305, 306, 58, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 449, 442, 13, 2, 350, 351, 350, 351, 346, 347, 23, 2, 296, 297, 21, 2, 346, 347, 346, 347, 350, 351, 350, 351, 220, 221, 312, 2, 239, 2, 23, 2, 350, 351, 23, 2, 23, 2, 224, 225, 303, 304, 62, 2, 216, 217, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 352, 353, 352, 353, 348, 349, 7, 4, 298, 299, 12, 4, 348, 349, 348, 349, 352, 353, 352, 353, 222, 223, 313, 314, 240, 4, 7, 4, 352, 353, 7, 4, 7, 4, 226, 4, 305, 306, 63, 4, 218, 219, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 29, 2, 216, 217, 350, 351, 350, 351, 23, 2, 296, 297, 21, 2, 346, 347, 350, 351, 346, 347, 350, 351, 286, 287, 307, 308, 28, 2, 350, 351, 23, 2, 350, 351, 350, 351, 346, 347, 303, 304, 62, 2, 23, 2, 9, 6, 5, 6, 41, 31, 40, 31, 40, 31, 1, 2, 23, 2, 262, 263, 23, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 218, 219, 352, 353, 352, 353, 7, 4, 298, 299, 12, 4, 348, 349, 352, 353, 348, 349, 352, 353, 288, 289, 7, 4, 7, 4, 352, 353, 7, 4, 352, 353, 352, 353, 348, 349, 305, 306, 63, 4, 7, 4, 3, 4, 7, 4, 39, 33, 36, 33, 36, 33, 3, 4, 7, 4, 264, 265, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 350, 351, 350, 351, 216, 217, 350, 351, 282, 283, 445, 442, 13, 2, 23, 2, 23, 2, 350, 351, 23, 2, 23, 2, 23, 2, 350, 351, 124, 290, 346, 347, 350, 351, 346, 347, 303, 304, 62, 2, 350, 351, 392, 2, 262, 263, 30, 31, 40, 31, 40, 31, 239, 2, 350, 351, 346, 347, 23, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 352, 353, 352, 353, 218, 219, 352, 353, 7, 4, 446, 440, 3, 4, 7, 4, 7, 4, 352, 353, 7, 4, 7, 4, 7, 4, 352, 353, 291, 292, 348, 349, 352, 353, 348, 349, 305, 306, 63, 4, 352, 353, 393, 4, 264, 265, 32, 33, 36, 33, 36, 33, 240, 4, 352, 353, 348, 349, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 346, 347, 286, 287, 350, 351, 286, 287, 284, 285, 30, 31, 1, 2, 350, 351, 346, 347, 350, 351, 23, 2, 284, 285, 23, 2, 300, 2, 300, 2, 224, 225, 346, 347, 346, 347, 296, 297, 21, 2, 216, 217, 1, 2, 350, 351, 437, 438, 40, 31, 40, 31, 1, 2, 286, 287, 350, 351, 350, 351, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 348, 349, 288, 289, 352, 353, 288, 289, 7, 4, 32, 33, 3, 4, 352, 353, 348, 349, 352, 353, 7, 4, 7, 4, 7, 4, 301, 302, 301, 302, 226, 4, 348, 349, 348, 349, 298, 299, 12, 4, 218, 219, 3, 4, 352, 353, 439, 440, 36, 33, 36, 33, 3, 4, 288, 289, 352, 353, 352, 353, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 216, 217, 284, 285, 286, 287, 350, 351, 23, 2, 346, 347, 30, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 9, 6, 5, 6, 22, 11, 5, 6, 245, 246, 445, 442, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 1, 2, 124, 2, 350, 351, 346, 347, 307, 308, 14, 15, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 218, 219, 7, 4, 288, 289, 352, 353, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 3, 4, 273, 274, 352, 353, 348, 349, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 220, 221, 346, 347, 350, 351, 346, 347, 346, 347, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 28, 2, 124, 2, 262, 263, 346, 347, 346, 347, 14, 15, 5, 6, 233, 234, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 275, 276, 270, 271, 216, 217, 350, 351, 216, 217, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 222, 223, 348, 349, 352, 353, 348, 349, 348, 349, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 273, 274, 264, 265, 348, 349, 348, 349, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 277, 272, 4, 218, 219, 352, 353, 218, 219, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 346, 347, 23, 2, 23, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 1, 2, 262, 263, 350, 351, 350, 351, 275, 276, 270, 271, 346, 347, 346, 347, 346, 347, 346, 347, 23, 2, 30, 31, 40, 31, 9, 6, 5, 6, 5, 6, 41, 31, 1, 2, 220, 221, 220, 221, 300, 2, 300, 2, 300, 2, 300, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 348, 349, 7, 4, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 3, 4, 264, 265, 352, 353, 352, 353, 7, 277, 272, 4, 348, 349, 348, 349, 348, 349, 348, 349, 7, 4, 32, 33, 36, 33, 3, 4, 7, 4, 7, 4, 39, 33, 3, 4, 222, 223, 222, 223, 301, 302, 301, 302, 301, 302, 301, 302, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 262, 263, 346, 347, 350, 351, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 1, 2, 124, 290, 23, 2, 124, 290, 23, 2, 23, 2, 346, 347, 124, 290, 284, 285, 350, 351, 350, 351, 30, 31, 40, 31, 1, 2, 350, 351, 282, 283, 30, 31, 42, 35, 34, 35, 34, 35, 441, 442, 47, 48, 45, 46, 64, 48, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 264, 265, 348, 349, 352, 353, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 3, 4, 291, 292, 7, 4, 291, 292, 7, 4, 7, 4, 348, 349, 291, 292, 7, 4, 352, 353, 352, 353, 32, 33, 36, 33, 3, 4, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 443, 440, 49, 4, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 1, 2, 262, 263, 346, 347, 315, 316, 23, 2, 346, 347, 315, 316, 350, 351, 23, 2, 262, 263, 220, 221, 30, 31, 40, 31, 1, 2, 224, 225, 282, 283, 437, 438, 40, 31, 137, 138, 448, 438, 40, 31, 1, 2, 224, 225, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 264, 265, 348, 349, 317, 318, 7, 4, 348, 349, 317, 318, 352, 353, 7, 4, 264, 265, 222, 223, 32, 33, 36, 33, 3, 4, 226, 4, 7, 4, 439, 440, 36, 33, 139, 140, 446, 440, 36, 33, 3, 4, 226, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 216, 217, 350, 351, 307, 308, 25, 26, 124, 290, 307, 308, 25, 26, 124, 2, 350, 351, 350, 351, 30, 31, 40, 31, 239, 2, 23, 2, 312, 2, 9, 6, 5, 127, 129, 130, 133, 134, 5, 6, 9, 6, 45, 46, 5, 6, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 218, 219, 352, 353, 7, 4, 27, 4, 291, 292, 7, 4, 27, 4, 273, 274, 352, 353, 352, 353, 32, 33, 36, 33, 240, 4, 7, 4, 313, 314, 3, 4, 7, 128, 131, 132, 135, 136, 7, 4, 3, 4, 7, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 231, 2, 350, 351, 346, 347, 293, 2, 23, 2, 23, 2, 284, 285, 346, 347, 275, 276, 270, 271, 262, 263, 30, 31, 9, 6, 29, 2, 23, 2, 307, 308, 28, 2, 224, 225, 141, 142, 143, 2, 23, 2, 28, 2, 346, 347, 220, 221, 14, 15, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 232, 4, 352, 353, 348, 349, 294, 295, 7, 4, 7, 4, 7, 4, 348, 349, 7, 277, 272, 4, 264, 265, 32, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 226, 4, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 222, 223, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 224, 225, 315, 316, 216, 217, 23, 2, 315, 316, 282, 283, 124, 2, 346, 347, 284, 285, 30, 31, 1, 2, 350, 351, 23, 2, 23, 2, 350, 351, 346, 347, 23, 2, 346, 347, 23, 2, 350, 351, 350, 351, 346, 347, 293, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 226, 4, 317, 318, 218, 219, 7, 4, 317, 318, 7, 4, 273, 274, 348, 349, 7, 4, 32, 33, 3, 4, 352, 353, 7, 4, 7, 4, 352, 353, 348, 349, 7, 4, 348, 349, 7, 4, 352, 353, 352, 353, 348, 349, 294, 295, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 284, 285, 307, 308, 25, 26, 23, 2, 307, 308, 25, 26, 275, 276, 270, 271, 350, 351, 30, 31, 205, 2, 346, 347, 23, 2, 346, 347, 350, 351, 23, 2, 23, 2, 350, 351, 23, 2, 350, 351, 346, 347, 23, 2, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 27, 4, 7, 4, 7, 4, 27, 4, 7, 277, 272, 4, 352, 353, 32, 33, 206, 4, 348, 349, 7, 4, 348, 349, 352, 353, 7, 4, 7, 4, 352, 353, 7, 4, 352, 353, 348, 349, 7, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 346, 347, 346, 347, 23, 2, 124, 290, 23, 2, 216, 217, 346, 347, 346, 347, 30, 31, 449, 442, 9, 6, 394, 395, 5, 6, 9, 6, 394, 395, 5, 6, 5, 6, 5, 6, 9, 6, 229, 230, 5, 6, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 348, 349, 348, 349, 7, 4, 291, 292, 7, 4, 218, 219, 348, 349, 348, 349, 32, 33, 443, 440, 3, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 256, 2, 350, 351, 350, 351, 23, 2, 262, 263, 262, 263, 224, 225, 350, 351, 346, 347, 293, 2, 216, 217, 30, 31, 40, 31, 1, 2, 350, 351, 346, 347, 1, 2, 23, 2, 23, 2, 346, 347, 23, 2, 1, 2, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 257, 4, 352, 353, 352, 353, 7, 4, 264, 265, 264, 265, 226, 4, 352, 353, 348, 349, 294, 295, 218, 219, 32, 33, 36, 33, 3, 4, 352, 353, 348, 349, 3, 4, 7, 4, 7, 4, 348, 349, 7, 4, 3, 4, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 233, 234, 201, 202, 201, 202, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 286, 287, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 23, 2, 346, 347, 286, 287, 437, 438, 40, 31, 1, 2, 23, 2, 23, 2, 1, 2, 300, 2, 300, 2, 350, 351, 346, 347, 1, 2, 23, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 288, 289, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 7, 4, 348, 349, 288, 289, 439, 440, 36, 33, 3, 4, 7, 4, 7, 4, 3, 4, 301, 302, 301, 302, 352, 353, 348, 349, 3, 4, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 262, 263, 220, 221, 23, 2, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 20, 11, 22, 11, 22, 11, 22, 11, 324, 325, 445, 442, 34, 35, 441, 442, 37, 31, 40, 31, 1, 2, 350, 351, 350, 351, 445, 442, 9, 6, 248, 249, 5, 6, 445, 442, 9, 6, 5, 6, 394, 395, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 264, 265, 222, 223, 7, 4, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 298, 299, 446, 440, 36, 33, 443, 440, 36, 33, 36, 33, 3, 4, 352, 353, 352, 353, 446, 440, 3, 4, 7, 4, 7, 4, 446, 440, 3, 4, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 235, 2, 216, 217, 350, 351, 346, 347, 346, 347, 224, 225, 307, 308, 14, 15, 5, 6, 5, 6, 41, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 28, 2, 346, 347, 350, 351, 346, 347, 296, 297, 24, 6, 5, 6, 247, 242, 5, 6, 41, 31, 42, 35, 34, 35, 441, 442, 37, 31, 1, 2, 350, 351, 346, 347, 14, 15, 28, 2, 350, 351, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 236, 4, 218, 219, 352, 353, 348, 349, 348, 349, 226, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 352, 353, 348, 349, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 443, 440, 36, 33, 3, 4, 352, 353, 348, 349, 7, 4, 7, 4, 352, 353, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 449, 442, 13, 2, 23, 2, 346, 347, 346, 347, 350, 351, 23, 2, 350, 351, 284, 285, 312, 2, 437, 438, 40, 31, 1, 2, 23, 2, 350, 351, 346, 347, 124, 290, 23, 2, 346, 347, 23, 2, 296, 297, 21, 2, 350, 351, 286, 287, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 346, 347, 346, 347, 350, 351, 216, 217, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 348, 349, 348, 349, 352, 353, 7, 4, 352, 353, 7, 4, 313, 314, 439, 440, 36, 33, 3, 4, 7, 4, 352, 353, 348, 349, 291, 292, 7, 4, 348, 349, 7, 4, 298, 299, 12, 4, 352, 353, 288, 289, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 348, 349, 348, 349, 352, 353, 218, 219, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 284, 285, 220, 221, 23, 2, 23, 2, 350, 351, 23, 2, 307, 308, 14, 15, 233, 234, 28, 2, 350, 351, 346, 347, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 209, 210, 346, 347, 23, 2, 350, 351, 437, 438, 9, 6, 5, 6, 5, 6, 5, 6, 28, 2, 350, 351, 23, 2, 293, 2, 23, 2, 216, 217, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 222, 223, 7, 4, 7, 4, 352, 353, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 348, 349, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 211, 4, 348, 349, 7, 4, 352, 353, 439, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 7, 4, 294, 295, 7, 4, 218, 219, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 9, 6, 394, 395, 5, 6, 13, 2, 23, 2, 350, 351, 346, 347, 350, 351, 23, 2, 23, 2, 20, 11, 22, 11, 248, 249, 22, 11, 22, 11, 38, 35, 34, 35, 34, 35, 441, 442, 37, 31, 1, 2, 293, 2, 350, 351, 23, 2, 124, 2, 350, 351, 346, 347, 216, 217, 350, 351, 23, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 3, 4, 7, 4, 352, 353, 348, 349, 352, 353, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 443, 440, 36, 33, 3, 4, 294, 295, 352, 353, 7, 4, 273, 274, 352, 353, 348, 349, 218, 219, 352, 353, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 346, 347, 1, 2, 23, 2, 286, 287, 346, 347, 23, 2, 124, 290, 282, 283, 1, 2, 23, 2, 23, 2, 286, 287, 23, 2, 437, 438, 9, 6, 247, 242, 5, 6, 448, 438, 1, 2, 346, 347, 346, 347, 216, 217, 275, 276, 270, 271, 262, 263, 350, 351, 350, 351, 346, 347, 262, 263, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 348, 349, 3, 4, 7, 4, 288, 289, 348, 349, 7, 4, 291, 292, 7, 4, 3, 4, 7, 4, 7, 4, 288, 289, 7, 4, 439, 440, 3, 4, 7, 4, 7, 4, 446, 440, 3, 4, 348, 349, 348, 349, 218, 219, 7, 277, 272, 4, 264, 265, 352, 353, 352, 353, 348, 349, 264, 265, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 124, 290, 312, 2, 1, 2, 293, 2, 23, 2, 346, 347, 312, 2, 445, 442, 441, 442, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 205, 2, 220, 221, 346, 347, 9, 6, 14, 15, 5, 6, 29, 2, 350, 351, 23, 2, 445, 442, 9, 6, 394, 395, 5, 6, 38, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 291, 292, 313, 314, 3, 4, 294, 295, 7, 4, 348, 349, 313, 314, 446, 440, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 206, 4, 222, 223, 348, 349, 3, 4, 7, 4, 7, 4, 7, 4, 352, 353, 7, 4, 446, 440, 3, 4, 7, 4, 7, 4, 39, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 29, 2, 293, 2, 307, 308, 28, 2, 286, 287, 124, 290, 350, 351, 307, 308, 14, 15, 5, 6, 5, 6, 5, 6, 448, 438, 40, 31, 40, 31, 40, 31, 207, 2, 220, 221, 350, 351, 1, 2, 262, 263, 346, 347, 346, 347, 216, 217, 350, 351, 30, 31, 256, 2, 346, 347, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 294, 295, 7, 4, 7, 4, 288, 289, 291, 292, 352, 353, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 208, 4, 222, 223, 352, 353, 3, 4, 264, 265, 348, 349, 348, 349, 218, 219, 352, 353, 32, 33, 257, 4, 348, 349, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 350, 351, 346, 347, 23, 2, 216, 217, 23, 2, 23, 2, 124, 2, 106, 107, 110, 111, 23, 2, 14, 15, 5, 6, 245, 246, 5, 6, 13, 2, 262, 263, 312, 2, 392, 2, 224, 225, 350, 351, 23, 2, 346, 347, 296, 297, 437, 438, 9, 6, 243, 244, 322, 333, 65, 15, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 352, 353, 348, 349, 7, 4, 218, 219, 7, 4, 7, 4, 125, 126, 108, 109, 112, 113, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 264, 265, 313, 314, 393, 4, 226, 4, 352, 353, 7, 4, 348, 349, 298, 299, 439, 440, 3, 4, 7, 4, 298, 332, 58, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 296, 297, 224, 225, 23, 2, 350, 351, 350, 351, 23, 2, 122, 123, 114, 115, 118, 119, 350, 351, 23, 2, 346, 347, 216, 217, 350, 351, 28, 2, 23, 2, 307, 308, 14, 15, 9, 6, 201, 202, 29, 2, 346, 347, 303, 304, 65, 15, 28, 2, 23, 2, 303, 304, 62, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 298, 299, 226, 4, 7, 4, 352, 353, 352, 353, 7, 4, 7, 4, 116, 117, 120, 121, 352, 353, 7, 4, 348, 349, 218, 219, 352, 353, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 348, 349, 305, 306, 58, 4, 7, 4, 7, 4, 305, 306, 63, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 65, 15, 29, 2, 23, 2, 296, 297, 24, 6, 5, 6, 229, 230, 201, 202, 13, 2, 346, 347, 286, 287, 284, 285, 23, 2, 350, 351, 23, 2, 23, 2, 346, 347, 350, 351, 350, 351, 350, 351, 350, 351, 1, 2, 346, 347, 23, 2, 124, 290, 303, 304, 62, 2, 23, 2, 350, 351, 296, 297, 209, 210, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 58, 4, 7, 4, 7, 4, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 3, 4, 348, 349, 288, 289, 7, 4, 7, 4, 352, 353, 7, 4, 7, 4, 348, 349, 352, 353, 352, 353, 352, 353, 352, 353, 3, 4, 348, 349, 7, 4, 291, 292, 305, 306, 63, 4, 7, 4, 352, 353, 298, 299, 211, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 224, 225, 296, 297, 392, 2, 346, 347, 23, 2, 296, 297, 21, 2, 23, 2, 284, 285, 282, 283, 1, 2, 220, 221, 220, 221, 262, 263, 23, 2, 346, 347, 350, 351, 23, 2, 23, 2, 350, 351, 216, 217, 216, 217, 346, 347, 1, 2, 350, 351, 350, 351, 346, 347, 296, 297, 21, 2, 23, 2, 350, 351, 303, 304, 62, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 226, 4, 298, 299, 393, 4, 348, 349, 7, 4, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 3, 4, 222, 223, 222, 223, 264, 265, 7, 4, 348, 349, 352, 353, 7, 4, 7, 4, 352, 353, 218, 219, 218, 219, 348, 349, 3, 4, 352, 353, 352, 353, 348, 349, 298, 299, 12, 4, 7, 4, 352, 353, 305, 306, 63, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 303, 304, 62, 2, 23, 2, 23, 2, 296, 297, 209, 210, 262, 263, 346, 347, 23, 2, 445, 442, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 346, 347, 350, 351, 224, 225, 445, 442, 34, 35, 34, 35, 441, 442, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 350, 351, 303, 304, 62, 2, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 305, 306, 63, 4, 7, 4, 7, 4, 298, 299, 211, 4, 264, 265, 348, 349, 7, 4, 446, 440, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 348, 349, 352, 353, 226, 4, 446, 440, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 352, 353, 305, 306, 63, 4, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 441, 442, 13, 2, 350, 351, 284, 285, 445, 442, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 352, 353, 7, 4, 446, 440, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":34, + "firstgid":1, + "image":"dungeon.png", + "imageheight":2240, + "imagewidth":2176, + "margin":0, + "name":"dungeon", + "spacing":0, + "tilecount":476, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l1/l1s.json b/gamefilesd/level/l1/l1s.json new file mode 100755 index 00000000..3a2aeeef --- /dev/null +++ b/gamefilesd/level/l1/l1s.json @@ -0,0 +1,27 @@ +{ + "texturePack": { + "id": "l1s", + "file": "levels/l1data/l1s.cel", + "imageContainer": "l1s", + "palette": "{1}", + "textureIndexes": [ + [10, 1], + [11, 0], + [70, 0], + [210, 0], + [248, 1], + [254, 3], + [258, 4], + [320, 0], + [324, 1], + [330, 1], + [340, 0], + [343, 1], + [392, 6], + [394, 7], + [407, 6], + [417, 0], + [420, 1] + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/l1/level.json b/gamefilesd/level/l1/level.json index 33853f07..3763d417 100755 --- a/gamefilesd/level/l1/level.json +++ b/gamefilesd/level/l1/level.json @@ -2,28 +2,23 @@ "palette": [ { "id": "l1_1", - "file":"levels/l1data/l1_1.pal" + "file": "levels/l1data/l1_1.pal" } ], + "load": ["level/l1/l1s.json", "l1_1"], "level": { "id": "level", - "path": "l1", - "name": "King Leoric's Lair", "palette": "l1_1", "file": "levels/l1data/l1.cel", - "outOfBoundsTileTop": 21, - "map": { "file": "levels/l1data/sklkng1.dun", "defaultTile": 12 }, + "layers": { "index": 2, "texturePack": "l1s" }, + "outOfBoundsTileLayer2": 21, "til": "levels/l1data/l1.til", "min": "levels/l1data/l1.min", "minBlocks": 10, "sol": "levels/l1data/l1.sol" }, - "action": { - "name": "if.equal", - "param1": "%beta%", - "param2": true, - "then": { "name": "load", "file": "level/l1/levelObjectsBeta.json" }, - "else": { "name": "load", "file": "level/l1/levelObjects.json" } - }, - "load": "level/l1/monsters.json" + "load": "level/automap/l1/load.json", + "load": "level/l1/levelObjects.json", + "load": "level/l1/monsters.json", + "load": "level/l1/level2.json" } \ No newline at end of file diff --git a/gamefilesd/level/l1/level2.json b/gamefilesd/level/l1/level2.json new file mode 100755 index 00000000..cd50a194 --- /dev/null +++ b/gamefilesd/level/l1/level2.json @@ -0,0 +1,16 @@ +{ + "level": { + "id": "level", + "path": "l1", + "name": "1", + "map": { "file": "level/l1/l1.json", "indexOffset": -1, "defaultTile": 12 } + }, + "load": "level/l1/levelObjects2.json", + "load": "level/l1/monsters2.json", + "load": "level/l1/quests.json", + "event": { + "time": 1.5, + "addToFront": true, + "action": { "name": "load", "file": ["res/player/sound/load.json", 97, "", "playAudio", "currentLevel"] } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l1/levelObjects.json b/gamefilesd/level/l1/levelObjects.json deleted file mode 100755 index 98e12a95..00000000 --- a/gamefilesd/level/l1/levelObjects.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "levelObject": { - "id": "town", - "name": "Up to town", - "mapPosition": [66, 26], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/town/load.json", "positionPlayer", "[25, 31]"] } - } -} \ No newline at end of file diff --git a/gamefilesd/level/l1/levelObjects2.json b/gamefilesd/level/l1/levelObjects2.json new file mode 100755 index 00000000..8bf2fd03 --- /dev/null +++ b/gamefilesd/level/l1/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [49, 84], + "properties": { + "x": 71, + "y": 52, + "level": 2 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [80, 51], + "properties": { + "x": 25, + "y": 31, + "level": 0 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l1/levelObjectsBeta.json b/gamefilesd/level/l1/levelObjectsBeta.json deleted file mode 100755 index cec690f8..00000000 --- a/gamefilesd/level/l1/levelObjectsBeta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "levelObject": { - "id": "town", - "name": "Up to town", - "mapPosition": [66, 27], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/town/load.json", "positionPlayer", "[25, 31]"] } - } -} \ No newline at end of file diff --git a/gamefilesd/level/l1/load.json b/gamefilesd/level/l1/load.json deleted file mode 100755 index 45b489b1..00000000 --- a/gamefilesd/level/l1/load.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "load": ["level/load.json", "l1", "{1}", "{2}", "cuttt"] -} \ No newline at end of file diff --git a/gamefilesd/level/l1/map.json b/gamefilesd/level/l1/map.json deleted file mode 100755 index 9fe14d33..00000000 --- a/gamefilesd/level/l1/map.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "action": { - "name": "if.equal", - "param1": "%showMap%", - "param2": true, - "then": { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, - "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } - } -} \ No newline at end of file diff --git a/gamefilesd/level/l1/monsters.json b/gamefilesd/level/l1/monsters.json index b2b0be23..cf6b9f65 100755 --- a/gamefilesd/level/l1/monsters.json +++ b/gamefilesd/level/l1/monsters.json @@ -1,9 +1,3 @@ { - "load": "level/monster/Scavenger/load.json", - "player": { - "class": "scavenger", - "mapPosition": [66, 28], - "direction": "front", - "AI": true - } + "load": "level/monster/Scavenger/load.json" } \ No newline at end of file diff --git a/gamefilesd/level/l1/monsters2.json b/gamefilesd/level/l1/monsters2.json new file mode 100755 index 00000000..9afa3c36 --- /dev/null +++ b/gamefilesd/level/l1/monsters2.json @@ -0,0 +1,8 @@ +{ + "player": { + "class": "scavenger", + "mapPosition": [80, 70], + "direction": "front", + "AI": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l1/quests.json b/gamefilesd/level/l1/quests.json new file mode 100755 index 00000000..be8a4e9a --- /dev/null +++ b/gamefilesd/level/l1/quests.json @@ -0,0 +1,9 @@ +{ + "action": [ + { "name": "quest.delete", "quest": "ogdenInit" } + ], + "quest": { + "id": "poisonedWater", + "name": "Poisoned Water Supply" + } +} \ No newline at end of file diff --git a/gamefilesd/level/l1/townToLevel.json b/gamefilesd/level/l1/townToLevel.json new file mode 100755 index 00000000..3b2d8b38 --- /dev/null +++ b/gamefilesd/level/l1/townToLevel.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "down", + "class": "levelDown", + "mapPosition": [25, 29], + "properties": { + "x": 81, + "y": 54, + "level": 1 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l10/l10.json b/gamefilesd/level/l10/l10.json new file mode 100755 index 00000000..88e8eb8c --- /dev/null +++ b/gamefilesd/level/l10/l10.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 337, 338, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 339, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 348, 349, 28, 29, 453, 454, 465, 466, 9, 10, 340, 341, 9, 10, 28, 29, 28, 29, 28, 29, 348, 349, 28, 29, 28, 29, 327, 328, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 350, 31, 30, 31, 455, 456, 467, 468, 11, 12, 342, 343, 11, 12, 30, 31, 30, 31, 30, 31, 350, 31, 30, 31, 30, 31, 329, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 9, 10, 40, 41, 36, 37, 344, 345, 9, 10, 441, 442, 21, 25, 48, 49, 44, 45, 13, 14, 28, 29, 28, 29, 40, 41, 344, 345, 9, 10, 40, 41, 323, 324, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 11, 12, 42, 43, 38, 39, 346, 347, 11, 12, 443, 444, 26, 27, 50, 51, 46, 47, 15, 16, 30, 31, 30, 31, 42, 43, 346, 347, 11, 12, 42, 43, 325, 326, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 445, 446, 48, 49, 44, 45, 17, 18, 52, 53, 48, 49, 44, 45, 385, 386, 21, 25, 389, 390, 48, 49, 461, 462, 465, 466, 44, 45, 385, 386, 48, 49, 44, 45, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 447, 448, 50, 51, 46, 47, 19, 20, 54, 55, 50, 51, 46, 47, 387, 388, 26, 27, 391, 392, 50, 51, 463, 464, 467, 468, 46, 47, 387, 388, 50, 51, 46, 47, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 9, 10, 348, 349, 40, 41, 36, 37, 9, 10, 437, 438, 385, 386, 389, 390, 13, 14, 1, 2, 52, 53, 389, 390, 385, 386, 244, 245, 21, 25, 21, 25, 389, 390, 389, 390, 385, 386, 21, 25, 385, 386, 389, 390, 48, 49, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 11, 12, 350, 31, 42, 43, 38, 39, 11, 12, 439, 440, 387, 388, 391, 392, 15, 16, 3, 4, 54, 55, 391, 392, 387, 388, 246, 247, 26, 27, 26, 27, 391, 392, 391, 392, 387, 388, 26, 27, 387, 388, 391, 392, 50, 51, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 48, 49, 344, 345, 44, 45, 385, 386, 13, 14, 441, 442, 17, 18, 52, 53, 48, 49, 36, 37, 44, 45, 21, 25, 21, 25, 385, 386, 21, 25, 21, 25, 21, 25, 389, 390, 21, 25, 21, 25, 72, 73, 60, 61, 56, 57, 150, 151, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 50, 51, 346, 347, 46, 47, 387, 388, 15, 16, 443, 444, 19, 20, 54, 55, 50, 51, 38, 39, 46, 47, 26, 27, 26, 27, 387, 388, 26, 27, 26, 27, 26, 27, 391, 392, 26, 27, 26, 27, 74, 75, 62, 63, 58, 59, 152, 153, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 166, 167, 389, 390, 21, 25, 385, 386, 393, 394, 17, 18, 21, 22, 1, 2, 21, 22, 1, 2, 5, 6, 52, 53, 21, 25, 17, 18, 5, 6, 5, 6, 5, 6, 52, 53, 385, 386, 385, 386, 385, 386, 72, 73, 84, 85, 17, 18, 5, 6, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 168, 169, 391, 392, 26, 27, 387, 388, 395, 396, 19, 20, 23, 24, 3, 4, 23, 24, 3, 4, 7, 8, 54, 55, 26, 27, 19, 20, 7, 8, 7, 8, 7, 8, 54, 55, 387, 388, 387, 388, 387, 388, 74, 75, 86, 87, 19, 20, 7, 8, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 162, 163, 21, 25, 389, 390, 385, 386, 21, 25, 48, 49, 9, 10, 327, 328, 28, 29, 28, 29, 28, 29, 32, 33, 17, 18, 21, 22, 40, 41, 36, 37, 9, 10, 1, 2, 52, 53, 385, 386, 393, 394, 158, 159, 389, 390, 48, 49, 9, 10, 327, 328, 40, 41, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 164, 165, 26, 27, 391, 392, 387, 388, 26, 27, 50, 51, 11, 12, 329, 31, 30, 31, 30, 31, 30, 31, 34, 35, 19, 20, 23, 24, 42, 43, 38, 39, 11, 12, 3, 4, 54, 55, 387, 388, 395, 396, 160, 161, 391, 392, 50, 51, 11, 12, 329, 31, 42, 43, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 5, 6, 52, 53, 17, 18, 52, 53, 48, 49, 323, 324, 461, 462, 469, 470, 465, 466, 44, 45, 48, 49, 36, 37, 44, 45, 17, 18, 21, 22, 28, 29, 397, 398, 21, 25, 21, 25, 80, 81, 60, 61, 76, 77, 48, 49, 323, 324, 44, 45, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 7, 8, 54, 55, 19, 20, 54, 55, 50, 51, 325, 326, 463, 464, 471, 472, 467, 468, 46, 47, 50, 51, 38, 39, 46, 47, 19, 20, 23, 24, 30, 31, 399, 400, 26, 27, 26, 27, 82, 83, 62, 63, 78, 79, 50, 51, 325, 326, 46, 47, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 252, 253, 44, 45, 13, 14, 445, 446, 21, 25, 21, 25, 385, 386, 389, 390, 17, 18, 52, 53, 21, 25, 389, 390, 393, 394, 48, 49, 9, 10, 28, 29, 248, 249, 385, 386, 385, 386, 21, 25, 111, 112, 134, 135, 115, 116, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 254, 255, 46, 47, 15, 16, 447, 448, 26, 27, 26, 27, 387, 388, 391, 392, 19, 20, 54, 55, 26, 27, 391, 392, 395, 396, 50, 51, 11, 12, 30, 31, 250, 251, 387, 388, 387, 388, 26, 27, 113, 114, 136, 137, 117, 118, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 21, 25, 17, 18, 21, 22, 441, 442, 21, 25, 385, 386, 389, 390, 17, 18, 21, 22, 1, 2, 52, 53, 21, 25, 21, 25, 17, 18, 21, 22, 28, 29, 1, 2, 52, 53, 385, 386, 389, 390, 119, 97, 142, 143, 122, 123, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 26, 27, 19, 20, 23, 24, 443, 444, 26, 27, 387, 388, 391, 392, 19, 20, 23, 24, 3, 4, 54, 55, 26, 27, 26, 27, 19, 20, 23, 24, 30, 31, 3, 4, 54, 55, 387, 388, 391, 392, 120, 121, 144, 145, 124, 125, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 385, 386, 48, 49, 252, 253, 44, 45, 385, 386, 385, 386, 385, 386, 13, 14, 28, 29, 40, 41, 44, 45, 17, 18, 52, 53, 48, 49, 9, 10, 28, 29, 28, 29, 32, 33, 21, 25, 385, 386, 385, 386, 80, 81, 76, 77, 13, 14, 40, 41, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 387, 388, 50, 51, 254, 255, 46, 47, 387, 388, 387, 388, 387, 388, 15, 16, 30, 31, 42, 43, 46, 47, 19, 20, 54, 55, 50, 51, 11, 12, 30, 31, 30, 31, 34, 35, 26, 27, 387, 388, 387, 388, 82, 83, 78, 79, 15, 16, 42, 43, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 72, 73, 76, 77, 21, 25, 21, 25, 393, 394, 244, 245, 21, 25, 48, 49, 252, 253, 44, 45, 17, 18, 21, 22, 248, 249, 21, 25, 13, 14, 317, 318, 319, 320, 44, 45, 389, 390, 389, 390, 72, 73, 60, 61, 84, 85, 48, 49, 44, 45, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 74, 75, 78, 79, 26, 27, 26, 27, 395, 396, 246, 247, 26, 27, 50, 51, 254, 255, 46, 47, 19, 20, 23, 24, 250, 251, 26, 27, 15, 16, 30, 31, 321, 322, 46, 47, 391, 392, 391, 392, 74, 75, 62, 63, 86, 87, 50, 51, 46, 47, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 68, 69, 80, 81, 60, 61, 76, 77, 21, 25, 21, 25, 393, 394, 21, 25, 21, 25, 17, 18, 21, 22, 40, 41, 44, 45, 17, 18, 21, 22, 28, 29, 1, 2, 52, 53, 393, 394, 72, 73, 84, 85, 389, 390, 389, 390, 21, 25, 385, 386, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 70, 71, 82, 83, 62, 63, 78, 79, 26, 27, 26, 27, 395, 396, 26, 27, 26, 27, 19, 20, 23, 24, 42, 43, 46, 47, 19, 20, 23, 24, 30, 31, 3, 4, 54, 55, 395, 396, 74, 75, 86, 87, 391, 392, 391, 392, 26, 27, 387, 388, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 64, 65, 17, 18, 52, 53, 68, 69, 72, 73, 76, 77, 385, 386, 389, 390, 393, 394, 48, 49, 401, 402, 44, 45, 393, 394, 48, 49, 374, 375, 357, 358, 28, 29, 248, 249, 389, 390, 80, 81, 76, 77, 393, 394, 389, 390, 192, 193, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 66, 67, 19, 20, 54, 55, 70, 71, 74, 75, 78, 79, 387, 388, 391, 392, 395, 396, 50, 51, 403, 404, 46, 47, 395, 396, 50, 51, 376, 377, 359, 31, 30, 31, 250, 251, 391, 392, 82, 83, 78, 79, 395, 396, 391, 392, 194, 195, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 393, 394, 68, 69, 13, 14, 32, 33, 80, 81, 84, 85, 80, 81, 154, 155, 56, 57, 56, 57, 76, 77, 111, 112, 115, 116, 17, 18, 52, 53, 13, 14, 317, 318, 319, 320, 44, 45, 393, 394, 385, 386, 80, 81, 76, 77, 389, 390, 21, 25, 389, 390, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 395, 396, 70, 71, 15, 16, 34, 35, 82, 83, 86, 87, 82, 83, 156, 157, 58, 59, 58, 59, 78, 79, 113, 114, 117, 118, 19, 20, 54, 55, 15, 16, 30, 31, 321, 322, 46, 47, 395, 396, 387, 388, 82, 83, 78, 79, 391, 392, 26, 27, 391, 392, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 88, 89, 60, 61, 56, 57, 84, 85, 13, 14, 32, 33, 389, 390, 393, 394, 389, 390, 385, 386, 17, 18, 52, 53, 80, 81, 140, 97, 104, 108, 13, 14, 1, 2, 21, 22, 28, 29, 248, 249, 389, 390, 385, 386, 393, 394, 393, 394, 64, 65, 21, 25, 21, 25, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 90, 91, 62, 63, 58, 59, 86, 87, 15, 16, 34, 35, 391, 392, 395, 396, 391, 392, 387, 388, 19, 20, 54, 55, 82, 83, 141, 114, 109, 110, 15, 16, 3, 4, 23, 24, 30, 31, 250, 251, 391, 392, 387, 388, 395, 396, 395, 396, 66, 67, 26, 27, 26, 27, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 17, 18, 5, 6, 21, 382, 1, 2, 52, 53, 385, 386, 389, 390, 17, 18, 21, 382, 1, 2, 52, 53, 119, 97, 122, 123, 48, 49, 9, 10, 28, 29, 40, 41, 44, 45, 385, 386, 385, 386, 389, 390, 389, 390, 64, 65, 389, 390, 393, 394, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 19, 20, 7, 8, 383, 384, 3, 4, 54, 55, 387, 388, 391, 392, 19, 20, 383, 384, 3, 4, 54, 55, 120, 121, 124, 125, 50, 51, 11, 12, 30, 31, 42, 43, 46, 47, 387, 388, 387, 388, 391, 392, 391, 392, 66, 67, 391, 392, 395, 396, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 28, 29, 363, 364, 28, 29, 32, 33, 385, 386, 17, 18, 21, 22, 363, 364, 40, 41, 44, 45, 21, 25, 21, 25, 17, 18, 21, 22, 28, 29, 32, 33, 21, 25, 389, 390, 385, 386, 184, 185, 21, 25, 64, 65, 21, 25, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 30, 31, 365, 31, 30, 31, 34, 35, 387, 388, 19, 20, 23, 24, 365, 31, 42, 43, 46, 47, 26, 27, 26, 27, 19, 20, 23, 24, 30, 31, 34, 35, 26, 27, 391, 392, 387, 388, 186, 187, 26, 27, 66, 67, 26, 27, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 21, 25, 48, 49, 36, 37, 9, 10, 32, 33, 393, 394, 389, 390, 385, 386, 48, 49, 374, 375, 357, 358, 1, 2, 5, 6, 52, 53, 385, 386, 385, 386, 21, 25, 158, 159, 21, 25, 17, 18, 21, 382, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 26, 27, 50, 51, 38, 39, 11, 12, 34, 35, 395, 396, 391, 392, 387, 388, 50, 51, 376, 377, 359, 31, 3, 4, 7, 8, 54, 55, 387, 388, 387, 388, 26, 27, 160, 161, 26, 27, 19, 20, 383, 384, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 337, 338, 28, 29, 28, 29, 28, 29, 32, 33, 17, 18, 5, 6, 52, 53, 17, 18, 21, 22, 32, 33, 21, 25, 389, 390, 17, 18, 5, 6, 21, 22, 28, 29, 28, 29, 40, 41, 44, 45, 17, 18, 5, 6, 52, 53, 80, 81, 76, 77, 13, 14, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 339, 31, 30, 31, 30, 31, 30, 31, 34, 35, 19, 20, 7, 8, 54, 55, 19, 20, 23, 24, 34, 35, 26, 27, 391, 392, 19, 20, 7, 8, 23, 24, 30, 31, 30, 31, 42, 43, 46, 47, 19, 20, 7, 8, 54, 55, 82, 83, 78, 79, 15, 16, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 340, 341, 9, 10, 28, 29, 28, 29, 32, 33, 13, 14, 40, 41, 44, 45, 13, 14, 28, 29, 1, 2, 5, 6, 52, 53, 48, 49, 401, 402, 9, 10, 28, 29, 28, 29, 1, 2, 5, 6, 21, 22, 40, 41, 44, 45, 17, 18, 146, 147, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 342, 343, 11, 12, 30, 31, 30, 31, 34, 35, 15, 16, 42, 43, 46, 47, 15, 16, 30, 31, 3, 4, 7, 8, 54, 55, 50, 51, 403, 404, 11, 12, 30, 31, 30, 31, 3, 4, 7, 8, 23, 24, 42, 43, 46, 47, 19, 20, 148, 149, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 445, 446, 48, 49, 461, 462, 465, 466, 44, 45, 48, 49, 44, 45, 393, 394, 48, 49, 9, 10, 28, 29, 28, 29, 473, 474, 489, 490, 529, 530, 512, 14, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 447, 448, 50, 51, 463, 464, 467, 468, 46, 47, 50, 51, 46, 47, 395, 396, 50, 51, 11, 12, 30, 31, 30, 31, 475, 476, 491, 492, 538, 532, 513, 514, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 21, 25, 21, 25, 21, 25, 21, 25, 21, 25, 21, 25, 389, 390, 17, 18, 21, 22, 28, 29, 28, 29, 397, 398, 393, 394, 21, 25, 13, 14, 327, 328, 28, 29, 28, 29, 40, 41, 44, 45, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 391, 392, 19, 20, 23, 24, 30, 31, 30, 31, 399, 400, 395, 396, 26, 27, 15, 16, 329, 31, 30, 31, 30, 31, 42, 43, 46, 47, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 437, 438, 17, 18, 5, 6, 52, 53, 393, 394, 21, 25, 21, 25, 385, 386, 13, 14, 28, 29, 317, 318, 319, 320, 44, 45, 17, 18, 52, 53, 48, 49, 323, 324, 9, 10, 28, 29, 1, 2, 5, 6, 21, 22, 28, 29, 337, 338, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 439, 440, 19, 20, 7, 8, 54, 55, 395, 396, 26, 27, 26, 27, 387, 388, 15, 16, 30, 31, 30, 31, 321, 322, 46, 47, 19, 20, 54, 55, 50, 51, 325, 326, 11, 12, 30, 31, 3, 4, 7, 8, 23, 24, 30, 31, 339, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 437, 438, 48, 49, 9, 10, 473, 474, 489, 490, 497, 498, 497, 498, 529, 530, 512, 14, 40, 41, 9, 10, 1, 2, 52, 53, 13, 14, 32, 33, 21, 25, 21, 25, 48, 49, 9, 10, 40, 41, 9, 10, 40, 41, 9, 10, 340, 341, 374, 375, 357, 358, 181, 182, 178, 179, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 439, 440, 50, 51, 11, 12, 475, 476, 491, 492, 499, 500, 499, 500, 538, 532, 513, 514, 42, 43, 11, 12, 3, 4, 54, 55, 15, 16, 34, 35, 26, 27, 26, 27, 50, 51, 11, 12, 42, 43, 11, 12, 42, 43, 11, 12, 342, 343, 376, 377, 359, 31, 183, 31, 180, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 437, 438, 389, 390, 48, 49, 44, 45, 393, 394, 385, 386, 393, 394, 17, 18, 21, 22, 32, 33, 48, 49, 252, 253, 44, 45, 13, 14, 32, 33, 21, 25, 21, 25, 21, 25, 48, 49, 44, 45, 48, 49, 44, 45, 48, 49, 44, 45, 13, 14, 40, 41, 170, 171, 174, 175, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 439, 440, 391, 392, 50, 51, 46, 47, 395, 396, 387, 388, 395, 396, 19, 20, 23, 24, 34, 35, 50, 51, 254, 255, 46, 47, 15, 16, 34, 35, 26, 27, 26, 27, 26, 27, 50, 51, 46, 47, 50, 51, 46, 47, 50, 51, 46, 47, 15, 16, 42, 43, 172, 173, 176, 177, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 481, 482, 529, 530, 489, 490, 497, 498, 497, 498, 489, 490, 497, 498, 512, 14, 28, 29, 1, 2, 52, 53, 389, 390, 21, 25, 48, 49, 44, 45, 393, 394, 21, 25, 385, 386, 17, 18, 52, 53, 389, 390, 393, 394, 385, 386, 389, 390, 48, 49, 44, 45, 385, 386, 385, 386, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 483, 484, 538, 532, 491, 492, 499, 500, 499, 500, 491, 492, 499, 500, 513, 514, 30, 31, 3, 4, 54, 55, 391, 392, 26, 27, 50, 51, 46, 47, 395, 396, 26, 27, 387, 388, 19, 20, 54, 55, 391, 392, 395, 396, 387, 388, 391, 392, 50, 51, 46, 47, 387, 388, 387, 388, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 21, 25, 21, 25, 393, 394, 389, 390, 393, 394, 393, 394, 48, 49, 9, 10, 28, 29, 473, 474, 489, 490, 489, 490, 489, 490, 489, 490, 497, 498, 497, 498, 529, 530, 512, 14, 1, 2, 52, 53, 21, 25, 21, 25, 21, 25, 385, 386, 393, 394, 393, 394, 389, 390, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 26, 27, 26, 27, 395, 396, 391, 392, 395, 396, 395, 396, 50, 51, 11, 12, 30, 31, 475, 476, 491, 492, 491, 492, 491, 492, 491, 492, 499, 500, 499, 500, 538, 532, 513, 514, 3, 4, 54, 55, 26, 27, 26, 27, 26, 27, 387, 388, 395, 396, 395, 396, 391, 392, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 370, 371, 52, 53, 21, 25, 389, 390, 393, 394, 21, 25, 48, 49, 477, 478, 44, 45, 385, 386, 21, 25, 385, 386, 21, 25, 111, 112, 115, 116, 21, 25, 48, 49, 401, 402, 44, 45, 21, 25, 389, 390, 389, 390, 389, 390, 385, 386, 385, 386, 389, 390, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 372, 373, 54, 55, 26, 27, 391, 392, 395, 396, 26, 27, 50, 51, 479, 480, 46, 47, 387, 388, 26, 27, 387, 388, 26, 27, 113, 114, 117, 118, 26, 27, 50, 51, 403, 404, 46, 47, 26, 27, 391, 392, 391, 392, 391, 392, 387, 388, 387, 388, 391, 392, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 1, 2, 5, 6, 52, 53, 385, 386, 389, 390, 389, 390, 501, 502, 21, 25, 385, 386, 21, 25, 389, 390, 111, 112, 126, 127, 104, 129, 100, 101, 100, 101, 100, 101, 100, 101, 100, 101, 100, 101, 100, 101, 115, 116, 393, 394, 21, 25, 21, 25, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 3, 4, 7, 8, 54, 55, 387, 388, 391, 392, 391, 392, 503, 504, 26, 27, 387, 388, 26, 27, 391, 392, 113, 114, 128, 114, 117, 114, 102, 103, 102, 103, 102, 103, 102, 103, 102, 103, 102, 103, 102, 103, 117, 118, 395, 396, 26, 27, 26, 27, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 385, 386, 192, 193, 389, 390, 501, 502, 385, 386, 389, 390, 389, 390, 111, 112, 126, 127, 104, 97, 104, 97, 104, 97, 104, 97, 104, 97, 104, 97, 104, 97, 142, 143, 104, 105, 122, 123, 17, 18, 52, 53, 385, 386, 13, 14, 40, 41, 477, 478, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 387, 388, 194, 195, 391, 392, 503, 504, 387, 388, 391, 392, 391, 392, 113, 114, 128, 114, 117, 114, 117, 114, 117, 114, 117, 114, 117, 114, 117, 114, 132, 133, 144, 145, 106, 107, 124, 125, 19, 20, 54, 55, 387, 388, 15, 16, 42, 43, 479, 480, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 385, 386, 389, 390, 385, 386, 21, 25, 501, 502, 111, 112, 115, 116, 389, 390, 119, 97, 104, 105, 104, 97, 104, 97, 104, 97, 104, 97, 104, 105, 104, 105, 122, 123, 64, 65, 393, 394, 21, 25, 13, 14, 1, 2, 52, 53, 48, 49, 44, 45, 533, 541, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 387, 388, 391, 392, 387, 388, 26, 27, 503, 504, 113, 114, 117, 118, 391, 392, 120, 121, 106, 107, 130, 131, 132, 133, 130, 131, 132, 133, 106, 107, 106, 107, 124, 125, 66, 67, 395, 396, 26, 27, 15, 16, 3, 4, 54, 55, 50, 51, 46, 47, 535, 536, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 370, 371, 5, 6, 52, 53, 393, 394, 501, 502, 96, 97, 104, 108, 385, 386, 389, 390, 393, 394, 119, 97, 122, 123, 119, 97, 122, 123, 393, 394, 385, 386, 21, 25, 158, 159, 393, 394, 21, 25, 48, 49, 36, 37, 44, 45, 389, 390, 385, 386, 501, 502, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 372, 373, 7, 8, 54, 55, 395, 396, 503, 504, 98, 99, 109, 110, 387, 388, 391, 392, 395, 396, 120, 121, 124, 125, 120, 121, 124, 125, 395, 396, 387, 388, 26, 27, 160, 161, 395, 396, 26, 27, 50, 51, 38, 39, 46, 47, 391, 392, 387, 388, 503, 504, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 28, 29, 32, 33, 385, 386, 493, 494, 119, 97, 122, 123, 21, 25, 188, 189, 385, 386, 21, 25, 393, 394, 393, 394, 385, 386, 389, 390, 21, 25, 72, 73, 84, 85, 21, 25, 21, 25, 21, 25, 385, 386, 393, 394, 389, 390, 389, 390, 501, 502, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 30, 31, 34, 35, 387, 388, 495, 496, 120, 121, 124, 125, 26, 27, 190, 191, 387, 388, 26, 27, 395, 396, 395, 396, 387, 388, 391, 392, 26, 27, 74, 75, 86, 87, 26, 27, 26, 27, 26, 27, 387, 388, 395, 396, 391, 392, 391, 392, 503, 504, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 493, 494, 21, 25, 393, 394, 21, 25, 21, 25, 385, 386, 385, 386, 21, 25, 21, 25, 21, 25, 17, 18, 52, 53, 80, 81, 56, 57, 60, 61, 56, 57, 60, 61, 76, 77, 17, 18, 5, 6, 52, 53, 501, 502, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 495, 496, 26, 27, 395, 396, 26, 27, 26, 27, 387, 388, 387, 388, 26, 27, 26, 27, 26, 27, 19, 20, 54, 55, 82, 83, 58, 59, 62, 63, 58, 59, 62, 63, 78, 79, 19, 20, 7, 8, 54, 55, 503, 504, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 533, 541, 17, 18, 52, 53, 385, 386, 385, 386, 21, 25, 21, 25, 385, 386, 17, 18, 5, 6, 21, 22, 397, 398, 17, 18, 370, 371, 52, 53, 17, 18, 52, 53, 80, 81, 150, 151, 28, 29, 1, 2, 509, 510, 21, 382, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 535, 536, 19, 20, 54, 55, 387, 388, 387, 388, 26, 27, 26, 27, 387, 388, 19, 20, 7, 8, 23, 24, 399, 400, 19, 20, 372, 373, 54, 55, 19, 20, 54, 55, 82, 83, 152, 153, 30, 31, 3, 4, 7, 511, 383, 384, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 509, 510, 21, 22, 1, 2, 52, 53, 17, 18, 52, 53, 389, 390, 17, 18, 21, 22, 28, 29, 28, 29, 1, 2, 21, 22, 354, 355, 1, 2, 21, 382, 1, 2, 5, 6, 21, 382, 28, 29, 28, 29, 28, 29, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 7, 511, 23, 24, 3, 4, 54, 55, 19, 20, 54, 55, 391, 392, 19, 20, 23, 24, 30, 31, 30, 31, 3, 4, 23, 24, 356, 31, 3, 4, 383, 384, 3, 4, 7, 8, 383, 384, 30, 31, 30, 31, 30, 31, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 1, 2, 5, 6, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 363, 364, 28, 29, 28, 29, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 3, 4, 7, 8, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 365, 31, 30, 31, 30, 31, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"caves.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"caves", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l10/level.json b/gamefilesd/level/l10/level.json index 15a8c678..5e7f48a8 100755 --- a/gamefilesd/level/l10/level.json +++ b/gamefilesd/level/l10/level.json @@ -1,33 +1,31 @@ { + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], "palette": [ { - "id": "l3pwater", - "file":"levels/l3data/l3pwater.pal" + "id": "l3_2", + "file": "levels/l3data/l3_2.pal" }, { "id": "colorCycle", - "fromId":"l3pwater" + "fromId": "l3_2" } ], "level": { "id": "level", - "path": "l10", - "name": "Foul Water", - "palette": "l3pwater", + "palette": "l3_2", "file": "levels/l3data/l3.cel", - "outOfBoundsTileTop": 7, - "map": { "file": "levels/l3data/foulwatr.dun", "defaultTile": 6 }, + "outOfBoundsTileLayer2": 7, "til": "levels/l3data/l3.til", "min": "levels/l3data/l3.min", "minBlocks": 10, "sol": "levels/l3data/l3.sol" }, - "levelObject": { - "id": "town", - "name": "Up to town", - "mapPosition": [14, 67], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/town/load.json", "positionPlayer", "[18, 69]"] } - } + "load": "level/automap/l3/load.json", + "load": "level/l10/levelObjects.json", + "load": "level/l10/monsters.json", + "load": "level/l10/level2.json" } \ No newline at end of file diff --git a/gamefilesd/level/l10/level2.json b/gamefilesd/level/l10/level2.json new file mode 100755 index 00000000..2c15d165 --- /dev/null +++ b/gamefilesd/level/l10/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "l10", + "name": "10", + "map": { "file": "level/l10/l10.json", "indexOffset": -1, "defaultTile": 6 } + }, + "load": "level/l10/levelObjects2.json", + "load": "level/l10/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l10/levelObjects2.json b/gamefilesd/level/l10/levelObjects2.json new file mode 100755 index 00000000..17d6257c --- /dev/null +++ b/gamefilesd/level/l10/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [20, 29], + "properties": { + "x": 51, + "y": 57, + "level": 11 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [73, 68], + "properties": { + "x": 19, + "y": 37, + "level": 9 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l10/load.json b/gamefilesd/level/l10/load.json deleted file mode 100755 index 2e50f9e3..00000000 --- a/gamefilesd/level/l10/load.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "load": ["level/load.json", "l10", "{1}", "{2}", "cut3"] -} \ No newline at end of file diff --git a/gamefilesd/level/l10/map.json b/gamefilesd/level/l10/map.json deleted file mode 100755 index 9fe14d33..00000000 --- a/gamefilesd/level/l10/map.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "action": { - "name": "if.equal", - "param1": "%showMap%", - "param2": true, - "then": { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, - "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } - } -} \ No newline at end of file diff --git a/gamefilesd/level/l11/l11.json b/gamefilesd/level/l11/l11.json new file mode 100755 index 00000000..ed856491 --- /dev/null +++ b/gamefilesd/level/l11/l11.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 337, 338, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 339, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 374, 375, 357, 358, 28, 29, 340, 341, 374, 375, 357, 358, 348, 349, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 376, 377, 359, 31, 30, 31, 342, 343, 376, 377, 359, 31, 350, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 48, 49, 461, 462, 465, 466, 44, 45, 13, 14, 40, 41, 344, 345, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 50, 51, 463, 464, 467, 468, 46, 47, 15, 16, 42, 43, 346, 347, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 21, 25, 21, 25, 21, 25, 48, 49, 44, 45, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 26, 27, 26, 27, 26, 27, 50, 51, 46, 47, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 36, 37, 9, 10, 40, 41, 461, 462, 457, 458, 485, 486, 469, 470, 465, 466, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 21, 25, 389, 390, 385, 386, 21, 25, 385, 386, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 38, 39, 11, 12, 42, 43, 463, 464, 459, 460, 487, 488, 471, 472, 467, 468, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 26, 27, 391, 392, 387, 388, 26, 27, 387, 388, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 48, 49, 44, 45, 21, 25, 21, 25, 533, 534, 21, 25, 21, 25, 48, 49, 252, 253, 401, 402, 36, 37, 477, 478, 36, 37, 44, 45, 389, 390, 21, 25, 111, 112, 100, 101, 115, 116, 21, 25, 393, 394, 48, 49, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 50, 51, 46, 47, 26, 27, 26, 27, 535, 536, 26, 27, 26, 27, 50, 51, 254, 255, 403, 404, 38, 39, 479, 480, 38, 39, 46, 47, 391, 392, 26, 27, 113, 114, 102, 103, 117, 118, 26, 27, 395, 396, 50, 51, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 9, 10, 317, 318, 319, 320, 44, 45, 393, 394, 21, 25, 389, 390, 21, 25, 493, 494, 385, 386, 389, 390, 21, 25, 385, 386, 21, 25, 393, 394, 501, 502, 21, 25, 17, 18, 5, 6, 52, 53, 96, 97, 104, 97, 104, 108, 111, 112, 115, 116, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 11, 12, 30, 31, 321, 322, 46, 47, 395, 396, 26, 27, 391, 392, 26, 27, 495, 496, 387, 388, 391, 392, 26, 27, 387, 388, 26, 27, 395, 396, 503, 504, 26, 27, 19, 20, 7, 8, 54, 55, 98, 99, 117, 114, 109, 110, 113, 114, 117, 118, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 13, 14, 28, 29, 32, 33, 21, 25, 21, 25, 385, 386, 21, 25, 389, 390, 493, 494, 385, 386, 385, 386, 389, 390, 21, 25, 385, 386, 21, 25, 533, 534, 17, 18, 21, 22, 28, 29, 397, 398, 96, 97, 104, 97, 104, 108, 96, 97, 104, 108, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 15, 16, 30, 31, 34, 35, 26, 27, 26, 27, 387, 388, 26, 27, 391, 392, 495, 496, 387, 388, 387, 388, 391, 392, 26, 27, 387, 388, 26, 27, 535, 536, 19, 20, 23, 24, 30, 31, 399, 400, 98, 99, 117, 114, 109, 110, 98, 99, 109, 110, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 21, 25, 13, 14, 28, 29, 32, 33, 17, 18, 5, 6, 5, 6, 52, 53, 17, 18, 509, 510, 52, 53, 389, 390, 385, 386, 184, 185, 385, 386, 21, 25, 501, 502, 48, 49, 461, 462, 465, 466, 44, 45, 96, 97, 104, 97, 104, 108, 119, 97, 122, 123, 389, 390, 389, 390, 48, 49, 36, 37, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 26, 27, 15, 16, 30, 31, 34, 35, 19, 20, 7, 8, 7, 8, 54, 55, 19, 20, 7, 511, 54, 55, 391, 392, 387, 388, 186, 187, 387, 388, 26, 27, 503, 504, 50, 51, 463, 464, 467, 468, 46, 47, 98, 99, 117, 114, 109, 110, 120, 121, 124, 125, 391, 392, 391, 392, 50, 51, 38, 39, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 17, 18, 52, 53, 48, 49, 9, 10, 1, 2, 21, 22, 28, 29, 327, 328, 1, 2, 21, 22, 28, 29, 1, 2, 52, 53, 393, 394, 385, 386, 385, 386, 17, 18, 509, 510, 5, 6, 52, 53, 385, 386, 393, 394, 119, 97, 142, 143, 122, 123, 21, 25, 385, 386, 393, 394, 21, 25, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 19, 20, 54, 55, 50, 51, 11, 12, 3, 4, 23, 24, 30, 31, 329, 31, 3, 4, 23, 24, 30, 31, 3, 4, 54, 55, 395, 396, 387, 388, 387, 388, 19, 20, 7, 511, 7, 8, 54, 55, 387, 388, 395, 396, 120, 121, 144, 145, 124, 125, 26, 27, 387, 388, 395, 396, 26, 27, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 473, 474, 529, 530, 512, 14, 28, 29, 317, 318, 319, 320, 323, 324, 374, 375, 357, 358, 40, 41, 9, 10, 248, 249, 21, 25, 393, 394, 17, 18, 21, 22, 28, 29, 28, 29, 397, 398, 17, 18, 52, 53, 389, 390, 158, 159, 393, 394, 21, 25, 21, 25, 21, 25, 21, 25, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 475, 476, 531, 532, 513, 514, 30, 31, 30, 31, 321, 322, 325, 326, 376, 377, 359, 31, 42, 43, 11, 12, 250, 251, 26, 27, 395, 396, 19, 20, 23, 24, 30, 31, 30, 31, 399, 400, 19, 20, 54, 55, 391, 392, 160, 161, 395, 396, 26, 27, 26, 27, 26, 27, 26, 27, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 17, 18, 21, 22, 28, 29, 28, 29, 1, 2, 52, 53, 48, 49, 401, 402, 44, 45, 48, 49, 44, 45, 21, 25, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 1, 2, 52, 53, 80, 81, 56, 57, 56, 57, 76, 77, 389, 390, 17, 18, 370, 371, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 19, 20, 23, 24, 30, 31, 30, 31, 3, 4, 54, 55, 50, 51, 403, 404, 46, 47, 50, 51, 46, 47, 26, 27, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 3, 4, 54, 55, 82, 83, 58, 59, 58, 59, 78, 79, 391, 392, 19, 20, 372, 373, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 32, 33, 393, 394, 21, 25, 21, 25, 385, 386, 385, 386, 17, 18, 21, 22, 317, 318, 319, 320, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 5, 6, 52, 53, 80, 81, 60, 61, 150, 151, 354, 355, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 34, 35, 395, 396, 26, 27, 26, 27, 387, 388, 387, 388, 19, 20, 23, 24, 30, 31, 321, 322, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 7, 8, 54, 55, 82, 83, 62, 63, 152, 153, 356, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 21, 25, 17, 18, 21, 22, 28, 29, 317, 318, 319, 320, 44, 45, 17, 18, 52, 53, 17, 18, 5, 6, 52, 53, 48, 49, 36, 37, 252, 253, 44, 45, 13, 14, 40, 41, 461, 462, 485, 486, 465, 466, 9, 10, 40, 41, 36, 37, 44, 45, 393, 394, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 26, 27, 19, 20, 23, 24, 30, 31, 30, 31, 321, 322, 46, 47, 19, 20, 54, 55, 19, 20, 7, 8, 54, 55, 50, 51, 38, 39, 254, 255, 46, 47, 15, 16, 42, 43, 463, 464, 487, 488, 467, 468, 11, 12, 42, 43, 38, 39, 46, 47, 395, 396, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 21, 25, 48, 49, 252, 253, 9, 10, 28, 29, 1, 2, 52, 53, 13, 14, 1, 2, 21, 22, 40, 41, 44, 45, 385, 386, 385, 386, 21, 25, 21, 25, 13, 14, 1, 2, 52, 53, 501, 502, 393, 394, 13, 14, 32, 33, 385, 386, 385, 386, 393, 394, 48, 49, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 26, 27, 50, 51, 254, 255, 11, 12, 30, 31, 3, 4, 54, 55, 15, 16, 3, 4, 23, 24, 42, 43, 46, 47, 387, 388, 387, 388, 26, 27, 26, 27, 15, 16, 3, 4, 54, 55, 503, 504, 395, 396, 15, 16, 34, 35, 387, 388, 387, 388, 395, 396, 50, 51, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 393, 394, 385, 386, 21, 25, 48, 49, 461, 462, 465, 466, 44, 45, 13, 14, 40, 41, 401, 402, 44, 45, 393, 394, 389, 390, 21, 25, 21, 25, 17, 18, 21, 22, 40, 41, 44, 45, 533, 534, 385, 386, 13, 14, 1, 2, 52, 53, 389, 390, 393, 394, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 395, 396, 387, 388, 26, 27, 50, 51, 463, 464, 467, 468, 46, 47, 15, 16, 42, 43, 403, 404, 46, 47, 395, 396, 391, 392, 26, 27, 26, 27, 19, 20, 23, 24, 42, 43, 46, 47, 535, 536, 387, 388, 15, 16, 3, 4, 54, 55, 391, 392, 395, 396, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 393, 394, 389, 390, 389, 390, 389, 390, 21, 25, 21, 25, 48, 49, 44, 45, 385, 386, 21, 25, 385, 386, 21, 25, 21, 25, 21, 25, 48, 49, 9, 10, 32, 33, 21, 25, 501, 502, 17, 18, 21, 22, 40, 41, 44, 45, 385, 386, 385, 386, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 395, 396, 391, 392, 391, 392, 391, 392, 26, 27, 26, 27, 50, 51, 46, 47, 387, 388, 26, 27, 387, 388, 26, 27, 26, 27, 26, 27, 50, 51, 11, 12, 34, 35, 26, 27, 503, 504, 19, 20, 23, 24, 42, 43, 46, 47, 387, 388, 387, 388, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 385, 386, 505, 543, 489, 490, 489, 490, 489, 490, 505, 543, 389, 390, 393, 394, 17, 18, 52, 53, 21, 25, 17, 18, 5, 6, 52, 53, 393, 394, 385, 386, 13, 14, 1, 2, 52, 53, 493, 494, 13, 14, 40, 41, 44, 45, 393, 394, 21, 25, 21, 25, 21, 25, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 387, 388, 544, 545, 491, 492, 491, 492, 491, 492, 516, 546, 391, 392, 395, 396, 19, 20, 54, 55, 26, 27, 19, 20, 7, 8, 54, 55, 395, 396, 387, 388, 15, 16, 3, 4, 54, 55, 495, 496, 15, 16, 42, 43, 46, 47, 395, 396, 26, 27, 26, 27, 26, 27, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 385, 386, 501, 502, 389, 390, 385, 386, 393, 394, 533, 534, 21, 25, 21, 25, 13, 14, 1, 2, 52, 53, 48, 49, 9, 10, 1, 2, 5, 6, 5, 6, 21, 382, 28, 29, 32, 33, 501, 502, 48, 49, 44, 45, 385, 386, 385, 386, 393, 394, 21, 25, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 387, 388, 503, 504, 391, 392, 387, 388, 395, 396, 535, 536, 26, 27, 26, 27, 15, 16, 3, 4, 54, 55, 50, 51, 11, 12, 3, 4, 7, 8, 7, 8, 383, 384, 30, 31, 34, 35, 503, 504, 50, 51, 46, 47, 387, 388, 387, 388, 395, 396, 26, 27, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 445, 446, 389, 390, 385, 386, 505, 515, 489, 490, 489, 490, 489, 490, 505, 506, 389, 390, 21, 25, 48, 49, 401, 402, 44, 45, 72, 73, 150, 151, 28, 29, 181, 182, 178, 179, 363, 364, 28, 29, 32, 33, 493, 494, 385, 386, 385, 386, 21, 25, 385, 386, 393, 394, 21, 25, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 447, 448, 391, 392, 387, 388, 544, 547, 491, 492, 491, 492, 491, 492, 507, 508, 391, 392, 26, 27, 50, 51, 403, 404, 46, 47, 74, 75, 152, 153, 30, 31, 183, 31, 180, 31, 365, 31, 30, 31, 34, 35, 495, 496, 387, 388, 387, 388, 26, 27, 387, 388, 395, 396, 26, 27, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 393, 394, 389, 390, 21, 25, 21, 25, 21, 25, 385, 386, 385, 386, 385, 386, 17, 18, 52, 53, 72, 73, 60, 61, 84, 85, 48, 49, 36, 37, 170, 171, 174, 175, 36, 37, 477, 478, 44, 45, 501, 502, 389, 390, 385, 386, 21, 25, 17, 18, 5, 6, 52, 53, 48, 49, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 395, 396, 391, 392, 26, 27, 26, 27, 26, 27, 387, 388, 387, 388, 387, 388, 19, 20, 54, 55, 74, 75, 62, 63, 86, 87, 50, 51, 38, 39, 172, 173, 176, 177, 38, 39, 479, 480, 46, 47, 503, 504, 391, 392, 387, 388, 26, 27, 19, 20, 7, 8, 54, 55, 50, 51, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 17, 18, 5, 6, 52, 53, 21, 25, 21, 25, 21, 25, 21, 25, 17, 18, 21, 22, 32, 33, 68, 69, 389, 390, 17, 18, 5, 6, 52, 53, 389, 390, 385, 386, 389, 390, 533, 534, 17, 18, 509, 510, 52, 53, 393, 394, 21, 25, 13, 14, 28, 29, 1, 2, 5, 6, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 19, 20, 7, 8, 54, 55, 26, 27, 26, 27, 26, 27, 26, 27, 19, 20, 23, 24, 34, 35, 70, 71, 391, 392, 19, 20, 7, 8, 54, 55, 391, 392, 387, 388, 391, 392, 535, 536, 19, 20, 7, 511, 54, 55, 395, 396, 26, 27, 15, 16, 30, 31, 3, 4, 7, 8, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 40, 41, 44, 45, 17, 18, 52, 53, 17, 18, 52, 53, 48, 49, 36, 37, 44, 45, 64, 65, 21, 25, 48, 49, 9, 10, 32, 33, 385, 386, 21, 25, 17, 18, 509, 510, 21, 22, 28, 29, 1, 2, 5, 6, 5, 6, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 42, 43, 46, 47, 19, 20, 54, 55, 19, 20, 54, 55, 50, 51, 38, 39, 46, 47, 66, 67, 26, 27, 50, 51, 11, 12, 34, 35, 387, 388, 26, 27, 19, 20, 7, 511, 23, 24, 30, 31, 3, 4, 7, 8, 7, 8, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 453, 454, 465, 466, 44, 45, 389, 390, 13, 14, 1, 2, 21, 22, 1, 2, 370, 371, 52, 53, 389, 390, 158, 159, 389, 390, 21, 25, 48, 49, 44, 45, 389, 390, 389, 390, 48, 49, 9, 10, 453, 454, 457, 458, 465, 466, 9, 10, 40, 41, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 455, 456, 467, 468, 46, 47, 391, 392, 15, 16, 3, 4, 23, 24, 3, 4, 372, 373, 54, 55, 391, 392, 160, 161, 391, 392, 26, 27, 50, 51, 46, 47, 391, 392, 391, 392, 50, 51, 11, 12, 455, 456, 459, 460, 467, 468, 11, 12, 42, 43, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 21, 25, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 354, 355, 1, 2, 52, 53, 68, 69, 389, 390, 17, 18, 52, 53, 21, 25, 17, 18, 52, 53, 17, 18, 21, 22, 441, 442, 385, 386, 21, 25, 48, 49, 44, 45, 48, 49, 9, 10, 317, 318, 319, 320, 461, 462, 465, 466, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 26, 27, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 356, 31, 3, 4, 54, 55, 70, 71, 391, 392, 19, 20, 54, 55, 26, 27, 19, 20, 54, 55, 19, 20, 23, 24, 443, 444, 387, 388, 26, 27, 50, 51, 46, 47, 50, 51, 11, 12, 30, 31, 321, 322, 463, 464, 467, 468, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 481, 482, 529, 530, 489, 490, 512, 14, 317, 318, 319, 320, 9, 10, 40, 41, 9, 10, 40, 41, 44, 45, 64, 65, 17, 18, 21, 22, 1, 2, 5, 6, 21, 22, 32, 33, 48, 49, 9, 10, 1, 2, 52, 53, 385, 386, 385, 386, 21, 25, 17, 18, 21, 22, 28, 29, 1, 2, 52, 53, 389, 390, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 483, 484, 531, 532, 491, 492, 513, 514, 30, 31, 321, 322, 11, 12, 42, 43, 11, 12, 42, 43, 46, 47, 66, 67, 19, 20, 23, 24, 3, 4, 7, 8, 23, 24, 34, 35, 50, 51, 11, 12, 3, 4, 54, 55, 387, 388, 387, 388, 26, 27, 19, 20, 23, 24, 30, 31, 3, 4, 54, 55, 391, 392, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 17, 18, 5, 6, 21, 22, 28, 29, 32, 33, 48, 49, 44, 45, 48, 49, 44, 45, 72, 73, 84, 85, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 13, 14, 40, 41, 44, 45, 393, 394, 17, 18, 52, 53, 48, 49, 374, 375, 357, 358, 28, 29, 397, 398, 21, 25, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 19, 20, 7, 8, 23, 24, 30, 31, 34, 35, 50, 51, 46, 47, 50, 51, 46, 47, 74, 75, 86, 87, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 15, 16, 42, 43, 46, 47, 395, 396, 19, 20, 54, 55, 50, 51, 376, 377, 359, 31, 30, 31, 399, 400, 26, 27, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 21, 25, 21, 25, 72, 73, 84, 85, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 48, 49, 44, 45, 17, 18, 5, 6, 21, 22, 1, 2, 370, 371, 21, 22, 28, 29, 40, 41, 44, 45, 385, 386, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 26, 27, 26, 27, 74, 75, 86, 87, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 50, 51, 46, 47, 19, 20, 7, 8, 23, 24, 3, 4, 372, 373, 23, 24, 30, 31, 42, 43, 46, 47, 387, 388, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 21, 25, 111, 112, 134, 135, 115, 116, 48, 49, 36, 37, 9, 10, 40, 41, 9, 10, 40, 41, 44, 45, 393, 394, 385, 386, 21, 25, 48, 49, 374, 375, 357, 358, 28, 29, 354, 355, 28, 29, 28, 29, 473, 474, 489, 490, 529, 530, 489, 490, 512, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 26, 27, 113, 114, 136, 137, 117, 118, 50, 51, 38, 39, 11, 12, 42, 43, 11, 12, 42, 43, 46, 47, 395, 396, 387, 388, 26, 27, 50, 51, 376, 377, 359, 31, 30, 31, 356, 31, 30, 31, 30, 31, 475, 476, 491, 492, 531, 532, 491, 492, 513, 514, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 17, 18, 52, 53, 119, 97, 104, 105, 122, 123, 385, 386, 17, 18, 21, 22, 445, 446, 48, 49, 44, 45, 21, 25, 21, 25, 21, 25, 21, 25, 393, 394, 48, 49, 9, 10, 28, 29, 317, 318, 319, 320, 36, 37, 44, 45, 21, 25, 393, 394, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 19, 20, 54, 55, 120, 121, 106, 107, 124, 125, 387, 388, 19, 20, 23, 24, 447, 448, 50, 51, 46, 47, 26, 27, 26, 27, 26, 27, 26, 27, 395, 396, 50, 51, 11, 12, 30, 31, 30, 31, 321, 322, 38, 39, 46, 47, 26, 27, 395, 396, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 1, 2, 5, 6, 5, 6, 52, 53, 21, 25, 13, 14, 28, 29, 441, 442, 393, 394, 389, 390, 21, 25, 505, 543, 489, 490, 505, 543, 393, 394, 389, 390, 48, 49, 477, 478, 36, 37, 44, 45, 389, 390, 21, 25, 389, 390, 389, 390, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 3, 4, 7, 8, 7, 8, 54, 55, 26, 27, 15, 16, 30, 31, 443, 444, 395, 396, 391, 392, 26, 27, 544, 545, 491, 492, 516, 546, 395, 396, 391, 392, 50, 51, 479, 480, 38, 39, 46, 47, 391, 392, 26, 27, 391, 392, 391, 392, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 477, 478, 44, 45, 21, 25, 48, 49, 477, 478, 44, 45, 21, 25, 389, 390, 393, 394, 501, 502, 21, 25, 501, 502, 21, 25, 21, 25, 393, 394, 533, 534, 21, 25, 21, 25, 389, 390, 389, 390, 192, 193, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 479, 480, 46, 47, 26, 27, 50, 51, 479, 480, 46, 47, 26, 27, 391, 392, 395, 396, 503, 504, 26, 27, 503, 504, 26, 27, 26, 27, 395, 396, 535, 536, 26, 27, 26, 27, 391, 392, 391, 392, 194, 195, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 36, 37, 461, 462, 469, 470, 469, 470, 469, 470, 465, 466, 44, 45, 533, 541, 21, 25, 17, 18, 52, 53, 533, 541, 393, 394, 385, 386, 192, 193, 21, 25, 501, 502, 21, 25, 533, 534, 21, 25, 385, 386, 389, 390, 501, 502, 17, 18, 52, 53, 21, 25, 21, 25, 385, 386, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 38, 39, 463, 464, 471, 472, 471, 472, 471, 472, 467, 468, 46, 47, 535, 536, 26, 27, 19, 20, 54, 55, 535, 536, 395, 396, 387, 388, 194, 195, 26, 27, 503, 504, 26, 27, 535, 536, 26, 27, 387, 388, 391, 392, 503, 504, 19, 20, 54, 55, 26, 27, 26, 27, 387, 388, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 166, 167, 21, 25, 21, 25, 21, 25, 17, 18, 5, 6, 52, 53, 393, 394, 501, 502, 17, 18, 21, 22, 1, 2, 509, 510, 52, 53, 21, 25, 21, 25, 385, 386, 501, 502, 21, 25, 501, 502, 21, 25, 17, 18, 370, 371, 509, 510, 21, 382, 1, 2, 52, 53, 385, 386, 17, 18, 52, 53, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 168, 169, 26, 27, 26, 27, 26, 27, 19, 20, 7, 8, 54, 55, 395, 396, 503, 504, 19, 20, 23, 24, 3, 4, 7, 511, 54, 55, 26, 27, 26, 27, 387, 388, 503, 504, 26, 27, 503, 504, 26, 27, 19, 20, 372, 373, 7, 511, 383, 384, 3, 4, 54, 55, 387, 388, 19, 20, 54, 55, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 162, 163, 21, 25, 21, 25, 389, 390, 13, 14, 28, 29, 32, 33, 385, 386, 493, 494, 48, 49, 9, 10, 28, 29, 28, 29, 248, 249, 385, 386, 21, 25, 385, 386, 505, 515, 489, 490, 505, 506, 389, 390, 13, 14, 354, 355, 28, 29, 363, 364, 28, 29, 1, 2, 5, 6, 21, 22, 1, 2, 370, 371, 21, 382, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 164, 165, 26, 27, 26, 27, 391, 392, 15, 16, 30, 31, 34, 35, 387, 388, 495, 496, 50, 51, 11, 12, 30, 31, 30, 31, 250, 251, 387, 388, 26, 27, 387, 388, 544, 547, 491, 492, 507, 508, 391, 392, 15, 16, 356, 31, 30, 31, 365, 31, 30, 31, 3, 4, 7, 8, 23, 24, 3, 4, 372, 373, 383, 384, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 473, 474, 497, 498, 489, 490, 529, 530, 512, 14, 327, 328, 32, 33, 393, 394, 501, 502, 385, 386, 378, 379, 360, 361, 28, 29, 1, 2, 52, 53, 389, 390, 21, 25, 385, 386, 21, 25, 385, 386, 385, 386, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 475, 476, 499, 500, 491, 492, 531, 532, 513, 514, 329, 31, 34, 35, 395, 396, 503, 504, 387, 388, 380, 381, 362, 31, 30, 31, 3, 4, 54, 55, 391, 392, 26, 27, 387, 388, 26, 27, 387, 388, 387, 388, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 17, 18, 52, 53, 48, 49, 323, 324, 44, 45, 17, 18, 509, 510, 52, 53, 378, 379, 360, 361, 28, 29, 40, 41, 44, 45, 385, 386, 17, 18, 52, 53, 17, 18, 5, 6, 370, 371, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 19, 20, 54, 55, 50, 51, 325, 326, 46, 47, 19, 20, 7, 511, 54, 55, 380, 381, 362, 31, 30, 31, 42, 43, 46, 47, 387, 388, 19, 20, 54, 55, 19, 20, 7, 8, 372, 373, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 21, 22, 1, 2, 370, 371, 370, 371, 5, 6, 21, 382, 28, 29, 1, 2, 21, 22, 28, 29, 28, 29, 1, 2, 5, 6, 370, 371, 21, 382, 1, 2, 21, 382, 28, 29, 354, 355, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 23, 24, 3, 4, 372, 373, 372, 373, 7, 8, 383, 384, 30, 31, 3, 4, 23, 24, 30, 31, 30, 31, 3, 4, 7, 8, 372, 373, 383, 384, 3, 4, 383, 384, 30, 31, 356, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 354, 355, 28, 29, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 363, 364, 28, 29, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 356, 31, 30, 31, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 365, 31, 30, 31, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"caves.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"caves", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l11/level.json b/gamefilesd/level/l11/level.json new file mode 100755 index 00000000..53bcc674 --- /dev/null +++ b/gamefilesd/level/l11/level.json @@ -0,0 +1,31 @@ +{ + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], + "palette": [ + { + "id": "l3_3", + "file": "levels/l3data/l3_3.pal" + }, + { + "id": "colorCycle", + "fromId": "l3_3" + } + ], + "level": { + "id": "level", + "palette": "l3_3", + "file": "levels/l3data/l3.cel", + "outOfBoundsTileLayer2": 7, + "til": "levels/l3data/l3.til", + "min": "levels/l3data/l3.min", + "minBlocks": 10, + "sol": "levels/l3data/l3.sol" + }, + "load": "level/automap/l3/load.json", + "load": "level/l11/levelObjects.json", + "load": "level/l11/monsters.json", + "load": "level/l11/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l11/level2.json b/gamefilesd/level/l11/level2.json new file mode 100755 index 00000000..782654ef --- /dev/null +++ b/gamefilesd/level/l11/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "l11", + "name": "11", + "map": { "file": "level/l11/l11.json", "indexOffset": -1, "defaultTile": 6 } + }, + "load": "level/l11/levelObjects2.json", + "load": "level/l11/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l11/levelObjects2.json b/gamefilesd/level/l11/levelObjects2.json new file mode 100755 index 00000000..2ee79cee --- /dev/null +++ b/gamefilesd/level/l11/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [20, 83], + "properties": { + "x": 59, + "y": 61, + "level": 12 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [51, 56], + "properties": { + "x": 21, + "y": 29, + "level": 10 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l11/music.json b/gamefilesd/level/l11/music.json new file mode 100755 index 00000000..dbeb6130 --- /dev/null +++ b/gamefilesd/level/l11/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvlc.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l12/l12.json b/gamefilesd/level/l12/l12.json new file mode 100755 index 00000000..6b9d1c58 --- /dev/null +++ b/gamefilesd/level/l12/l12.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 337, 338, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 36, 37, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 36, 37, 461, 462, 469, 470, 465, 466, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 339, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 38, 39, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 38, 39, 463, 464, 471, 472, 467, 468, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 340, 341, 36, 37, 9, 10, 40, 41, 36, 37, 9, 10, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 48, 49, 461, 462, 457, 458, 485, 486, 457, 458, 469, 470, 457, 458, 457, 458, 485, 486, 465, 466, 44, 45, 17, 18, 52, 53, 393, 394, 21, 25, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 342, 343, 38, 39, 11, 12, 42, 43, 38, 39, 11, 12, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 50, 51, 463, 464, 459, 460, 487, 488, 459, 460, 471, 472, 459, 460, 459, 460, 487, 488, 467, 468, 46, 47, 19, 20, 54, 55, 395, 396, 26, 27, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 48, 49, 44, 45, 21, 25, 378, 379, 360, 361, 28, 29, 28, 29, 40, 41, 44, 45, 385, 386, 393, 394, 389, 390, 533, 534, 385, 386, 21, 25, 21, 25, 393, 394, 501, 502, 385, 386, 17, 18, 21, 22, 32, 33, 393, 394, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 50, 51, 46, 47, 26, 27, 380, 381, 362, 31, 30, 31, 30, 31, 42, 43, 46, 47, 387, 388, 395, 396, 391, 392, 535, 536, 387, 388, 26, 27, 26, 27, 395, 396, 503, 504, 387, 388, 19, 20, 23, 24, 34, 35, 395, 396, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 21, 25, 385, 386, 48, 49, 374, 375, 357, 358, 28, 29, 1, 2, 52, 53, 21, 25, 17, 18, 52, 53, 501, 502, 385, 386, 21, 25, 184, 185, 385, 386, 493, 494, 21, 25, 48, 49, 36, 37, 44, 45, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 26, 27, 387, 388, 50, 51, 376, 377, 359, 31, 30, 31, 3, 4, 54, 55, 26, 27, 19, 20, 54, 55, 503, 504, 387, 388, 26, 27, 186, 187, 387, 388, 495, 496, 26, 27, 50, 51, 38, 39, 46, 47, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 17, 18, 5, 6, 52, 53, 385, 386, 378, 379, 360, 361, 28, 29, 337, 338, 1, 2, 52, 53, 13, 14, 1, 2, 509, 510, 52, 53, 21, 25, 389, 390, 393, 394, 533, 534, 17, 18, 52, 53, 389, 390, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 19, 20, 7, 8, 54, 55, 387, 388, 380, 381, 362, 31, 30, 31, 339, 31, 3, 4, 54, 55, 15, 16, 3, 4, 7, 511, 54, 55, 26, 27, 391, 392, 395, 396, 535, 536, 19, 20, 54, 55, 391, 392, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 385, 386, 13, 14, 40, 41, 44, 45, 389, 390, 48, 49, 36, 37, 9, 10, 340, 341, 9, 10, 32, 33, 48, 49, 461, 462, 465, 466, 44, 45, 385, 386, 389, 390, 17, 18, 509, 510, 21, 22, 1, 2, 52, 53, 21, 25, 48, 49, 9, 10, 40, 41, 36, 37, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 387, 388, 15, 16, 42, 43, 46, 47, 391, 392, 50, 51, 38, 39, 11, 12, 342, 343, 11, 12, 34, 35, 50, 51, 463, 464, 467, 468, 46, 47, 387, 388, 391, 392, 19, 20, 7, 511, 23, 24, 3, 4, 54, 55, 26, 27, 50, 51, 11, 12, 42, 43, 38, 39, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 393, 394, 21, 25, 48, 49, 44, 45, 385, 386, 385, 386, 21, 25, 393, 394, 48, 49, 44, 45, 48, 49, 44, 45, 389, 390, 389, 390, 21, 25, 21, 25, 21, 25, 21, 25, 48, 49, 477, 478, 461, 462, 465, 466, 44, 45, 17, 18, 52, 53, 48, 49, 44, 45, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 395, 396, 26, 27, 50, 51, 46, 47, 387, 388, 387, 388, 26, 27, 395, 396, 50, 51, 46, 47, 50, 51, 46, 47, 391, 392, 391, 392, 26, 27, 26, 27, 26, 27, 26, 27, 50, 51, 479, 480, 463, 464, 467, 468, 46, 47, 19, 20, 54, 55, 50, 51, 46, 47, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 21, 25, 21, 25, 393, 394, 21, 25, 21, 25, 21, 25, 389, 390, 17, 18, 5, 6, 52, 53, 385, 386, 21, 25, 21, 25, 21, 25, 21, 25, 184, 185, 389, 390, 389, 390, 533, 534, 21, 25, 21, 25, 17, 18, 21, 22, 248, 249, 389, 390, 389, 390, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 26, 27, 26, 27, 395, 396, 26, 27, 26, 27, 26, 27, 391, 392, 19, 20, 7, 8, 54, 55, 387, 388, 26, 27, 26, 27, 26, 27, 26, 27, 186, 187, 391, 392, 391, 392, 535, 536, 26, 27, 26, 27, 19, 20, 23, 24, 250, 251, 391, 392, 391, 392, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 21, 25, 385, 386, 184, 185, 385, 386, 21, 25, 389, 390, 17, 18, 21, 22, 40, 41, 44, 45, 393, 394, 21, 25, 21, 25, 21, 25, 385, 386, 389, 390, 21, 25, 385, 386, 501, 502, 389, 390, 21, 25, 48, 49, 36, 37, 44, 45, 21, 25, 393, 394, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 26, 27, 387, 388, 186, 187, 387, 388, 26, 27, 391, 392, 19, 20, 23, 24, 42, 43, 46, 47, 395, 396, 26, 27, 26, 27, 26, 27, 387, 388, 391, 392, 26, 27, 387, 388, 503, 504, 391, 392, 26, 27, 50, 51, 38, 39, 46, 47, 26, 27, 395, 396, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 21, 25, 385, 386, 21, 25, 21, 25, 389, 390, 21, 25, 378, 379, 360, 361, 32, 33, 17, 18, 5, 6, 5, 6, 52, 53, 385, 386, 389, 390, 389, 390, 385, 386, 385, 386, 501, 502, 17, 18, 52, 53, 393, 394, 385, 386, 21, 25, 393, 394, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 26, 27, 387, 388, 26, 27, 26, 27, 391, 392, 26, 27, 380, 381, 362, 31, 34, 35, 19, 20, 7, 8, 7, 8, 54, 55, 387, 388, 391, 392, 391, 392, 387, 388, 387, 388, 503, 504, 19, 20, 54, 55, 395, 396, 387, 388, 26, 27, 395, 396, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 17, 18, 52, 53, 385, 386, 385, 386, 385, 386, 21, 25, 13, 14, 40, 41, 44, 45, 48, 49, 401, 402, 9, 10, 32, 33, 21, 25, 21, 25, 389, 390, 17, 18, 5, 6, 509, 510, 21, 382, 1, 2, 52, 53, 389, 390, 21, 25, 17, 18, 21, 22, 40, 41, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 19, 20, 54, 55, 387, 388, 387, 388, 387, 388, 26, 27, 15, 16, 42, 43, 46, 47, 50, 51, 403, 404, 11, 12, 34, 35, 26, 27, 26, 27, 391, 392, 19, 20, 7, 8, 7, 511, 383, 384, 3, 4, 54, 55, 391, 392, 26, 27, 19, 20, 23, 24, 42, 43, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 21, 22, 1, 2, 5, 6, 5, 6, 52, 53, 389, 390, 48, 49, 44, 45, 21, 25, 385, 386, 385, 386, 13, 14, 1, 2, 52, 53, 385, 386, 21, 25, 48, 49, 374, 375, 357, 358, 363, 364, 28, 29, 1, 2, 52, 53, 21, 25, 48, 49, 252, 253, 44, 45, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 23, 24, 3, 4, 7, 8, 7, 8, 54, 55, 391, 392, 50, 51, 46, 47, 26, 27, 387, 388, 387, 388, 15, 16, 3, 4, 54, 55, 387, 388, 26, 27, 50, 51, 376, 377, 359, 31, 365, 31, 30, 31, 3, 4, 54, 55, 26, 27, 50, 51, 254, 255, 46, 47, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 461, 462, 465, 466, 9, 10, 40, 41, 477, 478, 44, 45, 385, 386, 385, 386, 17, 18, 5, 6, 52, 53, 385, 386, 378, 379, 360, 361, 397, 398, 393, 394, 21, 25, 17, 18, 21, 22, 28, 29, 40, 41, 9, 10, 40, 41, 44, 45, 389, 390, 389, 390, 385, 386, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 463, 464, 467, 468, 11, 12, 42, 43, 479, 480, 46, 47, 387, 388, 387, 388, 19, 20, 7, 8, 54, 55, 387, 388, 380, 381, 362, 31, 399, 400, 395, 396, 26, 27, 19, 20, 23, 24, 30, 31, 42, 43, 11, 12, 42, 43, 46, 47, 391, 392, 391, 392, 387, 388, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 389, 390, 48, 49, 44, 45, 493, 494, 393, 394, 385, 386, 17, 18, 21, 22, 327, 328, 1, 2, 52, 53, 48, 49, 36, 37, 44, 45, 385, 386, 21, 25, 48, 49, 9, 10, 40, 41, 44, 45, 48, 49, 44, 45, 17, 18, 5, 6, 5, 6, 52, 53, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 391, 392, 50, 51, 46, 47, 495, 496, 395, 396, 387, 388, 19, 20, 23, 24, 329, 31, 3, 4, 54, 55, 50, 51, 38, 39, 46, 47, 387, 388, 26, 27, 50, 51, 11, 12, 42, 43, 46, 47, 50, 51, 46, 47, 19, 20, 7, 8, 7, 8, 54, 55, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 445, 446, 385, 386, 393, 394, 385, 386, 493, 494, 21, 25, 21, 25, 48, 49, 36, 37, 323, 324, 9, 10, 1, 2, 5, 6, 52, 53, 21, 25, 385, 386, 17, 18, 52, 53, 13, 14, 473, 474, 489, 490, 489, 490, 529, 530, 512, 14, 40, 41, 9, 10, 397, 398, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 447, 448, 387, 388, 395, 396, 387, 388, 495, 496, 26, 27, 26, 27, 50, 51, 38, 39, 325, 326, 11, 12, 3, 4, 7, 8, 54, 55, 26, 27, 387, 388, 19, 20, 54, 55, 15, 16, 475, 476, 491, 492, 491, 492, 531, 532, 513, 514, 42, 43, 11, 12, 399, 400, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 21, 25, 184, 185, 385, 386, 493, 494, 21, 25, 21, 25, 17, 18, 52, 53, 389, 390, 48, 49, 9, 10, 28, 29, 1, 2, 52, 53, 17, 18, 21, 22, 1, 2, 21, 22, 248, 249, 385, 386, 17, 18, 5, 6, 21, 22, 32, 33, 48, 49, 44, 45, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 26, 27, 186, 187, 387, 388, 495, 496, 26, 27, 26, 27, 19, 20, 54, 55, 391, 392, 50, 51, 11, 12, 30, 31, 3, 4, 54, 55, 19, 20, 23, 24, 3, 4, 23, 24, 250, 251, 387, 388, 19, 20, 7, 8, 23, 24, 34, 35, 50, 51, 46, 47, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 21, 25, 393, 394, 393, 394, 533, 534, 389, 390, 21, 25, 13, 14, 1, 2, 52, 53, 389, 390, 48, 49, 9, 10, 40, 41, 44, 45, 48, 49, 461, 462, 465, 466, 9, 10, 1, 2, 370, 371, 21, 22, 28, 29, 40, 41, 44, 45, 385, 386, 21, 25, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 26, 27, 395, 396, 395, 396, 535, 536, 391, 392, 26, 27, 15, 16, 3, 4, 54, 55, 391, 392, 50, 51, 11, 12, 42, 43, 46, 47, 50, 51, 463, 464, 467, 468, 11, 12, 3, 4, 372, 373, 23, 24, 30, 31, 42, 43, 46, 47, 387, 388, 26, 27, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 385, 386, 21, 25, 501, 502, 385, 386, 17, 18, 21, 22, 28, 29, 397, 398, 17, 18, 52, 53, 13, 14, 1, 2, 52, 53, 21, 25, 385, 386, 17, 18, 21, 22, 28, 29, 354, 355, 28, 29, 28, 29, 1, 2, 52, 53, 389, 390, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 387, 388, 26, 27, 503, 504, 387, 388, 19, 20, 23, 24, 30, 31, 399, 400, 19, 20, 54, 55, 15, 16, 3, 4, 54, 55, 26, 27, 387, 388, 19, 20, 23, 24, 30, 31, 356, 31, 30, 31, 30, 31, 3, 4, 54, 55, 391, 392, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 477, 478, 44, 45, 21, 25, 17, 18, 509, 510, 5, 6, 21, 22, 40, 41, 36, 37, 44, 45, 13, 14, 1, 2, 21, 22, 40, 41, 44, 45, 393, 394, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 397, 398, 21, 25, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 479, 480, 46, 47, 26, 27, 19, 20, 7, 511, 7, 8, 23, 24, 42, 43, 38, 39, 46, 47, 15, 16, 3, 4, 23, 24, 42, 43, 46, 47, 395, 396, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 399, 400, 26, 27, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 501, 502, 385, 386, 389, 390, 48, 49, 9, 10, 28, 29, 28, 29, 166, 167, 385, 386, 17, 18, 21, 22, 28, 29, 40, 41, 44, 45, 385, 386, 21, 25, 385, 386, 13, 14, 181, 182, 178, 179, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 21, 22, 348, 349, 28, 29, 40, 41, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 503, 504, 387, 388, 391, 392, 50, 51, 11, 12, 30, 31, 30, 31, 168, 169, 387, 388, 19, 20, 23, 24, 30, 31, 42, 43, 46, 47, 387, 388, 26, 27, 387, 388, 15, 16, 183, 31, 180, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 23, 24, 350, 31, 30, 31, 42, 43, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 493, 494, 389, 390, 21, 25, 21, 25, 13, 14, 337, 338, 28, 29, 162, 163, 389, 390, 378, 379, 360, 361, 28, 29, 1, 2, 52, 53, 21, 25, 184, 185, 385, 386, 48, 49, 170, 171, 174, 175, 461, 462, 465, 466, 92, 93, 9, 10, 40, 41, 9, 10, 40, 41, 344, 345, 36, 37, 44, 45, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 495, 496, 391, 392, 26, 27, 26, 27, 15, 16, 339, 31, 30, 31, 164, 165, 391, 392, 380, 381, 362, 31, 30, 31, 3, 4, 54, 55, 26, 27, 186, 187, 387, 388, 50, 51, 172, 173, 176, 177, 463, 464, 467, 468, 94, 95, 11, 12, 42, 43, 11, 12, 42, 43, 346, 347, 38, 39, 46, 47, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 493, 494, 385, 386, 21, 25, 393, 394, 13, 14, 340, 341, 9, 10, 32, 33, 21, 25, 48, 49, 9, 10, 317, 318, 319, 320, 44, 45, 385, 386, 385, 386, 389, 390, 21, 25, 72, 73, 60, 61, 56, 57, 56, 57, 84, 85, 48, 49, 44, 45, 48, 49, 44, 45, 72, 73, 76, 77, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 495, 496, 387, 388, 26, 27, 395, 396, 15, 16, 342, 343, 11, 12, 34, 35, 26, 27, 50, 51, 11, 12, 30, 31, 321, 322, 46, 47, 387, 388, 387, 388, 391, 392, 26, 27, 74, 75, 62, 63, 58, 59, 58, 59, 86, 87, 50, 51, 46, 47, 50, 51, 46, 47, 74, 75, 78, 79, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 533, 534, 21, 25, 188, 189, 389, 390, 48, 49, 44, 45, 48, 49, 44, 45, 21, 25, 389, 390, 48, 49, 9, 10, 1, 2, 5, 6, 52, 53, 21, 25, 244, 245, 389, 390, 158, 159, 21, 25, 21, 25, 393, 394, 393, 394, 21, 25, 72, 73, 76, 77, 21, 25, 68, 69, 68, 69, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 535, 536, 26, 27, 190, 191, 391, 392, 50, 51, 46, 47, 50, 51, 46, 47, 26, 27, 391, 392, 50, 51, 11, 12, 3, 4, 7, 8, 54, 55, 26, 27, 246, 247, 391, 392, 160, 161, 26, 27, 26, 27, 395, 396, 395, 396, 26, 27, 74, 75, 78, 79, 26, 27, 70, 71, 70, 71, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 397, 398, 21, 25, 493, 494, 389, 390, 393, 394, 389, 390, 385, 386, 385, 386, 389, 390, 21, 25, 21, 25, 72, 73, 76, 77, 48, 49, 9, 10, 40, 41, 44, 45, 21, 25, 385, 386, 393, 394, 64, 65, 111, 112, 100, 101, 115, 116, 21, 25, 385, 386, 68, 69, 80, 81, 60, 61, 84, 85, 80, 81, 76, 77, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 399, 400, 26, 27, 495, 496, 391, 392, 395, 396, 391, 392, 387, 388, 387, 388, 391, 392, 26, 27, 26, 27, 74, 75, 78, 79, 50, 51, 11, 12, 42, 43, 46, 47, 26, 27, 387, 388, 395, 396, 66, 67, 113, 114, 102, 103, 117, 118, 26, 27, 387, 388, 70, 71, 82, 83, 62, 63, 86, 87, 82, 83, 78, 79, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 493, 494, 389, 390, 393, 394, 389, 390, 21, 25, 21, 25, 385, 386, 21, 25, 389, 390, 68, 69, 80, 81, 76, 77, 48, 49, 44, 45, 111, 112, 100, 101, 115, 116, 111, 112, 134, 135, 126, 127, 104, 97, 104, 129, 115, 116, 21, 25, 64, 65, 17, 18, 5, 6, 370, 371, 52, 53, 64, 65, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 495, 496, 391, 392, 395, 396, 391, 392, 26, 27, 26, 27, 387, 388, 26, 27, 391, 392, 70, 71, 82, 83, 78, 79, 50, 51, 46, 47, 113, 114, 102, 103, 117, 118, 113, 114, 136, 137, 128, 114, 117, 114, 117, 114, 117, 118, 26, 27, 66, 67, 19, 20, 7, 8, 372, 373, 54, 55, 66, 67, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 509, 510, 5, 6, 52, 53, 21, 25, 111, 112, 115, 116, 389, 390, 21, 25, 72, 73, 84, 85, 17, 18, 146, 147, 52, 53, 21, 25, 96, 97, 104, 97, 104, 108, 119, 97, 104, 97, 104, 97, 104, 97, 104, 97, 104, 108, 21, 25, 68, 69, 48, 49, 9, 10, 354, 355, 1, 2, 146, 147, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 511, 7, 8, 54, 55, 26, 27, 113, 114, 117, 118, 391, 392, 26, 27, 74, 75, 86, 87, 19, 20, 148, 149, 54, 55, 26, 27, 98, 99, 117, 114, 109, 110, 120, 121, 130, 131, 132, 133, 130, 131, 117, 114, 109, 110, 26, 27, 70, 71, 50, 51, 11, 12, 356, 31, 3, 4, 148, 149, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 461, 462, 465, 466, 44, 45, 111, 112, 126, 127, 104, 108, 72, 73, 154, 155, 84, 85, 17, 18, 21, 382, 28, 29, 32, 33, 21, 25, 119, 97, 104, 97, 104, 129, 115, 116, 119, 97, 122, 123, 96, 97, 104, 97, 104, 129, 115, 116, 68, 69, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 463, 464, 467, 468, 46, 47, 113, 114, 128, 114, 109, 110, 74, 75, 156, 157, 86, 87, 19, 20, 383, 384, 30, 31, 34, 35, 26, 27, 120, 121, 130, 131, 117, 114, 117, 118, 120, 121, 124, 125, 98, 99, 117, 114, 117, 114, 117, 118, 70, 71, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 389, 390, 111, 112, 126, 127, 104, 97, 104, 138, 84, 85, 385, 386, 17, 18, 21, 22, 363, 364, 28, 29, 1, 2, 52, 53, 389, 390, 119, 97, 104, 97, 104, 108, 21, 25, 111, 112, 126, 127, 104, 97, 104, 97, 122, 123, 64, 65, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 391, 392, 113, 114, 128, 114, 117, 114, 117, 139, 86, 87, 387, 388, 19, 20, 23, 24, 365, 31, 30, 31, 3, 4, 54, 55, 391, 392, 120, 121, 130, 131, 109, 110, 26, 27, 113, 114, 128, 114, 117, 114, 132, 133, 124, 125, 66, 67, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 389, 390, 96, 97, 104, 97, 104, 97, 104, 129, 115, 116, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 111, 112, 126, 127, 104, 108, 393, 394, 119, 97, 104, 97, 104, 97, 104, 108, 389, 390, 158, 159, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 391, 392, 98, 99, 117, 114, 117, 114, 117, 114, 117, 118, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 113, 114, 128, 114, 109, 110, 395, 396, 120, 121, 130, 131, 117, 114, 109, 110, 391, 392, 160, 161, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 52, 53, 119, 97, 104, 97, 104, 97, 104, 97, 122, 123, 21, 25, 393, 394, 378, 379, 360, 361, 28, 29, 40, 41, 44, 45, 111, 112, 126, 127, 104, 97, 104, 108, 17, 18, 52, 53, 119, 97, 104, 97, 104, 138, 56, 57, 84, 85, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 54, 55, 120, 121, 130, 131, 117, 114, 132, 133, 124, 125, 26, 27, 395, 396, 380, 381, 362, 31, 30, 31, 42, 43, 46, 47, 113, 114, 128, 114, 117, 114, 109, 110, 19, 20, 54, 55, 120, 121, 130, 131, 117, 139, 58, 59, 86, 87, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 453, 454, 465, 466, 44, 45, 385, 386, 119, 97, 104, 97, 104, 129, 100, 101, 115, 116, 17, 18, 21, 22, 28, 29, 40, 41, 44, 45, 111, 112, 126, 127, 104, 97, 104, 97, 104, 108, 48, 49, 44, 45, 21, 25, 96, 97, 104, 129, 115, 116, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 455, 456, 467, 468, 46, 47, 387, 388, 120, 121, 130, 131, 117, 114, 102, 103, 117, 118, 19, 20, 23, 24, 30, 31, 42, 43, 46, 47, 113, 114, 128, 114, 132, 133, 130, 131, 109, 110, 50, 51, 46, 47, 26, 27, 98, 99, 117, 114, 117, 118, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 21, 25, 21, 25, 21, 25, 21, 25, 119, 97, 104, 105, 104, 105, 122, 123, 13, 14, 40, 41, 477, 478, 44, 45, 21, 25, 119, 97, 104, 105, 122, 123, 96, 97, 104, 108, 393, 394, 389, 390, 389, 390, 119, 97, 104, 105, 122, 123, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 26, 27, 26, 27, 26, 27, 26, 27, 120, 121, 106, 107, 106, 107, 124, 125, 15, 16, 42, 43, 479, 480, 46, 47, 26, 27, 120, 121, 106, 107, 124, 125, 98, 99, 109, 110, 395, 396, 391, 392, 391, 392, 120, 121, 106, 107, 124, 125, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 393, 394, 389, 390, 17, 18, 52, 53, 385, 386, 389, 390, 385, 386, 21, 25, 13, 14, 32, 33, 533, 534, 17, 18, 52, 53, 393, 394, 21, 25, 21, 25, 119, 97, 122, 123, 21, 25, 389, 390, 17, 18, 52, 53, 389, 390, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 395, 396, 391, 392, 19, 20, 54, 55, 387, 388, 391, 392, 387, 388, 26, 27, 15, 16, 34, 35, 535, 536, 19, 20, 54, 55, 395, 396, 26, 27, 26, 27, 120, 121, 124, 125, 26, 27, 391, 392, 19, 20, 54, 55, 391, 392, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 481, 482, 529, 530, 489, 490, 512, 14, 32, 33, 17, 18, 5, 6, 52, 53, 17, 18, 21, 22, 1, 2, 509, 510, 21, 382, 1, 2, 5, 6, 52, 53, 21, 25, 21, 25, 21, 25, 21, 25, 21, 25, 13, 14, 32, 33, 17, 18, 5, 6, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 483, 484, 531, 532, 491, 492, 513, 514, 34, 35, 19, 20, 7, 8, 54, 55, 19, 20, 23, 24, 3, 4, 7, 511, 383, 384, 3, 4, 7, 8, 54, 55, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 15, 16, 34, 35, 19, 20, 7, 8, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 21, 25, 17, 18, 21, 382, 1, 2, 21, 22, 28, 29, 1, 2, 21, 22, 28, 29, 28, 29, 28, 29, 363, 364, 28, 29, 28, 29, 1, 2, 370, 371, 5, 6, 5, 6, 5, 6, 5, 6, 21, 22, 1, 2, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 26, 27, 19, 20, 383, 384, 3, 4, 23, 24, 30, 31, 3, 4, 23, 24, 30, 31, 30, 31, 30, 31, 365, 31, 30, 31, 30, 31, 3, 4, 372, 373, 7, 8, 7, 8, 7, 8, 7, 8, 23, 24, 3, 4, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 21, 22, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 23, 24, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"caves.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"caves", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l12/level.json b/gamefilesd/level/l12/level.json new file mode 100755 index 00000000..1c57fdf3 --- /dev/null +++ b/gamefilesd/level/l12/level.json @@ -0,0 +1,31 @@ +{ + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], + "palette": [ + { + "id": "l3_4", + "file": "levels/l3data/l3_4.pal" + }, + { + "id": "colorCycle", + "fromId": "l3_4" + } + ], + "level": { + "id": "level", + "palette": "l3_4", + "file": "levels/l3data/l3.cel", + "outOfBoundsTileLayer2": 7, + "til": "levels/l3data/l3.til", + "min": "levels/l3data/l3.min", + "minBlocks": 10, + "sol": "levels/l3data/l3.sol" + }, + "load": "level/automap/l3/load.json", + "load": "level/l12/levelObjects.json", + "load": "level/l12/monsters.json", + "load": "level/l12/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l12/level2.json b/gamefilesd/level/l12/level2.json new file mode 100755 index 00000000..c00ca95c --- /dev/null +++ b/gamefilesd/level/l12/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "l12", + "name": "12", + "map": { "file": "level/l12/l12.json", "indexOffset": -1, "defaultTile": 6 } + }, + "load": "level/l12/levelObjects2.json", + "load": "level/l12/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l12/levelObjects2.json b/gamefilesd/level/l12/levelObjects2.json new file mode 100755 index 00000000..dd21d08a --- /dev/null +++ b/gamefilesd/level/l12/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [36, 59], + "properties": { + "x": 44, + "y": 36, + "level": 13 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [59, 60], + "properties": { + "x": 21, + "y": 83, + "level": 11 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l12/music.json b/gamefilesd/level/l12/music.json new file mode 100755 index 00000000..dbeb6130 --- /dev/null +++ b/gamefilesd/level/l12/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvlc.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l13/l13.json b/gamefilesd/level/l13/l13.json new file mode 100755 index 00000000..3105b6a7 --- /dev/null +++ b/gamefilesd/level/l13/l13.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 5, 6, 5, 6, 212, 213, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 192, 193, 5, 6, 32, 28, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 212, 213, 216, 217, 5, 6, 32, 28, 5, 6, 5, 6, 212, 213, 192, 193, 5, 6, 5, 6, 5, 6, 212, 213, 192, 193, 5, 6, 192, 193, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 214, 215, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 194, 195, 7, 4, 33, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 214, 215, 218, 219, 7, 4, 33, 4, 7, 4, 7, 4, 214, 215, 194, 195, 7, 4, 7, 4, 7, 4, 214, 215, 194, 195, 7, 4, 194, 195, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 156, 157, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 309, 310, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 313, 314, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 149, 153, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 147, 158, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 311, 312, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 315, 316, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 154, 155, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 196, 197, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 204, 205, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 149, 153, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 313, 314, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 198, 199, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 206, 207, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 154, 155, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 315, 316, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 42, 43, 17, 18, 17, 18, 395, 396, 42, 43, 17, 18, 17, 18, 56, 57, 50, 51, 50, 51, 50, 51, 389, 390, 36, 37, 149, 153, 305, 306, 56, 57, 50, 51, 389, 390, 42, 43, 17, 18, 17, 18, 59, 60, 50, 51, 50, 51, 50, 51, 389, 390, 42, 43, 17, 18, 149, 153, 395, 396, 42, 43, 17, 18, 17, 18, 56, 57, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 44, 4, 19, 20, 19, 20, 397, 388, 44, 4, 19, 20, 19, 20, 58, 49, 52, 49, 52, 49, 52, 49, 391, 388, 33, 4, 154, 155, 307, 308, 58, 49, 52, 49, 391, 388, 44, 4, 19, 20, 19, 20, 61, 49, 52, 49, 52, 49, 52, 49, 391, 388, 44, 4, 19, 20, 154, 155, 397, 388, 44, 4, 19, 20, 19, 20, 58, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 149, 153, 159, 160, 385, 386, 1, 2, 17, 18, 17, 18, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 159, 160, 17, 18, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 149, 153, 17, 18, 385, 386, 1, 2, 309, 310, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 154, 155, 161, 162, 387, 388, 3, 4, 19, 20, 19, 20, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 161, 162, 19, 20, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 154, 155, 19, 20, 387, 388, 3, 4, 311, 312, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 404, 405, 208, 209, 17, 18, 149, 150, 30, 31, 5, 6, 5, 6, 5, 6, 200, 201, 36, 37, 159, 160, 149, 150, 385, 386, 53, 54, 392, 393, 1, 2, 17, 18, 149, 150, 30, 31, 5, 6, 5, 6, 200, 201, 5, 6, 36, 37, 17, 18, 149, 150, 385, 386, 74, 75, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 406, 388, 210, 211, 19, 20, 151, 152, 29, 4, 7, 4, 7, 4, 7, 4, 202, 203, 33, 4, 161, 162, 151, 152, 387, 388, 55, 49, 394, 388, 3, 4, 19, 20, 151, 152, 29, 4, 7, 4, 7, 4, 202, 203, 7, 4, 33, 4, 19, 20, 151, 152, 387, 388, 76, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 34, 35, 17, 18, 145, 146, 11, 12, 17, 18, 17, 18, 156, 157, 145, 146, 11, 12, 17, 18, 145, 146, 41, 39, 416, 417, 27, 28, 34, 35, 17, 18, 145, 146, 254, 255, 17, 18, 17, 18, 17, 18, 145, 146, 11, 12, 17, 18, 145, 146, 41, 39, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 16, 4, 19, 20, 147, 148, 13, 14, 19, 20, 19, 20, 147, 158, 147, 148, 13, 14, 19, 20, 147, 148, 26, 4, 409, 388, 29, 4, 16, 4, 19, 20, 147, 148, 13, 256, 19, 20, 19, 20, 19, 20, 147, 148, 13, 14, 19, 20, 147, 148, 26, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 149, 153, 17, 18, 159, 160, 17, 18, 102, 103, 110, 111, 98, 99, 17, 18, 17, 18, 149, 153, 313, 314, 159, 160, 385, 386, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 149, 153, 149, 150, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 154, 155, 19, 20, 161, 162, 19, 20, 104, 105, 112, 113, 100, 101, 19, 20, 19, 20, 154, 155, 315, 316, 161, 162, 387, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 154, 155, 151, 152, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 192, 193, 5, 6, 5, 6, 5, 6, 34, 35, 17, 18, 17, 18, 17, 18, 21, 22, 106, 107, 94, 95, 90, 91, 86, 87, 21, 22, 17, 18, 17, 18, 17, 18, 385, 386, 208, 209, 17, 18, 305, 306, 305, 306, 260, 258, 149, 153, 17, 18, 17, 18, 17, 18, 21, 22, 17, 18, 313, 314, 145, 146, 41, 39, 192, 193, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 194, 195, 7, 4, 7, 4, 7, 4, 16, 4, 19, 20, 19, 20, 19, 20, 23, 4, 108, 109, 96, 97, 92, 93, 88, 89, 23, 4, 19, 20, 19, 20, 19, 20, 387, 388, 210, 211, 19, 20, 307, 308, 307, 308, 23, 259, 154, 155, 19, 20, 19, 20, 19, 20, 23, 4, 19, 20, 315, 316, 147, 148, 26, 4, 194, 195, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 159, 160, 309, 310, 204, 205, 313, 314, 17, 18, 82, 83, 17, 18, 1, 2, 17, 18, 149, 153, 56, 57, 65, 66, 413, 414, 42, 43, 17, 18, 17, 18, 208, 209, 17, 18, 17, 18, 17, 18, 17, 18, 1, 2, 159, 160, 17, 18, 17, 18, 309, 310, 17, 18, 159, 160, 17, 18, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 161, 162, 311, 312, 206, 207, 315, 316, 19, 20, 84, 85, 19, 20, 3, 4, 19, 20, 154, 155, 58, 49, 67, 49, 415, 388, 44, 4, 19, 20, 19, 20, 210, 211, 19, 20, 19, 20, 19, 20, 19, 20, 3, 4, 161, 162, 19, 20, 19, 20, 311, 312, 19, 20, 161, 162, 19, 20, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 305, 306, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 149, 153, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 309, 310, 1, 2, 149, 153, 156, 157, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 1, 2, 17, 18, 149, 153, 17, 18, 17, 18, 188, 189, 156, 157, 159, 160, 313, 314, 17, 18, 17, 18, 17, 18, 159, 160, 156, 157, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 307, 308, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 154, 155, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 311, 312, 3, 4, 154, 155, 147, 158, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 3, 4, 19, 20, 154, 155, 19, 20, 19, 20, 190, 191, 147, 158, 161, 162, 315, 316, 19, 20, 19, 20, 19, 20, 161, 162, 147, 158, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 1, 2, 305, 306, 159, 160, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 149, 153, 17, 18, 1, 2, 17, 18, 159, 160, 17, 18, 17, 18, 196, 197, 17, 18, 149, 153, 159, 160, 159, 160, 17, 18, 17, 18, 17, 18, 305, 306, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 3, 4, 307, 308, 161, 162, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 154, 155, 19, 20, 3, 4, 19, 20, 161, 162, 19, 20, 19, 20, 198, 199, 19, 20, 154, 155, 161, 162, 161, 162, 19, 20, 19, 20, 19, 20, 307, 308, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 313, 314, 17, 18, 17, 18, 309, 310, 17, 18, 17, 18, 17, 18, 159, 160, 1, 2, 17, 18, 149, 153, 305, 306, 156, 157, 1, 2, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 208, 209, 17, 18, 17, 18, 1, 2, 17, 18, 305, 306, 17, 18, 156, 157, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 315, 316, 19, 20, 19, 20, 311, 312, 19, 20, 19, 20, 19, 20, 161, 162, 3, 4, 19, 20, 154, 155, 307, 308, 147, 158, 3, 4, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 210, 211, 19, 20, 19, 20, 3, 4, 19, 20, 307, 308, 19, 20, 147, 158, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 56, 57, 389, 390, 36, 37, 305, 306, 17, 18, 313, 314, 17, 18, 59, 60, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 74, 75, 50, 51, 389, 390, 36, 37, 17, 18, 17, 18, 17, 18, 17, 18, 59, 60, 389, 390, 42, 43, 17, 18, 156, 157, 156, 157, 305, 306, 17, 18, 156, 157, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 58, 49, 391, 388, 33, 4, 307, 308, 19, 20, 315, 316, 19, 20, 61, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 76, 49, 52, 49, 391, 388, 33, 4, 19, 20, 19, 20, 19, 20, 19, 20, 61, 49, 391, 388, 44, 4, 19, 20, 147, 158, 147, 158, 307, 308, 19, 20, 147, 158, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 413, 414, 42, 43, 17, 18, 313, 314, 395, 396, 404, 405, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 413, 414, 42, 43, 149, 153, 159, 160, 56, 57, 65, 66, 392, 393, 1, 2, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 415, 388, 44, 4, 19, 20, 315, 316, 397, 388, 406, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 415, 388, 44, 4, 154, 155, 161, 162, 58, 49, 67, 49, 394, 388, 3, 4, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 156, 157, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 156, 157, 30, 31, 200, 201, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 251, 252, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 147, 158, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 147, 158, 29, 4, 202, 203, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 253, 4, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 309, 310, 17, 18, 1, 2, 305, 306, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 208, 209, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 311, 312, 19, 20, 3, 4, 307, 308, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 210, 211, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 392, 393, 196, 197, 149, 153, 149, 153, 1, 2, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 149, 153, 17, 18, 305, 306, 149, 153, 17, 18, 46, 47, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 394, 388, 198, 199, 154, 155, 154, 155, 3, 4, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 154, 155, 19, 20, 307, 308, 154, 155, 19, 20, 48, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 156, 157, 156, 157, 188, 189, 149, 150, 395, 396, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 42, 43, 156, 157, 17, 18, 156, 157, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 147, 158, 175, 176, 190, 191, 151, 152, 397, 388, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 44, 4, 147, 158, 19, 20, 147, 158, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 392, 393, 1, 2, 149, 153, 171, 172, 167, 168, 145, 146, 41, 39, 77, 78, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 34, 35, 313, 314, 17, 18, 156, 157, 17, 18, 46, 47, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 394, 388, 3, 4, 154, 155, 173, 174, 169, 170, 147, 148, 26, 4, 70, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 16, 4, 315, 316, 19, 20, 147, 158, 19, 20, 48, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 5, 6, 5, 6, 216, 217, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 392, 393, 204, 205, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 196, 197, 149, 153, 159, 160, 17, 18, 156, 157, 17, 18, 46, 47, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 7, 4, 7, 4, 218, 219, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 394, 388, 206, 207, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 198, 199, 154, 155, 161, 162, 19, 20, 147, 158, 19, 20, 48, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 149, 153, 17, 18, 313, 314, 17, 18, 159, 160, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 163, 164, 159, 160, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 159, 160, 313, 314, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 154, 155, 19, 20, 315, 316, 19, 20, 161, 162, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 165, 166, 161, 162, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 161, 162, 315, 316, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 137, 138, 122, 123, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 156, 157, 149, 150, 398, 399, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 389, 390, 42, 43, 149, 153, 149, 150, 385, 386, 53, 54, 392, 393, 1, 2, 149, 153, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 139, 140, 124, 125, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 147, 158, 151, 152, 400, 388, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 391, 388, 44, 4, 154, 155, 151, 152, 387, 388, 55, 49, 394, 388, 3, 4, 154, 155, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 149, 153, 134, 135, 130, 131, 118, 119, 17, 18, 149, 150, 385, 386, 392, 393, 27, 28, 34, 35, 156, 157, 145, 146, 41, 39, 416, 417, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 27, 28, 34, 35, 17, 18, 145, 146, 41, 39, 416, 417, 392, 393, 1, 2, 17, 18, 305, 306, 17, 18, 17, 18, 313, 314, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 154, 155, 49, 136, 132, 133, 120, 121, 19, 20, 151, 152, 387, 388, 394, 388, 29, 4, 16, 4, 147, 158, 147, 148, 26, 4, 409, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 29, 4, 16, 4, 19, 20, 147, 148, 26, 4, 409, 388, 394, 388, 3, 4, 19, 20, 307, 308, 19, 20, 19, 20, 315, 316, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 188, 189, 17, 18, 141, 142, 126, 127, 114, 115, 17, 18, 145, 146, 41, 39, 5, 6, 36, 37, 17, 18, 17, 18, 17, 18, 17, 18, 30, 31, 5, 6, 5, 6, 77, 78, 53, 54, 392, 393, 248, 249, 5, 6, 5, 6, 36, 37, 17, 18, 313, 314, 17, 18, 305, 306, 30, 31, 5, 6, 34, 35, 441, 442, 449, 450, 437, 438, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 190, 191, 19, 20, 143, 144, 128, 129, 116, 117, 19, 20, 147, 148, 26, 4, 7, 4, 33, 4, 19, 20, 19, 20, 19, 20, 19, 20, 29, 4, 7, 4, 7, 4, 70, 49, 55, 49, 394, 388, 250, 4, 7, 4, 7, 4, 33, 4, 19, 20, 315, 316, 19, 20, 307, 308, 29, 4, 7, 4, 16, 4, 443, 444, 451, 452, 439, 440, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 156, 157, 156, 157, 1, 2, 149, 153, 149, 153, 159, 160, 17, 18, 1, 2, 17, 18, 305, 306, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 156, 157, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 196, 197, 17, 18, 156, 157, 445, 446, 433, 434, 429, 430, 425, 426, 159, 160, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 147, 158, 147, 158, 3, 4, 154, 155, 154, 155, 161, 162, 19, 20, 3, 4, 19, 20, 307, 308, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 147, 158, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 198, 199, 19, 20, 147, 158, 447, 448, 435, 436, 431, 432, 427, 428, 161, 162, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 159, 160, 159, 160, 309, 310, 149, 153, 17, 18, 149, 153, 1, 2, 17, 18, 309, 310, 149, 153, 159, 160, 1, 2, 156, 157, 159, 160, 46, 47, 53, 54, 392, 393, 1, 2, 149, 153, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 313, 314, 421, 422, 149, 153, 313, 314, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 161, 162, 161, 162, 311, 312, 154, 155, 19, 20, 154, 155, 3, 4, 19, 20, 311, 312, 154, 155, 161, 162, 3, 4, 147, 158, 161, 162, 48, 49, 55, 49, 394, 388, 3, 4, 154, 155, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 315, 316, 423, 424, 154, 155, 315, 316, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 149, 153, 156, 157, 159, 160, 17, 18, 149, 153, 17, 18, 17, 18, 149, 150, 1, 2, 17, 18, 149, 153, 17, 18, 149, 150, 204, 205, 17, 18, 149, 150, 385, 386, 53, 54, 392, 393, 196, 197, 159, 160, 149, 150, 1, 2, 17, 18, 17, 18, 309, 310, 149, 150, 208, 209, 17, 18, 309, 310, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 154, 155, 147, 158, 161, 162, 19, 20, 154, 155, 19, 20, 19, 20, 151, 152, 3, 4, 19, 20, 154, 155, 19, 20, 151, 152, 206, 207, 19, 20, 151, 152, 387, 388, 55, 49, 394, 388, 198, 199, 161, 162, 151, 152, 3, 4, 19, 20, 19, 20, 311, 312, 151, 152, 210, 211, 19, 20, 311, 312, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 159, 160, 17, 18, 145, 146, 11, 12, 17, 18, 17, 18, 17, 18, 145, 146, 11, 12, 17, 18, 145, 146, 41, 39, 416, 417, 248, 249, 34, 35, 149, 153, 145, 146, 11, 12, 17, 18, 17, 18, 17, 18, 145, 146, 254, 255, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 161, 162, 19, 20, 147, 148, 13, 14, 19, 20, 19, 20, 19, 20, 147, 148, 13, 14, 19, 20, 147, 148, 26, 4, 409, 388, 250, 4, 16, 4, 154, 155, 147, 148, 13, 14, 19, 20, 19, 20, 19, 20, 147, 148, 13, 256, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 389, 390, 246, 241, 313, 314, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 149, 153, 385, 386, 1, 2, 313, 314, 17, 18, 305, 306, 149, 153, 313, 314, 305, 306, 17, 18, 17, 18, 17, 18, 156, 157, 313, 314, 17, 18, 56, 57, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 391, 388, 247, 243, 315, 316, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 154, 155, 387, 388, 3, 4, 315, 316, 19, 20, 307, 308, 154, 155, 315, 316, 307, 308, 19, 20, 19, 20, 19, 20, 147, 158, 315, 316, 19, 20, 58, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 156, 157, 21, 22, 17, 18, 149, 153, 17, 18, 17, 18, 260, 258, 17, 18, 17, 18, 17, 18, 385, 386, 1, 2, 17, 18, 17, 18, 17, 18, 21, 22, 17, 18, 17, 18, 17, 18, 305, 306, 21, 22, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 147, 158, 23, 4, 19, 20, 154, 155, 19, 20, 19, 20, 23, 259, 19, 20, 19, 20, 19, 20, 387, 388, 3, 4, 19, 20, 19, 20, 19, 20, 23, 4, 19, 20, 19, 20, 19, 20, 307, 308, 23, 4, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 413, 414, 42, 43, 17, 18, 309, 310, 1, 2, 17, 18, 17, 18, 156, 157, 17, 18, 188, 189, 17, 18, 17, 18, 56, 57, 65, 66, 413, 414, 42, 43, 313, 314, 17, 18, 1, 2, 17, 18, 159, 160, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 56, 57, 404, 405, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 415, 388, 44, 4, 19, 20, 311, 312, 3, 4, 19, 20, 19, 20, 147, 158, 19, 20, 190, 191, 19, 20, 19, 20, 58, 49, 67, 49, 415, 388, 44, 4, 315, 316, 19, 20, 3, 4, 19, 20, 161, 162, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 58, 49, 406, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 212, 213, 416, 417, 204, 205, 305, 306, 17, 18, 59, 60, 50, 51, 50, 51, 50, 51, 389, 390, 36, 37, 159, 160, 17, 18, 46, 47, 53, 54, 392, 393, 204, 205, 17, 18, 17, 18, 59, 60, 50, 51, 50, 51, 50, 51, 389, 390, 36, 37, 17, 18, 159, 160, 385, 386, 27, 28, 5, 6, 212, 213, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 214, 215, 409, 388, 206, 207, 307, 308, 19, 20, 61, 49, 52, 49, 52, 49, 52, 49, 391, 388, 33, 4, 161, 162, 19, 20, 48, 49, 55, 49, 394, 388, 206, 207, 19, 20, 19, 20, 61, 49, 52, 49, 52, 49, 52, 49, 391, 388, 33, 4, 19, 20, 161, 162, 387, 388, 29, 4, 7, 4, 214, 215, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 149, 150, 385, 386, 1, 2, 17, 18, 149, 150, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 17, 18, 149, 150, 385, 386, 392, 393, 392, 393, 1, 2, 17, 18, 17, 18, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 188, 189, 17, 18, 149, 150, 385, 386, 1, 2, 156, 157, 149, 150, 385, 386, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 151, 152, 387, 388, 3, 4, 19, 20, 151, 152, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 19, 20, 151, 152, 387, 388, 394, 388, 394, 388, 3, 4, 19, 20, 19, 20, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 190, 191, 19, 20, 151, 152, 387, 388, 3, 4, 147, 158, 151, 152, 387, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 34, 35, 17, 18, 145, 146, 244, 245, 34, 35, 17, 18, 145, 146, 41, 39, 216, 217, 192, 193, 5, 6, 5, 6, 36, 37, 17, 18, 145, 146, 41, 39, 5, 6, 5, 6, 34, 35, 17, 18, 17, 18, 30, 31, 5, 6, 5, 6, 5, 6, 5, 6, 34, 35, 17, 18, 145, 146, 41, 39, 34, 35, 17, 18, 145, 146, 41, 39, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 16, 4, 19, 20, 147, 148, 242, 243, 16, 4, 19, 20, 147, 148, 26, 4, 218, 219, 194, 195, 7, 4, 7, 4, 33, 4, 19, 20, 147, 148, 26, 4, 7, 4, 7, 4, 16, 4, 19, 20, 19, 20, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 16, 4, 19, 20, 147, 148, 26, 4, 16, 4, 19, 20, 147, 148, 26, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 305, 306, 17, 18, 309, 310, 17, 18, 309, 310, 149, 153, 17, 18, 313, 314, 17, 18, 313, 314, 17, 18, 159, 160, 1, 2, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 17, 18, 156, 157, 17, 18, 1, 2, 17, 18, 156, 157, 17, 18, 17, 18, 156, 157, 17, 18, 156, 157, 305, 306, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 307, 308, 19, 20, 311, 312, 19, 20, 311, 312, 154, 155, 19, 20, 315, 316, 19, 20, 315, 316, 19, 20, 161, 162, 3, 4, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 19, 20, 147, 158, 19, 20, 3, 4, 19, 20, 147, 158, 19, 20, 19, 20, 147, 158, 19, 20, 147, 158, 307, 308, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 149, 153, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 156, 157, 1, 2, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 149, 153, 17, 18, 1, 2, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 154, 155, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 147, 158, 3, 4, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 154, 155, 19, 20, 3, 4, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 71, 72, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 71, 72, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 73, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 73, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":43, + "firstgid":1, + "image":"hell.png", + "imageheight":2816, + "imagewidth":2752, + "margin":0, + "name":"hell", + "spacing":0, + "tilecount":473, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l13/level.json b/gamefilesd/level/l13/level.json new file mode 100755 index 00000000..0feda704 --- /dev/null +++ b/gamefilesd/level/l13/level.json @@ -0,0 +1,31 @@ +{ + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], + "palette": [ + { + "id": "l4_1", + "file": "levels/l4data/l4_1.pal" + }, + { + "id": "colorCycle", + "fromId": "l4_1" + } + ], + "level": { + "id": "level", + "palette": "l4_1", + "file": "levels/l4data/l4.cel", + "outOfBoundsTileLayer2": 19, + "til": "levels/l4data/l4.til", + "min": "levels/l4data/l4.min", + "minBlocks": 16, + "sol": "levels/l4data/l4.sol" + }, + "load": "level/automap/l4/load.json", + "load": "level/l13/levelObjects.json", + "load": "level/l13/monsters.json", + "load": "level/l13/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l13/level2.json b/gamefilesd/level/l13/level2.json new file mode 100755 index 00000000..ca56de69 --- /dev/null +++ b/gamefilesd/level/l13/level2.json @@ -0,0 +1,17 @@ +{ + "level": { + "id": "level", + "path": "l13", + "name": "13", + "defaultTile": 5, + "map": { "file": "level/l13/l13.json", "indexOffset": -1 } + }, + "load": "level/l13/levelObjects2.json", + "load": "level/l13/monsters2.json", + "load": ["level/town/loadPassages.json", "true", "true", "true"], + "event": { + "time": 1.5, + "addToFront": true, + "action": { "name": "load", "file": ["res/player/sound/load.json", 99, "", "playAudio", "currentLevel"] } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l13/levelObjects2.json b/gamefilesd/level/l13/levelObjects2.json new file mode 100755 index 00000000..775a88a8 --- /dev/null +++ b/gamefilesd/level/l13/levelObjects2.json @@ -0,0 +1,33 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [25, 65], + "properties": { + "x": 38, + "y": 86, + "level": 14 + } + }, + { + "id": "town", + "class": "levelTown", + "mapPosition": [84, 69], + "properties": { + "x": 42, + "y": 80 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [42, 35], + "properties": { + "x": 37, + "y": 59, + "level": 12 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l13/music.json b/gamefilesd/level/l13/music.json new file mode 100755 index 00000000..d7d2e6a7 --- /dev/null +++ b/gamefilesd/level/l13/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvld.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l15/redPentagram.json b/gamefilesd/level/l13/redPentagram.json similarity index 100% rename from gamefilesd/level/l15/redPentagram.json rename to gamefilesd/level/l13/redPentagram.json diff --git a/gamefilesd/level/l13/townToLevel.json b/gamefilesd/level/l13/townToLevel.json new file mode 100755 index 00000000..a3d67852 --- /dev/null +++ b/gamefilesd/level/l13/townToLevel.json @@ -0,0 +1,11 @@ +{ + "levelObject": { + "id": "hell", + "class": "levelHell", + "mapPosition": [41, 79], + "properties": { + "x": 86, + "y": 70 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l14/l14.json b/gamefilesd/level/l14/l14.json new file mode 100755 index 00000000..c08fdace --- /dev/null +++ b/gamefilesd/level/l14/l14.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 192, 193, 5, 6, 77, 78, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 27, 28, 5, 6, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 5, 6, 5, 6, 416, 417, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 27, 28, 192, 193, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 194, 195, 7, 4, 70, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 409, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 29, 4, 194, 195, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 1, 2, 17, 18, 156, 157, 385, 386, 27, 28, 216, 217, 5, 6, 212, 213, 5, 6, 36, 37, 17, 18, 17, 18, 17, 18, 149, 150, 385, 386, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 305, 306, 17, 18, 17, 18, 149, 150, 30, 31, 192, 193, 5, 6, 5, 6, 192, 193, 416, 417, 1, 2, 156, 157, 17, 18, 385, 386, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 3, 4, 19, 20, 147, 158, 387, 388, 29, 4, 218, 219, 7, 4, 214, 215, 7, 4, 33, 4, 19, 20, 19, 20, 19, 20, 151, 152, 387, 388, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 307, 308, 19, 20, 19, 20, 151, 152, 29, 4, 194, 195, 7, 4, 7, 4, 194, 195, 409, 388, 3, 4, 147, 158, 19, 20, 387, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 5, 6, 251, 252, 17, 18, 156, 157, 30, 31, 34, 35, 17, 18, 17, 18, 313, 314, 145, 146, 11, 12, 17, 18, 17, 18, 17, 18, 145, 146, 41, 39, 77, 78, 53, 54, 392, 393, 248, 249, 34, 35, 17, 18, 17, 18, 17, 18, 145, 146, 11, 12, 17, 18, 17, 18, 17, 18, 145, 146, 244, 245, 34, 35, 17, 18, 156, 157, 30, 31, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 7, 4, 253, 4, 19, 20, 175, 176, 29, 4, 16, 4, 19, 20, 19, 20, 315, 316, 147, 148, 13, 14, 19, 20, 19, 20, 19, 20, 147, 148, 26, 4, 70, 49, 55, 49, 394, 388, 250, 4, 16, 4, 19, 20, 19, 20, 19, 20, 147, 148, 13, 14, 19, 20, 19, 20, 19, 20, 147, 148, 242, 243, 16, 4, 19, 20, 175, 176, 29, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 171, 172, 167, 168, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 17, 18, 149, 153, 149, 153, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 171, 172, 167, 168, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 173, 174, 169, 170, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 19, 20, 154, 155, 154, 155, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 173, 174, 169, 170, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 204, 205, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 305, 306, 149, 153, 149, 153, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 17, 18, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 206, 207, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 307, 308, 154, 155, 154, 155, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 19, 20, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 156, 157, 305, 306, 159, 160, 163, 164, 159, 160, 149, 153, 149, 153, 156, 157, 17, 18, 17, 18, 156, 157, 305, 306, 156, 157, 17, 18, 159, 160, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 309, 310, 309, 310, 149, 153, 156, 157, 17, 18, 149, 153, 163, 164, 305, 306, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 147, 158, 307, 308, 161, 162, 165, 166, 161, 162, 154, 155, 154, 155, 147, 158, 19, 20, 19, 20, 147, 158, 307, 308, 147, 158, 19, 20, 161, 162, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 311, 312, 311, 312, 154, 155, 147, 158, 19, 20, 154, 155, 165, 166, 307, 308, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 305, 306, 149, 153, 17, 18, 17, 18, 1, 2, 159, 160, 17, 18, 159, 160, 149, 150, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 156, 157, 385, 386, 53, 54, 392, 393, 1, 2, 309, 310, 17, 18, 305, 306, 17, 18, 309, 310, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 1, 2, 149, 153, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 307, 308, 154, 155, 19, 20, 19, 20, 3, 4, 161, 162, 19, 20, 161, 162, 151, 152, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 147, 158, 387, 388, 55, 49, 394, 388, 3, 4, 311, 312, 19, 20, 307, 308, 19, 20, 311, 312, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 3, 4, 154, 155, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 389, 390, 42, 43, 17, 18, 149, 153, 30, 31, 257, 258, 17, 18, 17, 18, 145, 146, 24, 25, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 38, 39, 416, 417, 27, 28, 38, 39, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 15, 9, 17, 18, 17, 18, 156, 157, 27, 28, 5, 6, 246, 241, 156, 157, 17, 18, 59, 60, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 391, 388, 44, 4, 19, 20, 154, 155, 29, 4, 16, 259, 19, 20, 19, 20, 147, 148, 26, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 40, 4, 409, 388, 29, 4, 40, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 16, 4, 19, 20, 19, 20, 175, 176, 29, 4, 7, 4, 247, 243, 147, 158, 19, 20, 61, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 1, 2, 17, 18, 159, 160, 17, 18, 156, 157, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 385, 386, 1, 2, 17, 18, 17, 18, 309, 310, 17, 18, 159, 160, 17, 18, 309, 310, 17, 18, 159, 160, 171, 172, 167, 168, 156, 157, 1, 2, 156, 157, 149, 153, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 3, 4, 19, 20, 161, 162, 19, 20, 147, 158, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 387, 388, 3, 4, 19, 20, 19, 20, 311, 312, 19, 20, 161, 162, 19, 20, 311, 312, 19, 20, 161, 162, 173, 174, 169, 170, 147, 158, 3, 4, 147, 158, 154, 155, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 389, 390, 389, 390, 36, 37, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 309, 310, 385, 386, 1, 2, 149, 153, 17, 18, 159, 160, 156, 157, 17, 18, 159, 160, 313, 314, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 398, 399, 389, 390, 389, 390, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 391, 388, 391, 388, 33, 4, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 311, 312, 387, 388, 3, 4, 154, 155, 19, 20, 161, 162, 147, 158, 19, 20, 161, 162, 315, 316, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 400, 388, 391, 388, 391, 388, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 200, 201, 5, 6, 36, 37, 17, 18, 17, 18, 17, 18, 159, 160, 159, 160, 17, 18, 149, 153, 17, 18, 156, 157, 149, 153, 17, 18, 17, 18, 385, 386, 1, 2, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 156, 157, 17, 18, 17, 18, 17, 18, 163, 164, 17, 18, 30, 31, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 202, 203, 7, 4, 33, 4, 19, 20, 19, 20, 19, 20, 161, 162, 161, 162, 19, 20, 154, 155, 19, 20, 147, 158, 154, 155, 19, 20, 19, 20, 387, 388, 3, 4, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 147, 158, 19, 20, 19, 20, 19, 20, 165, 166, 19, 20, 29, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 1, 2, 17, 18, 149, 150, 1, 2, 159, 160, 149, 153, 159, 160, 17, 18, 149, 150, 17, 18, 17, 18, 156, 157, 309, 310, 17, 18, 159, 160, 149, 150, 385, 386, 1, 2, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 149, 150, 17, 18, 313, 314, 17, 18, 149, 150, 1, 2, 313, 314, 1, 2, 17, 18, 149, 150, 385, 386, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 3, 4, 19, 20, 151, 152, 3, 4, 161, 162, 154, 155, 161, 162, 19, 20, 151, 152, 19, 20, 19, 20, 147, 158, 311, 312, 19, 20, 161, 162, 151, 152, 387, 388, 3, 4, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 151, 152, 19, 20, 315, 316, 19, 20, 151, 152, 3, 4, 315, 316, 3, 4, 19, 20, 151, 152, 387, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 192, 193, 34, 35, 17, 18, 145, 146, 41, 39, 15, 9, 159, 160, 17, 18, 17, 18, 145, 146, 8, 9, 156, 157, 17, 18, 17, 18, 309, 310, 17, 18, 145, 146, 41, 39, 34, 35, 17, 18, 309, 310, 313, 314, 156, 157, 156, 157, 145, 146, 8, 9, 17, 18, 156, 157, 145, 146, 24, 25, 5, 6, 34, 35, 313, 314, 145, 146, 41, 39, 192, 193, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 194, 195, 16, 4, 19, 20, 147, 148, 26, 4, 16, 4, 161, 162, 19, 20, 19, 20, 147, 148, 10, 4, 147, 158, 19, 20, 19, 20, 311, 312, 19, 20, 147, 148, 26, 4, 16, 4, 19, 20, 311, 312, 315, 316, 147, 158, 147, 158, 147, 148, 10, 4, 19, 20, 147, 158, 147, 148, 26, 4, 7, 4, 16, 4, 315, 316, 147, 148, 26, 4, 194, 195, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 156, 157, 305, 306, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 305, 306, 309, 310, 17, 18, 17, 18, 17, 18, 156, 157, 159, 160, 17, 18, 17, 18, 17, 18, 156, 157, 313, 314, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 156, 157, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 147, 158, 307, 308, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 307, 308, 311, 312, 19, 20, 19, 20, 19, 20, 147, 158, 161, 162, 19, 20, 19, 20, 19, 20, 147, 158, 315, 316, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 147, 158, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 149, 153, 159, 160, 149, 153, 17, 18, 159, 160, 17, 18, 17, 18, 159, 160, 159, 160, 17, 18, 17, 18, 156, 157, 159, 160, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 154, 155, 161, 162, 154, 155, 19, 20, 161, 162, 19, 20, 19, 20, 161, 162, 161, 162, 19, 20, 19, 20, 147, 158, 161, 162, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 56, 57, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 389, 390, 42, 43, 17, 18, 309, 310, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 58, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 391, 388, 44, 4, 19, 20, 311, 312, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 159, 160, 17, 18, 156, 157, 17, 18, 17, 18, 313, 314, 17, 18, 17, 18, 17, 18, 159, 160, 309, 310, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 204, 205, 149, 153, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 161, 162, 19, 20, 147, 158, 19, 20, 19, 20, 315, 316, 19, 20, 19, 20, 19, 20, 161, 162, 311, 312, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 206, 207, 154, 155, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 389, 390, 42, 43, 156, 157, 17, 18, 156, 157, 149, 153, 159, 160, 313, 314, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 305, 306, 305, 306, 17, 18, 17, 18, 17, 18, 149, 153, 56, 57, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 391, 388, 44, 4, 147, 158, 19, 20, 147, 158, 154, 155, 161, 162, 315, 316, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 307, 308, 307, 308, 19, 20, 19, 20, 19, 20, 154, 155, 58, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 389, 390, 389, 390, 389, 390, 42, 43, 17, 18, 149, 153, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 149, 150, 395, 396, 389, 390, 389, 390, 389, 390, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 391, 388, 391, 388, 391, 388, 44, 4, 19, 20, 154, 155, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 151, 152, 397, 388, 391, 388, 391, 388, 391, 388, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 248, 249, 5, 6, 5, 6, 5, 6, 34, 35, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 145, 146, 41, 39, 216, 217, 192, 193, 5, 6, 416, 417, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 250, 4, 7, 4, 7, 4, 7, 4, 16, 4, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 147, 148, 26, 4, 218, 219, 194, 195, 7, 4, 409, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 212, 213, 5, 6, 5, 6, 5, 6, 5, 6, 34, 35, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 149, 153, 17, 18, 313, 314, 17, 18, 17, 18, 145, 146, 41, 39, 5, 6, 5, 6, 192, 193, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 214, 215, 7, 4, 7, 4, 7, 4, 7, 4, 16, 4, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 154, 155, 19, 20, 315, 316, 19, 20, 19, 20, 147, 148, 26, 4, 7, 4, 7, 4, 194, 195, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 196, 197, 17, 18, 17, 18, 305, 306, 17, 18, 17, 18, 309, 310, 17, 18, 17, 18, 305, 306, 309, 310, 17, 18, 149, 150, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 198, 199, 19, 20, 19, 20, 307, 308, 19, 20, 19, 20, 311, 312, 19, 20, 19, 20, 307, 308, 311, 312, 19, 20, 151, 152, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 145, 146, 41, 39, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 200, 201, 5, 6, 5, 6, 5, 6, 5, 6, 34, 35, 156, 157, 17, 18, 159, 160, 309, 310, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 147, 148, 26, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 202, 203, 7, 4, 7, 4, 7, 4, 7, 4, 16, 4, 147, 158, 19, 20, 161, 162, 311, 312, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 305, 306, 17, 18, 159, 160, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 313, 314, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 307, 308, 19, 20, 161, 162, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 315, 316, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 149, 153, 156, 157, 149, 153, 159, 160, 305, 306, 17, 18, 313, 314, 17, 18, 149, 153, 149, 150, 156, 157, 17, 18, 313, 314, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 17, 18, 17, 18, 149, 150, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 313, 314, 17, 18, 149, 153, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 154, 155, 147, 158, 154, 155, 161, 162, 307, 308, 19, 20, 315, 316, 19, 20, 154, 155, 151, 152, 147, 158, 19, 20, 315, 316, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 19, 20, 19, 20, 151, 152, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 315, 316, 19, 20, 154, 155, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 389, 390, 246, 241, 156, 157, 17, 18, 27, 28, 15, 9, 17, 18, 149, 153, 149, 153, 145, 146, 8, 9, 149, 153, 17, 18, 137, 138, 122, 123, 17, 18, 159, 160, 395, 396, 42, 43, 17, 18, 309, 310, 156, 157, 149, 153, 305, 306, 145, 146, 8, 9, 17, 18, 17, 18, 156, 157, 27, 28, 5, 6, 42, 43, 159, 160, 309, 310, 56, 57, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 391, 388, 247, 243, 147, 158, 19, 20, 29, 4, 16, 4, 19, 20, 154, 155, 154, 155, 147, 148, 10, 4, 154, 155, 19, 20, 139, 140, 124, 125, 19, 20, 161, 162, 397, 388, 44, 4, 19, 20, 311, 312, 147, 158, 154, 155, 307, 308, 147, 148, 10, 4, 19, 20, 19, 20, 175, 176, 29, 4, 7, 4, 44, 4, 161, 162, 311, 312, 58, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 208, 209, 17, 18, 17, 18, 1, 2, 159, 160, 17, 18, 149, 153, 17, 18, 149, 153, 17, 18, 17, 18, 134, 135, 130, 131, 118, 119, 17, 18, 156, 157, 385, 386, 1, 2, 305, 306, 313, 314, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 171, 172, 167, 168, 17, 18, 188, 189, 156, 157, 309, 310, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 210, 211, 19, 20, 19, 20, 3, 4, 161, 162, 19, 20, 154, 155, 19, 20, 154, 155, 19, 20, 19, 20, 49, 136, 132, 133, 120, 121, 19, 20, 147, 158, 387, 388, 3, 4, 307, 308, 315, 316, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 173, 174, 169, 170, 19, 20, 190, 191, 147, 158, 311, 312, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 389, 390, 389, 390, 36, 37, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 149, 153, 309, 310, 141, 142, 126, 127, 114, 115, 149, 153, 309, 310, 385, 386, 1, 2, 17, 18, 17, 18, 17, 18, 159, 160, 159, 160, 17, 18, 17, 18, 17, 18, 313, 314, 305, 306, 17, 18, 17, 18, 398, 399, 389, 390, 389, 390, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 391, 388, 391, 388, 33, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 154, 155, 311, 312, 143, 144, 128, 129, 116, 117, 154, 155, 311, 312, 387, 388, 3, 4, 19, 20, 19, 20, 19, 20, 161, 162, 161, 162, 19, 20, 19, 20, 19, 20, 315, 316, 307, 308, 19, 20, 19, 20, 400, 388, 391, 388, 391, 388, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 36, 37, 149, 153, 17, 18, 159, 160, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 149, 153, 309, 310, 159, 160, 17, 18, 385, 386, 1, 2, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 305, 306, 159, 160, 17, 18, 17, 18, 163, 164, 17, 18, 30, 31, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 33, 4, 154, 155, 19, 20, 161, 162, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 154, 155, 311, 312, 161, 162, 19, 20, 387, 388, 3, 4, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 307, 308, 161, 162, 19, 20, 19, 20, 165, 166, 19, 20, 29, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 1, 2, 17, 18, 159, 160, 1, 2, 17, 18, 17, 18, 156, 157, 149, 150, 159, 160, 149, 153, 309, 310, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 385, 386, 1, 2, 17, 18, 149, 153, 17, 18, 17, 18, 305, 306, 159, 160, 156, 157, 156, 157, 156, 157, 149, 150, 188, 189, 17, 18, 1, 2, 159, 160, 17, 18, 385, 386, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 3, 4, 19, 20, 161, 162, 3, 4, 19, 20, 19, 20, 147, 158, 151, 152, 161, 162, 154, 155, 311, 312, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 387, 388, 3, 4, 19, 20, 154, 155, 19, 20, 19, 20, 307, 308, 161, 162, 147, 158, 147, 158, 147, 158, 151, 152, 190, 191, 19, 20, 3, 4, 161, 162, 19, 20, 387, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 5, 6, 34, 35, 17, 18, 156, 157, 30, 31, 15, 9, 17, 18, 17, 18, 145, 146, 24, 25, 5, 6, 192, 193, 5, 6, 192, 193, 5, 6, 5, 6, 62, 63, 65, 66, 413, 414, 32, 28, 5, 6, 5, 6, 5, 6, 5, 6, 200, 201, 15, 9, 17, 18, 17, 18, 145, 146, 24, 25, 5, 6, 34, 35, 305, 306, 156, 157, 30, 31, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 7, 4, 16, 4, 19, 20, 175, 176, 29, 4, 16, 4, 19, 20, 19, 20, 147, 148, 26, 4, 7, 4, 194, 195, 7, 4, 194, 195, 7, 4, 7, 4, 64, 49, 67, 49, 415, 388, 33, 4, 7, 4, 7, 4, 7, 4, 7, 4, 202, 203, 16, 4, 19, 20, 19, 20, 147, 148, 26, 4, 7, 4, 16, 4, 307, 308, 175, 176, 29, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 188, 189, 17, 18, 156, 157, 17, 18, 171, 172, 167, 168, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 305, 306, 313, 314, 17, 18, 17, 18, 156, 157, 149, 153, 17, 18, 171, 172, 167, 168, 309, 310, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 190, 191, 19, 20, 147, 158, 19, 20, 173, 174, 169, 170, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 307, 308, 315, 316, 19, 20, 19, 20, 147, 158, 154, 155, 19, 20, 173, 174, 169, 170, 311, 312, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 102, 103, 110, 111, 98, 99, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 204, 205, 17, 18, 17, 18, 17, 18, 305, 306, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 156, 157, 159, 160, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 104, 105, 112, 113, 100, 101, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 206, 207, 19, 20, 19, 20, 19, 20, 307, 308, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 147, 158, 161, 162, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 188, 189, 17, 18, 17, 18, 17, 18, 17, 18, 163, 164, 149, 153, 106, 107, 94, 95, 90, 91, 86, 87, 313, 314, 17, 18, 17, 18, 156, 157, 159, 160, 17, 18, 46, 47, 53, 54, 392, 393, 196, 197, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 309, 310, 17, 18, 309, 310, 17, 18, 156, 157, 17, 18, 163, 164, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 190, 191, 19, 20, 19, 20, 19, 20, 19, 20, 165, 166, 154, 155, 108, 109, 96, 97, 92, 93, 88, 89, 315, 316, 19, 20, 19, 20, 147, 158, 161, 162, 19, 20, 48, 49, 55, 49, 394, 388, 198, 199, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 311, 312, 19, 20, 311, 312, 19, 20, 147, 158, 19, 20, 165, 166, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 149, 153, 17, 18, 17, 18, 156, 157, 1, 2, 159, 160, 313, 314, 305, 306, 82, 83, 17, 18, 21, 22, 17, 18, 17, 18, 159, 160, 156, 157, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 309, 310, 305, 306, 17, 18, 156, 157, 17, 18, 21, 22, 156, 157, 159, 160, 156, 157, 309, 310, 17, 18, 17, 18, 17, 18, 149, 153, 1, 2, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 154, 155, 19, 20, 19, 20, 147, 158, 3, 4, 161, 162, 315, 316, 307, 308, 84, 85, 19, 20, 23, 4, 19, 20, 19, 20, 161, 162, 147, 158, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 311, 312, 307, 308, 19, 20, 147, 158, 19, 20, 23, 4, 147, 158, 161, 162, 147, 158, 311, 312, 19, 20, 19, 20, 19, 20, 154, 155, 3, 4, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 389, 390, 246, 241, 17, 18, 17, 18, 398, 399, 42, 43, 156, 157, 17, 18, 17, 18, 17, 18, 1, 2, 17, 18, 313, 314, 313, 314, 309, 310, 56, 57, 65, 66, 53, 54, 53, 54, 413, 414, 42, 43, 17, 18, 17, 18, 156, 157, 17, 18, 1, 2, 17, 18, 17, 18, 159, 160, 17, 18, 395, 396, 42, 43, 17, 18, 17, 18, 59, 60, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 391, 388, 247, 243, 19, 20, 19, 20, 400, 388, 44, 4, 147, 158, 19, 20, 19, 20, 19, 20, 3, 4, 19, 20, 315, 316, 315, 316, 311, 312, 58, 49, 67, 49, 55, 49, 55, 49, 415, 388, 44, 4, 19, 20, 19, 20, 147, 158, 19, 20, 3, 4, 19, 20, 19, 20, 161, 162, 19, 20, 397, 388, 44, 4, 19, 20, 19, 20, 61, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 46, 47, 74, 75, 50, 51, 50, 51, 50, 51, 389, 390, 36, 37, 17, 18, 17, 18, 17, 18, 305, 306, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 159, 160, 59, 60, 50, 51, 50, 51, 50, 51, 50, 51, 404, 405, 208, 209, 17, 18, 309, 310, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 48, 49, 76, 49, 52, 49, 52, 49, 52, 49, 391, 388, 33, 4, 19, 20, 19, 20, 19, 20, 307, 308, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 161, 162, 61, 49, 52, 49, 52, 49, 52, 49, 52, 49, 406, 388, 210, 211, 19, 20, 311, 312, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":43, + "firstgid":1, + "image":"hell.png", + "imageheight":2816, + "imagewidth":2752, + "margin":0, + "name":"hell", + "spacing":0, + "tilecount":473, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l14/level.json b/gamefilesd/level/l14/level.json new file mode 100755 index 00000000..dcbacd69 --- /dev/null +++ b/gamefilesd/level/l14/level.json @@ -0,0 +1,31 @@ +{ + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], + "palette": [ + { + "id": "l4_2", + "file": "levels/l4data/l4_2.pal" + }, + { + "id": "colorCycle", + "fromId": "l4_2" + } + ], + "level": { + "id": "level", + "palette": "l4_2", + "file": "levels/l4data/l4.cel", + "outOfBoundsTileLayer2": 19, + "til": "levels/l4data/l4.til", + "min": "levels/l4data/l4.min", + "minBlocks": 16, + "sol": "levels/l4data/l4.sol" + }, + "load": "level/automap/l4/load.json", + "load": "level/l14/levelObjects.json", + "load": "level/l14/monsters.json", + "load": "level/l14/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l14/level2.json b/gamefilesd/level/l14/level2.json new file mode 100755 index 00000000..acc097ba --- /dev/null +++ b/gamefilesd/level/l14/level2.json @@ -0,0 +1,11 @@ +{ + "level": { + "id": "level", + "path": "l14", + "name": "14", + "defaultTile": 5, + "map": { "file": "level/l14/l14.json", "indexOffset": -1 } + }, + "load": "level/l14/levelObjects2.json", + "load": "level/l14/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l14/levelObjects2.json b/gamefilesd/level/l14/levelObjects2.json new file mode 100755 index 00000000..5da48c35 --- /dev/null +++ b/gamefilesd/level/l14/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [47, 71], + "properties": { + "x": 44, + "y": 36, + "level": 15 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [36, 85], + "properties": { + "x": 25, + "y": 67, + "level": 13 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l14/music.json b/gamefilesd/level/l14/music.json new file mode 100755 index 00000000..d7d2e6a7 --- /dev/null +++ b/gamefilesd/level/l14/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvld.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l15/l15.json b/gamefilesd/level/l15/l15.json new file mode 100755 index 00000000..5137f1bd --- /dev/null +++ b/gamefilesd/level/l15/l15.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 212, 213, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 192, 193, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 32, 28, 5, 6, 212, 213, 216, 217, 5, 6, 216, 217, 5, 6, 5, 6, 212, 213, 32, 28, 5, 6, 5, 6, 5, 6, 212, 213, 192, 193, 5, 6, 192, 193, 5, 6, 192, 193, 5, 6, 5, 6, 212, 213, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 214, 215, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 194, 195, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 33, 4, 7, 4, 214, 215, 218, 219, 7, 4, 218, 219, 7, 4, 7, 4, 214, 215, 33, 4, 7, 4, 7, 4, 7, 4, 214, 215, 194, 195, 7, 4, 194, 195, 7, 4, 194, 195, 7, 4, 7, 4, 214, 215, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 1, 2, 17, 18, 159, 160, 313, 314, 17, 18, 17, 18, 17, 18, 149, 153, 149, 153, 17, 18, 156, 157, 156, 157, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 3, 4, 19, 20, 161, 162, 315, 316, 19, 20, 19, 20, 19, 20, 154, 155, 154, 155, 19, 20, 147, 158, 147, 158, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 1, 2, 159, 160, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 156, 157, 156, 157, 17, 18, 17, 18, 313, 314, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 3, 4, 161, 162, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 147, 158, 147, 158, 19, 20, 19, 20, 315, 316, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 42, 43, 156, 157, 17, 18, 395, 396, 246, 241, 17, 18, 149, 153, 56, 57, 50, 51, 50, 51, 50, 51, 389, 390, 36, 37, 17, 18, 305, 306, 56, 57, 50, 51, 389, 390, 42, 43, 17, 18, 149, 153, 59, 60, 50, 51, 50, 51, 50, 51, 389, 390, 42, 43, 159, 160, 17, 18, 395, 396, 42, 43, 17, 18, 149, 153, 56, 57, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 44, 4, 147, 158, 19, 20, 397, 388, 247, 243, 19, 20, 154, 155, 58, 49, 52, 49, 52, 49, 52, 49, 391, 388, 33, 4, 19, 20, 307, 308, 58, 49, 52, 49, 391, 388, 44, 4, 19, 20, 154, 155, 61, 49, 52, 49, 52, 49, 52, 49, 391, 388, 44, 4, 161, 162, 19, 20, 397, 388, 44, 4, 19, 20, 154, 155, 58, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 156, 157, 385, 386, 1, 2, 17, 18, 17, 18, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 204, 205, 159, 160, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 159, 160, 17, 18, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 17, 18, 159, 160, 385, 386, 208, 209, 309, 310, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 147, 158, 387, 388, 3, 4, 19, 20, 19, 20, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 206, 207, 161, 162, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 161, 162, 19, 20, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 19, 20, 161, 162, 387, 388, 210, 211, 311, 312, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 404, 405, 1, 2, 17, 18, 149, 150, 30, 31, 5, 6, 5, 6, 5, 6, 212, 213, 36, 37, 17, 18, 149, 150, 385, 386, 53, 54, 392, 393, 1, 2, 17, 18, 149, 150, 30, 31, 5, 6, 5, 6, 5, 6, 216, 217, 36, 37, 17, 18, 149, 150, 385, 386, 74, 75, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 406, 388, 3, 4, 19, 20, 151, 152, 29, 4, 7, 4, 7, 4, 7, 4, 214, 215, 33, 4, 19, 20, 151, 152, 387, 388, 55, 49, 394, 388, 3, 4, 19, 20, 151, 152, 29, 4, 7, 4, 7, 4, 7, 4, 218, 219, 33, 4, 19, 20, 151, 152, 387, 388, 76, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 34, 35, 17, 18, 145, 146, 11, 12, 17, 18, 17, 18, 17, 18, 145, 146, 11, 12, 17, 18, 145, 146, 41, 39, 416, 417, 27, 28, 34, 35, 17, 18, 145, 146, 11, 12, 17, 18, 159, 160, 17, 18, 145, 146, 11, 12, 17, 18, 145, 146, 41, 39, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 16, 4, 19, 20, 147, 148, 13, 14, 19, 20, 19, 20, 19, 20, 147, 148, 13, 14, 19, 20, 147, 148, 26, 4, 409, 388, 29, 4, 16, 4, 19, 20, 147, 148, 13, 14, 19, 20, 161, 162, 19, 20, 147, 148, 13, 14, 19, 20, 147, 148, 26, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 17, 18, 17, 18, 159, 160, 17, 18, 102, 103, 110, 111, 98, 99, 159, 160, 17, 18, 17, 18, 313, 314, 17, 18, 385, 386, 1, 2, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 156, 157, 149, 150, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 19, 20, 19, 20, 161, 162, 19, 20, 104, 105, 112, 113, 100, 101, 161, 162, 19, 20, 19, 20, 315, 316, 19, 20, 387, 388, 3, 4, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 147, 158, 151, 152, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 5, 6, 5, 6, 5, 6, 5, 6, 34, 35, 17, 18, 159, 160, 17, 18, 21, 22, 106, 107, 94, 95, 90, 91, 86, 87, 260, 258, 17, 18, 17, 18, 17, 18, 385, 386, 1, 2, 149, 153, 305, 306, 305, 306, 21, 22, 17, 18, 17, 18, 17, 18, 17, 18, 21, 22, 156, 157, 313, 314, 145, 146, 41, 39, 5, 6, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 16, 4, 19, 20, 161, 162, 19, 20, 23, 4, 108, 109, 96, 97, 92, 93, 88, 89, 23, 259, 19, 20, 19, 20, 19, 20, 387, 388, 3, 4, 154, 155, 307, 308, 307, 308, 23, 4, 19, 20, 19, 20, 19, 20, 19, 20, 23, 4, 147, 158, 315, 316, 147, 148, 26, 4, 7, 4, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 159, 160, 17, 18, 159, 160, 17, 18, 156, 157, 156, 157, 17, 18, 309, 310, 1, 2, 313, 314, 149, 153, 82, 83, 17, 18, 1, 2, 17, 18, 17, 18, 56, 57, 65, 66, 413, 414, 42, 43, 17, 18, 17, 18, 1, 2, 17, 18, 159, 160, 17, 18, 17, 18, 188, 189, 17, 18, 159, 160, 17, 18, 309, 310, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 161, 162, 19, 20, 161, 162, 19, 20, 147, 158, 147, 158, 19, 20, 311, 312, 3, 4, 315, 316, 154, 155, 84, 85, 19, 20, 3, 4, 19, 20, 19, 20, 58, 49, 67, 49, 415, 388, 44, 4, 19, 20, 19, 20, 3, 4, 19, 20, 161, 162, 19, 20, 19, 20, 190, 191, 19, 20, 161, 162, 19, 20, 311, 312, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 305, 306, 156, 157, 149, 153, 17, 18, 17, 18, 305, 306, 17, 18, 17, 18, 1, 2, 17, 18, 149, 153, 156, 157, 309, 310, 1, 2, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 188, 189, 156, 157, 159, 160, 17, 18, 17, 18, 1, 2, 17, 18, 159, 160, 313, 314, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 307, 308, 147, 158, 154, 155, 19, 20, 19, 20, 307, 308, 19, 20, 19, 20, 3, 4, 19, 20, 154, 155, 147, 158, 311, 312, 3, 4, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 190, 191, 147, 158, 161, 162, 19, 20, 19, 20, 3, 4, 19, 20, 161, 162, 315, 316, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 313, 314, 17, 18, 1, 2, 305, 306, 149, 153, 156, 157, 149, 153, 1, 2, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 159, 160, 1, 2, 149, 153, 159, 160, 159, 160, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 315, 316, 19, 20, 3, 4, 307, 308, 154, 155, 147, 158, 154, 155, 3, 4, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 161, 162, 3, 4, 154, 155, 161, 162, 161, 162, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 313, 314, 17, 18, 159, 160, 309, 310, 17, 18, 149, 153, 17, 18, 156, 157, 1, 2, 17, 18, 17, 18, 305, 306, 149, 153, 208, 209, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 156, 157, 17, 18, 188, 189, 17, 18, 305, 306, 17, 18, 159, 160, 1, 2, 17, 18, 159, 160, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 315, 316, 19, 20, 161, 162, 311, 312, 19, 20, 154, 155, 19, 20, 147, 158, 3, 4, 19, 20, 19, 20, 307, 308, 154, 155, 210, 211, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 147, 158, 19, 20, 190, 191, 19, 20, 307, 308, 19, 20, 161, 162, 3, 4, 19, 20, 161, 162, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 56, 57, 389, 390, 36, 37, 305, 306, 17, 18, 313, 314, 17, 18, 59, 60, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 74, 75, 50, 51, 389, 390, 36, 37, 17, 18, 156, 157, 156, 157, 156, 157, 59, 60, 389, 390, 42, 43, 17, 18, 17, 18, 149, 153, 305, 306, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 58, 49, 391, 388, 33, 4, 307, 308, 19, 20, 315, 316, 19, 20, 61, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 76, 49, 52, 49, 391, 388, 33, 4, 19, 20, 147, 158, 147, 158, 147, 158, 61, 49, 391, 388, 44, 4, 19, 20, 19, 20, 154, 155, 307, 308, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 46, 47, 53, 54, 413, 414, 42, 43, 149, 153, 313, 314, 395, 396, 404, 405, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 413, 414, 42, 43, 17, 18, 149, 153, 56, 57, 65, 66, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 149, 153, 156, 157, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 48, 49, 55, 49, 415, 388, 44, 4, 154, 155, 315, 316, 397, 388, 406, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 415, 388, 44, 4, 19, 20, 154, 155, 58, 49, 67, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 154, 155, 147, 158, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 196, 197, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 149, 153, 17, 18, 30, 31, 5, 6, 192, 193, 77, 78, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 34, 35, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 159, 160, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 198, 199, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 154, 155, 19, 20, 29, 4, 7, 4, 194, 195, 70, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 16, 4, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 161, 162, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 149, 153, 159, 160, 159, 160, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 188, 189, 309, 310, 17, 18, 208, 209, 305, 306, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 196, 197, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 46, 47, 53, 54, 392, 393, 1, 2, 149, 153, 17, 18, 156, 157, 17, 18, 149, 153, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 154, 155, 161, 162, 161, 162, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 190, 191, 311, 312, 19, 20, 210, 211, 307, 308, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 198, 199, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 48, 49, 55, 49, 394, 388, 3, 4, 154, 155, 19, 20, 147, 158, 19, 20, 154, 155, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 392, 393, 208, 209, 17, 18, 17, 18, 196, 197, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 305, 306, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 394, 388, 210, 211, 19, 20, 19, 20, 198, 199, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 307, 308, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 156, 157, 1, 2, 149, 150, 395, 396, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 42, 43, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 175, 176, 3, 4, 151, 152, 397, 388, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 44, 4, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 171, 172, 167, 168, 145, 146, 244, 245, 77, 78, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 34, 35, 313, 314, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 173, 174, 169, 170, 147, 148, 242, 243, 70, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 16, 4, 315, 316, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 27, 28, 216, 217, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 149, 153, 159, 160, 17, 18, 156, 157, 17, 18, 46, 47, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 29, 4, 218, 219, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 154, 155, 161, 162, 19, 20, 147, 158, 19, 20, 48, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 149, 153, 17, 18, 313, 314, 17, 18, 159, 160, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 163, 164, 159, 160, 159, 160, 46, 47, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 159, 160, 313, 314, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 154, 155, 19, 20, 315, 316, 19, 20, 161, 162, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 165, 166, 161, 162, 161, 162, 48, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 161, 162, 315, 316, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 317, 353, 360, 361, 371, 338, 17, 18, 17, 18, 46, 47, 53, 54, 392, 393, 1, 2, 156, 157, 149, 150, 398, 399, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 389, 390, 42, 43, 149, 153, 149, 150, 385, 386, 53, 54, 392, 393, 1, 2, 149, 153, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 354, 355, 362, 363, 372, 373, 19, 20, 19, 20, 48, 49, 55, 49, 394, 388, 3, 4, 147, 158, 151, 152, 400, 388, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 391, 388, 44, 4, 154, 155, 151, 152, 387, 388, 55, 49, 394, 388, 3, 4, 154, 155, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 149, 153, 356, 357, 367, 368, 378, 379, 17, 18, 149, 150, 385, 386, 392, 393, 27, 28, 34, 35, 156, 157, 145, 146, 41, 39, 416, 417, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 27, 28, 34, 35, 17, 18, 145, 146, 41, 39, 416, 417, 392, 393, 1, 2, 17, 18, 305, 306, 17, 18, 17, 18, 313, 314, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 154, 155, 358, 359, 369, 370, 380, 381, 19, 20, 151, 152, 387, 388, 394, 388, 29, 4, 16, 4, 147, 158, 147, 148, 26, 4, 409, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 29, 4, 16, 4, 19, 20, 147, 148, 26, 4, 409, 388, 394, 388, 3, 4, 19, 20, 307, 308, 19, 20, 19, 20, 315, 316, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 188, 189, 17, 18, 364, 365, 374, 375, 382, 383, 17, 18, 145, 146, 41, 39, 5, 6, 36, 37, 17, 18, 17, 18, 17, 18, 17, 18, 30, 31, 5, 6, 5, 6, 77, 78, 53, 54, 392, 393, 248, 249, 5, 6, 5, 6, 36, 37, 17, 18, 313, 314, 17, 18, 305, 306, 30, 31, 5, 6, 34, 35, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 190, 191, 19, 20, 331, 366, 376, 377, 384, 352, 19, 20, 147, 148, 26, 4, 7, 4, 33, 4, 19, 20, 19, 20, 19, 20, 19, 20, 29, 4, 7, 4, 7, 4, 70, 49, 55, 49, 394, 388, 250, 4, 7, 4, 7, 4, 33, 4, 19, 20, 315, 316, 19, 20, 307, 308, 29, 4, 7, 4, 16, 4, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 204, 205, 17, 18, 17, 18, 17, 18, 156, 157, 156, 157, 305, 306, 17, 18, 149, 153, 208, 209, 159, 160, 17, 18, 17, 18, 17, 18, 1, 2, 17, 18, 305, 306, 46, 47, 53, 54, 392, 393, 188, 189, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 149, 153, 17, 18, 1, 2, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 206, 207, 19, 20, 19, 20, 19, 20, 147, 158, 147, 158, 307, 308, 19, 20, 154, 155, 210, 211, 161, 162, 19, 20, 19, 20, 19, 20, 3, 4, 19, 20, 307, 308, 48, 49, 55, 49, 394, 388, 190, 191, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 154, 155, 19, 20, 3, 4, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 159, 160, 17, 18, 149, 153, 17, 18, 309, 310, 17, 18, 17, 18, 17, 18, 1, 2, 159, 160, 309, 310, 156, 157, 159, 160, 1, 2, 17, 18, 156, 157, 46, 47, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 149, 153, 313, 314, 17, 18, 17, 18, 313, 314, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 161, 162, 19, 20, 154, 155, 19, 20, 311, 312, 19, 20, 19, 20, 19, 20, 3, 4, 161, 162, 311, 312, 147, 158, 161, 162, 3, 4, 19, 20, 147, 158, 48, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 154, 155, 315, 316, 19, 20, 19, 20, 315, 316, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 204, 205, 159, 160, 17, 18, 149, 153, 17, 18, 17, 18, 159, 160, 17, 18, 149, 150, 1, 2, 17, 18, 17, 18, 17, 18, 149, 150, 1, 2, 149, 153, 149, 150, 385, 386, 53, 54, 392, 393, 1, 2, 17, 18, 149, 150, 1, 2, 17, 18, 17, 18, 309, 310, 149, 150, 1, 2, 17, 18, 309, 310, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 206, 207, 161, 162, 19, 20, 154, 155, 19, 20, 19, 20, 161, 162, 19, 20, 151, 152, 3, 4, 19, 20, 19, 20, 19, 20, 151, 152, 3, 4, 154, 155, 151, 152, 387, 388, 55, 49, 394, 388, 3, 4, 19, 20, 151, 152, 3, 4, 19, 20, 19, 20, 311, 312, 151, 152, 3, 4, 19, 20, 311, 312, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 1, 2, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 159, 160, 17, 18, 145, 146, 11, 12, 17, 18, 17, 18, 17, 18, 145, 146, 11, 12, 17, 18, 145, 146, 41, 39, 416, 417, 248, 249, 34, 35, 149, 153, 145, 146, 11, 12, 17, 18, 17, 18, 17, 18, 145, 146, 254, 255, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 3, 4, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 161, 162, 19, 20, 147, 148, 13, 14, 19, 20, 19, 20, 19, 20, 147, 148, 13, 14, 19, 20, 147, 148, 26, 4, 409, 388, 250, 4, 16, 4, 154, 155, 147, 148, 13, 14, 19, 20, 19, 20, 19, 20, 147, 148, 13, 256, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 389, 390, 246, 241, 313, 314, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 149, 153, 385, 386, 1, 2, 313, 314, 17, 18, 305, 306, 149, 153, 313, 314, 305, 306, 17, 18, 17, 18, 17, 18, 156, 157, 313, 314, 17, 18, 56, 57, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 391, 388, 247, 243, 315, 316, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 154, 155, 387, 388, 3, 4, 315, 316, 19, 20, 307, 308, 154, 155, 315, 316, 307, 308, 19, 20, 19, 20, 19, 20, 147, 158, 315, 316, 19, 20, 58, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 156, 157, 21, 22, 17, 18, 149, 153, 17, 18, 17, 18, 260, 258, 17, 18, 17, 18, 17, 18, 385, 386, 1, 2, 17, 18, 17, 18, 17, 18, 21, 22, 17, 18, 17, 18, 17, 18, 305, 306, 21, 22, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 147, 158, 23, 4, 19, 20, 154, 155, 19, 20, 19, 20, 23, 259, 19, 20, 19, 20, 19, 20, 387, 388, 3, 4, 19, 20, 19, 20, 19, 20, 23, 4, 19, 20, 19, 20, 19, 20, 307, 308, 23, 4, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 413, 414, 42, 43, 17, 18, 309, 310, 1, 2, 17, 18, 17, 18, 156, 157, 17, 18, 188, 189, 17, 18, 17, 18, 56, 57, 65, 66, 413, 414, 42, 43, 313, 314, 17, 18, 1, 2, 17, 18, 159, 160, 17, 18, 17, 18, 1, 2, 17, 18, 17, 18, 56, 57, 404, 405, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 415, 388, 44, 4, 19, 20, 311, 312, 3, 4, 19, 20, 19, 20, 147, 158, 19, 20, 190, 191, 19, 20, 19, 20, 58, 49, 67, 49, 415, 388, 44, 4, 315, 316, 19, 20, 3, 4, 19, 20, 161, 162, 19, 20, 19, 20, 3, 4, 19, 20, 19, 20, 58, 49, 406, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 212, 213, 416, 417, 204, 205, 305, 306, 17, 18, 59, 60, 50, 51, 50, 51, 50, 51, 389, 390, 36, 37, 159, 160, 17, 18, 46, 47, 53, 54, 392, 393, 204, 205, 17, 18, 17, 18, 59, 60, 50, 51, 50, 51, 50, 51, 389, 390, 36, 37, 17, 18, 159, 160, 385, 386, 27, 28, 5, 6, 212, 213, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 214, 215, 409, 388, 206, 207, 307, 308, 19, 20, 61, 49, 52, 49, 52, 49, 52, 49, 391, 388, 33, 4, 161, 162, 19, 20, 48, 49, 55, 49, 394, 388, 206, 207, 19, 20, 19, 20, 61, 49, 52, 49, 52, 49, 52, 49, 391, 388, 33, 4, 19, 20, 161, 162, 387, 388, 29, 4, 7, 4, 214, 215, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 149, 150, 385, 386, 1, 2, 17, 18, 149, 150, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 1, 2, 17, 18, 149, 150, 385, 386, 392, 393, 392, 393, 1, 2, 17, 18, 17, 18, 385, 386, 392, 393, 392, 393, 392, 393, 392, 393, 188, 189, 17, 18, 149, 150, 385, 386, 1, 2, 156, 157, 149, 150, 385, 386, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 151, 152, 387, 388, 3, 4, 19, 20, 151, 152, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 3, 4, 19, 20, 151, 152, 387, 388, 394, 388, 394, 388, 3, 4, 19, 20, 19, 20, 387, 388, 394, 388, 394, 388, 394, 388, 394, 388, 190, 191, 19, 20, 151, 152, 387, 388, 3, 4, 147, 158, 151, 152, 387, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 34, 35, 17, 18, 145, 146, 244, 245, 34, 35, 17, 18, 145, 146, 41, 39, 216, 217, 192, 193, 5, 6, 5, 6, 36, 37, 17, 18, 145, 146, 41, 39, 5, 6, 5, 6, 34, 35, 17, 18, 17, 18, 30, 31, 5, 6, 5, 6, 5, 6, 5, 6, 34, 35, 17, 18, 145, 146, 41, 39, 34, 35, 17, 18, 145, 146, 41, 39, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 16, 4, 19, 20, 147, 148, 242, 243, 16, 4, 19, 20, 147, 148, 26, 4, 218, 219, 194, 195, 7, 4, 7, 4, 33, 4, 19, 20, 147, 148, 26, 4, 7, 4, 7, 4, 16, 4, 19, 20, 19, 20, 29, 4, 7, 4, 7, 4, 7, 4, 7, 4, 16, 4, 19, 20, 147, 148, 26, 4, 16, 4, 19, 20, 147, 148, 26, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 305, 306, 17, 18, 309, 310, 17, 18, 309, 310, 149, 153, 17, 18, 313, 314, 17, 18, 313, 314, 17, 18, 159, 160, 1, 2, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 17, 18, 156, 157, 17, 18, 1, 2, 17, 18, 156, 157, 17, 18, 17, 18, 156, 157, 17, 18, 156, 157, 305, 306, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 307, 308, 19, 20, 311, 312, 19, 20, 311, 312, 154, 155, 19, 20, 315, 316, 19, 20, 315, 316, 19, 20, 161, 162, 3, 4, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 19, 20, 147, 158, 19, 20, 3, 4, 19, 20, 147, 158, 19, 20, 19, 20, 147, 158, 19, 20, 147, 158, 307, 308, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 149, 153, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 156, 157, 1, 2, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 149, 153, 17, 18, 1, 2, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 154, 155, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 147, 158, 3, 4, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 154, 155, 19, 20, 3, 4, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 71, 72, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 71, 72, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 73, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 73, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":43, + "firstgid":1, + "image":"hell.png", + "imageheight":2816, + "imagewidth":2752, + "margin":0, + "name":"hell", + "spacing":0, + "tilecount":473, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l15/level.json b/gamefilesd/level/l15/level.json index df1e1b90..aeba5758 100755 --- a/gamefilesd/level/l15/level.json +++ b/gamefilesd/level/l15/level.json @@ -1,42 +1,31 @@ { + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], "palette": [ { - "id": "l4_4", - "file":"levels/l4data/l4_4.pal" + "id": "l4_3", + "file": "levels/l4data/l4_3.pal" }, { "id": "colorCycle", - "fromId":"l4_4" + "fromId": "l4_3" } ], "level": { "id": "level", - "path": "l15", - "name": "Hell", - "palette": "l4_4", + "palette": "l4_3", "file": "levels/l4data/l4.cel", - "outOfBoundsTileTop": 19, - "defaultTile": 5, - "mapSize": [50, 50], - "map": [ - { "file": "levels/l4data/warlord2.dun", "position": [0, 0] }, - { "file": "levels/l4data/diab1.dun", "position": [10, 1] }, - { "file": "levels/l4data/diab2b.dun", "position": [0, 15] }, - { "file": "levels/l4data/diab3b.dun", "position": [21, 18] }, - { "file": "levels/l4data/diab4b.dun", "position": [21, 0] }, - { "file": "level/l15/redPentagram.json", "indexOffset": -1, "position": [27, 6] } - ], + "outOfBoundsTileLayer2": 19, "til": "levels/l4data/l4.til", "min": "levels/l4data/l4.min", "minBlocks": 16, "sol": "levels/l4data/l4.sol" }, - "levelObject": { - "id": "town", - "name": "Up to town", - "mapPosition": [6, 7], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/town/load.json", "positionPlayer", "[42, 80]"] } - } + "load": "level/automap/l4/load.json", + "load": "level/l15/levelObjects.json", + "load": "level/l15/monsters.json", + "load": "level/l15/level2.json" } \ No newline at end of file diff --git a/gamefilesd/level/l15/level2.json b/gamefilesd/level/l15/level2.json new file mode 100755 index 00000000..a04e5495 --- /dev/null +++ b/gamefilesd/level/l15/level2.json @@ -0,0 +1,11 @@ +{ + "level": { + "id": "level", + "path": "l15", + "name": "15", + "defaultTile": 5, + "map": { "file": "level/l15/l15.json", "indexOffset": -1 } + }, + "load": "level/l15/levelObjects2.json", + "load": "level/l15/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l15/levelObjects2.json b/gamefilesd/level/l15/levelObjects2.json new file mode 100755 index 00000000..a6531b54 --- /dev/null +++ b/gamefilesd/level/l15/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [24, 64], + "properties": { + "x": 58, + "y": 32, + "level": 16 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [42, 35], + "properties": { + "x": 47, + "y": 73, + "level": 14 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l15/load.json b/gamefilesd/level/l15/load.json deleted file mode 100755 index 787186a4..00000000 --- a/gamefilesd/level/l15/load.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "load": ["level/load.json", "l15", "{1}", "{2}", "cut4"] -} \ No newline at end of file diff --git a/gamefilesd/level/l15/map.json b/gamefilesd/level/l15/map.json deleted file mode 100755 index 9fe14d33..00000000 --- a/gamefilesd/level/l15/map.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "action": { - "name": "if.equal", - "param1": "%showMap%", - "param2": true, - "then": { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, - "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } - } -} \ No newline at end of file diff --git a/gamefilesd/level/l16/l16.json b/gamefilesd/level/l16/l16.json new file mode 100755 index 00000000..ad3ba13f --- /dev/null +++ b/gamefilesd/level/l16/l16.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 392, 393, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 394, 388, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 200, 201, 5, 6, 5, 6, 5, 6, 200, 201, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 216, 217, 5, 6, 5, 6, 192, 193, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 216, 217, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 200, 201, 5, 6, 5, 6, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 202, 203, 7, 4, 7, 4, 7, 4, 202, 203, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 218, 219, 7, 4, 7, 4, 194, 195, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 218, 219, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 202, 203, 7, 4, 7, 4, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 102, 103, 110, 111, 98, 99, 309, 310, 17, 18, 17, 18, 395, 396, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 42, 43, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 104, 105, 112, 113, 100, 101, 311, 312, 19, 20, 19, 20, 397, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 44, 4, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 106, 107, 94, 95, 90, 91, 86, 87, 17, 18, 17, 18, 385, 386, 27, 28, 212, 213, 216, 217, 212, 213, 216, 217, 212, 213, 200, 201, 216, 217, 34, 35, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 108, 109, 96, 97, 92, 93, 88, 89, 19, 20, 19, 20, 387, 388, 29, 4, 214, 215, 218, 219, 214, 215, 218, 219, 214, 215, 202, 203, 218, 219, 16, 4, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 196, 197, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 82, 83, 17, 18, 17, 18, 17, 18, 385, 386, 208, 209, 17, 18, 309, 310, 305, 306, 17, 18, 17, 18, 305, 306, 17, 18, 313, 314, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 198, 199, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 84, 85, 19, 20, 19, 20, 19, 20, 387, 388, 210, 211, 19, 20, 311, 312, 307, 308, 19, 20, 19, 20, 307, 308, 19, 20, 315, 316, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 17, 18, 17, 18, 385, 386, 1, 2, 305, 306, 395, 396, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 42, 43, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 183, 184, 185, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 19, 20, 19, 20, 387, 388, 3, 4, 307, 308, 397, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 44, 4, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 248, 249, 180, 181, 186, 187, 177, 178, 246, 241, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 385, 386, 204, 205, 17, 18, 385, 386, 27, 28, 212, 213, 192, 193, 5, 6, 416, 417, 208, 209, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 175, 176, 250, 4, 182, 4, 147, 158, 179, 4, 247, 243, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 387, 388, 206, 207, 19, 20, 387, 388, 29, 4, 214, 215, 194, 195, 7, 4, 409, 388, 210, 211, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 171, 172, 167, 168, 17, 18, 17, 18, 171, 172, 167, 168, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 313, 314, 17, 18, 17, 18, 385, 386, 188, 189, 309, 310, 385, 386, 196, 197, 261, 262, 269, 270, 17, 18, 385, 386, 196, 197, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 173, 174, 169, 170, 19, 20, 19, 20, 173, 174, 169, 170, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 315, 316, 19, 20, 19, 20, 387, 388, 190, 191, 311, 312, 387, 388, 198, 199, 263, 264, 271, 272, 19, 20, 387, 388, 198, 199, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 208, 209, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 385, 386, 208, 209, 305, 306, 385, 386, 1, 2, 265, 266, 273, 274, 17, 18, 385, 386, 1, 2, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 210, 211, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 387, 388, 210, 211, 307, 308, 387, 388, 3, 4, 267, 268, 275, 276, 19, 20, 387, 388, 3, 4, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 149, 150, 163, 164, 149, 153, 159, 160, 17, 18, 163, 164, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 159, 160, 159, 160, 17, 18, 17, 18, 385, 386, 196, 197, 149, 150, 385, 386, 413, 414, 389, 390, 42, 43, 17, 18, 385, 386, 204, 205, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 151, 152, 165, 166, 154, 183, 184, 185, 19, 20, 165, 166, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 161, 162, 161, 162, 19, 20, 19, 20, 387, 388, 198, 199, 151, 152, 387, 388, 415, 388, 391, 388, 44, 4, 19, 20, 387, 388, 206, 207, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 145, 146, 244, 245, 180, 181, 186, 187, 177, 178, 251, 252, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 17, 18, 17, 18, 17, 18, 17, 18, 385, 386, 204, 205, 145, 146, 41, 39, 212, 213, 216, 217, 34, 35, 305, 306, 385, 386, 188, 189, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 147, 148, 242, 243, 182, 4, 147, 158, 179, 4, 253, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 19, 20, 19, 20, 19, 20, 19, 20, 387, 388, 206, 207, 147, 148, 26, 4, 214, 215, 218, 219, 16, 4, 307, 308, 387, 388, 190, 191, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 385, 386, 1, 2, 305, 306, 309, 310, 17, 18, 17, 18, 309, 310, 17, 18, 385, 386, 208, 209, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 387, 388, 3, 4, 307, 308, 311, 312, 19, 20, 19, 20, 311, 312, 19, 20, 387, 388, 210, 211, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 150, 385, 386, 413, 414, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 404, 405, 204, 205, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 151, 152, 387, 388, 415, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 406, 388, 206, 207, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 309, 310, 313, 314, 156, 157, 17, 18, 17, 18, 145, 146, 41, 39, 216, 217, 212, 213, 200, 201, 192, 193, 212, 213, 192, 193, 212, 213, 216, 217, 34, 35, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 311, 312, 315, 316, 147, 158, 19, 20, 19, 20, 147, 148, 26, 4, 218, 219, 214, 215, 202, 203, 194, 195, 214, 215, 194, 195, 214, 215, 218, 219, 16, 4, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 208, 209, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 159, 160, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 210, 211, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 183, 184, 185, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 413, 414, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 32, 28, 5, 6, 180, 181, 186, 187, 177, 178, 401, 402, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 389, 390, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 415, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 33, 4, 7, 4, 182, 4, 147, 158, 179, 4, 403, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 391, 388, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 27, 28, 5, 6, 5, 6, 192, 193, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 251, 252, 17, 18, 309, 310, 305, 306, 145, 146, 41, 39, 5, 6, 192, 193, 5, 6, 5, 6, 192, 193, 5, 6, 5, 6, 216, 217, 5, 6, 192, 193, 5, 6, 192, 193, 5, 6, 77, 78, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 29, 4, 7, 4, 7, 4, 194, 195, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 253, 4, 19, 20, 311, 312, 307, 308, 147, 148, 26, 4, 7, 4, 194, 195, 7, 4, 7, 4, 194, 195, 7, 4, 7, 4, 218, 219, 7, 4, 194, 195, 7, 4, 194, 195, 7, 4, 70, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 204, 205, 17, 18, 293, 294, 301, 302, 27, 28, 5, 6, 180, 181, 186, 187, 177, 178, 216, 217, 42, 43, 277, 278, 281, 282, 17, 18, 17, 18, 313, 314, 305, 306, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 206, 207, 19, 20, 295, 296, 303, 304, 29, 4, 7, 4, 182, 4, 147, 158, 179, 4, 218, 219, 44, 4, 279, 280, 283, 284, 19, 20, 19, 20, 315, 316, 307, 308, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 297, 298, 159, 160, 188, 189, 224, 225, 17, 18, 224, 225, 17, 18, 149, 150, 188, 189, 159, 160, 149, 153, 17, 18, 17, 18, 149, 153, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 395, 396, 389, 390, 42, 43, 17, 18, 17, 18, 149, 150, 395, 396, 389, 390, 42, 43, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 299, 300, 161, 162, 190, 191, 226, 227, 19, 20, 226, 227, 19, 20, 151, 152, 190, 191, 161, 162, 154, 155, 19, 20, 19, 20, 154, 155, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 397, 388, 391, 388, 44, 4, 19, 20, 19, 20, 151, 152, 397, 388, 391, 388, 44, 4, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 27, 28, 216, 217, 34, 35, 220, 221, 228, 229, 220, 221, 228, 229, 145, 146, 41, 39, 5, 6, 42, 43, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 149, 150, 385, 386, 27, 28, 34, 35, 17, 18, 17, 18, 145, 146, 41, 39, 416, 417, 204, 205, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 29, 4, 218, 219, 16, 4, 222, 223, 230, 231, 222, 223, 230, 231, 147, 148, 26, 4, 7, 4, 44, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 151, 152, 387, 388, 29, 4, 16, 4, 19, 20, 19, 20, 147, 148, 26, 4, 409, 388, 206, 207, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 204, 205, 224, 225, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 224, 225, 17, 18, 156, 157, 188, 189, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 145, 146, 41, 39, 34, 35, 293, 294, 301, 302, 277, 278, 281, 282, 145, 146, 41, 39, 34, 35, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 206, 207, 226, 227, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 226, 227, 19, 20, 175, 176, 190, 191, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 147, 148, 26, 4, 16, 4, 295, 296, 303, 304, 279, 280, 283, 284, 147, 148, 26, 4, 16, 4, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 167, 168, 220, 221, 228, 229, 17, 18, 395, 396, 389, 390, 42, 43, 220, 221, 228, 229, 171, 172, 167, 168, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 297, 298, 317, 318, 325, 326, 337, 338, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 169, 170, 222, 223, 230, 231, 19, 20, 397, 388, 391, 388, 44, 4, 222, 223, 230, 231, 173, 174, 169, 170, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 299, 300, 319, 320, 327, 328, 339, 340, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 224, 225, 17, 18, 149, 150, 385, 386, 392, 393, 196, 197, 224, 225, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 285, 286, 321, 322, 333, 334, 345, 346, 17, 18, 17, 18, 159, 160, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 226, 227, 19, 20, 151, 152, 387, 388, 394, 388, 198, 199, 226, 227, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 287, 288, 323, 324, 335, 336, 347, 348, 19, 20, 19, 20, 161, 162, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 163, 164, 220, 221, 228, 229, 145, 146, 41, 39, 216, 217, 34, 35, 220, 221, 228, 229, 17, 18, 163, 164, 17, 18, 17, 18, 17, 18, 17, 18, 149, 153, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 289, 290, 329, 330, 341, 342, 349, 350, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 165, 166, 222, 223, 230, 231, 147, 148, 26, 4, 218, 219, 16, 4, 222, 223, 230, 231, 19, 20, 165, 166, 19, 20, 19, 20, 19, 20, 19, 20, 154, 155, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 291, 292, 331, 332, 343, 344, 351, 352, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 149, 150, 208, 209, 17, 18, 17, 18, 224, 225, 17, 18, 224, 225, 17, 18, 17, 18, 17, 18, 17, 18, 208, 209, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 395, 396, 42, 43, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 395, 396, 42, 43, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 151, 152, 210, 211, 19, 20, 19, 20, 226, 227, 19, 20, 226, 227, 19, 20, 19, 20, 19, 20, 19, 20, 210, 211, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 397, 388, 44, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 397, 388, 44, 4, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 208, 209, 145, 146, 41, 39, 5, 6, 42, 43, 220, 221, 228, 229, 220, 221, 228, 229, 17, 18, 27, 28, 200, 201, 34, 35, 17, 18, 17, 18, 309, 310, 156, 157, 159, 160, 17, 18, 17, 18, 149, 150, 385, 386, 413, 414, 42, 43, 17, 18, 17, 18, 149, 150, 395, 396, 404, 405, 196, 197, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 210, 211, 147, 148, 26, 4, 7, 4, 44, 4, 222, 223, 230, 231, 222, 223, 230, 231, 19, 20, 29, 4, 202, 203, 16, 4, 19, 20, 19, 20, 311, 312, 147, 158, 161, 162, 19, 20, 19, 20, 151, 152, 387, 388, 415, 388, 44, 4, 19, 20, 19, 20, 151, 152, 397, 388, 406, 388, 198, 199, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 285, 286, 149, 150, 204, 205, 17, 18, 149, 153, 159, 160, 17, 18, 17, 18, 204, 205, 261, 262, 269, 270, 17, 18, 17, 18, 17, 18, 17, 18, 305, 306, 149, 153, 17, 18, 145, 146, 41, 39, 192, 193, 34, 35, 149, 153, 159, 160, 145, 146, 41, 39, 212, 213, 34, 35, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 287, 288, 151, 152, 206, 207, 19, 20, 154, 183, 184, 185, 19, 20, 19, 20, 206, 207, 263, 264, 271, 272, 19, 20, 19, 20, 19, 20, 19, 20, 307, 308, 154, 155, 19, 20, 147, 148, 26, 4, 194, 195, 16, 4, 154, 155, 161, 162, 147, 148, 26, 4, 214, 215, 16, 4, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 289, 290, 145, 146, 41, 39, 192, 193, 180, 181, 186, 187, 177, 178, 5, 6, 34, 35, 265, 266, 273, 274, 17, 18, 17, 18, 156, 157, 305, 306, 309, 310, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 291, 292, 147, 148, 26, 4, 194, 195, 182, 4, 147, 158, 179, 4, 7, 4, 16, 4, 267, 268, 275, 276, 19, 20, 19, 20, 147, 158, 307, 308, 311, 312, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 156, 157, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 147, 158, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 392, 393, 1, 2, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 46, 47, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 394, 388, 3, 4, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 48, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 74, 75, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 50, 51, 65, 66, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 76, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 52, 49, 67, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 53, 54, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49, 55, 49], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":43, + "firstgid":1, + "image":"hell.png", + "imageheight":2816, + "imagewidth":2752, + "margin":0, + "name":"hell", + "spacing":0, + "tilecount":473, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l16/level.json b/gamefilesd/level/l16/level.json new file mode 100755 index 00000000..f9edfa49 --- /dev/null +++ b/gamefilesd/level/l16/level.json @@ -0,0 +1,31 @@ +{ + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], + "palette": [ + { + "id": "l4_4", + "file": "levels/l4data/l4_4.pal" + }, + { + "id": "colorCycle", + "fromId": "l4_4" + } + ], + "level": { + "id": "level", + "palette": "l4_4", + "file": "levels/l4data/l4.cel", + "outOfBoundsTileLayer2": 19, + "til": "levels/l4data/l4.til", + "min": "levels/l4data/l4.min", + "minBlocks": 16, + "sol": "levels/l4data/l4.sol" + }, + "load": "level/automap/l4/load.json", + "load": "level/l16/levelObjects.json", + "load": "level/l16/monsters.json", + "load": "level/l16/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l16/level2.json b/gamefilesd/level/l16/level2.json new file mode 100755 index 00000000..9827975c --- /dev/null +++ b/gamefilesd/level/l16/level2.json @@ -0,0 +1,11 @@ +{ + "level": { + "id": "level", + "path": "l16", + "name": "16", + "defaultTile": 5, + "map": { "file": "level/l16/l16.json", "indexOffset": -1 } + }, + "load": "level/l16/levelObjects2.json", + "load": "level/l16/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l16/levelObjects2.json b/gamefilesd/level/l16/levelObjects2.json new file mode 100755 index 00000000..474760fa --- /dev/null +++ b/gamefilesd/level/l16/levelObjects2.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "up", + "class": "levelUp", + "mapPosition": [56, 31], + "properties": { + "x": 25, + "y": 67, + "level": 15 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l16/music.json b/gamefilesd/level/l16/music.json new file mode 100755 index 00000000..d7d2e6a7 --- /dev/null +++ b/gamefilesd/level/l16/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvld.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l2/l2.json b/gamefilesd/level/l2/l2.json new file mode 100755 index 00000000..ecdd54af --- /dev/null +++ b/gamefilesd/level/l2/l2.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 203, 204, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 239, 2, 346, 347, 346, 347, 346, 347, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 240, 4, 348, 349, 348, 349, 348, 349, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 29, 2, 124, 290, 23, 2, 23, 2, 282, 283, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 291, 292, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 124, 290, 350, 351, 350, 351, 239, 2, 346, 347, 350, 351, 350, 351, 350, 351, 346, 347, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 291, 292, 352, 353, 352, 353, 240, 4, 348, 349, 352, 353, 352, 353, 352, 353, 348, 349, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 43, 2, 350, 351, 346, 347, 346, 347, 282, 283, 346, 347, 307, 308, 14, 15, 448, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 220, 221, 124, 290, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 44, 4, 352, 353, 348, 349, 348, 349, 7, 4, 348, 349, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 222, 223, 291, 292, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 449, 442, 20, 11, 22, 11, 22, 11, 248, 249, 22, 11, 445, 442, 13, 2, 23, 2, 346, 347, 23, 2, 350, 351, 262, 263, 312, 2, 9, 6, 5, 6, 5, 6, 229, 230, 5, 6, 5, 6, 5, 6, 9, 6, 45, 46, 5, 6, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 3, 4, 7, 4, 348, 349, 7, 4, 352, 353, 264, 265, 313, 314, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 28, 2, 346, 347, 284, 285, 23, 2, 350, 351, 437, 438, 1, 2, 346, 347, 350, 351, 23, 2, 350, 351, 286, 287, 307, 308, 28, 2, 23, 2, 346, 347, 23, 2, 350, 351, 346, 347, 262, 263, 28, 2, 23, 2, 23, 2, 14, 15, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 348, 349, 7, 4, 7, 4, 352, 353, 439, 440, 3, 4, 348, 349, 352, 353, 7, 4, 352, 353, 288, 289, 7, 4, 7, 4, 7, 4, 348, 349, 7, 4, 352, 353, 348, 349, 264, 265, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 220, 221, 350, 351, 23, 2, 346, 347, 346, 347, 445, 442, 37, 31, 42, 35, 34, 35, 441, 442, 13, 2, 350, 351, 346, 347, 23, 2, 23, 2, 224, 225, 350, 351, 346, 347, 346, 347, 350, 351, 346, 347, 346, 347, 282, 283, 284, 285, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 222, 223, 352, 353, 7, 4, 348, 349, 348, 349, 446, 440, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 352, 353, 348, 349, 7, 4, 7, 4, 226, 4, 352, 353, 348, 349, 348, 349, 352, 353, 348, 349, 348, 349, 7, 4, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 350, 351, 350, 351, 216, 217, 23, 2, 437, 438, 40, 31, 9, 6, 5, 6, 5, 6, 28, 2, 350, 351, 23, 2, 23, 2, 23, 2, 350, 351, 350, 351, 220, 221, 216, 217, 350, 351, 300, 2, 300, 2, 300, 2, 300, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 352, 353, 352, 353, 218, 219, 7, 4, 439, 440, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 352, 353, 7, 4, 7, 4, 7, 4, 352, 353, 352, 353, 222, 223, 218, 219, 352, 353, 301, 302, 301, 302, 301, 302, 301, 302, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 1, 2, 346, 347, 350, 351, 346, 347, 23, 2, 224, 225, 346, 347, 13, 2, 350, 351, 350, 351, 350, 351, 300, 2, 300, 2, 284, 285, 20, 11, 22, 11, 22, 11, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 348, 349, 7, 4, 226, 4, 348, 349, 3, 4, 352, 353, 352, 353, 352, 353, 301, 302, 301, 302, 7, 4, 3, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 300, 2, 300, 2, 300, 2, 346, 347, 350, 351, 346, 347, 445, 442, 9, 6, 5, 6, 5, 6, 5, 6, 22, 11, 445, 442, 13, 2, 23, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 301, 302, 301, 302, 301, 302, 348, 349, 352, 353, 348, 349, 446, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 3, 4, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 449, 442, 47, 48, 45, 46, 64, 48, 38, 35, 34, 35, 441, 442, 37, 31, 1, 2, 23, 2, 346, 347, 293, 2, 286, 287, 30, 31, 1, 2, 350, 351, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 49, 4, 7, 4, 7, 4, 39, 33, 36, 33, 443, 440, 36, 33, 3, 4, 7, 4, 348, 349, 294, 295, 288, 289, 32, 33, 3, 4, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 220, 221, 262, 263, 437, 438, 40, 31, 40, 31, 40, 31, 1, 2, 124, 2, 216, 217, 282, 283, 312, 2, 437, 438, 1, 2, 346, 347, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 222, 223, 264, 265, 439, 440, 36, 33, 36, 33, 36, 33, 3, 4, 273, 274, 218, 219, 7, 4, 313, 314, 439, 440, 3, 4, 348, 349, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 201, 202, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 201, 202, 14, 15, 38, 35, 441, 442, 37, 31, 9, 6, 5, 6, 5, 6, 28, 2, 275, 276, 270, 271, 350, 351, 307, 308, 14, 15, 14, 15, 5, 6, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 443, 440, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 277, 272, 4, 352, 353, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 346, 347, 350, 351, 23, 2, 346, 347, 350, 351, 346, 347, 220, 221, 23, 2, 296, 297, 437, 438, 40, 31, 40, 31, 239, 2, 350, 351, 23, 2, 124, 290, 23, 2, 346, 347, 284, 285, 350, 351, 124, 2, 23, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 348, 349, 352, 353, 7, 4, 348, 349, 352, 353, 348, 349, 222, 223, 7, 4, 298, 299, 439, 440, 36, 33, 36, 33, 240, 4, 352, 353, 7, 4, 291, 292, 7, 4, 348, 349, 7, 4, 352, 353, 273, 274, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 23, 2, 216, 217, 262, 263, 23, 2, 23, 2, 216, 217, 350, 351, 296, 297, 24, 6, 5, 6, 322, 323, 21, 2, 346, 347, 23, 2, 23, 2, 23, 2, 23, 2, 23, 2, 216, 217, 275, 276, 270, 271, 350, 351, 437, 438, 40, 31, 137, 138, 448, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 7, 4, 218, 219, 264, 265, 7, 4, 7, 4, 218, 219, 352, 353, 298, 299, 12, 4, 7, 4, 298, 299, 12, 4, 348, 349, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 218, 219, 7, 277, 272, 4, 352, 353, 439, 440, 36, 33, 139, 140, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 315, 316, 23, 2, 23, 2, 315, 316, 23, 2, 23, 2, 350, 351, 327, 297, 21, 2, 300, 2, 326, 297, 21, 2, 262, 263, 23, 2, 364, 365, 368, 369, 372, 373, 368, 369, 13, 2, 124, 2, 350, 351, 23, 2, 9, 6, 5, 127, 129, 130, 133, 134, 5, 6, 243, 244, 322, 323, 448, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 317, 318, 7, 4, 7, 4, 317, 318, 7, 4, 7, 4, 352, 353, 328, 311, 321, 302, 301, 302, 310, 311, 12, 4, 264, 265, 7, 4, 366, 367, 370, 371, 374, 375, 370, 371, 3, 4, 273, 274, 352, 353, 7, 4, 3, 4, 7, 128, 131, 132, 135, 136, 7, 4, 7, 4, 298, 299, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 216, 217, 307, 308, 25, 26, 286, 287, 307, 308, 25, 26, 220, 221, 23, 2, 307, 308, 17, 11, 22, 11, 22, 11, 8, 2, 346, 347, 23, 2, 360, 361, 376, 377, 384, 385, 380, 381, 205, 2, 275, 276, 270, 271, 350, 351, 1, 2, 23, 2, 141, 142, 143, 2, 124, 2, 220, 221, 303, 304, 65, 15, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 218, 219, 7, 4, 27, 4, 288, 289, 7, 4, 27, 4, 222, 223, 7, 4, 7, 4, 18, 19, 7, 4, 7, 4, 7, 4, 348, 349, 7, 4, 362, 363, 378, 379, 386, 387, 382, 383, 206, 4, 7, 277, 272, 4, 352, 353, 3, 4, 7, 4, 7, 4, 7, 4, 273, 274, 222, 223, 305, 306, 58, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 286, 287, 350, 351, 346, 347, 23, 2, 350, 351, 23, 2, 23, 2, 23, 2, 350, 351, 346, 347, 346, 347, 23, 2, 23, 2, 262, 263, 23, 2, 23, 2, 356, 357, 380, 381, 380, 381, 380, 381, 407, 213, 124, 2, 350, 351, 350, 351, 1, 2, 124, 290, 124, 2, 350, 351, 275, 276, 270, 271, 303, 304, 62, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 288, 289, 352, 353, 348, 349, 7, 4, 352, 353, 7, 4, 7, 4, 7, 4, 352, 353, 348, 349, 348, 349, 7, 4, 7, 4, 264, 265, 7, 4, 7, 4, 358, 359, 382, 383, 382, 383, 382, 383, 408, 215, 273, 274, 352, 353, 352, 353, 3, 4, 291, 292, 273, 274, 352, 353, 7, 277, 272, 4, 305, 306, 63, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 216, 217, 350, 351, 315, 316, 350, 351, 216, 217, 315, 316, 23, 2, 220, 221, 216, 217, 329, 316, 300, 2, 300, 2, 309, 2, 350, 351, 350, 351, 315, 316, 360, 361, 376, 377, 388, 389, 380, 381, 207, 2, 275, 276, 270, 271, 23, 2, 207, 2, 346, 347, 275, 276, 270, 271, 346, 347, 350, 351, 303, 304, 62, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 218, 219, 352, 353, 317, 318, 352, 353, 218, 219, 317, 318, 7, 4, 222, 223, 218, 219, 328, 330, 301, 302, 301, 302, 310, 311, 352, 353, 352, 353, 317, 318, 362, 363, 378, 379, 390, 391, 382, 383, 208, 4, 7, 277, 272, 4, 7, 4, 208, 4, 348, 349, 7, 277, 272, 4, 348, 349, 352, 353, 305, 306, 63, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 293, 2, 307, 308, 25, 26, 350, 351, 307, 308, 25, 26, 350, 351, 284, 285, 296, 297, 10, 11, 22, 11, 324, 325, 16, 2, 350, 351, 307, 308, 14, 15, 201, 202, 5, 6, 245, 246, 8, 2, 350, 351, 23, 2, 23, 2, 1, 2, 350, 351, 346, 347, 23, 2, 346, 347, 23, 2, 296, 297, 392, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 294, 295, 7, 4, 27, 4, 352, 353, 7, 4, 27, 4, 352, 353, 7, 4, 298, 299, 12, 4, 7, 4, 298, 299, 12, 4, 352, 353, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 7, 4, 7, 4, 3, 4, 352, 353, 348, 349, 7, 4, 348, 349, 7, 4, 298, 299, 393, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 216, 217, 350, 351, 350, 351, 346, 347, 23, 2, 350, 351, 346, 347, 124, 290, 350, 351, 296, 297, 21, 2, 262, 263, 296, 297, 21, 2, 23, 2, 346, 347, 350, 351, 346, 347, 346, 347, 346, 347, 346, 347, 346, 347, 23, 2, 23, 2, 205, 2, 262, 263, 346, 347, 23, 2, 282, 283, 346, 347, 303, 304, 62, 2, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 218, 219, 352, 353, 352, 353, 348, 349, 7, 4, 352, 353, 348, 349, 291, 292, 352, 353, 298, 299, 12, 4, 264, 265, 298, 299, 12, 4, 7, 4, 348, 349, 352, 353, 348, 349, 348, 349, 348, 349, 348, 349, 348, 349, 7, 4, 7, 4, 206, 4, 264, 265, 348, 349, 7, 4, 7, 4, 348, 349, 305, 306, 63, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 346, 347, 350, 351, 346, 347, 262, 263, 346, 347, 346, 347, 350, 351, 216, 217, 23, 2, 38, 35, 34, 35, 441, 442, 13, 2, 346, 347, 224, 225, 350, 351, 23, 2, 350, 351, 346, 347, 216, 217, 23, 2, 346, 347, 220, 221, 1, 2, 350, 351, 445, 442, 441, 442, 441, 442, 176, 2, 262, 263, 38, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 348, 349, 352, 353, 348, 349, 264, 265, 348, 349, 348, 349, 352, 353, 218, 219, 7, 4, 39, 33, 36, 33, 443, 440, 3, 4, 348, 349, 226, 4, 352, 353, 7, 4, 352, 353, 348, 349, 218, 219, 7, 4, 348, 349, 222, 223, 3, 4, 352, 353, 446, 440, 443, 440, 443, 440, 177, 4, 264, 265, 39, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 262, 263, 262, 263, 350, 351, 23, 2, 346, 347, 350, 351, 220, 221, 350, 351, 23, 2, 346, 347, 437, 438, 40, 31, 40, 31, 239, 2, 216, 217, 262, 263, 350, 351, 23, 2, 282, 283, 23, 2, 296, 297, 350, 351, 350, 351, 262, 263, 1, 2, 312, 2, 437, 438, 447, 438, 447, 438, 167, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 264, 265, 264, 265, 352, 353, 7, 4, 348, 349, 352, 353, 222, 223, 352, 353, 7, 4, 348, 349, 439, 440, 36, 33, 36, 33, 240, 4, 218, 219, 264, 265, 352, 353, 7, 4, 7, 4, 7, 4, 298, 299, 352, 353, 352, 353, 264, 265, 3, 4, 313, 314, 439, 440, 443, 440, 443, 440, 175, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 449, 442, 9, 6, 5, 6, 5, 6, 5, 6, 322, 323, 445, 442, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 9, 6, 14, 15, 5, 6, 5, 6, 29, 2, 286, 287, 293, 2, 23, 2, 296, 297, 24, 6, 5, 6, 5, 6, 28, 2, 307, 308, 178, 170, 450, 451, 169, 170, 171, 2, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 298, 299, 446, 440, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 288, 289, 294, 295, 7, 4, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 452, 453, 7, 4, 7, 4, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 216, 217, 350, 351, 346, 347, 303, 304, 65, 15, 5, 6, 5, 6, 5, 6, 448, 438, 40, 31, 40, 31, 1, 2, 224, 225, 346, 347, 350, 351, 23, 2, 23, 2, 346, 347, 23, 2, 296, 297, 21, 2, 346, 347, 23, 2, 350, 351, 350, 351, 284, 285, 284, 285, 286, 287, 350, 351, 282, 283, 9, 6, 5, 6, 5, 6, 229, 230, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 218, 219, 352, 353, 348, 349, 305, 306, 58, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 3, 4, 226, 4, 348, 349, 352, 353, 7, 4, 7, 4, 348, 349, 7, 4, 298, 299, 12, 4, 348, 349, 7, 4, 352, 353, 352, 353, 7, 4, 7, 4, 288, 289, 352, 353, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 262, 263, 23, 2, 303, 304, 62, 2, 350, 351, 346, 347, 124, 290, 9, 6, 5, 6, 5, 6, 28, 2, 220, 221, 23, 2, 346, 347, 346, 347, 293, 2, 346, 347, 23, 2, 296, 297, 21, 2, 224, 225, 350, 351, 346, 347, 124, 2, 106, 107, 110, 111, 23, 2, 350, 351, 23, 2, 205, 2, 346, 347, 350, 351, 350, 351, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 264, 265, 7, 4, 305, 306, 63, 4, 352, 353, 348, 349, 291, 292, 3, 4, 7, 4, 7, 4, 7, 4, 222, 223, 7, 4, 348, 349, 348, 349, 294, 295, 348, 349, 7, 4, 298, 299, 12, 4, 226, 4, 352, 353, 348, 349, 125, 126, 108, 109, 112, 113, 7, 4, 352, 353, 7, 4, 206, 4, 348, 349, 352, 353, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 284, 285, 23, 2, 293, 2, 296, 297, 43, 2, 346, 347, 346, 347, 23, 2, 1, 2, 346, 347, 23, 2, 350, 351, 224, 225, 346, 347, 23, 2, 13, 2, 124, 290, 350, 351, 23, 2, 286, 287, 445, 442, 34, 35, 441, 442, 13, 2, 122, 123, 114, 115, 118, 119, 23, 2, 346, 347, 350, 351, 1, 2, 23, 2, 23, 2, 346, 347, 262, 263, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 294, 295, 298, 299, 44, 4, 348, 349, 348, 349, 7, 4, 3, 4, 348, 349, 7, 4, 352, 353, 226, 4, 348, 349, 7, 4, 3, 4, 291, 292, 352, 353, 7, 4, 288, 289, 446, 440, 36, 33, 443, 440, 3, 4, 7, 4, 116, 117, 120, 121, 7, 4, 348, 349, 352, 353, 3, 4, 7, 4, 7, 4, 348, 349, 264, 265, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 350, 351, 350, 351, 303, 304, 62, 2, 23, 2, 350, 351, 346, 347, 235, 2, 350, 351, 346, 347, 350, 351, 23, 2, 262, 263, 350, 351, 445, 442, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 1, 2, 350, 351, 350, 351, 346, 347, 350, 351, 346, 347, 312, 2, 1, 2, 350, 351, 23, 2, 23, 2, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 352, 353, 352, 353, 305, 306, 63, 4, 7, 4, 352, 353, 348, 349, 236, 4, 352, 353, 348, 349, 352, 353, 7, 4, 264, 265, 352, 353, 446, 440, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 352, 353, 348, 349, 352, 353, 348, 349, 313, 314, 3, 4, 352, 353, 7, 4, 7, 4, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 350, 351, 303, 304, 62, 2, 350, 351, 23, 2, 216, 217, 1, 2, 346, 347, 23, 2, 23, 2, 296, 297, 445, 442, 441, 442, 37, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 28, 2, 346, 347, 346, 347, 350, 351, 216, 217, 350, 351, 307, 308, 28, 2, 23, 2, 224, 225, 23, 2, 307, 308, 14, 15, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 352, 353, 305, 306, 63, 4, 352, 353, 7, 4, 218, 219, 3, 4, 348, 349, 7, 4, 7, 4, 298, 299, 446, 440, 443, 440, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 348, 349, 352, 353, 218, 219, 352, 353, 7, 4, 7, 4, 7, 4, 226, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 29, 2, 286, 287, 346, 347, 350, 351, 262, 263, 9, 6, 247, 242, 5, 6, 5, 6, 28, 2, 346, 347, 23, 2, 224, 225, 303, 304, 65, 15, 5, 6, 5, 6, 5, 6, 13, 2, 262, 263, 350, 351, 350, 351, 350, 351, 346, 347, 23, 2, 23, 2, 262, 263, 23, 2, 350, 351, 220, 221, 346, 347, 350, 351, 346, 347, 346, 347, 350, 351, 224, 225, 293, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 288, 289, 348, 349, 352, 353, 264, 265, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 7, 4, 226, 4, 305, 306, 58, 4, 7, 4, 7, 4, 7, 4, 3, 4, 264, 265, 352, 353, 352, 353, 352, 353, 348, 349, 7, 4, 7, 4, 264, 265, 7, 4, 352, 353, 222, 223, 348, 349, 352, 353, 348, 349, 348, 349, 352, 353, 226, 4, 294, 295, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 282, 283, 224, 225, 220, 221, 286, 287, 1, 2, 350, 351, 286, 287, 216, 217, 350, 351, 216, 217, 346, 347, 346, 347, 296, 297, 43, 2, 224, 225, 23, 2, 346, 347, 231, 2, 23, 2, 220, 221, 350, 351, 220, 221, 293, 2, 23, 2, 346, 347, 23, 2, 346, 347, 262, 263, 350, 351, 23, 2, 23, 2, 262, 263, 350, 351, 346, 347, 350, 351, 224, 225, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 226, 4, 222, 223, 288, 289, 3, 4, 352, 353, 288, 289, 218, 219, 352, 353, 218, 219, 348, 349, 348, 349, 298, 299, 44, 4, 226, 4, 7, 4, 348, 349, 232, 4, 7, 4, 222, 223, 352, 353, 222, 223, 294, 295, 7, 4, 348, 349, 7, 4, 348, 349, 264, 265, 352, 353, 7, 4, 7, 4, 264, 265, 352, 353, 348, 349, 352, 353, 226, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 23, 2, 350, 351, 350, 351, 220, 221, 346, 347, 43, 2, 346, 347, 350, 351, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 62, 2, 23, 2, 286, 287, 346, 347, 1, 2, 346, 347, 350, 351, 350, 351, 350, 351, 350, 351, 350, 351, 23, 2, 350, 351, 350, 351, 350, 351, 262, 263, 350, 351, 350, 351, 346, 347, 346, 347, 216, 217, 23, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 7, 4, 352, 353, 352, 353, 222, 223, 348, 349, 44, 4, 348, 349, 352, 353, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 63, 4, 7, 4, 288, 289, 348, 349, 3, 4, 348, 349, 352, 353, 352, 353, 352, 353, 352, 353, 352, 353, 7, 4, 352, 353, 352, 353, 352, 353, 264, 265, 352, 353, 352, 353, 348, 349, 348, 349, 218, 219, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 47, 48, 45, 46, 64, 48, 64, 48, 64, 48, 38, 35, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 350, 351, 350, 351, 346, 347, 23, 2, 23, 2, 284, 285, 23, 2, 350, 351, 262, 263, 23, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 49, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 352, 353, 352, 353, 348, 349, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 264, 265, 7, 4, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 23, 2, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 449, 442, 9, 6, 394, 395, 5, 6, 5, 6, 241, 242, 13, 2, 23, 2, 350, 351, 346, 347, 23, 2, 23, 2, 350, 351, 20, 11, 22, 11, 22, 11, 22, 11, 22, 11, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 7, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 352, 353, 348, 349, 7, 4, 7, 4, 352, 353, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 224, 225, 124, 290, 346, 347, 38, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 286, 287, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 226, 4, 291, 292, 348, 349, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 288, 289, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 207, 2, 350, 351, 224, 225, 346, 347, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 350, 351, 346, 347, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 208, 4, 352, 353, 226, 4, 348, 349, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 352, 353, 348, 349, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 284, 285, 23, 2, 284, 285, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 262, 263, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 264, 265, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":34, + "firstgid":1, + "image":"dungeon.png", + "imageheight":2240, + "imagewidth":2176, + "margin":0, + "name":"dungeon", + "spacing":0, + "tilecount":476, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l2/level.json b/gamefilesd/level/l2/level.json new file mode 100755 index 00000000..a04705a9 --- /dev/null +++ b/gamefilesd/level/l2/level.json @@ -0,0 +1,24 @@ +{ + "palette": [ + { + "id": "l1_2", + "file": "levels/l1data/l1_2.pal" + } + ], + "load": ["level/l1/l1s.json", "l1_2"], + "level": { + "id": "level", + "palette": "l1_2", + "file": "levels/l1data/l1.cel", + "layers": { "index": 2, "texturePack": "l1s" }, + "outOfBoundsTileLayer2": 21, + "til": "levels/l1data/l1.til", + "min": "levels/l1data/l1.min", + "minBlocks": 10, + "sol": "levels/l1data/l1.sol" + }, + "load": "level/automap/l1/load.json", + "load": "level/l2/levelObjects.json", + "load": "level/l2/monsters.json", + "load": "level/l2/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l2/level2.json b/gamefilesd/level/l2/level2.json new file mode 100755 index 00000000..4c22ca97 --- /dev/null +++ b/gamefilesd/level/l2/level2.json @@ -0,0 +1,16 @@ +{ + "level": { + "id": "level", + "path": "l2", + "name": "2", + "map": { "file": "level/l2/l2.json", "indexOffset": -1, "defaultTile": 12 } + }, + "action": { + "name": "if.equal", + "param1": "%beta%", + "param2": true, + "then": { "name": "load", "file": "level/l2/levelObjects2Beta.json" }, + "else": { "name": "load", "file": "level/l2/levelObjects2.json" } + }, + "load": "level/l2/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l2/levelObjects2.json b/gamefilesd/level/l2/levelObjects2.json new file mode 100755 index 00000000..af46b464 --- /dev/null +++ b/gamefilesd/level/l2/levelObjects2.json @@ -0,0 +1,34 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [71, 72], + "properties": { + "x": 49, + "y": 72, + "level": 3 + } + }, + { + "id": "down2", + "class": "levelDownDungeon2", + "mapPosition": [73, 66], + "text1": "poisonWater", + "properties": { + "x": 15, + "y": 67 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [70, 49], + "properties": { + "x": 49, + "y": 85, + "level": 1 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l2/levelObjects2Beta.json b/gamefilesd/level/l2/levelObjects2Beta.json new file mode 100755 index 00000000..8e374980 --- /dev/null +++ b/gamefilesd/level/l2/levelObjects2Beta.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [71, 72], + "properties": { + "x": 49, + "y": 72, + "level": 3 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [70, 49], + "properties": { + "x": 49, + "y": 85, + "level": 1 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l2/music.json b/gamefilesd/level/l2/music.json new file mode 100755 index 00000000..a4b80564 --- /dev/null +++ b/gamefilesd/level/l2/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvla.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l3/l3.json b/gamefilesd/level/l3/l3.json new file mode 100755 index 00000000..c27acb40 --- /dev/null +++ b/gamefilesd/level/l3/l3.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 241, 242, 5, 6, 5, 6, 448, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 350, 351, 346, 347, 346, 347, 220, 221, 23, 2, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 201, 202, 448, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 348, 349, 348, 349, 222, 223, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 124, 290, 23, 2, 23, 2, 350, 351, 350, 351, 239, 2, 216, 217, 346, 347, 23, 2, 350, 351, 312, 2, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 245, 246, 5, 6, 28, 2, 346, 347, 307, 308, 14, 15, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 291, 292, 7, 4, 7, 4, 352, 353, 352, 353, 240, 4, 218, 219, 348, 349, 7, 4, 352, 353, 313, 314, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 220, 221, 346, 347, 350, 351, 262, 263, 23, 2, 346, 347, 43, 2, 350, 351, 350, 351, 23, 2, 350, 351, 307, 308, 28, 2, 23, 2, 346, 347, 346, 347, 220, 221, 346, 347, 346, 347, 350, 351, 224, 225, 350, 351, 23, 2, 346, 347, 23, 2, 23, 2, 286, 287, 346, 347, 350, 351, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 222, 223, 348, 349, 352, 353, 264, 265, 7, 4, 348, 349, 44, 4, 352, 353, 352, 353, 7, 4, 352, 353, 7, 4, 7, 4, 7, 4, 348, 349, 348, 349, 222, 223, 348, 349, 348, 349, 352, 353, 226, 4, 352, 353, 7, 4, 348, 349, 7, 4, 7, 4, 288, 289, 348, 349, 352, 353, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 300, 2, 300, 2, 23, 2, 23, 2, 445, 442, 441, 442, 13, 2, 350, 351, 346, 347, 346, 347, 262, 263, 346, 347, 216, 217, 350, 351, 220, 221, 224, 225, 346, 347, 216, 217, 262, 263, 23, 2, 23, 2, 23, 2, 346, 347, 220, 221, 284, 285, 346, 347, 23, 2, 346, 347, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 301, 302, 301, 302, 7, 4, 7, 4, 446, 440, 443, 440, 3, 4, 352, 353, 348, 349, 348, 349, 264, 265, 348, 349, 218, 219, 352, 353, 222, 223, 226, 4, 348, 349, 218, 219, 264, 265, 7, 4, 7, 4, 7, 4, 348, 349, 222, 223, 7, 4, 348, 349, 7, 4, 348, 349, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 449, 442, 9, 6, 5, 6, 5, 6, 22, 11, 5, 6, 445, 442, 40, 31, 40, 31, 1, 2, 300, 2, 300, 2, 23, 2, 350, 351, 216, 217, 282, 283, 346, 347, 216, 217, 350, 351, 23, 2, 262, 263, 284, 285, 346, 347, 350, 351, 220, 221, 346, 347, 23, 2, 346, 347, 23, 2, 124, 290, 284, 285, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 3, 4, 301, 302, 301, 302, 7, 4, 352, 353, 218, 219, 7, 4, 348, 349, 218, 219, 352, 353, 7, 4, 264, 265, 7, 4, 348, 349, 352, 353, 222, 223, 348, 349, 7, 4, 348, 349, 7, 4, 291, 292, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 207, 2, 23, 2, 350, 351, 346, 347, 262, 263, 30, 31, 40, 31, 40, 31, 449, 442, 47, 48, 64, 48, 45, 46, 13, 2, 286, 287, 350, 351, 220, 221, 262, 263, 300, 2, 300, 2, 300, 2, 300, 2, 350, 351, 262, 263, 350, 351, 23, 2, 23, 2, 300, 2, 300, 2, 300, 2, 300, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 208, 4, 7, 4, 352, 353, 348, 349, 264, 265, 32, 33, 36, 33, 36, 33, 443, 440, 49, 4, 7, 4, 7, 4, 3, 4, 288, 289, 352, 353, 222, 223, 264, 265, 301, 302, 301, 302, 301, 302, 301, 302, 352, 353, 264, 265, 352, 353, 7, 4, 7, 4, 301, 302, 301, 302, 301, 302, 301, 302, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 220, 221, 224, 225, 346, 347, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 445, 442, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 47, 48, 45, 46, 324, 325, 445, 442, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 47, 48, 45, 46, 64, 48, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 222, 223, 226, 4, 348, 349, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 49, 4, 7, 4, 298, 299, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 49, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 29, 2, 346, 347, 23, 2, 350, 351, 307, 308, 14, 15, 448, 438, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 28, 2, 350, 351, 296, 297, 24, 6, 201, 202, 5, 6, 247, 242, 41, 31, 40, 31, 1, 2, 220, 221, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 348, 349, 7, 4, 352, 353, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 352, 353, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 3, 4, 222, 223, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 235, 2, 346, 347, 346, 347, 346, 347, 350, 351, 350, 351, 23, 2, 9, 6, 5, 6, 5, 6, 5, 6, 201, 202, 203, 204, 5, 6, 5, 6, 5, 6, 229, 230, 13, 2, 350, 351, 350, 351, 23, 2, 296, 297, 21, 2, 350, 351, 286, 287, 346, 347, 437, 438, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 236, 4, 348, 349, 348, 349, 348, 349, 352, 353, 352, 353, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 352, 353, 352, 353, 7, 4, 298, 299, 12, 4, 352, 353, 288, 289, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 346, 347, 350, 351, 23, 2, 216, 217, 43, 2, 262, 263, 224, 225, 350, 351, 23, 2, 282, 283, 220, 221, 346, 347, 346, 347, 350, 351, 1, 2, 286, 287, 23, 2, 346, 347, 296, 297, 21, 2, 23, 2, 262, 263, 23, 2, 9, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 348, 349, 352, 353, 7, 4, 218, 219, 44, 4, 264, 265, 226, 4, 352, 353, 7, 4, 7, 4, 222, 223, 348, 349, 348, 349, 352, 353, 3, 4, 288, 289, 7, 4, 348, 349, 298, 299, 12, 4, 7, 4, 264, 265, 7, 4, 3, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 235, 2, 220, 221, 350, 351, 346, 347, 23, 2, 346, 347, 23, 2, 1, 2, 350, 351, 346, 347, 282, 283, 284, 285, 23, 2, 23, 2, 350, 351, 23, 2, 216, 217, 1, 2, 346, 347, 350, 351, 346, 347, 296, 297, 21, 2, 284, 285, 350, 351, 312, 2, 207, 2, 224, 225, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 236, 4, 222, 223, 352, 353, 348, 349, 7, 4, 348, 349, 7, 4, 3, 4, 352, 353, 348, 349, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 7, 4, 218, 219, 3, 4, 348, 349, 352, 353, 348, 349, 298, 299, 12, 4, 7, 4, 352, 353, 313, 314, 208, 4, 226, 4, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 346, 347, 224, 225, 350, 351, 346, 347, 350, 351, 23, 2, 445, 442, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 300, 2, 300, 2, 300, 2, 300, 2, 21, 2, 350, 351, 346, 347, 307, 308, 28, 2, 23, 2, 307, 308, 14, 15, 247, 242, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 348, 349, 226, 4, 352, 353, 348, 349, 352, 353, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 301, 302, 301, 302, 301, 302, 301, 302, 12, 4, 352, 353, 348, 349, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 441, 442, 20, 11, 22, 11, 22, 11, 13, 2, 262, 263, 23, 2, 350, 351, 346, 347, 282, 283, 284, 285, 124, 290, 124, 2, 23, 2, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 3, 4, 264, 265, 7, 4, 352, 353, 348, 349, 7, 4, 7, 4, 291, 292, 273, 274, 7, 4, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 23, 2, 23, 2, 1, 2, 23, 2, 224, 225, 23, 2, 262, 263, 124, 2, 284, 285, 124, 2, 275, 276, 270, 271, 307, 308, 14, 15, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 7, 4, 7, 4, 3, 4, 7, 4, 226, 4, 7, 4, 264, 265, 273, 274, 7, 4, 273, 274, 7, 277, 272, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 346, 347, 346, 347, 346, 347, 350, 351, 293, 2, 346, 347, 346, 347, 296, 297, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 42, 35, 34, 35, 441, 442, 13, 2, 124, 290, 275, 276, 270, 271, 275, 276, 270, 271, 124, 2, 346, 347, 124, 2, 23, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 348, 349, 348, 349, 348, 349, 352, 353, 294, 295, 348, 349, 348, 349, 298, 299, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 443, 440, 3, 4, 291, 292, 7, 277, 272, 4, 7, 277, 272, 4, 273, 274, 348, 349, 273, 274, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 23, 2, 23, 2, 23, 2, 23, 2, 23, 2, 23, 2, 350, 351, 296, 297, 24, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 247, 242, 5, 6, 5, 6, 5, 6, 322, 323, 21, 2, 346, 347, 346, 347, 346, 347, 346, 347, 262, 263, 275, 276, 270, 271, 275, 276, 270, 271, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 298, 299, 12, 4, 348, 349, 348, 349, 348, 349, 348, 349, 264, 265, 7, 277, 272, 4, 7, 277, 272, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 38, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 327, 297, 21, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 326, 297, 21, 2, 124, 2, 224, 225, 315, 316, 350, 351, 262, 263, 315, 316, 23, 2, 216, 217, 220, 221, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 328, 311, 321, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 310, 311, 12, 4, 273, 274, 226, 4, 317, 318, 352, 353, 264, 265, 317, 318, 7, 4, 218, 219, 222, 223, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 426, 427, 235, 2, 350, 351, 307, 308, 17, 11, 22, 11, 22, 11, 22, 11, 248, 249, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 248, 249, 22, 11, 22, 11, 248, 249, 22, 11, 22, 11, 22, 11, 8, 2, 275, 276, 270, 271, 307, 308, 25, 26, 262, 263, 307, 308, 25, 26, 220, 221, 220, 221, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 428, 299, 236, 4, 352, 353, 7, 4, 18, 19, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 277, 272, 4, 7, 4, 27, 4, 264, 265, 7, 4, 27, 4, 222, 223, 222, 223, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 426, 427, 417, 2, 220, 221, 350, 351, 293, 2, 346, 347, 346, 347, 23, 2, 350, 351, 23, 2, 350, 351, 220, 221, 284, 285, 262, 263, 350, 351, 262, 263, 286, 287, 293, 2, 350, 351, 350, 351, 23, 2, 346, 347, 346, 347, 262, 263, 23, 2, 346, 347, 350, 351, 346, 347, 216, 217, 350, 351, 23, 2, 262, 263, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 428, 299, 418, 419, 222, 223, 352, 353, 294, 295, 348, 349, 348, 349, 7, 4, 352, 353, 7, 4, 352, 353, 222, 223, 7, 4, 264, 265, 352, 353, 264, 265, 288, 289, 294, 295, 352, 353, 352, 353, 7, 4, 348, 349, 348, 349, 264, 265, 7, 4, 348, 349, 352, 353, 348, 349, 218, 219, 352, 353, 7, 4, 264, 265, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 207, 2, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 422, 423, 235, 2, 346, 347, 329, 316, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 309, 2, 350, 351, 23, 2, 346, 347, 315, 316, 346, 347, 346, 347, 315, 316, 23, 2, 350, 351, 346, 347, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 208, 4, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 424, 425, 236, 4, 348, 349, 328, 330, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 310, 311, 352, 353, 7, 4, 348, 349, 317, 318, 348, 349, 348, 349, 317, 318, 7, 4, 352, 353, 348, 349, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 224, 225, 315, 316, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 296, 297, 10, 11, 248, 249, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 248, 249, 22, 11, 22, 11, 22, 11, 22, 11, 324, 325, 16, 2, 23, 2, 350, 351, 307, 308, 25, 26, 23, 2, 307, 308, 25, 26, 350, 351, 346, 347, 293, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 226, 4, 317, 318, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 298, 299, 12, 4, 7, 4, 352, 353, 7, 4, 27, 4, 7, 4, 7, 4, 27, 4, 352, 353, 348, 349, 294, 295, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 216, 217, 307, 308, 14, 15, 233, 234, 237, 238, 233, 234, 5, 6, 8, 2, 346, 347, 296, 297, 21, 2, 23, 2, 262, 263, 350, 351, 346, 347, 262, 263, 293, 2, 293, 2, 346, 347, 23, 2, 350, 351, 346, 347, 350, 351, 346, 347, 23, 2, 286, 287, 296, 297, 21, 2, 23, 2, 23, 2, 262, 263, 23, 2, 350, 351, 282, 283, 124, 2, 346, 347, 23, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 218, 219, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 298, 299, 12, 4, 7, 4, 264, 265, 352, 353, 348, 349, 264, 265, 294, 295, 294, 295, 348, 349, 7, 4, 352, 353, 348, 349, 352, 353, 348, 349, 7, 4, 288, 289, 298, 299, 12, 4, 7, 4, 7, 4, 264, 265, 7, 4, 352, 353, 7, 4, 273, 274, 348, 349, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 235, 2, 262, 263, 23, 2, 350, 351, 23, 2, 23, 2, 23, 2, 350, 351, 23, 2, 350, 351, 23, 2, 38, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 23, 2, 350, 351, 23, 2, 220, 221, 124, 2, 275, 276, 270, 271, 350, 351, 224, 225, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 236, 4, 264, 265, 7, 4, 352, 353, 7, 4, 7, 4, 7, 4, 352, 353, 7, 4, 352, 353, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 352, 353, 7, 4, 222, 223, 273, 274, 7, 277, 272, 4, 352, 353, 226, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 124, 290, 23, 2, 23, 2, 350, 351, 284, 285, 346, 347, 350, 351, 346, 347, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 28, 2, 124, 2, 106, 107, 110, 111, 346, 347, 262, 263, 275, 276, 270, 271, 350, 351, 346, 347, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 291, 292, 7, 4, 7, 4, 352, 353, 7, 4, 348, 349, 352, 353, 348, 349, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 125, 126, 108, 109, 112, 113, 348, 349, 264, 265, 7, 277, 272, 4, 352, 353, 348, 349, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 346, 347, 346, 347, 262, 263, 346, 347, 23, 2, 216, 217, 346, 347, 23, 2, 346, 347, 122, 123, 114, 115, 118, 119, 284, 285, 224, 225, 350, 351, 346, 347, 38, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 348, 349, 348, 349, 264, 265, 348, 349, 7, 4, 218, 219, 348, 349, 7, 4, 348, 349, 7, 4, 116, 117, 120, 121, 7, 4, 226, 4, 352, 353, 348, 349, 39, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 197, 198, 197, 198, 5, 6, 5, 6, 5, 6, 203, 204, 5, 6, 201, 202, 5, 6, 203, 204, 5, 6, 448, 438, 40, 31, 137, 138, 448, 438, 40, 31, 1, 2, 346, 347, 346, 347, 23, 2, 346, 347, 23, 2, 262, 263, 346, 347, 216, 217, 346, 347, 350, 351, 216, 217, 350, 351, 346, 347, 224, 225, 346, 347, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 199, 200, 199, 200, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 139, 140, 446, 440, 36, 33, 3, 4, 348, 349, 348, 349, 7, 4, 348, 349, 7, 4, 264, 265, 348, 349, 218, 219, 348, 349, 352, 353, 218, 219, 352, 353, 348, 349, 226, 4, 348, 349, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 350, 351, 23, 2, 224, 225, 350, 351, 350, 351, 23, 2, 23, 2, 23, 2, 284, 285, 346, 347, 23, 2, 9, 6, 5, 127, 129, 130, 133, 134, 5, 6, 28, 2, 350, 351, 346, 347, 346, 347, 23, 2, 220, 221, 350, 351, 9, 6, 5, 6, 5, 6, 201, 202, 5, 6, 5, 6, 9, 6, 5, 6, 5, 6, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 7, 4, 226, 4, 352, 353, 352, 353, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 7, 4, 3, 4, 7, 128, 131, 132, 135, 136, 7, 4, 7, 4, 352, 353, 348, 349, 348, 349, 7, 4, 222, 223, 352, 353, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 216, 217, 346, 347, 350, 351, 284, 285, 224, 225, 262, 263, 350, 351, 350, 351, 284, 285, 23, 2, 256, 2, 23, 2, 141, 142, 143, 2, 350, 351, 346, 347, 350, 351, 224, 225, 262, 263, 224, 225, 23, 2, 350, 351, 1, 2, 346, 347, 124, 2, 23, 2, 262, 263, 286, 287, 1, 2, 350, 351, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 218, 219, 348, 349, 352, 353, 7, 4, 226, 4, 264, 265, 352, 353, 352, 353, 7, 4, 7, 4, 257, 4, 7, 4, 7, 4, 7, 4, 352, 353, 348, 349, 352, 353, 226, 4, 264, 265, 226, 4, 7, 4, 352, 353, 3, 4, 348, 349, 273, 274, 7, 4, 264, 265, 288, 289, 3, 4, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 231, 2, 350, 351, 23, 2, 346, 347, 346, 347, 220, 221, 23, 2, 23, 2, 346, 347, 346, 347, 346, 347, 220, 221, 346, 347, 43, 2, 293, 2, 350, 351, 346, 347, 350, 351, 346, 347, 23, 2, 346, 347, 286, 287, 23, 2, 346, 347, 216, 217, 43, 2, 23, 2, 275, 276, 270, 271, 224, 225, 346, 347, 235, 2, 350, 351, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 232, 4, 352, 353, 7, 4, 348, 349, 348, 349, 222, 223, 7, 4, 7, 4, 348, 349, 348, 349, 348, 349, 222, 223, 348, 349, 44, 4, 294, 295, 352, 353, 348, 349, 352, 353, 348, 349, 7, 4, 348, 349, 288, 289, 7, 4, 348, 349, 218, 219, 44, 4, 7, 4, 7, 277, 272, 4, 226, 4, 348, 349, 236, 4, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 262, 263, 346, 347, 350, 351, 23, 2, 346, 347, 346, 347, 346, 347, 346, 347, 350, 351, 350, 351, 346, 347, 284, 285, 445, 442, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 350, 351, 23, 2, 346, 347, 23, 2, 346, 347, 220, 221, 9, 6, 5, 6, 5, 6, 45, 46, 322, 323, 445, 442, 9, 6, 45, 46, 5, 6, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 264, 265, 348, 349, 352, 353, 7, 4, 348, 349, 348, 349, 348, 349, 348, 349, 352, 353, 352, 353, 348, 349, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 352, 353, 7, 4, 348, 349, 7, 4, 348, 349, 222, 223, 3, 4, 7, 4, 7, 4, 7, 4, 298, 299, 446, 440, 3, 4, 7, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 350, 351, 350, 351, 346, 347, 350, 351, 38, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 9, 6, 5, 6, 5, 6, 229, 230, 203, 204, 14, 15, 197, 198, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 28, 2, 350, 351, 346, 347, 23, 2, 296, 297, 24, 6, 28, 2, 350, 351, 346, 347, 9, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 352, 353, 352, 353, 348, 349, 352, 353, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 199, 200, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 348, 349, 7, 4, 298, 299, 12, 4, 7, 4, 352, 353, 348, 349, 3, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 235, 2, 293, 2, 262, 263, 23, 2, 346, 347, 23, 2, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 346, 347, 350, 351, 346, 347, 262, 263, 350, 351, 350, 351, 350, 351, 350, 351, 350, 351, 23, 2, 346, 347, 284, 285, 346, 347, 296, 297, 21, 2, 350, 351, 216, 217, 23, 2, 1, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 236, 4, 294, 295, 264, 265, 7, 4, 348, 349, 7, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 348, 349, 352, 353, 348, 349, 264, 265, 352, 353, 352, 353, 352, 353, 352, 353, 352, 353, 7, 4, 348, 349, 7, 4, 348, 349, 298, 299, 12, 4, 352, 353, 218, 219, 7, 4, 3, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 235, 2, 346, 347, 346, 347, 350, 351, 284, 285, 350, 351, 350, 351, 350, 351, 23, 2, 346, 347, 23, 2, 220, 221, 350, 351, 286, 287, 224, 225, 23, 2, 296, 297, 21, 2, 284, 285, 346, 347, 346, 347, 43, 2, 284, 285, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 236, 4, 348, 349, 348, 349, 352, 353, 7, 4, 352, 353, 352, 353, 352, 353, 7, 4, 348, 349, 7, 4, 222, 223, 352, 353, 288, 289, 226, 4, 7, 4, 298, 299, 12, 4, 7, 4, 348, 349, 348, 349, 44, 4, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 322, 323, 24, 6, 29, 2, 346, 347, 23, 2, 23, 2, 23, 2, 9, 6, 5, 6, 5, 6, 5, 6, 38, 35, 441, 442, 9, 6, 45, 46, 5, 6, 5, 6, 5, 6, 445, 442, 9, 6, 45, 46, 5, 6, 38, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 298, 299, 12, 4, 7, 4, 348, 349, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 39, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 3, 4, 7, 4, 7, 4, 39, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 296, 297, 21, 2, 23, 2, 216, 217, 216, 217, 350, 351, 350, 351, 43, 2, 350, 351, 350, 351, 23, 2, 30, 31, 40, 31, 1, 2, 350, 351, 282, 283, 23, 2, 262, 263, 437, 438, 1, 2, 346, 347, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 298, 299, 12, 4, 7, 4, 218, 219, 218, 219, 352, 353, 352, 353, 44, 4, 352, 353, 352, 353, 7, 4, 32, 33, 36, 33, 3, 4, 352, 353, 7, 4, 7, 4, 264, 265, 439, 440, 3, 4, 348, 349, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 296, 297, 21, 2, 23, 2, 350, 351, 282, 283, 216, 217, 23, 2, 319, 2, 300, 2, 300, 2, 346, 347, 437, 438, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 1, 2, 23, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 298, 299, 12, 4, 7, 4, 352, 353, 7, 4, 218, 219, 7, 4, 320, 302, 301, 302, 301, 302, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 3, 4, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 441, 442, 13, 2, 282, 283, 293, 2, 23, 2, 346, 347, 47, 48, 45, 46, 64, 48, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 262, 263, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 294, 295, 7, 4, 348, 349, 49, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 264, 265, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 346, 347, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 348, 349, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":34, + "firstgid":1, + "image":"dungeon.png", + "imageheight":2240, + "imagewidth":2176, + "margin":0, + "name":"dungeon", + "spacing":0, + "tilecount":476, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l3/level.json b/gamefilesd/level/l3/level.json new file mode 100755 index 00000000..a90af6fc --- /dev/null +++ b/gamefilesd/level/l3/level.json @@ -0,0 +1,24 @@ +{ + "palette": [ + { + "id": "l1_3", + "file": "levels/l1data/l1_3.pal" + } + ], + "load": ["level/l1/l1s.json", "l1_3"], + "level": { + "id": "level", + "palette": "l1_3", + "file": "levels/l1data/l1.cel", + "layers": { "index": 2, "texturePack": "l1s" }, + "outOfBoundsTileLayer2": 21, + "til": "levels/l1data/l1.til", + "min": "levels/l1data/l1.min", + "minBlocks": 10, + "sol": "levels/l1data/l1.sol" + }, + "load": "level/automap/l1/load.json", + "load": "level/l3/levelObjects.json", + "load": "level/l3/monsters.json", + "load": "level/l3/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l3/level2.json b/gamefilesd/level/l3/level2.json new file mode 100755 index 00000000..25a841ad --- /dev/null +++ b/gamefilesd/level/l3/level2.json @@ -0,0 +1,11 @@ +{ + "level": { + "id": "level", + "path": "l3", + "name": "3", + "map": { "file": "level/l3/l3.json", "indexOffset": -1, "defaultTile": 12 } + }, + "load": "level/l3/levelObjects2.json", + "load": "level/l3/monsters2.json", + "load": "level/l3/quests.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l3/levelObjects2.json b/gamefilesd/level/l3/levelObjects2.json new file mode 100755 index 00000000..d1ccc072 --- /dev/null +++ b/gamefilesd/level/l3/levelObjects2.json @@ -0,0 +1,34 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [77, 66], + "properties": { + "x": 51, + "y": 64, + "level": 4 + } + }, + { + "id": "down2", + "class": "levelDownDungeon2", + "mapPosition": [32, 55], + "text1": "skeletonKing", + "properties": { + "x": 83, + "y": 44 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [48, 69], + "properties": { + "x": 71, + "y": 73, + "level": 2 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l3/music.json b/gamefilesd/level/l3/music.json new file mode 100755 index 00000000..a4b80564 --- /dev/null +++ b/gamefilesd/level/l3/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvla.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l3/quests.json b/gamefilesd/level/l3/quests.json new file mode 100755 index 00000000..549d9291 --- /dev/null +++ b/gamefilesd/level/l3/quests.json @@ -0,0 +1,6 @@ +{ + "quest": { + "id": "ogdensSign", + "name": "Ogden's Sign" + } +} \ No newline at end of file diff --git a/gamefilesd/level/l4/l4.json b/gamefilesd/level/l4/l4.json new file mode 100755 index 00000000..09d10d50 --- /dev/null +++ b/gamefilesd/level/l4/l4.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 247, 242, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 197, 198, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 239, 2, 350, 351, 23, 2, 350, 351, 216, 217, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 199, 200, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 240, 4, 352, 353, 7, 4, 352, 353, 218, 219, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 346, 347, 346, 347, 262, 263, 23, 2, 23, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 227, 2, 282, 283, 262, 263, 286, 287, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 220, 221, 350, 351, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 348, 349, 348, 349, 264, 265, 7, 4, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 228, 4, 7, 4, 264, 265, 288, 289, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 222, 223, 352, 353, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 350, 351, 350, 351, 23, 2, 23, 2, 23, 2, 346, 347, 262, 263, 437, 438, 40, 31, 9, 6, 5, 6, 28, 2, 23, 2, 350, 351, 23, 2, 284, 285, 30, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 124, 290, 350, 351, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 352, 353, 7, 4, 7, 4, 7, 4, 348, 349, 264, 265, 439, 440, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 352, 353, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 291, 292, 352, 353, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 9, 6, 5, 6, 394, 395, 445, 442, 37, 31, 40, 31, 227, 2, 346, 347, 284, 285, 350, 351, 23, 2, 23, 2, 293, 2, 30, 31, 40, 31, 40, 31, 9, 6, 29, 2, 350, 351, 23, 2, 23, 2, 286, 287, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 228, 4, 348, 349, 7, 4, 352, 353, 7, 4, 7, 4, 294, 295, 32, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 7, 4, 7, 4, 288, 289, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 303, 304, 65, 15, 5, 6, 5, 6, 28, 2, 346, 347, 350, 351, 346, 347, 23, 2, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 205, 2, 282, 283, 262, 263, 350, 351, 346, 347, 445, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 305, 306, 58, 4, 7, 4, 7, 4, 7, 4, 348, 349, 352, 353, 348, 349, 7, 4, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 206, 4, 7, 4, 264, 265, 352, 353, 348, 349, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 296, 297, 392, 2, 262, 263, 262, 263, 346, 347, 346, 347, 23, 2, 23, 2, 350, 351, 282, 283, 346, 347, 30, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 23, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 298, 299, 393, 4, 264, 265, 264, 265, 348, 349, 348, 349, 7, 4, 7, 4, 352, 353, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 303, 304, 62, 2, 23, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 30, 31, 40, 31, 40, 31, 235, 2, 262, 263, 282, 283, 350, 351, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 305, 306, 63, 4, 7, 4, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 32, 33, 36, 33, 36, 33, 236, 4, 264, 265, 7, 4, 352, 353, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 28, 2, 23, 2, 312, 2, 9, 6, 394, 395, 5, 6, 47, 48, 64, 48, 64, 48, 64, 48, 64, 48, 394, 395, 324, 325, 437, 438, 40, 31, 40, 31, 1, 2, 23, 2, 346, 347, 220, 221, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 313, 314, 3, 4, 7, 4, 7, 4, 49, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 298, 299, 439, 440, 36, 33, 36, 33, 3, 4, 7, 4, 348, 349, 222, 223, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 346, 347, 23, 2, 346, 347, 262, 263, 307, 308, 28, 2, 284, 285, 23, 2, 28, 2, 346, 347, 346, 347, 284, 285, 293, 2, 350, 351, 303, 304, 65, 15, 201, 202, 5, 6, 28, 2, 23, 2, 350, 351, 38, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 348, 349, 7, 4, 348, 349, 264, 265, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 348, 349, 7, 4, 294, 295, 352, 353, 305, 306, 58, 4, 7, 4, 7, 4, 7, 4, 7, 4, 352, 353, 39, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 346, 347, 262, 263, 350, 351, 346, 347, 346, 347, 350, 351, 284, 285, 23, 2, 445, 442, 13, 2, 350, 351, 23, 2, 346, 347, 296, 297, 392, 2, 346, 347, 23, 2, 350, 351, 350, 351, 284, 285, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 348, 349, 264, 265, 352, 353, 348, 349, 348, 349, 352, 353, 7, 4, 7, 4, 446, 440, 3, 4, 352, 353, 7, 4, 348, 349, 298, 299, 393, 4, 348, 349, 7, 4, 352, 353, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 23, 2, 346, 347, 220, 221, 350, 351, 23, 2, 224, 225, 346, 347, 350, 351, 23, 2, 30, 31, 1, 2, 282, 283, 23, 2, 350, 351, 303, 304, 62, 2, 23, 2, 23, 2, 23, 2, 346, 347, 262, 263, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 224, 225, 282, 283, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 7, 4, 348, 349, 222, 223, 352, 353, 7, 4, 226, 4, 348, 349, 352, 353, 7, 4, 32, 33, 3, 4, 7, 4, 7, 4, 352, 353, 305, 306, 63, 4, 7, 4, 7, 4, 7, 4, 348, 349, 264, 265, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 226, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 346, 347, 23, 2, 346, 347, 346, 347, 350, 351, 346, 347, 23, 2, 346, 347, 30, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 262, 263, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 348, 349, 7, 4, 348, 349, 348, 349, 352, 353, 348, 349, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 264, 265, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 350, 351, 350, 351, 350, 351, 312, 2, 23, 2, 346, 347, 346, 347, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 207, 2, 350, 351, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 352, 353, 352, 353, 352, 353, 313, 314, 7, 4, 348, 349, 348, 349, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 208, 4, 352, 353, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 229, 230, 28, 2, 346, 347, 346, 347, 216, 217, 23, 2, 220, 221, 307, 308, 14, 15, 197, 198, 38, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 5, 6, 5, 6, 28, 2, 124, 2, 307, 308, 14, 15, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 348, 349, 348, 349, 218, 219, 7, 4, 222, 223, 7, 4, 7, 4, 199, 200, 39, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 273, 274, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 23, 2, 23, 2, 346, 347, 350, 351, 350, 351, 224, 225, 23, 2, 262, 263, 350, 351, 296, 297, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 231, 2, 350, 351, 23, 2, 23, 2, 346, 347, 275, 276, 270, 271, 23, 2, 216, 217, 350, 351, 262, 263, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 7, 4, 7, 4, 348, 349, 352, 353, 352, 353, 226, 4, 7, 4, 264, 265, 352, 353, 298, 299, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 232, 4, 352, 353, 7, 4, 7, 4, 348, 349, 7, 277, 272, 4, 7, 4, 218, 219, 352, 353, 264, 265, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 346, 347, 350, 351, 346, 347, 23, 2, 350, 351, 346, 347, 350, 351, 350, 351, 296, 297, 24, 6, 5, 6, 247, 242, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 241, 242, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 247, 242, 5, 6, 322, 323, 258, 2, 296, 297, 9, 6, 5, 6, 5, 6, 9, 6, 5, 6, 5, 6, 5, 6, 13, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 348, 349, 352, 353, 348, 349, 7, 4, 352, 353, 348, 349, 352, 353, 352, 353, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 298, 299, 259, 4, 298, 299, 3, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 350, 351, 350, 351, 315, 316, 350, 351, 224, 225, 315, 316, 346, 347, 23, 2, 23, 2, 327, 297, 21, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 326, 297, 21, 2, 296, 297, 21, 2, 124, 2, 23, 2, 21, 2, 23, 2, 23, 2, 23, 2, 1, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 352, 353, 352, 353, 317, 318, 352, 353, 226, 4, 317, 318, 348, 349, 7, 4, 7, 4, 328, 311, 321, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 310, 311, 12, 4, 298, 299, 321, 302, 273, 274, 7, 4, 321, 302, 7, 4, 7, 4, 7, 4, 3, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 346, 347, 307, 308, 25, 26, 224, 225, 307, 308, 25, 26, 224, 225, 23, 2, 307, 308, 17, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 248, 249, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 8, 2, 262, 263, 1, 2, 23, 2, 23, 2, 1, 2, 23, 2, 23, 2, 23, 2, 1, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 348, 349, 7, 4, 27, 4, 226, 4, 7, 4, 27, 4, 226, 4, 7, 4, 7, 4, 18, 19, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 264, 265, 3, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 3, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 220, 221, 23, 2, 216, 217, 350, 351, 346, 347, 350, 351, 350, 351, 124, 290, 350, 351, 23, 2, 350, 351, 350, 351, 23, 2, 346, 347, 350, 351, 262, 263, 350, 351, 346, 347, 350, 351, 350, 351, 346, 347, 23, 2, 286, 287, 23, 2, 350, 351, 350, 351, 346, 347, 124, 2, 23, 2, 9, 6, 5, 6, 5, 6, 24, 6, 5, 6, 5, 6, 5, 6, 1, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 222, 223, 7, 4, 218, 219, 352, 353, 348, 349, 352, 353, 352, 353, 291, 292, 352, 353, 7, 4, 352, 353, 352, 353, 7, 4, 348, 349, 352, 353, 264, 265, 352, 353, 348, 349, 352, 353, 352, 353, 348, 349, 7, 4, 288, 289, 7, 4, 352, 353, 352, 353, 348, 349, 273, 274, 7, 4, 3, 4, 7, 4, 7, 4, 12, 4, 7, 4, 7, 4, 7, 4, 3, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 346, 347, 315, 316, 350, 351, 350, 351, 315, 316, 23, 2, 350, 351, 286, 287, 329, 316, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 300, 2, 309, 2, 275, 276, 270, 271, 1, 2, 106, 107, 110, 111, 21, 2, 262, 263, 282, 283, 350, 351, 1, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 348, 349, 317, 318, 352, 353, 352, 353, 317, 318, 7, 4, 352, 353, 288, 289, 328, 330, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 301, 302, 310, 311, 7, 277, 272, 4, 3, 4, 108, 109, 112, 113, 12, 4, 264, 265, 7, 4, 352, 353, 3, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 350, 351, 307, 308, 25, 26, 346, 347, 307, 308, 25, 26, 350, 351, 23, 2, 296, 297, 10, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 22, 11, 324, 325, 16, 2, 262, 263, 1, 2, 114, 115, 118, 119, 10, 11, 22, 11, 22, 11, 22, 11, 1, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 352, 353, 7, 4, 27, 4, 348, 349, 7, 4, 27, 4, 352, 353, 7, 4, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 298, 299, 12, 4, 264, 265, 3, 4, 116, 117, 120, 121, 12, 4, 7, 4, 7, 4, 7, 4, 3, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 262, 263, 216, 217, 23, 2, 23, 2, 350, 351, 350, 351, 23, 2, 350, 351, 220, 221, 296, 297, 21, 2, 350, 351, 350, 351, 350, 351, 346, 347, 23, 2, 137, 138, 13, 2, 346, 347, 23, 2, 220, 221, 23, 2, 282, 283, 23, 2, 23, 2, 346, 347, 296, 297, 21, 2, 312, 2, 1, 2, 284, 285, 303, 304, 21, 2, 262, 263, 216, 217, 346, 347, 417, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 264, 265, 218, 219, 7, 4, 7, 4, 352, 353, 352, 353, 7, 4, 352, 353, 222, 223, 298, 299, 12, 4, 352, 353, 352, 353, 352, 353, 348, 349, 7, 4, 139, 140, 3, 4, 348, 349, 7, 4, 222, 223, 7, 4, 7, 4, 7, 4, 7, 4, 348, 349, 298, 299, 12, 4, 313, 314, 3, 4, 7, 4, 305, 306, 12, 4, 264, 265, 218, 219, 348, 349, 418, 419, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 350, 351, 346, 347, 346, 347, 220, 221, 350, 351, 346, 347, 350, 351, 124, 290, 350, 351, 445, 442, 34, 35, 34, 35, 441, 442, 9, 6, 5, 127, 129, 130, 133, 134, 5, 6, 445, 442, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 307, 308, 14, 15, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 8, 2, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 348, 349, 348, 349, 222, 223, 352, 353, 348, 349, 352, 353, 291, 292, 352, 353, 446, 440, 36, 33, 36, 33, 443, 440, 3, 4, 7, 128, 131, 132, 135, 136, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 262, 263, 350, 351, 23, 2, 346, 347, 350, 351, 23, 2, 224, 225, 284, 285, 350, 351, 9, 6, 5, 6, 5, 6, 5, 6, 28, 2, 124, 2, 141, 142, 143, 2, 262, 263, 9, 6, 197, 198, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 205, 2, 350, 351, 23, 2, 350, 351, 23, 2, 350, 351, 296, 297, 346, 347, 346, 347, 350, 351, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 264, 265, 352, 353, 7, 4, 348, 349, 352, 353, 7, 4, 226, 4, 7, 4, 352, 353, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 273, 274, 7, 4, 7, 4, 264, 265, 3, 4, 199, 200, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 206, 4, 352, 353, 7, 4, 352, 353, 7, 4, 352, 353, 298, 299, 348, 349, 348, 349, 352, 353, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 441, 442, 9, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 394, 395, 9, 6, 5, 6, 13, 2, 350, 351, 23, 2, 23, 2, 350, 351, 275, 276, 270, 271, 346, 347, 350, 351, 392, 2, 23, 2, 346, 347, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 197, 198, 5, 6, 29, 2, 224, 225, 296, 297, 24, 6, 5, 6, 5, 6, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 3, 4, 352, 353, 7, 4, 7, 4, 352, 353, 7, 277, 272, 4, 348, 349, 352, 353, 393, 4, 7, 4, 348, 349, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 199, 200, 7, 4, 7, 4, 226, 4, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 239, 2, 23, 2, 23, 2, 350, 351, 23, 2, 23, 2, 23, 2, 1, 2, 346, 347, 1, 2, 293, 2, 350, 351, 350, 351, 346, 347, 23, 2, 346, 347, 23, 2, 23, 2, 1, 2, 23, 2, 262, 263, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 224, 225, 23, 2, 346, 347, 296, 297, 21, 2, 346, 347, 220, 221, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 240, 4, 7, 4, 7, 4, 352, 353, 7, 4, 7, 4, 7, 4, 3, 4, 348, 349, 3, 4, 294, 295, 352, 353, 352, 353, 348, 349, 7, 4, 348, 349, 7, 4, 7, 4, 3, 4, 7, 4, 264, 265, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 226, 4, 7, 4, 348, 349, 298, 299, 12, 4, 348, 349, 222, 223, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 205, 2, 350, 351, 23, 2, 346, 347, 346, 347, 346, 347, 23, 2, 207, 2, 350, 351, 38, 35, 34, 35, 34, 35, 441, 442, 9, 6, 5, 6, 5, 6, 394, 395, 5, 6, 38, 35, 34, 35, 34, 35, 441, 442, 37, 31, 9, 6, 5, 6, 5, 6, 28, 2, 220, 221, 220, 221, 224, 225, 23, 2, 23, 2, 296, 297, 21, 2, 23, 2, 216, 217, 282, 283, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 206, 4, 352, 353, 7, 4, 348, 349, 348, 349, 348, 349, 7, 4, 208, 4, 352, 353, 39, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 443, 440, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 222, 223, 222, 223, 226, 4, 7, 4, 7, 4, 298, 299, 12, 4, 7, 4, 218, 219, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 350, 351, 23, 2, 346, 347, 23, 2, 392, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 1, 2, 216, 217, 346, 347, 346, 347, 312, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 293, 2, 350, 351, 350, 351, 23, 2, 346, 347, 262, 263, 13, 2, 286, 287, 262, 263, 445, 442, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 352, 353, 7, 4, 348, 349, 7, 4, 393, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 3, 4, 218, 219, 348, 349, 348, 349, 313, 314, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 294, 295, 352, 353, 352, 353, 7, 4, 348, 349, 264, 265, 3, 4, 288, 289, 264, 265, 446, 440, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 346, 347, 23, 2, 23, 2, 286, 287, 293, 2, 1, 2, 346, 347, 437, 438, 40, 31, 40, 31, 9, 6, 29, 2, 23, 2, 23, 2, 23, 2, 307, 308, 14, 15, 448, 438, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 346, 347, 346, 347, 23, 2, 350, 351, 23, 2, 445, 442, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 348, 349, 7, 4, 7, 4, 288, 289, 294, 295, 3, 4, 348, 349, 439, 440, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 348, 349, 348, 349, 7, 4, 352, 353, 7, 4, 446, 440, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 23, 2, 350, 351, 293, 2, 346, 347, 262, 263, 346, 347, 445, 442, 441, 442, 37, 31, 40, 31, 40, 31, 207, 2, 216, 217, 220, 221, 346, 347, 350, 351, 346, 347, 303, 304, 65, 15, 5, 6, 5, 6, 5, 6, 9, 6, 29, 2, 23, 2, 23, 2, 9, 6, 5, 6, 5, 6, 14, 15, 5, 6, 197, 198, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 7, 4, 352, 353, 294, 295, 348, 349, 264, 265, 348, 349, 446, 440, 443, 440, 36, 33, 36, 33, 36, 33, 208, 4, 218, 219, 222, 223, 348, 349, 352, 353, 348, 349, 305, 306, 58, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 199, 200, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 14, 15, 5, 6, 5, 6, 5, 6, 38, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 207, 2, 350, 351, 350, 351, 23, 2, 23, 2, 286, 287, 303, 304, 62, 2, 350, 351, 23, 2, 296, 297, 1, 2, 346, 347, 293, 2, 346, 347, 392, 2, 350, 351, 23, 2, 124, 290, 220, 221, 262, 263, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 208, 4, 352, 353, 352, 353, 7, 4, 7, 4, 288, 289, 305, 306, 63, 4, 352, 353, 7, 4, 298, 299, 3, 4, 348, 349, 294, 295, 348, 349, 393, 4, 352, 353, 7, 4, 291, 292, 222, 223, 264, 265, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 207, 2, 350, 351, 350, 351, 23, 2, 296, 297, 437, 438, 40, 31, 40, 31, 9, 6, 5, 6, 243, 244, 197, 198, 245, 246, 28, 2, 346, 347, 124, 290, 346, 347, 346, 347, 224, 225, 23, 2, 392, 2, 293, 2, 23, 2, 296, 297, 21, 2, 284, 285, 216, 217, 350, 351, 205, 2, 224, 225, 262, 263, 282, 283, 23, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 208, 4, 352, 353, 352, 353, 7, 4, 298, 299, 439, 440, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 199, 200, 7, 4, 7, 4, 348, 349, 291, 292, 348, 349, 348, 349, 226, 4, 7, 4, 393, 4, 294, 295, 7, 4, 298, 299, 12, 4, 7, 4, 218, 219, 352, 353, 206, 4, 226, 4, 264, 265, 7, 4, 7, 4, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 346, 347, 23, 2, 296, 297, 24, 6, 5, 6, 241, 242, 28, 2, 220, 221, 350, 351, 346, 347, 350, 351, 293, 2, 346, 347, 350, 351, 23, 2, 23, 2, 23, 2, 23, 2, 445, 442, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 350, 351, 445, 442, 9, 6, 203, 204, 394, 395, 65, 15, 322, 323, 24, 6, 197, 198, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 348, 349, 7, 4, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 222, 223, 352, 353, 348, 349, 352, 353, 294, 295, 348, 349, 352, 353, 7, 4, 7, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 352, 353, 446, 440, 3, 4, 7, 4, 7, 4, 58, 4, 298, 299, 12, 4, 199, 200, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 216, 217, 350, 351, 224, 225, 296, 297, 21, 2, 293, 2, 350, 351, 23, 2, 350, 351, 346, 347, 346, 347, 346, 347, 350, 351, 23, 2, 346, 347, 346, 347, 346, 347, 350, 351, 445, 442, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 1, 2, 346, 347, 296, 297, 392, 2, 296, 297, 254, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 218, 219, 352, 353, 226, 4, 298, 299, 12, 4, 294, 295, 352, 353, 7, 4, 352, 353, 348, 349, 348, 349, 348, 349, 352, 353, 7, 4, 348, 349, 348, 349, 348, 349, 352, 353, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 3, 4, 348, 349, 298, 299, 393, 4, 298, 299, 255, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 216, 217, 124, 290, 296, 297, 21, 2, 262, 263, 346, 347, 346, 347, 350, 351, 350, 351, 350, 351, 346, 347, 224, 225, 346, 347, 346, 347, 216, 217, 282, 283, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 303, 304, 62, 2, 296, 297, 21, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 218, 219, 291, 292, 298, 299, 12, 4, 264, 265, 348, 349, 348, 349, 352, 353, 352, 353, 352, 353, 348, 349, 226, 4, 348, 349, 348, 349, 218, 219, 7, 4, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 305, 306, 63, 4, 298, 299, 12, 4, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 346, 347, 262, 263, 38, 35, 34, 35, 441, 442, 13, 2, 346, 347, 262, 263, 262, 263, 23, 2, 350, 351, 23, 2, 445, 442, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 282, 283, 350, 351, 445, 442, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 348, 349, 264, 265, 39, 33, 36, 33, 443, 440, 3, 4, 348, 349, 264, 265, 264, 265, 7, 4, 352, 353, 7, 4, 446, 440, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 446, 440, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 224, 225, 23, 2, 350, 351, 23, 2, 437, 438, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 226, 4, 7, 4, 352, 353, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":34, + "firstgid":1, + "image":"dungeon.png", + "imageheight":2240, + "imagewidth":2176, + "margin":0, + "name":"dungeon", + "spacing":0, + "tilecount":476, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l4/level.json b/gamefilesd/level/l4/level.json new file mode 100755 index 00000000..96b2de3a --- /dev/null +++ b/gamefilesd/level/l4/level.json @@ -0,0 +1,24 @@ +{ + "palette": [ + { + "id": "l1_4", + "file": "levels/l1data/l1_4.pal" + } + ], + "load": ["level/l1/l1s.json", "l1_4"], + "level": { + "id": "level", + "palette": "l1_4", + "file": "levels/l1data/l1.cel", + "layers": { "index": 2, "texturePack": "l1s" }, + "outOfBoundsTileLayer2": 21, + "til": "levels/l1data/l1.til", + "min": "levels/l1data/l1.min", + "minBlocks": 10, + "sol": "levels/l1data/l1.sol" + }, + "load": "level/automap/l1/load.json", + "load": "level/l4/levelObjects.json", + "load": "level/l4/monsters.json", + "load": "level/l4/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l4/level2.json b/gamefilesd/level/l4/level2.json new file mode 100755 index 00000000..03b6275f --- /dev/null +++ b/gamefilesd/level/l4/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "l4", + "name": "4", + "map": { "file": "level/l4/l4.json", "indexOffset": -1, "defaultTile": 12 } + }, + "load": "level/l4/levelObjects2.json", + "load": "level/l4/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l4/levelObjects2.json b/gamefilesd/level/l4/levelObjects2.json new file mode 100755 index 00000000..c6c6c7c5 --- /dev/null +++ b/gamefilesd/level/l4/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [79, 58], + "properties": { + "x": 31, + "y": 44, + "level": 5 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [50, 61], + "properties": { + "x": 77, + "y": 67, + "level": 3 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l4/music.json b/gamefilesd/level/l4/music.json new file mode 100755 index 00000000..a4b80564 --- /dev/null +++ b/gamefilesd/level/l4/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvla.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l5/l2s.json b/gamefilesd/level/l5/l2s.json new file mode 100755 index 00000000..871d679e --- /dev/null +++ b/gamefilesd/level/l5/l2s.json @@ -0,0 +1,52 @@ +{ + "texturePack": [ + { + "id": "l2s", + "file": "levels/l2data/l2s.cel", + "imageContainer": "l2s", + "palette": "{1}", + "rects": [ + { "index": 0, "rect": [0, 0, 64, 160], "offset": [32, 16] }, + { "index": 1, "rect": [0, 0, 64, 160], "offset": [32, 16] }, + { "index": 2, "rect": [0, 0, 64, 160] }, + { "index": 3, "rect": [0, 0, 64, 160] }, + { "index": 4, "rect": [0, 0, 64, 160] }, + { "index": 5, "rect": [0, 0, 64, 160] }, + { "index": 0, "rect": [0, 0, 64, 160], "offset": [-64, 32] }, + { "index": 1, "rect": [0, 0, 64, 160], "offset": [-64, 32] }, + { "index": 2, "rect": [0, 0, 64, 160], "offset": [64, 32] }, + { "index": 3, "rect": [0, 0, 64, 160], "offset": [64, 32] }, + { "index": 1, "rect": [0, 0, 64, 160], "offset": [0, 32] } + ], + "textureIndexes": [ + [12, 4], + [16, 5], + [130, 7], + [131, 6], + [133, 8], + [134, 9], + [137, 8], + [138, 9], + [140, 8], + [142, 8], + [145, 2], + [146, 3], + [153, 1], + [155, 0], + [516, 10], + [550, 4] + ] + }, + { + "id": "l2s_2", + "imageContainer": "l2s", + "palette": "{1}", + "rects": [ + { "index": 1, "rect": [0, 0, 64, 160], "offset": [-64, 32] } + ], + "textureIndexes": [ + [137, 0] + ] + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l5/l5.json b/gamefilesd/level/l5/l5.json new file mode 100755 index 00000000..a6f70fe6 --- /dev/null +++ b/gamefilesd/level/l5/l5.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 5, 6, 299, 300, 5, 6, 422, 423, 426, 427, 253, 254, 107, 108, 5, 6, 5, 6, 68, 69, 103, 104, 422, 423, 426, 427, 5, 6, 103, 104, 291, 292, 5, 6, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 7, 8, 301, 302, 7, 8, 424, 425, 428, 429, 255, 256, 109, 110, 7, 8, 7, 8, 70, 71, 105, 106, 424, 425, 428, 429, 7, 8, 105, 106, 293, 294, 7, 8, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 311, 312, 9, 10, 9, 10, 319, 320, 371, 372, 9, 10, 9, 10, 9, 10, 406, 407, 410, 411, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 313, 314, 11, 12, 11, 12, 321, 322, 373, 374, 11, 12, 11, 12, 11, 12, 408, 409, 412, 413, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 250, 10, 558, 22, 9, 10, 29, 30, 5, 6, 5, 6, 25, 26, 9, 10, 9, 10, 430, 431, 438, 439, 303, 304, 299, 300, 5, 6, 291, 292, 5, 6, 25, 26, 387, 388, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 554, 252, 559, 268, 11, 12, 31, 32, 7, 8, 7, 8, 27, 28, 11, 12, 11, 12, 432, 433, 440, 441, 305, 306, 301, 302, 7, 8, 293, 294, 7, 8, 27, 28, 389, 390, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 555, 556, 9, 10, 9, 10, 275, 276, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 434, 435, 442, 443, 1, 2, 430, 431, 438, 439, 311, 312, 9, 10, 279, 280, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 557, 12, 11, 12, 11, 12, 277, 278, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 436, 437, 444, 445, 3, 4, 432, 433, 440, 441, 313, 314, 11, 12, 281, 282, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 9, 10, 462, 463, 470, 471, 60, 61, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 450, 451, 434, 435, 442, 443, 9, 10, 315, 316, 283, 284, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 11, 12, 464, 465, 472, 473, 62, 63, 11, 12, 157, 158, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 452, 453, 436, 437, 444, 445, 11, 12, 317, 318, 285, 286, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 482, 483, 490, 491, 9, 10, 466, 467, 474, 475, 1, 2, 375, 376, 166, 167, 131, 22, 9, 10, 9, 10, 9, 10, 9, 10, 446, 447, 9, 10, 307, 308, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 484, 485, 492, 493, 11, 12, 468, 469, 476, 477, 3, 4, 377, 378, 168, 169, 132, 133, 11, 12, 11, 12, 11, 12, 11, 12, 448, 449, 11, 12, 309, 310, 11, 12, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 478, 479, 486, 487, 9, 10, 402, 403, 9, 10, 279, 280, 315, 316, 153, 154, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 159, 160, 150, 10, 275, 276, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 454, 455, 458, 459, 5, 6, 5, 6, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 480, 481, 488, 489, 11, 12, 404, 405, 157, 158, 281, 282, 317, 318, 155, 156, 11, 12, 11, 12, 11, 12, 11, 12, 157, 158, 3, 4, 11, 12, 11, 12, 161, 162, 151, 152, 277, 278, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 456, 457, 460, 461, 7, 8, 7, 8, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 406, 407, 410, 411, 398, 399, 163, 164, 33, 34, 5, 6, 5, 6, 21, 22, 9, 10, 9, 10, 9, 10, 163, 164, 33, 34, 5, 6, 299, 300, 134, 135, 146, 147, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 482, 483, 490, 491, 462, 463, 470, 471, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 408, 409, 412, 413, 400, 401, 11, 165, 35, 36, 7, 8, 7, 8, 23, 24, 11, 12, 11, 12, 11, 12, 11, 165, 35, 36, 7, 8, 301, 302, 136, 137, 148, 149, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 484, 485, 492, 493, 464, 465, 472, 473, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 90, 91, 319, 320, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 402, 403, 9, 10, 315, 316, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 307, 308, 9, 10, 9, 10, 307, 308, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 478, 479, 486, 487, 466, 467, 474, 475, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 92, 93, 321, 322, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 404, 405, 11, 12, 317, 318, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 309, 310, 11, 12, 11, 12, 309, 310, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 480, 481, 488, 489, 468, 469, 476, 477, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 307, 308, 371, 372, 402, 403, 9, 10, 9, 10, 9, 10, 398, 399, 387, 388, 307, 308, 528, 529, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 9, 10, 406, 407, 410, 411, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 309, 310, 373, 374, 404, 405, 11, 12, 11, 12, 11, 12, 400, 401, 389, 390, 309, 310, 530, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 11, 12, 408, 409, 412, 413, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 5, 6, 21, 22, 9, 10, 9, 10, 398, 399, 9, 10, 9, 10, 9, 10, 528, 529, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 7, 8, 23, 24, 11, 12, 11, 12, 400, 401, 11, 12, 11, 12, 157, 158, 530, 523, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 315, 316, 250, 10, 266, 22, 9, 10, 9, 10, 163, 164, 33, 34, 5, 6, 454, 455, 458, 459, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 159, 160, 150, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 317, 318, 251, 252, 267, 268, 11, 12, 11, 12, 11, 165, 35, 36, 7, 8, 456, 457, 460, 461, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 161, 162, 151, 152, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 76, 77, 9, 10, 319, 320, 311, 312, 9, 265, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 134, 135, 146, 147, 45, 46, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 78, 79, 11, 12, 321, 322, 313, 314, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 157, 158, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 136, 137, 148, 149, 47, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 406, 407, 410, 411, 9, 10, 9, 10, 303, 304, 103, 104, 295, 296, 5, 6, 5, 6, 25, 26, 163, 164, 33, 34, 5, 6, 5, 6, 72, 73, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 5, 6, 5, 6, 5, 6, 21, 22, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 408, 409, 412, 413, 11, 12, 11, 12, 305, 306, 105, 106, 297, 298, 7, 8, 7, 8, 27, 28, 11, 165, 35, 36, 7, 8, 7, 8, 74, 75, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 7, 8, 7, 8, 7, 8, 23, 24, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 311, 312, 307, 308, 9, 10, 462, 463, 470, 471, 275, 276, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 311, 312, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 313, 314, 309, 310, 11, 12, 464, 465, 472, 473, 277, 278, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 313, 314, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 466, 467, 474, 475, 283, 284, 315, 316, 9, 10, 9, 10, 9, 10, 283, 284, 375, 376, 402, 403, 395, 396, 9, 10, 307, 308, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 468, 469, 476, 477, 285, 286, 317, 318, 11, 12, 11, 12, 11, 12, 285, 286, 377, 378, 404, 405, 11, 397, 11, 12, 309, 310, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 418, 419, 402, 403, 9, 10, 9, 10, 9, 10, 482, 483, 490, 491, 398, 399, 307, 308, 9, 10, 9, 10, 371, 372, 375, 376, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 528, 529, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 420, 421, 404, 405, 11, 12, 11, 12, 11, 12, 484, 485, 492, 493, 400, 401, 309, 310, 11, 12, 11, 12, 373, 374, 377, 378, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 530, 523, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 462, 463, 470, 471, 9, 10, 9, 10, 9, 10, 414, 415, 398, 399, 9, 10, 159, 160, 150, 10, 478, 479, 486, 487, 9, 10, 9, 10, 371, 372, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 29, 30, 5, 6, 5, 6, 33, 34, 17, 18, 33, 34, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 464, 465, 472, 473, 11, 12, 11, 12, 157, 158, 416, 417, 400, 401, 11, 12, 161, 162, 151, 152, 480, 481, 488, 489, 11, 12, 11, 12, 373, 374, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 31, 32, 7, 8, 7, 8, 35, 36, 19, 20, 35, 36, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 466, 467, 474, 475, 9, 10, 406, 407, 163, 164, 33, 34, 494, 495, 498, 499, 134, 135, 146, 147, 21, 22, 9, 10, 9, 10, 315, 316, 391, 392, 9, 10, 319, 320, 9, 10, 37, 38, 44, 38, 283, 284, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 406, 407, 410, 411, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 468, 469, 476, 477, 11, 12, 408, 409, 11, 165, 35, 36, 496, 497, 500, 501, 136, 137, 148, 149, 23, 24, 11, 12, 11, 12, 317, 318, 393, 394, 11, 12, 321, 322, 11, 12, 39, 40, 43, 40, 285, 286, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 408, 409, 412, 413, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 29, 30, 257, 258, 261, 262, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 31, 32, 259, 260, 263, 264, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 29, 30, 5, 6, 17, 18, 5, 6, 21, 22, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 450, 451, 9, 10, 9, 10, 9, 10, 29, 30, 21, 22, 379, 380, 9, 10, 33, 34, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 31, 32, 7, 8, 19, 20, 7, 8, 23, 24, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 452, 453, 11, 12, 11, 12, 11, 12, 31, 32, 23, 24, 381, 382, 11, 12, 35, 36, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 406, 407, 410, 411, 9, 10, 9, 10, 9, 10, 391, 392, 9, 10, 9, 10, 37, 38, 44, 38, 446, 447, 9, 10, 9, 10, 9, 10, 1, 2, 391, 392, 9, 10, 9, 10, 379, 380, 242, 243, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 408, 409, 412, 413, 11, 12, 11, 12, 11, 12, 393, 394, 11, 12, 11, 12, 39, 40, 43, 40, 448, 449, 11, 12, 11, 12, 11, 12, 3, 4, 393, 394, 11, 12, 11, 12, 381, 382, 244, 245, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 21, 22, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 1, 2, 9, 10, 29, 30, 5, 6, 33, 34, 25, 26, 9, 10, 9, 10, 29, 30, 33, 34, 253, 254, 25, 26, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 23, 24, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 3, 4, 11, 12, 31, 32, 7, 8, 35, 36, 27, 28, 11, 12, 11, 12, 31, 32, 35, 36, 255, 256, 27, 28, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 45, 46, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 450, 451, 9, 10, 1, 2, 9, 10, 9, 10, 238, 239, 383, 384, 9, 10, 238, 239, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 47, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 452, 453, 11, 12, 3, 4, 11, 12, 11, 12, 240, 241, 385, 386, 11, 12, 240, 241, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 9, 10, 551, 544, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 551, 544, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 11, 12, 552, 546, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 552, 546, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 510, 511, 150, 10, 528, 529, 41, 42, 524, 525, 53, 54, 44, 38, 303, 304, 494, 495, 498, 499, 5, 6, 5, 6, 5, 6, 25, 26, 9, 10, 1, 2, 9, 10, 9, 10, 242, 243, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 512, 513, 151, 152, 530, 523, 43, 40, 526, 523, 52, 40, 43, 40, 305, 306, 496, 497, 500, 501, 7, 8, 7, 8, 7, 8, 27, 28, 11, 12, 3, 4, 11, 12, 11, 12, 244, 245, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 134, 135, 146, 147, 33, 34, 5, 6, 299, 300, 5, 6, 5, 6, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 13, 14, 9, 10, 1, 2, 9, 10, 9, 10, 25, 26, 9, 10, 9, 10, 25, 26, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 136, 137, 148, 149, 35, 36, 7, 8, 301, 302, 7, 8, 7, 8, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 15, 16, 157, 158, 3, 4, 11, 12, 11, 12, 27, 28, 11, 12, 157, 158, 27, 28, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 13, 14, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 450, 451, 163, 164, 33, 34, 5, 6, 29, 30, 21, 22, 395, 396, 163, 164, 33, 34, 29, 30, 253, 254, 21, 22, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 15, 16, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 452, 453, 11, 165, 35, 36, 7, 8, 31, 32, 23, 24, 11, 397, 11, 165, 35, 36, 31, 32, 255, 256, 23, 24, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 246, 247, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 446, 447, 9, 10, 9, 10, 9, 10, 234, 235, 387, 388, 9, 10, 383, 384, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 157, 158, 248, 249, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 448, 449, 11, 12, 11, 12, 11, 12, 236, 237, 389, 390, 11, 12, 385, 386, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 163, 164, 269, 270, 9, 10, 406, 407, 410, 411, 9, 10, 45, 46, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 25, 26, 9, 10, 9, 10, 9, 10, 238, 239, 29, 30, 17, 18, 111, 112, 25, 26, 242, 243, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 165, 271, 272, 11, 12, 408, 409, 412, 413, 11, 12, 47, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 27, 28, 11, 12, 11, 12, 11, 12, 240, 241, 31, 32, 19, 20, 113, 114, 27, 28, 244, 245, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 29, 30, 21, 22, 9, 10, 387, 388, 33, 34, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 31, 32, 23, 24, 11, 12, 389, 390, 35, 36, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 430, 431, 438, 439, 9, 10, 238, 239, 383, 384, 395, 396, 9, 10, 9, 10, 238, 239, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 432, 433, 440, 441, 11, 12, 240, 241, 385, 386, 11, 397, 11, 12, 11, 12, 240, 241, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 434, 435, 442, 443, 9, 10, 242, 243, 9, 10, 387, 388, 9, 10, 9, 10, 242, 243, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 436, 437, 444, 445, 157, 158, 244, 245, 11, 12, 389, 390, 11, 12, 11, 12, 244, 245, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 9, 10, 9, 10, 163, 164, 33, 34, 25, 26, 9, 10, 9, 10, 29, 30, 21, 22, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 11, 12, 11, 12, 11, 165, 35, 36, 27, 28, 11, 12, 11, 12, 31, 32, 23, 24, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 9, 10, 9, 10, 9, 10, 9, 10, 33, 34, 17, 18, 540, 18, 21, 22, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 11, 12, 11, 12, 11, 12, 11, 12, 35, 36, 19, 20, 19, 20, 23, 24, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"catacombs.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"catacombs", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l5/level.json b/gamefilesd/level/l5/level.json index 3500d8fc..8681b2af 100755 --- a/gamefilesd/level/l5/level.json +++ b/gamefilesd/level/l5/level.json @@ -1,29 +1,27 @@ { "palette": [ { - "id": "l2", - "file":"levels/l2data/l2.pal" + "id": "l2_1", + "file": "levels/l2data/l2_1.pal" } ], + "load": ["level/l5/l2s.json", "l2_1"], "level": { "id": "level", - "path": "l5", - "name": "Chamber of Bones", - "palette": "l2", + "palette": "l2_1", "file": "levels/l2data/l2.cel", - "outOfBoundsTileTop": 11, - "map": { "file": "levels/l2data/bonecha1.dun", "defaultTile": 2 }, + "layers": [ + { "index": 2, "texturePack": "l2s" }, + { "index": 3, "texturePack": "l2s_2" } + ], + "outOfBoundsTileLayer2": 11, "til": "levels/l2data/l2.til", "min": "levels/l2data/l2.min", "minBlocks": 10, "sol": "levels/l2data/l2.sol" }, - "levelObject": { - "id": "town", - "name": "Up to town", - "mapPosition": [56, 22], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/town/load.json", "positionPlayer", "[49, 22]"] } - } + "load": "level/automap/l2/load.json", + "load": "level/l5/levelObjects.json", + "load": "level/l5/monsters.json", + "load": "level/l5/level2.json" } \ No newline at end of file diff --git a/gamefilesd/level/l5/level2.json b/gamefilesd/level/l5/level2.json new file mode 100755 index 00000000..c78bfb99 --- /dev/null +++ b/gamefilesd/level/l5/level2.json @@ -0,0 +1,16 @@ +{ + "level": { + "id": "level", + "path": "l5", + "name": "5", + "map": { "file": "level/l5/l5.json", "indexOffset": -1, "defaultTile": 2 } + }, + "load": "level/l5/levelObjects2.json", + "load": "level/l5/monsters2.json", + "load": ["level/town/loadPassages.json", "true", "false", "false"], + "event": { + "time": 1.5, + "addToFront": true, + "action": { "name": "load", "file": ["res/player/sound/load.json", 96, "", "playAudio", "currentLevel"] } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l5/levelObjects2.json b/gamefilesd/level/l5/levelObjects2.json new file mode 100755 index 00000000..a31a6dd3 --- /dev/null +++ b/gamefilesd/level/l5/levelObjects2.json @@ -0,0 +1,33 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [41, 78], + "properties": { + "x": 29, + "y": 66, + "level": 6 + } + }, + { + "id": "town", + "class": "levelTown", + "mapPosition": [30, 25], + "properties": { + "x": 49, + "y": 22 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [30, 43], + "properties": { + "x": 79, + "y": 59, + "level": 4 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l5/load.json b/gamefilesd/level/l5/load.json deleted file mode 100755 index 30a870f8..00000000 --- a/gamefilesd/level/l5/load.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "load": ["level/load.json", "l5", "{1}", "{2}", "cut2"] -} \ No newline at end of file diff --git a/gamefilesd/level/l5/map.json b/gamefilesd/level/l5/map.json deleted file mode 100755 index 9fe14d33..00000000 --- a/gamefilesd/level/l5/map.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "action": { - "name": "if.equal", - "param1": "%showMap%", - "param2": true, - "then": { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, - "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } - } -} \ No newline at end of file diff --git a/gamefilesd/level/l5/townToLevel.json b/gamefilesd/level/l5/townToLevel.json new file mode 100755 index 00000000..b4171451 --- /dev/null +++ b/gamefilesd/level/l5/townToLevel.json @@ -0,0 +1,11 @@ +{ + "levelObject": { + "id": "catacombs", + "class": "levelCatacombs", + "mapPosition": [49, 21], + "properties": { + "x": 31, + "y": 26 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l6/l6.json b/gamefilesd/level/l6/l6.json new file mode 100755 index 00000000..6e49928e --- /dev/null +++ b/gamefilesd/level/l6/l6.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 127, 128, 5, 6, 291, 292, 299, 300, 291, 292, 72, 73, 291, 292, 5, 6, 494, 495, 498, 499, 291, 292, 299, 300, 5, 6, 5, 6, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 303, 304, 5, 6, 454, 455, 458, 459, 291, 292, 5, 6, 299, 300, 422, 423, 426, 427, 291, 292, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 129, 130, 7, 8, 293, 294, 301, 302, 293, 294, 74, 75, 293, 294, 7, 8, 496, 497, 500, 501, 293, 294, 301, 302, 7, 8, 7, 8, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 305, 306, 7, 8, 456, 457, 460, 461, 293, 294, 7, 8, 301, 302, 424, 425, 428, 429, 293, 294, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 9, 10, 9, 10, 9, 10, 9, 10, 379, 380, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 307, 308, 315, 316, 406, 407, 410, 411, 37, 38, 44, 38, 44, 38, 60, 61, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 11, 12, 11, 12, 11, 12, 11, 12, 381, 382, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 309, 310, 317, 318, 408, 409, 412, 413, 39, 40, 43, 40, 43, 40, 62, 63, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 9, 10, 303, 304, 5, 6, 5, 6, 295, 296, 422, 423, 426, 427, 5, 6, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 450, 451, 9, 10, 127, 128, 5, 6, 494, 495, 498, 499, 5, 6, 295, 296, 25, 26, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 11, 12, 305, 306, 7, 8, 7, 8, 297, 298, 424, 425, 428, 429, 7, 8, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 452, 453, 11, 12, 129, 130, 7, 8, 496, 497, 500, 501, 7, 8, 297, 298, 27, 28, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 279, 280, 9, 10, 430, 431, 438, 439, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 307, 308, 37, 38, 44, 38, 44, 38, 446, 447, 9, 10, 418, 419, 402, 403, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 281, 282, 11, 12, 432, 433, 440, 441, 11, 12, 11, 12, 157, 158, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 309, 310, 39, 40, 43, 40, 43, 40, 448, 449, 11, 12, 420, 421, 404, 405, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 64, 65, 387, 388, 434, 435, 442, 443, 379, 380, 9, 10, 166, 167, 131, 22, 462, 463, 470, 471, 371, 372, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 76, 77, 9, 10, 414, 415, 398, 399, 9, 10, 9, 10, 9, 10, 9, 10, 279, 280, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 66, 67, 389, 390, 436, 437, 444, 445, 381, 382, 11, 12, 168, 169, 132, 133, 464, 465, 472, 473, 373, 374, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 78, 79, 11, 12, 416, 417, 400, 401, 11, 12, 11, 12, 11, 12, 11, 12, 281, 282, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 315, 316, 9, 10, 153, 154, 9, 10, 466, 467, 474, 475, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 275, 276, 9, 10, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 157, 158, 3, 4, 11, 12, 11, 12, 11, 12, 317, 318, 11, 12, 155, 156, 11, 12, 468, 469, 476, 477, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 277, 278, 157, 158, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 242, 243, 163, 164, 33, 34, 494, 495, 498, 499, 291, 292, 454, 455, 458, 459, 5, 6, 21, 22, 9, 10, 9, 10, 9, 10, 9, 10, 307, 308, 9, 10, 37, 38, 44, 38, 44, 38, 1, 2, 163, 164, 33, 34, 5, 6, 5, 6, 17, 18, 295, 296, 5, 6, 287, 288, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 244, 245, 11, 165, 35, 36, 496, 497, 500, 501, 293, 294, 456, 457, 460, 461, 7, 8, 23, 24, 11, 12, 11, 12, 11, 12, 11, 12, 309, 310, 11, 12, 39, 40, 43, 40, 43, 40, 3, 4, 11, 165, 35, 36, 7, 8, 7, 8, 19, 20, 297, 298, 7, 8, 289, 290, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 60, 61, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 315, 316, 371, 372, 37, 38, 44, 38, 44, 38, 283, 284, 315, 316, 9, 10, 9, 10, 462, 463, 470, 471, 9, 10, 430, 431, 438, 439, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 62, 63, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 317, 318, 373, 374, 39, 40, 43, 40, 43, 40, 285, 286, 317, 318, 11, 12, 11, 12, 464, 465, 472, 473, 11, 12, 432, 433, 440, 441, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 524, 525, 25, 26, 9, 10, 395, 396, 430, 431, 438, 439, 311, 312, 462, 463, 470, 471, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 533, 534, 25, 26, 9, 10, 311, 312, 466, 467, 474, 475, 9, 10, 434, 435, 442, 443, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 526, 523, 27, 28, 11, 12, 11, 397, 432, 433, 440, 441, 313, 314, 464, 465, 472, 473, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 535, 523, 27, 28, 11, 12, 313, 314, 468, 469, 476, 477, 11, 12, 436, 437, 444, 445, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 434, 435, 442, 443, 9, 10, 466, 467, 474, 475, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 1, 2, 371, 372, 395, 396, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 436, 437, 444, 445, 11, 12, 468, 469, 476, 477, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 3, 4, 373, 374, 11, 397, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 9, 10, 9, 10, 406, 407, 410, 411, 9, 10, 9, 10, 45, 46, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 303, 304, 299, 300, 21, 22, 307, 308, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 12, 11, 12, 408, 409, 412, 413, 11, 12, 11, 12, 47, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 305, 306, 301, 302, 23, 24, 309, 310, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 315, 316, 9, 10, 9, 10, 9, 10, 9, 10, 371, 372, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 9, 10, 9, 10, 9, 10, 29, 30, 299, 300, 494, 495, 498, 499, 25, 26, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 317, 318, 11, 12, 11, 12, 11, 12, 11, 12, 373, 374, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 11, 12, 11, 12, 11, 12, 31, 32, 301, 302, 496, 497, 500, 501, 27, 28, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 524, 525, 303, 304, 5, 6, 17, 18, 102, 99, 291, 292, 5, 6, 33, 34, 98, 99, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 315, 316, 9, 10, 246, 247, 9, 10, 450, 451, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 526, 523, 305, 306, 7, 8, 19, 20, 100, 101, 293, 294, 7, 8, 35, 36, 100, 101, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 317, 318, 157, 158, 248, 249, 11, 12, 452, 453, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 311, 312, 9, 10, 9, 10, 9, 10, 159, 160, 150, 10, 520, 521, 44, 38, 44, 38, 44, 38, 29, 30, 5, 6, 25, 26, 371, 372, 163, 164, 269, 270, 9, 10, 446, 447, 9, 10, 406, 407, 410, 411, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 313, 314, 11, 12, 11, 12, 11, 12, 161, 162, 151, 152, 522, 523, 43, 40, 43, 40, 43, 40, 31, 32, 7, 8, 27, 28, 373, 374, 11, 165, 271, 272, 11, 12, 448, 449, 11, 12, 408, 409, 412, 413, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 524, 525, 303, 304, 5, 6, 299, 300, 134, 135, 146, 147, 33, 34, 253, 254, 291, 292, 5, 6, 25, 26, 9, 10, 13, 14, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 279, 280, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 526, 523, 305, 306, 7, 8, 301, 302, 136, 137, 148, 149, 35, 36, 255, 256, 293, 294, 7, 8, 27, 28, 11, 12, 15, 16, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 281, 282, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 395, 396, 387, 388, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 13, 14, 307, 308, 283, 284, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 159, 160, 150, 10, 283, 284, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 397, 389, 390, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 15, 16, 309, 310, 285, 286, 11, 12, 11, 12, 11, 12, 157, 158, 3, 4, 11, 12, 161, 162, 151, 152, 285, 286, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 275, 276, 395, 396, 528, 529, 524, 525, 25, 26, 9, 10, 163, 164, 33, 34, 5, 6, 134, 135, 146, 147, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 277, 278, 11, 397, 530, 523, 526, 523, 27, 28, 11, 12, 11, 165, 35, 36, 7, 8, 136, 137, 148, 149, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 315, 316, 9, 10, 319, 320, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 29, 30, 17, 18, 531, 521, 44, 38, 76, 77, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 317, 318, 11, 12, 321, 322, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 31, 32, 19, 20, 532, 523, 43, 40, 78, 79, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 533, 534, 303, 304, 299, 300, 17, 18, 72, 73, 291, 292, 5, 6, 5, 6, 5, 6, 21, 22, 9, 10, 33, 34, 528, 529, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 535, 523, 305, 306, 301, 302, 19, 20, 74, 75, 293, 294, 7, 8, 7, 8, 7, 8, 23, 24, 11, 12, 35, 36, 530, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 5, 6, 5, 6, 295, 296, 107, 108, 299, 300, 5, 6, 299, 300, 102, 99, 5, 6, 531, 521, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 462, 463, 470, 471, 9, 10, 159, 160, 150, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 7, 8, 7, 8, 297, 298, 109, 110, 301, 302, 7, 8, 301, 302, 100, 101, 7, 8, 532, 523, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 464, 465, 472, 473, 11, 12, 161, 162, 151, 152, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 375, 376, 9, 10, 9, 10, 9, 10, 307, 308, 9, 10, 520, 521, 44, 38, 44, 38, 50, 51, 41, 42, 524, 525, 25, 26, 9, 10, 9, 10, 466, 467, 474, 475, 9, 10, 143, 135, 146, 147, 33, 34, 98, 99, 295, 296, 257, 258, 295, 296, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 377, 378, 11, 12, 11, 12, 11, 12, 309, 310, 157, 158, 522, 523, 43, 40, 43, 40, 52, 40, 43, 40, 526, 523, 27, 28, 11, 12, 11, 12, 468, 469, 476, 477, 11, 12, 144, 145, 148, 149, 35, 36, 100, 101, 297, 298, 259, 260, 297, 298, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 387, 388, 303, 304, 5, 6, 291, 292, 25, 26, 163, 164, 33, 34, 291, 292, 102, 99, 107, 108, 5, 6, 299, 300, 21, 22, 402, 403, 9, 10, 9, 10, 45, 46, 524, 525, 25, 26, 9, 10, 462, 463, 470, 471, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 389, 390, 305, 306, 7, 8, 293, 294, 27, 28, 11, 165, 35, 36, 293, 294, 100, 101, 109, 110, 7, 8, 301, 302, 23, 24, 404, 405, 11, 12, 11, 12, 47, 40, 526, 523, 27, 28, 11, 12, 464, 465, 472, 473, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 482, 483, 490, 491, 250, 10, 266, 22, 9, 10, 275, 276, 9, 10, 9, 10, 275, 276, 9, 10, 402, 403, 9, 10, 9, 10, 307, 308, 9, 10, 9, 10, 9, 10, 398, 399, 430, 431, 438, 439, 37, 38, 44, 38, 450, 451, 307, 308, 466, 467, 474, 475, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 484, 485, 492, 493, 251, 252, 267, 268, 11, 12, 277, 278, 11, 12, 11, 12, 277, 278, 11, 12, 404, 405, 11, 12, 11, 12, 309, 310, 11, 12, 11, 12, 11, 12, 400, 401, 432, 433, 440, 441, 39, 40, 43, 40, 452, 453, 309, 310, 468, 469, 476, 477, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 478, 479, 486, 487, 9, 265, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 1, 2, 9, 10, 398, 399, 9, 10, 9, 10, 9, 10, 9, 10, 315, 316, 307, 308, 9, 10, 434, 435, 442, 443, 37, 38, 44, 38, 446, 447, 9, 10, 9, 10, 371, 372, 9, 10, 311, 312, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 480, 481, 488, 489, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 3, 4, 11, 12, 400, 401, 11, 12, 11, 12, 11, 12, 11, 12, 317, 318, 309, 310, 11, 12, 436, 437, 444, 445, 39, 40, 43, 40, 448, 449, 11, 12, 11, 12, 373, 374, 11, 12, 313, 314, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 430, 431, 438, 439, 9, 10, 1, 2, 9, 10, 9, 10, 13, 14, 9, 10, 9, 10, 315, 316, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 1, 2, 315, 316, 9, 10, 9, 10, 319, 320, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 432, 433, 440, 441, 11, 12, 3, 4, 11, 12, 11, 12, 15, 16, 11, 12, 11, 12, 317, 318, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 3, 4, 317, 318, 11, 12, 11, 12, 321, 322, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 434, 435, 442, 443, 9, 10, 283, 284, 406, 407, 410, 411, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 50, 51, 41, 42, 524, 525, 303, 304, 17, 18, 494, 495, 498, 499, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 436, 437, 444, 445, 11, 12, 285, 286, 408, 409, 412, 413, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 52, 40, 43, 40, 526, 523, 305, 306, 19, 20, 496, 497, 500, 501, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 307, 308, 9, 10, 9, 10, 279, 280, 9, 10, 9, 10, 94, 95, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 311, 312, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 379, 380, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 309, 310, 11, 12, 157, 158, 281, 282, 11, 12, 11, 12, 96, 97, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 313, 314, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 381, 382, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 430, 431, 438, 439, 395, 396, 163, 164, 33, 34, 295, 296, 257, 258, 287, 288, 375, 376, 45, 46, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 533, 534, 29, 30, 5, 6, 17, 18, 33, 34, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 432, 433, 440, 441, 11, 397, 11, 165, 35, 36, 297, 298, 259, 260, 289, 290, 377, 378, 47, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 535, 523, 31, 32, 7, 8, 19, 20, 35, 36, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 434, 435, 442, 443, 315, 316, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 5, 6, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 436, 437, 444, 445, 317, 318, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 7, 8, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 291, 292, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 25, 26, 9, 10, 13, 14, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 293, 294, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 27, 28, 11, 12, 15, 16, 11, 12, 157, 158, 11, 12, 157, 158, 11, 12, 157, 158, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 291, 292, 25, 26, 406, 407, 410, 411, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 1, 2, 9, 10, 163, 164, 138, 139, 163, 164, 134, 135, 163, 164, 131, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 293, 294, 27, 28, 408, 409, 412, 413, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 3, 4, 11, 12, 11, 165, 132, 140, 11, 165, 136, 137, 11, 165, 132, 133, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 5, 6, 5, 6, 299, 300, 5, 6, 5, 6, 5, 6, 5, 6, 514, 515, 131, 22, 9, 10, 13, 14, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 13, 14, 9, 10, 283, 284, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 7, 8, 7, 8, 301, 302, 7, 8, 7, 8, 7, 8, 7, 8, 516, 517, 132, 133, 11, 12, 15, 16, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 15, 16, 11, 12, 285, 286, 11, 12, 157, 158, 11, 12, 11, 12, 11, 12, 157, 158, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 153, 154, 9, 10, 9, 10, 418, 419, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 402, 403, 9, 10, 1, 2, 9, 10, 1, 2, 9, 10, 163, 164, 131, 22, 250, 10, 266, 22, 163, 164, 131, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 155, 156, 11, 12, 11, 12, 420, 421, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 404, 405, 11, 12, 3, 4, 11, 12, 3, 4, 11, 12, 11, 165, 132, 133, 251, 252, 267, 268, 11, 165, 132, 133, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 25, 26, 9, 10, 414, 415, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 398, 399, 9, 10, 528, 529, 524, 525, 25, 26, 9, 10, 9, 10, 9, 10, 9, 265, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 27, 28, 11, 12, 416, 417, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 400, 401, 11, 12, 530, 523, 526, 523, 27, 28, 11, 12, 157, 158, 11, 12, 11, 12, 11, 12, 157, 158, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 524, 525, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 1, 2, 9, 10, 163, 164, 134, 135, 9, 10, 134, 135, 163, 164, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 3, 4, 11, 12, 11, 165, 136, 137, 11, 12, 136, 137, 11, 165, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"catacombs.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"catacombs", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l6/level.json b/gamefilesd/level/l6/level.json new file mode 100755 index 00000000..082abe5d --- /dev/null +++ b/gamefilesd/level/l6/level.json @@ -0,0 +1,27 @@ +{ + "palette": [ + { + "id": "l2_2", + "file": "levels/l2data/l2_2.pal" + } + ], + "load": ["level/l5/l2s.json", "l2_2"], + "level": { + "id": "level", + "palette": "l2_2", + "file": "levels/l2data/l2.cel", + "layers": [ + { "index": 2, "texturePack": "l2s" }, + { "index": 3, "texturePack": "l2s_2" } + ], + "outOfBoundsTileLayer2": 11, + "til": "levels/l2data/l2.til", + "min": "levels/l2data/l2.min", + "minBlocks": 10, + "sol": "levels/l2data/l2.sol" + }, + "load": "level/automap/l2/load.json", + "load": "level/l6/levelObjects.json", + "load": "level/l6/monsters.json", + "load": "level/l6/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l6/level2.json b/gamefilesd/level/l6/level2.json new file mode 100755 index 00000000..6c9aef1b --- /dev/null +++ b/gamefilesd/level/l6/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "l6", + "name": "6", + "map": { "file": "level/l6/l6.json", "indexOffset": -1, "defaultTile": 2 } + }, + "load": "level/l6/levelObjects2.json", + "load": "level/l6/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l6/levelObjects2.json b/gamefilesd/level/l6/levelObjects2.json new file mode 100755 index 00000000..a2c986c5 --- /dev/null +++ b/gamefilesd/level/l6/levelObjects2.json @@ -0,0 +1,34 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [75, 46], + "properties": { + "x": 27, + "y": 26, + "level": 7 + } + }, + { + "id": "down2", + "class": "levelDownCatacombs2", + "mapPosition": [84, 85], + "text1": "chamberBone", + "properties": { + "x": 57, + "y": 22 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [28, 65], + "properties": { + "x": 40, + "y": 80, + "level": 5 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l6/music.json b/gamefilesd/level/l6/music.json new file mode 100755 index 00000000..9da03bcb --- /dev/null +++ b/gamefilesd/level/l6/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvlb.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l7/l7.json b/gamefilesd/level/l7/l7.json new file mode 100755 index 00000000..610bd546 --- /dev/null +++ b/gamefilesd/level/l7/l7.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 5, 6, 5, 6, 494, 495, 498, 499, 295, 296, 5, 6, 5, 6, 291, 292, 5, 6, 295, 296, 261, 262, 299, 300, 111, 112, 5, 6, 295, 296, 102, 99, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 7, 8, 7, 8, 496, 497, 500, 501, 297, 298, 7, 8, 7, 8, 293, 294, 7, 8, 297, 298, 263, 264, 301, 302, 113, 114, 7, 8, 297, 298, 100, 101, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 238, 239, 9, 10, 315, 316, 371, 372, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 319, 320, 311, 312, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 240, 241, 11, 12, 317, 318, 373, 374, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 321, 322, 313, 314, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 250, 10, 266, 22, 9, 10, 9, 10, 246, 247, 311, 312, 303, 304, 299, 300, 5, 6, 5, 6, 295, 296, 5, 6, 72, 73, 25, 26, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 251, 252, 267, 268, 11, 12, 157, 158, 248, 249, 313, 314, 305, 306, 301, 302, 7, 8, 7, 8, 297, 298, 7, 8, 74, 75, 27, 28, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 9, 265, 9, 10, 9, 10, 163, 164, 269, 270, 9, 10, 1, 2, 9, 10, 9, 10, 430, 431, 438, 439, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 454, 455, 458, 459, 494, 495, 498, 499, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 12, 11, 12, 11, 12, 11, 165, 271, 272, 11, 12, 3, 4, 11, 12, 11, 12, 432, 433, 440, 441, 11, 12, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 456, 457, 460, 461, 496, 497, 500, 501, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 319, 320, 9, 10, 9, 10, 9, 10, 9, 10, 315, 316, 9, 10, 1, 2, 9, 10, 9, 10, 434, 435, 442, 443, 9, 10, 9, 10, 283, 284, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 319, 320, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 321, 322, 11, 12, 11, 12, 11, 12, 11, 12, 317, 318, 157, 158, 3, 4, 11, 12, 11, 12, 436, 437, 444, 445, 11, 12, 11, 12, 285, 286, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 321, 322, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 163, 164, 33, 34, 5, 6, 5, 6, 5, 6, 17, 18, 291, 292, 299, 300, 287, 288, 9, 10, 37, 38, 44, 38, 44, 38, 303, 304, 454, 455, 458, 459, 514, 515, 131, 22, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 165, 35, 36, 7, 8, 7, 8, 7, 8, 19, 20, 293, 294, 301, 302, 289, 290, 11, 12, 39, 40, 43, 40, 43, 40, 305, 306, 456, 457, 460, 461, 516, 517, 132, 133, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 482, 483, 490, 491, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 387, 388, 9, 10, 9, 10, 9, 10, 9, 10, 406, 407, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 1, 2, 315, 316, 9, 10, 153, 154, 9, 10, 315, 316, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 484, 485, 492, 493, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 389, 390, 11, 12, 11, 12, 11, 12, 11, 12, 408, 409, 157, 158, 11, 12, 522, 523, 43, 40, 43, 40, 3, 4, 317, 318, 11, 12, 155, 156, 11, 12, 317, 318, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 478, 479, 486, 487, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 528, 529, 25, 26, 9, 10, 9, 10, 402, 403, 9, 10, 9, 10, 9, 10, 163, 164, 33, 34, 33, 34, 454, 455, 458, 459, 29, 30, 5, 6, 17, 18, 528, 529, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 480, 481, 488, 489, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 530, 523, 27, 28, 11, 12, 11, 12, 404, 405, 11, 12, 11, 12, 11, 12, 11, 165, 35, 36, 35, 36, 456, 457, 460, 461, 31, 32, 7, 8, 19, 20, 530, 523, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 319, 320, 9, 10, 371, 372, 9, 10, 375, 376, 520, 521, 1, 273, 9, 10, 9, 10, 398, 399, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 315, 316, 9, 10, 9, 10, 13, 14, 9, 10, 9, 10, 37, 38, 283, 284, 159, 160, 150, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 321, 322, 11, 12, 373, 374, 11, 12, 377, 378, 522, 523, 3, 274, 11, 12, 11, 12, 400, 401, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 317, 318, 11, 12, 11, 12, 15, 16, 11, 12, 11, 12, 39, 40, 285, 286, 161, 162, 151, 152, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 482, 483, 490, 491, 9, 10, 9, 10, 311, 312, 9, 10, 25, 26, 9, 10, 45, 46, 41, 42, 41, 42, 524, 525, 533, 534, 25, 26, 9, 10, 520, 521, 303, 304, 134, 135, 146, 147, 45, 46, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 484, 485, 492, 493, 11, 12, 11, 12, 313, 314, 11, 12, 27, 28, 11, 12, 47, 40, 43, 40, 43, 40, 526, 523, 535, 523, 27, 28, 11, 12, 522, 523, 305, 306, 136, 137, 148, 149, 47, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 478, 479, 486, 487, 9, 10, 319, 320, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 524, 525, 53, 54, 25, 26, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 480, 481, 488, 489, 11, 12, 321, 322, 11, 12, 157, 158, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 526, 523, 52, 40, 27, 28, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 291, 292, 253, 254, 68, 69, 5, 6, 454, 455, 458, 459, 299, 300, 21, 22, 9, 10, 9, 10, 371, 372, 9, 10, 163, 164, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 406, 407, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 293, 294, 255, 256, 70, 71, 7, 8, 456, 457, 460, 461, 301, 302, 23, 24, 11, 12, 11, 12, 373, 374, 11, 12, 11, 165, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 408, 409, 157, 158, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 9, 10, 430, 431, 438, 439, 9, 10, 319, 320, 9, 10, 9, 10, 9, 10, 395, 396, 402, 403, 307, 308, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 163, 164, 33, 34, 291, 292, 5, 6, 295, 296, 5, 6, 494, 495, 498, 499, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 11, 12, 432, 433, 440, 441, 11, 12, 321, 322, 11, 12, 11, 12, 11, 12, 11, 397, 404, 405, 309, 310, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 165, 35, 36, 293, 294, 7, 8, 297, 298, 7, 8, 496, 497, 500, 501, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 482, 483, 490, 491, 9, 10, 434, 435, 442, 443, 9, 10, 402, 403, 371, 372, 9, 10, 9, 10, 9, 10, 398, 399, 9, 10, 406, 407, 410, 411, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 307, 308, 9, 10, 371, 372, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 484, 485, 492, 493, 11, 12, 436, 437, 444, 445, 11, 12, 404, 405, 373, 374, 11, 12, 11, 12, 11, 12, 400, 401, 11, 12, 408, 409, 412, 413, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 309, 310, 11, 12, 373, 374, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 478, 479, 486, 487, 9, 10, 307, 308, 9, 10, 9, 10, 398, 399, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 379, 380, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 524, 525, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 159, 160, 150, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 480, 481, 488, 489, 11, 12, 309, 310, 11, 12, 11, 12, 400, 401, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 381, 382, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 526, 523, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 161, 162, 151, 152, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 379, 380, 9, 10, 9, 10, 315, 316, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 430, 431, 438, 439, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 524, 525, 29, 30, 454, 455, 458, 459, 134, 135, 146, 147, 33, 34, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 381, 382, 11, 12, 11, 12, 317, 318, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 432, 433, 440, 441, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 526, 523, 31, 32, 456, 457, 460, 461, 136, 137, 148, 149, 35, 36, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 234, 235, 430, 431, 438, 439, 9, 10, 9, 10, 311, 312, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 434, 435, 442, 443, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 236, 237, 432, 433, 440, 441, 11, 12, 11, 12, 313, 314, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 436, 437, 444, 445, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 434, 435, 442, 443, 371, 372, 9, 10, 395, 396, 45, 46, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 295, 296, 25, 26, 9, 10, 9, 10, 9, 10, 9, 10, 406, 407, 410, 411, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 436, 437, 444, 445, 373, 374, 11, 12, 11, 397, 47, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 297, 298, 27, 28, 11, 12, 11, 12, 11, 12, 11, 12, 408, 409, 412, 413, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 5, 6, 295, 296, 21, 22, 9, 10, 13, 14, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 7, 8, 297, 298, 23, 24, 11, 12, 15, 16, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 462, 463, 470, 471, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 299, 300, 303, 304, 291, 292, 5, 6, 295, 296, 5, 6, 454, 455, 458, 459, 5, 6, 25, 26, 9, 10, 406, 407, 410, 411, 379, 380, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 464, 465, 472, 473, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 301, 302, 305, 306, 293, 294, 7, 8, 297, 298, 7, 8, 456, 457, 460, 461, 7, 8, 27, 28, 11, 12, 408, 409, 412, 413, 381, 382, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 90, 91, 9, 10, 466, 467, 474, 475, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 375, 376, 13, 14, 9, 10, 9, 10, 9, 10, 9, 10, 395, 396, 9, 10, 9, 10, 90, 91, 9, 10, 9, 10, 9, 10, 9, 10, 275, 276, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 92, 93, 11, 12, 468, 469, 476, 477, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 377, 378, 15, 16, 11, 12, 11, 12, 11, 12, 11, 12, 11, 397, 11, 12, 157, 158, 92, 93, 11, 12, 11, 12, 11, 12, 11, 12, 277, 278, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 303, 304, 257, 258, 5, 6, 454, 455, 458, 459, 102, 99, 299, 300, 5, 6, 25, 26, 9, 10, 279, 280, 9, 10, 9, 10, 402, 403, 315, 316, 9, 10, 9, 10, 166, 167, 131, 22, 9, 10, 9, 10, 528, 529, 524, 525, 29, 30, 17, 18, 295, 296, 528, 529, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 305, 306, 259, 260, 7, 8, 456, 457, 460, 461, 100, 101, 301, 302, 7, 8, 27, 28, 11, 12, 281, 282, 11, 12, 11, 12, 404, 405, 317, 318, 11, 12, 11, 12, 168, 169, 132, 133, 11, 12, 11, 12, 530, 523, 526, 523, 31, 32, 19, 20, 297, 298, 530, 523, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 371, 372, 9, 10, 13, 14, 9, 10, 13, 14, 9, 10, 9, 10, 398, 399, 9, 10, 371, 372, 9, 10, 153, 154, 9, 10, 9, 10, 528, 529, 53, 54, 44, 38, 450, 451, 9, 10, 9, 10, 33, 34, 454, 455, 458, 459, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 373, 374, 11, 12, 15, 16, 11, 12, 15, 16, 11, 12, 11, 12, 400, 401, 11, 12, 373, 374, 11, 12, 155, 156, 11, 12, 11, 12, 530, 523, 52, 40, 43, 40, 452, 453, 11, 12, 11, 12, 35, 36, 456, 457, 460, 461, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 9, 10, 9, 10, 9, 10, 9, 10, 391, 392, 9, 10, 9, 10, 275, 276, 9, 10, 528, 529, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 50, 51, 524, 525, 53, 54, 44, 38, 44, 38, 446, 447, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 11, 12, 11, 12, 11, 12, 11, 12, 393, 394, 11, 12, 11, 12, 277, 278, 11, 12, 530, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 526, 523, 52, 40, 43, 40, 43, 40, 448, 449, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 9, 10, 9, 10, 9, 10, 315, 316, 9, 10, 319, 320, 9, 10, 528, 529, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 11, 12, 11, 12, 11, 12, 317, 318, 11, 12, 321, 322, 11, 12, 530, 523, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 524, 525, 303, 304, 17, 18, 454, 455, 458, 459, 291, 292, 33, 34, 5, 6, 98, 99, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 524, 525, 25, 26, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 526, 523, 305, 306, 19, 20, 456, 457, 460, 461, 293, 294, 35, 36, 7, 8, 100, 101, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 526, 523, 27, 28, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 9, 10, 402, 403, 9, 10, 9, 10, 9, 10, 9, 10, 33, 34, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 11, 12, 404, 405, 11, 12, 11, 12, 11, 12, 11, 12, 35, 36, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 273, 9, 10, 371, 372, 398, 399, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 29, 30, 291, 292, 5, 6, 98, 99, 291, 292, 299, 300, 454, 455, 458, 459, 5, 6, 33, 34, 5, 6, 17, 18, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 274, 11, 12, 373, 374, 400, 401, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 31, 32, 293, 294, 7, 8, 100, 101, 293, 294, 301, 302, 456, 457, 460, 461, 7, 8, 35, 36, 7, 8, 19, 20, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 5, 6, 5, 6, 5, 6, 299, 300, 21, 22, 9, 10, 406, 407, 410, 411, 9, 10, 45, 46, 524, 525, 25, 26, 159, 160, 150, 10, 520, 521, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 7, 8, 7, 8, 7, 8, 301, 302, 23, 24, 11, 12, 408, 409, 412, 413, 11, 12, 47, 40, 526, 523, 27, 28, 161, 162, 151, 152, 522, 523, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 29, 30, 134, 135, 146, 147, 33, 34, 531, 521, 44, 38, 1, 2, 9, 10, 303, 304, 5, 6, 5, 6, 5, 6, 494, 495, 498, 499, 5, 6, 25, 26, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 31, 32, 136, 137, 148, 149, 35, 36, 532, 523, 43, 40, 3, 4, 11, 12, 305, 306, 7, 8, 7, 8, 7, 8, 496, 497, 500, 501, 7, 8, 27, 28, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 29, 30, 295, 296, 5, 6, 5, 6, 295, 296, 5, 6, 25, 26, 9, 10, 37, 38, 44, 38, 450, 451, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 279, 280, 9, 10, 450, 451, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 31, 32, 297, 298, 7, 8, 7, 8, 297, 298, 7, 8, 27, 28, 11, 12, 39, 40, 43, 40, 452, 453, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 281, 282, 11, 12, 452, 453, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 283, 284, 402, 403, 9, 10, 9, 10, 9, 10, 9, 10, 13, 14, 9, 10, 37, 38, 44, 38, 446, 447, 462, 463, 470, 471, 9, 10, 37, 38, 44, 38, 1, 2, 9, 10, 446, 447, 9, 10, 9, 10, 9, 10, 391, 392, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 285, 286, 404, 405, 11, 12, 11, 12, 11, 12, 11, 12, 15, 16, 11, 12, 39, 40, 43, 40, 448, 449, 464, 465, 472, 473, 11, 12, 39, 40, 43, 40, 3, 4, 11, 12, 448, 449, 11, 12, 11, 12, 11, 12, 393, 394, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 1, 2, 398, 399, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 1, 2, 466, 467, 474, 475, 9, 10, 520, 521, 44, 38, 279, 280, 9, 10, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 157, 158, 3, 4, 400, 401, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 3, 4, 468, 469, 476, 477, 11, 12, 522, 523, 43, 40, 281, 282, 157, 158, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 163, 164, 33, 34, 299, 300, 291, 292, 5, 6, 5, 6, 5, 6, 287, 288, 9, 10, 37, 38, 44, 38, 50, 51, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 1, 2, 163, 164, 33, 34, 5, 6, 5, 6, 5, 6, 17, 18, 5, 6, 5, 6, 21, 22, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 165, 35, 36, 301, 302, 293, 294, 7, 8, 7, 8, 7, 8, 289, 290, 11, 12, 39, 40, 43, 40, 52, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 3, 4, 11, 165, 35, 36, 7, 8, 7, 8, 7, 8, 19, 20, 7, 8, 7, 8, 23, 24, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"catacombs.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"catacombs", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l7/level.json b/gamefilesd/level/l7/level.json new file mode 100755 index 00000000..61876717 --- /dev/null +++ b/gamefilesd/level/l7/level.json @@ -0,0 +1,27 @@ +{ + "palette": [ + { + "id": "l2_3", + "file": "levels/l2data/l2_3.pal" + } + ], + "load": ["level/l5/l2s.json", "l2_3"], + "level": { + "id": "level", + "palette": "l2_3", + "file": "levels/l2data/l2.cel", + "layers": [ + { "index": 2, "texturePack": "l2s" }, + { "index": 3, "texturePack": "l2s_2" } + ], + "outOfBoundsTileLayer2": 11, + "til": "levels/l2data/l2.til", + "min": "levels/l2data/l2.min", + "minBlocks": 10, + "sol": "levels/l2data/l2.sol" + }, + "load": "level/automap/l2/load.json", + "load": "level/l7/levelObjects.json", + "load": "level/l7/monsters.json", + "load": "level/l7/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l7/level2.json b/gamefilesd/level/l7/level2.json new file mode 100755 index 00000000..0e9c0203 --- /dev/null +++ b/gamefilesd/level/l7/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "l7", + "name": "7", + "map": { "file": "level/l7/l7.json", "indexOffset": -1, "defaultTile": 2 } + }, + "load": "level/l7/levelObjects2.json", + "load": "level/l7/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l7/levelObjects2.json b/gamefilesd/level/l7/levelObjects2.json new file mode 100755 index 00000000..4ff98e08 --- /dev/null +++ b/gamefilesd/level/l7/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [33, 26], + "properties": { + "x": 29, + "y": 42, + "level": 8 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [26, 25], + "properties": { + "x": 74, + "y": 48, + "level": 6 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l7/music.json b/gamefilesd/level/l7/music.json new file mode 100755 index 00000000..9da03bcb --- /dev/null +++ b/gamefilesd/level/l7/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvlb.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l8/l8.json b/gamefilesd/level/l8/l8.json new file mode 100755 index 00000000..4ec80288 --- /dev/null +++ b/gamefilesd/level/l8/l8.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 295, 296, 72, 73, 295, 296, 299, 300, 454, 455, 458, 459, 5, 6, 494, 495, 498, 499, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 297, 298, 74, 75, 297, 298, 301, 302, 456, 457, 460, 461, 7, 8, 496, 497, 500, 501, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 375, 376, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 377, 378, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 76, 77, 9, 10, 9, 10, 246, 247, 311, 312, 29, 30, 291, 292, 5, 6, 25, 26, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 78, 79, 11, 12, 157, 158, 248, 249, 313, 314, 31, 32, 293, 294, 7, 8, 27, 28, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 163, 164, 269, 270, 9, 10, 1, 2, 9, 10, 371, 372, 1, 2, 319, 320, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 165, 271, 272, 11, 12, 3, 4, 11, 12, 373, 374, 3, 4, 321, 322, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 299, 300, 72, 73, 295, 296, 5, 6, 422, 423, 426, 427, 5, 6, 5, 6, 291, 292, 531, 521, 44, 38, 279, 280, 9, 10, 311, 312, 9, 10, 9, 10, 275, 276, 9, 10, 9, 10, 279, 280, 387, 388, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 301, 302, 74, 75, 297, 298, 7, 8, 424, 425, 428, 429, 7, 8, 7, 8, 293, 294, 532, 523, 43, 40, 281, 282, 11, 12, 313, 314, 11, 12, 11, 12, 277, 278, 11, 12, 157, 158, 281, 282, 389, 390, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 60, 61, 430, 431, 438, 439, 9, 10, 9, 10, 371, 372, 9, 10, 307, 308, 9, 10, 9, 10, 37, 38, 44, 38, 482, 483, 490, 491, 402, 403, 9, 10, 9, 10, 482, 483, 490, 491, 166, 167, 131, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 62, 63, 432, 433, 440, 441, 11, 12, 11, 12, 373, 374, 11, 12, 309, 310, 11, 12, 11, 12, 39, 40, 43, 40, 484, 485, 492, 493, 404, 405, 11, 12, 11, 12, 484, 485, 492, 493, 168, 169, 132, 133, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 434, 435, 442, 443, 9, 10, 9, 10, 29, 30, 454, 455, 458, 459, 25, 26, 9, 10, 37, 38, 44, 38, 478, 479, 486, 487, 398, 399, 9, 10, 9, 10, 478, 479, 486, 487, 153, 154, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 436, 437, 444, 445, 11, 12, 11, 12, 31, 32, 456, 457, 460, 461, 27, 28, 11, 12, 39, 40, 43, 40, 480, 481, 488, 489, 400, 401, 11, 12, 157, 158, 480, 481, 488, 489, 155, 156, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 406, 407, 410, 411, 9, 10, 283, 284, 9, 10, 9, 10, 283, 284, 9, 10, 37, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 163, 164, 33, 34, 295, 296, 5, 6, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 408, 409, 412, 413, 11, 12, 285, 286, 11, 12, 11, 12, 285, 286, 11, 12, 39, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 165, 35, 36, 297, 298, 7, 8, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 371, 372, 279, 280, 311, 312, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 275, 276, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 319, 320, 9, 10, 520, 521, 44, 38, 44, 38, 29, 30, 5, 6, 299, 300, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 373, 374, 281, 282, 313, 314, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 277, 278, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 321, 322, 11, 12, 522, 523, 43, 40, 43, 40, 31, 32, 7, 8, 301, 302, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 311, 312, 379, 380, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 538, 14, 9, 10, 37, 38, 44, 38, 50, 51, 41, 42, 524, 525, 25, 26, 402, 403, 375, 376, 9, 10, 9, 10, 9, 10, 528, 529, 53, 54, 44, 38, 44, 38, 275, 276, 9, 10, 9, 10, 33, 34, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 313, 314, 381, 382, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 15, 16, 11, 12, 39, 40, 43, 40, 52, 40, 43, 40, 526, 523, 27, 28, 404, 405, 377, 378, 11, 12, 11, 12, 11, 12, 530, 523, 52, 40, 43, 40, 43, 40, 277, 278, 11, 12, 11, 12, 35, 36, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 9, 10, 250, 10, 266, 22, 311, 312, 1, 2, 462, 463, 470, 471, 275, 276, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 398, 399, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 238, 239, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 11, 12, 251, 252, 267, 268, 313, 314, 3, 4, 464, 465, 472, 473, 277, 278, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 400, 401, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 240, 241, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 9, 10, 9, 265, 9, 10, 9, 10, 76, 77, 466, 467, 474, 475, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 303, 304, 291, 292, 25, 26, 9, 10, 9, 10, 9, 10, 402, 403, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 127, 128, 291, 292, 5, 6, 5, 6, 5, 6, 25, 26, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 11, 12, 11, 12, 11, 12, 157, 158, 78, 79, 468, 469, 476, 477, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 305, 306, 293, 294, 27, 28, 11, 12, 11, 12, 11, 12, 404, 405, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 129, 130, 293, 294, 7, 8, 7, 8, 7, 8, 27, 28, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 387, 388, 9, 10, 163, 164, 33, 34, 5, 6, 5, 6, 287, 288, 9, 10, 37, 38, 44, 38, 29, 30, 21, 22, 9, 10, 538, 14, 9, 10, 9, 10, 9, 10, 398, 399, 9, 10, 37, 38, 44, 38, 303, 304, 291, 292, 25, 26, 9, 10, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 389, 390, 11, 12, 11, 165, 35, 36, 7, 8, 7, 8, 289, 290, 11, 12, 39, 40, 43, 40, 31, 32, 23, 24, 11, 12, 15, 16, 11, 12, 11, 12, 11, 12, 400, 401, 11, 12, 39, 40, 43, 40, 305, 306, 293, 294, 27, 28, 11, 12, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 315, 316, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 311, 312, 9, 10, 520, 521, 44, 38, 1, 2, 319, 320, 9, 10, 1, 2, 371, 372, 319, 320, 395, 396, 9, 10, 9, 10, 37, 38, 44, 38, 279, 280, 9, 10, 1, 2, 9, 10, 1, 2, 9, 10, 9, 10, 159, 160, 150, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 317, 318, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 313, 314, 157, 158, 522, 523, 43, 40, 3, 4, 321, 322, 11, 12, 3, 4, 373, 374, 321, 322, 11, 397, 11, 12, 11, 12, 39, 40, 43, 40, 281, 282, 157, 158, 3, 4, 157, 158, 3, 4, 11, 12, 11, 12, 161, 162, 151, 152, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 25, 26, 9, 10, 163, 164, 33, 34, 5, 6, 33, 34, 25, 26, 9, 10, 1, 2, 9, 10, 159, 160, 150, 10, 9, 10, 311, 312, 520, 521, 44, 38, 1, 2, 166, 167, 131, 22, 163, 164, 33, 34, 5, 6, 291, 292, 134, 135, 146, 147, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 27, 28, 11, 12, 11, 165, 35, 36, 7, 8, 35, 36, 27, 28, 157, 158, 3, 4, 11, 12, 161, 162, 151, 152, 11, 12, 313, 314, 522, 523, 43, 40, 3, 4, 168, 169, 132, 133, 11, 165, 35, 36, 7, 8, 293, 294, 136, 137, 148, 149, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 9, 10, 371, 372, 9, 10, 9, 10, 482, 483, 163, 164, 33, 34, 29, 30, 134, 135, 146, 147, 45, 46, 524, 525, 53, 54, 303, 304, 21, 22, 153, 154, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 430, 431, 438, 439, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 11, 12, 373, 374, 11, 12, 11, 12, 484, 485, 11, 165, 35, 36, 31, 32, 136, 137, 148, 149, 47, 40, 526, 523, 52, 40, 305, 306, 23, 24, 155, 156, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 432, 433, 440, 441, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 5, 6, 5, 6, 68, 69, 5, 6, 299, 300, 494, 495, 498, 499, 21, 22, 9, 10, 307, 308, 9, 10, 9, 10, 9, 10, 478, 479, 486, 487, 311, 312, 13, 14, 307, 308, 9, 10, 520, 521, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 33, 34, 45, 46, 524, 525, 25, 26, 9, 10, 9, 10, 9, 10, 434, 435, 442, 443, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 7, 8, 7, 8, 70, 71, 7, 8, 301, 302, 496, 497, 500, 501, 23, 24, 11, 12, 309, 310, 11, 12, 11, 12, 11, 12, 480, 481, 488, 489, 313, 314, 15, 16, 309, 310, 11, 12, 522, 523, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 35, 36, 47, 40, 526, 523, 27, 28, 11, 12, 11, 12, 11, 12, 436, 437, 444, 445, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 482, 483, 490, 491, 319, 320, 311, 312, 9, 10, 9, 10, 395, 396, 315, 316, 9, 10, 9, 10, 430, 431, 438, 439, 9, 10, 9, 10, 283, 284, 9, 10, 528, 529, 533, 534, 29, 30, 540, 18, 531, 521, 44, 38, 44, 38, 275, 276, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 1, 2, 9, 10, 9, 10, 402, 403, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 484, 485, 492, 493, 321, 322, 313, 314, 11, 12, 11, 12, 11, 397, 317, 318, 11, 12, 11, 12, 432, 433, 440, 441, 11, 12, 11, 12, 285, 286, 11, 12, 530, 523, 535, 523, 31, 32, 19, 20, 532, 523, 43, 40, 43, 40, 277, 278, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 3, 4, 11, 12, 11, 12, 404, 405, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 478, 479, 486, 487, 29, 30, 5, 6, 5, 6, 291, 292, 25, 26, 9, 10, 406, 407, 410, 411, 434, 435, 442, 443, 9, 10, 9, 10, 13, 14, 9, 10, 37, 38, 44, 38, 275, 276, 9, 10, 37, 38, 44, 38, 44, 38, 1, 2, 9, 10, 319, 320, 9, 10, 37, 38, 44, 38, 279, 280, 9, 10, 9, 10, 398, 399, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 480, 481, 488, 489, 31, 32, 7, 8, 7, 8, 293, 294, 27, 28, 11, 12, 408, 409, 412, 413, 436, 437, 444, 445, 11, 12, 11, 12, 15, 16, 11, 12, 39, 40, 43, 40, 277, 278, 11, 12, 39, 40, 43, 40, 43, 40, 3, 4, 11, 12, 321, 322, 11, 12, 39, 40, 43, 40, 281, 282, 11, 12, 11, 12, 400, 401, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 1, 2, 9, 10, 9, 10, 375, 376, 450, 451, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 307, 308, 9, 10, 1, 2, 9, 10, 520, 521, 44, 38, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 1, 2, 395, 396, 9, 10, 9, 10, 37, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 3, 4, 11, 12, 11, 12, 377, 378, 452, 453, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 309, 310, 11, 12, 3, 4, 11, 12, 522, 523, 43, 40, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 3, 4, 11, 397, 11, 12, 11, 12, 39, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 1, 2, 9, 10, 406, 407, 410, 411, 446, 447, 315, 316, 9, 10, 9, 10, 307, 308, 9, 10, 9, 10, 9, 10, 528, 529, 524, 525, 53, 54, 44, 38, 1, 2, 9, 10, 520, 521, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 375, 376, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 3, 4, 11, 12, 408, 409, 412, 413, 448, 449, 317, 318, 11, 12, 11, 12, 309, 310, 11, 12, 11, 12, 11, 12, 530, 523, 526, 523, 52, 40, 43, 40, 3, 4, 11, 12, 522, 523, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 377, 378, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 283, 284, 9, 10, 90, 91, 9, 10, 9, 10, 395, 396, 1, 2, 9, 10, 45, 46, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 29, 30, 540, 18, 531, 521, 44, 38, 44, 38, 90, 91, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 285, 286, 11, 12, 92, 93, 11, 12, 11, 12, 11, 397, 3, 4, 11, 12, 47, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 31, 32, 19, 20, 532, 523, 43, 40, 43, 40, 92, 93, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 275, 276, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 303, 304, 5, 6, 295, 296, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 277, 278, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 305, 306, 7, 8, 297, 298, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 450, 451, 9, 10, 283, 284, 9, 10, 159, 160, 150, 10, 1, 2, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 1, 2, 9, 10, 406, 407, 410, 411, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 452, 453, 157, 158, 285, 286, 11, 12, 161, 162, 151, 152, 3, 4, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 3, 4, 11, 12, 408, 409, 412, 413, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 446, 447, 163, 164, 33, 34, 103, 104, 134, 135, 146, 147, 21, 22, 371, 372, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 510, 511, 150, 10, 528, 529, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 234, 235, 319, 320, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 448, 449, 11, 165, 35, 36, 105, 106, 136, 137, 148, 149, 23, 24, 373, 374, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 512, 513, 151, 152, 530, 523, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 236, 237, 321, 322, 11, 12, 157, 158, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 315, 316, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 143, 135, 146, 147, 33, 34, 72, 73, 5, 6, 454, 455, 458, 459, 102, 99, 33, 34, 25, 26, 9, 10, 163, 164, 33, 34, 291, 292, 422, 423, 426, 427, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 317, 318, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 144, 145, 148, 149, 35, 36, 74, 75, 7, 8, 456, 457, 460, 461, 100, 101, 35, 36, 27, 28, 11, 12, 11, 165, 35, 36, 293, 294, 424, 425, 428, 429, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 5, 6, 25, 26, 462, 463, 470, 471, 9, 10, 9, 10, 9, 10, 9, 10, 371, 372, 9, 10, 538, 14, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 7, 8, 27, 28, 464, 465, 472, 473, 11, 12, 11, 12, 11, 12, 11, 12, 373, 374, 11, 12, 15, 16, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 538, 14, 466, 467, 474, 475, 9, 10, 29, 30, 5, 6, 295, 296, 25, 26, 9, 10, 1, 2, 9, 10, 528, 529, 41, 42, 524, 525, 25, 26, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 15, 16, 468, 469, 476, 477, 11, 12, 31, 32, 7, 8, 297, 298, 27, 28, 11, 12, 3, 4, 11, 12, 530, 523, 43, 40, 526, 523, 27, 28, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 29, 30, 422, 423, 426, 427, 5, 6, 422, 423, 426, 427, 103, 104, 5, 6, 5, 6, 299, 300, 295, 296, 5, 6, 514, 515, 131, 22, 9, 10, 283, 284, 9, 10, 9, 10, 307, 308, 1, 2, 430, 431, 438, 439, 450, 451, 9, 10, 528, 529, 524, 525, 53, 54, 44, 38, 44, 38, 279, 280, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 31, 32, 424, 425, 428, 429, 7, 8, 424, 425, 428, 429, 105, 106, 7, 8, 7, 8, 301, 302, 297, 298, 7, 8, 516, 517, 132, 133, 11, 12, 285, 286, 11, 12, 11, 12, 309, 310, 3, 4, 432, 433, 440, 441, 452, 453, 157, 158, 530, 523, 526, 523, 52, 40, 43, 40, 43, 40, 281, 282, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 430, 431, 438, 439, 9, 10, 153, 154, 9, 10, 9, 10, 528, 529, 524, 525, 25, 26, 9, 10, 1, 2, 434, 435, 442, 443, 446, 447, 163, 164, 33, 34, 5, 6, 291, 292, 531, 521, 44, 38, 1, 2, 9, 10, 37, 38, 44, 38, 29, 30, 5, 6, 5, 6, 531, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 432, 433, 440, 441, 11, 12, 155, 156, 11, 12, 11, 12, 530, 523, 526, 523, 27, 28, 11, 12, 3, 4, 436, 437, 444, 445, 448, 449, 11, 165, 35, 36, 7, 8, 293, 294, 532, 523, 43, 40, 3, 4, 11, 12, 39, 40, 43, 40, 31, 32, 7, 8, 7, 8, 532, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 303, 304, 5, 6, 5, 6, 299, 300, 5, 6, 25, 26, 9, 10, 434, 435, 442, 443, 9, 10, 9, 10, 45, 46, 524, 525, 53, 54, 44, 38, 275, 276, 9, 10, 275, 276, 9, 10, 9, 10, 283, 284, 9, 10, 402, 403, 9, 10, 9, 10, 37, 38, 44, 38, 1, 2, 9, 10, 520, 521, 44, 38, 1, 2, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 305, 306, 7, 8, 7, 8, 301, 302, 7, 8, 27, 28, 11, 12, 436, 437, 444, 445, 11, 12, 11, 12, 47, 40, 526, 523, 52, 40, 43, 40, 277, 278, 11, 12, 277, 278, 11, 12, 11, 12, 285, 286, 11, 12, 404, 405, 11, 12, 11, 12, 39, 40, 43, 40, 3, 4, 157, 158, 522, 523, 43, 40, 3, 4, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 482, 483, 490, 491, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 450, 451, 9, 10, 9, 10, 450, 451, 9, 10, 398, 399, 9, 10, 9, 10, 37, 38, 44, 38, 1, 2, 163, 164, 33, 34, 5, 6, 25, 26, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 484, 485, 492, 493, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 452, 453, 11, 12, 11, 12, 452, 453, 11, 12, 400, 401, 11, 12, 11, 12, 39, 40, 43, 40, 3, 4, 11, 165, 35, 36, 7, 8, 27, 28, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 478, 479, 486, 487, 9, 10, 159, 160, 150, 10, 1, 2, 9, 10, 45, 46, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 446, 447, 159, 160, 150, 10, 446, 447, 9, 10, 9, 10, 462, 463, 470, 471, 37, 38, 44, 38, 1, 2, 9, 10, 9, 10, 9, 10, 1, 2, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 157, 158, 480, 481, 488, 489, 11, 12, 161, 162, 151, 152, 3, 4, 11, 12, 47, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 3, 4, 157, 158, 448, 449, 161, 162, 151, 152, 448, 449, 11, 12, 11, 12, 464, 465, 472, 473, 39, 40, 43, 40, 3, 4, 11, 12, 11, 12, 11, 12, 3, 4, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 275, 276, 163, 164, 33, 34, 5, 6, 5, 6, 134, 135, 146, 147, 21, 22, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 163, 164, 33, 34, 134, 135, 146, 147, 21, 22, 9, 10, 9, 10, 466, 467, 474, 475, 37, 38, 44, 38, 50, 51, 524, 525, 25, 26, 9, 10, 538, 14, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 277, 278, 11, 165, 35, 36, 7, 8, 7, 8, 136, 137, 148, 149, 23, 24, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 165, 35, 36, 136, 137, 148, 149, 23, 24, 11, 12, 11, 12, 468, 469, 476, 477, 39, 40, 43, 40, 52, 40, 526, 523, 27, 28, 11, 12, 15, 16, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 279, 280, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 50, 51, 524, 525, 25, 26, 9, 10, 9, 10, 37, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 281, 282, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 52, 40, 526, 523, 27, 28, 11, 12, 11, 12, 39, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 1, 2, 9, 10, 9, 10, 520, 521, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 3, 4, 11, 12, 11, 12, 522, 523, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 50, 51, 41, 42, 524, 525, 53, 54, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 52, 40, 43, 40, 526, 523, 52, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 44, 38, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40, 43, 40], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"catacombs.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"catacombs", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l8/level.json b/gamefilesd/level/l8/level.json new file mode 100755 index 00000000..e7c3b2ab --- /dev/null +++ b/gamefilesd/level/l8/level.json @@ -0,0 +1,27 @@ +{ + "palette": [ + { + "id": "l2_4", + "file": "levels/l2data/l2_4.pal" + } + ], + "load": ["level/l5/l2s.json", "l2_4"], + "level": { + "id": "level", + "palette": "l2_4", + "file": "levels/l2data/l2.cel", + "layers": [ + { "index": 2, "texturePack": "l2s" }, + { "index": 3, "texturePack": "l2s_2" } + ], + "outOfBoundsTileLayer2": 11, + "til": "levels/l2data/l2.til", + "min": "levels/l2data/l2.min", + "minBlocks": 10, + "sol": "levels/l2data/l2.sol" + }, + "load": "level/automap/l2/load.json", + "load": "level/l8/levelObjects.json", + "load": "level/l8/monsters.json", + "load": "level/l8/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l8/level2.json b/gamefilesd/level/l8/level2.json new file mode 100755 index 00000000..5b490711 --- /dev/null +++ b/gamefilesd/level/l8/level2.json @@ -0,0 +1,16 @@ +{ + "level": { + "id": "level", + "path": "l8", + "name": "8", + "map": { "file": "level/l8/l8.json", "indexOffset": -1, "defaultTile": 2 } + }, + "action": { + "name": "if.equal", + "param1": "%beta%", + "param2": true, + "then": { "name": "load", "file": "level/l8/levelObjects2Beta.json" }, + "else": { "name": "load", "file": "level/l8/levelObjects2.json" } + }, + "load": "level/l8/monsters2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l8/levelObjects2.json b/gamefilesd/level/l8/levelObjects2.json new file mode 100755 index 00000000..9db8d3fb --- /dev/null +++ b/gamefilesd/level/l8/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [53, 26], + "properties": { + "x": 61, + "y": 75, + "level": 9 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [28, 41], + "properties": { + "x": 32, + "y": 28, + "level": 7 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l8/levelObjects2Beta.json b/gamefilesd/level/l8/levelObjects2Beta.json new file mode 100755 index 00000000..d247bc93 --- /dev/null +++ b/gamefilesd/level/l8/levelObjects2Beta.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "up", + "class": "levelUp", + "mapPosition": [28, 41], + "properties": { + "x": 32, + "y": 28, + "level": 7 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l8/music.json b/gamefilesd/level/l8/music.json new file mode 100755 index 00000000..9da03bcb --- /dev/null +++ b/gamefilesd/level/l8/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvlb.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l9/l9.json b/gamefilesd/level/l9/l9.json new file mode 100755 index 00000000..475ba636 --- /dev/null +++ b/gamefilesd/level/l9/l9.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 401, 402, 9, 10, 40, 41, 252, 253, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 559, 182, 556, 557, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 337, 338, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 403, 404, 11, 12, 42, 43, 254, 255, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 560, 31, 558, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 339, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 21, 25, 48, 49, 44, 45, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 337, 338, 28, 29, 28, 29, 40, 41, 548, 549, 552, 553, 477, 478, 252, 253, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 340, 341, 9, 10, 28, 29, 40, 41, 401, 402, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 26, 27, 50, 51, 46, 47, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 339, 31, 30, 31, 30, 31, 42, 43, 550, 551, 554, 555, 479, 480, 254, 255, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 342, 343, 11, 12, 30, 31, 42, 43, 403, 404, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 21, 25, 393, 394, 389, 390, 389, 390, 48, 49, 461, 462, 469, 470, 465, 466, 9, 10, 340, 341, 461, 462, 465, 466, 44, 45, 393, 394, 385, 386, 501, 502, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 48, 49, 477, 478, 44, 45, 17, 18, 21, 382, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 26, 27, 395, 396, 391, 392, 391, 392, 50, 51, 463, 464, 471, 472, 467, 468, 11, 12, 342, 343, 463, 464, 467, 468, 46, 47, 395, 396, 387, 388, 503, 504, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 50, 51, 479, 480, 46, 47, 19, 20, 383, 384, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 21, 25, 385, 386, 184, 185, 389, 390, 389, 390, 21, 25, 389, 390, 17, 18, 21, 22, 1, 2, 52, 53, 389, 390, 21, 25, 21, 25, 385, 386, 493, 494, 389, 390, 21, 25, 13, 14, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 385, 386, 501, 502, 389, 390, 13, 14, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 26, 27, 387, 388, 186, 187, 391, 392, 391, 392, 26, 27, 391, 392, 19, 20, 23, 24, 3, 4, 54, 55, 391, 392, 26, 27, 26, 27, 387, 388, 495, 496, 391, 392, 26, 27, 15, 16, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 387, 388, 503, 504, 391, 392, 15, 16, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 445, 446, 21, 25, 21, 25, 21, 25, 21, 25, 21, 25, 17, 18, 52, 53, 21, 25, 13, 14, 28, 29, 28, 29, 32, 33, 21, 25, 21, 25, 385, 386, 21, 25, 501, 502, 389, 390, 385, 386, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 533, 541, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 447, 448, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 19, 20, 54, 55, 26, 27, 15, 16, 30, 31, 30, 31, 34, 35, 26, 27, 26, 27, 387, 388, 26, 27, 503, 504, 391, 392, 387, 388, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 535, 536, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 21, 25, 21, 25, 385, 386, 17, 18, 52, 53, 13, 14, 1, 2, 52, 53, 48, 49, 9, 10, 40, 41, 44, 45, 21, 25, 188, 189, 21, 25, 21, 25, 533, 541, 389, 390, 21, 25, 21, 25, 13, 14, 28, 29, 28, 29, 40, 41, 44, 45, 17, 18, 509, 510, 52, 53, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 26, 27, 26, 27, 387, 388, 19, 20, 54, 55, 15, 16, 3, 4, 54, 55, 50, 51, 11, 12, 42, 43, 46, 47, 26, 27, 190, 191, 26, 27, 26, 27, 535, 536, 391, 392, 26, 27, 26, 27, 15, 16, 30, 31, 30, 31, 42, 43, 46, 47, 19, 20, 7, 511, 54, 55, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 449, 450, 389, 390, 21, 25, 17, 18, 21, 22, 32, 33, 48, 49, 252, 253, 44, 45, 17, 18, 21, 22, 445, 446, 21, 25, 385, 386, 393, 394, 21, 25, 17, 18, 509, 510, 52, 53, 385, 386, 21, 25, 48, 49, 461, 462, 465, 466, 44, 45, 385, 386, 13, 14, 40, 41, 44, 45, 17, 18, 21, 382, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 451, 452, 391, 392, 26, 27, 19, 20, 23, 24, 34, 35, 50, 51, 254, 255, 46, 47, 19, 20, 23, 24, 447, 448, 26, 27, 387, 388, 395, 396, 26, 27, 19, 20, 7, 511, 54, 55, 387, 388, 26, 27, 50, 51, 463, 464, 467, 468, 46, 47, 387, 388, 15, 16, 42, 43, 46, 47, 19, 20, 383, 384, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 21, 25, 21, 25, 48, 49, 9, 10, 397, 398, 21, 25, 385, 386, 21, 25, 48, 49, 9, 10, 441, 442, 21, 25, 389, 390, 21, 25, 17, 18, 21, 22, 28, 29, 1, 2, 52, 53, 393, 394, 385, 386, 21, 25, 389, 390, 393, 394, 389, 390, 48, 49, 44, 45, 17, 18, 21, 382, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 26, 27, 26, 27, 50, 51, 11, 12, 399, 400, 26, 27, 387, 388, 26, 27, 50, 51, 11, 12, 443, 444, 26, 27, 391, 392, 26, 27, 19, 20, 23, 24, 30, 31, 3, 4, 54, 55, 395, 396, 387, 388, 26, 27, 391, 392, 395, 396, 391, 392, 50, 51, 46, 47, 19, 20, 383, 384, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 389, 390, 21, 25, 13, 14, 445, 446, 385, 386, 21, 25, 17, 18, 5, 6, 21, 22, 1, 2, 52, 53, 389, 390, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 445, 446, 21, 25, 385, 386, 385, 386, 21, 25, 21, 25, 21, 25, 385, 386, 21, 25, 13, 14, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 391, 392, 26, 27, 15, 16, 447, 448, 387, 388, 26, 27, 19, 20, 7, 8, 23, 24, 3, 4, 54, 55, 391, 392, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 447, 448, 26, 27, 387, 388, 387, 388, 26, 27, 26, 27, 26, 27, 387, 388, 26, 27, 15, 16, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 21, 25, 385, 386, 13, 14, 441, 442, 17, 18, 52, 53, 48, 49, 9, 10, 40, 41, 477, 478, 44, 45, 17, 18, 5, 6, 5, 6, 21, 382, 28, 29, 28, 29, 441, 442, 17, 18, 5, 6, 5, 6, 5, 6, 52, 53, 389, 390, 21, 25, 393, 394, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 26, 27, 387, 388, 15, 16, 443, 444, 19, 20, 54, 55, 50, 51, 11, 12, 42, 43, 479, 480, 46, 47, 19, 20, 7, 8, 7, 8, 383, 384, 30, 31, 30, 31, 443, 444, 19, 20, 7, 8, 7, 8, 7, 8, 54, 55, 391, 392, 26, 27, 395, 396, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 166, 167, 389, 390, 17, 18, 5, 6, 21, 22, 1, 2, 21, 22, 1, 2, 52, 53, 48, 49, 44, 45, 501, 502, 385, 386, 48, 49, 9, 10, 28, 29, 363, 364, 28, 29, 28, 29, 1, 2, 21, 382, 28, 29, 28, 29, 28, 29, 473, 474, 529, 530, 489, 490, 489, 490, 512, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 168, 169, 391, 392, 19, 20, 7, 8, 23, 24, 3, 4, 23, 24, 3, 4, 54, 55, 50, 51, 46, 47, 503, 504, 387, 388, 50, 51, 11, 12, 30, 31, 365, 31, 30, 31, 30, 31, 3, 4, 383, 384, 30, 31, 30, 31, 30, 31, 475, 476, 538, 532, 491, 492, 491, 492, 513, 514, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 162, 163, 385, 386, 48, 49, 36, 37, 9, 10, 40, 41, 477, 478, 36, 37, 44, 45, 17, 18, 52, 53, 533, 541, 389, 390, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 327, 328, 28, 29, 363, 364, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 5, 6, 52, 53, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 164, 165, 387, 388, 50, 51, 38, 39, 11, 12, 42, 43, 479, 480, 38, 39, 46, 47, 19, 20, 54, 55, 535, 536, 391, 392, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 329, 31, 30, 31, 365, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 7, 8, 54, 55, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 21, 25, 393, 394, 48, 49, 44, 45, 501, 502, 21, 25, 17, 18, 21, 22, 32, 33, 501, 502, 389, 390, 48, 49, 461, 462, 465, 466, 9, 10, 40, 41, 323, 324, 9, 10, 28, 29, 40, 41, 477, 478, 374, 375, 357, 358, 28, 29, 40, 41, 44, 45, 21, 25, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 26, 27, 395, 396, 50, 51, 46, 47, 503, 504, 26, 27, 19, 20, 23, 24, 34, 35, 503, 504, 391, 392, 50, 51, 463, 464, 467, 468, 11, 12, 42, 43, 325, 326, 11, 12, 30, 31, 42, 43, 479, 480, 376, 377, 359, 31, 30, 31, 42, 43, 46, 47, 26, 27, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 248, 249, 21, 25, 385, 386, 385, 386, 21, 25, 385, 386, 533, 541, 389, 390, 13, 14, 40, 41, 44, 45, 493, 494, 393, 394, 389, 390, 389, 390, 21, 25, 48, 49, 44, 45, 389, 390, 48, 49, 36, 37, 44, 45, 493, 494, 13, 14, 28, 29, 28, 29, 1, 2, 5, 6, 52, 53, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 250, 251, 26, 27, 387, 388, 387, 388, 26, 27, 387, 388, 535, 536, 391, 392, 15, 16, 42, 43, 46, 47, 495, 496, 395, 396, 391, 392, 391, 392, 26, 27, 50, 51, 46, 47, 391, 392, 50, 51, 38, 39, 46, 47, 495, 496, 15, 16, 30, 31, 30, 31, 3, 4, 7, 8, 54, 55, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 385, 386, 188, 189, 389, 390, 17, 18, 509, 510, 370, 371, 21, 22, 248, 249, 21, 25, 493, 494, 21, 25, 184, 185, 21, 25, 21, 25, 21, 25, 21, 25, 385, 386, 389, 390, 393, 394, 389, 390, 533, 541, 48, 49, 36, 37, 9, 10, 40, 41, 9, 10, 1, 2, 21, 382, 28, 29, 337, 338, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 387, 388, 190, 191, 391, 392, 19, 20, 7, 511, 372, 373, 23, 24, 250, 251, 26, 27, 495, 496, 26, 27, 186, 187, 26, 27, 26, 27, 26, 27, 26, 27, 387, 388, 391, 392, 395, 396, 391, 392, 535, 536, 50, 51, 38, 39, 11, 12, 42, 43, 11, 12, 3, 4, 383, 384, 30, 31, 339, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 44, 45, 21, 25, 21, 25, 21, 25, 378, 379, 360, 361, 354, 355, 28, 29, 1, 2, 52, 53, 493, 494, 389, 390, 21, 25, 389, 390, 393, 394, 17, 18, 5, 6, 52, 53, 21, 25, 389, 390, 385, 386, 501, 502, 393, 394, 21, 25, 48, 49, 44, 45, 48, 49, 9, 10, 363, 364, 327, 328, 340, 341, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 46, 47, 26, 27, 26, 27, 26, 27, 380, 381, 362, 31, 356, 31, 30, 31, 3, 4, 54, 55, 495, 496, 391, 392, 26, 27, 391, 392, 395, 396, 19, 20, 7, 8, 54, 55, 26, 27, 391, 392, 387, 388, 503, 504, 395, 396, 26, 27, 50, 51, 46, 47, 50, 51, 11, 12, 365, 31, 329, 31, 342, 343, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 393, 394, 21, 25, 17, 18, 52, 53, 13, 14, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 501, 502, 21, 25, 17, 18, 52, 53, 21, 25, 48, 49, 9, 10, 1, 2, 5, 6, 370, 371, 5, 6, 509, 510, 5, 6, 52, 53, 385, 386, 385, 386, 393, 394, 13, 14, 40, 41, 323, 324, 44, 45, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 395, 396, 26, 27, 19, 20, 54, 55, 15, 16, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 503, 504, 26, 27, 19, 20, 54, 55, 26, 27, 50, 51, 11, 12, 3, 4, 7, 8, 372, 373, 7, 8, 7, 511, 7, 8, 54, 55, 387, 388, 387, 388, 395, 396, 15, 16, 42, 43, 325, 326, 46, 47, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 370, 371, 5, 6, 21, 382, 1, 2, 21, 22, 28, 29, 28, 29, 28, 29, 445, 446, 385, 386, 501, 502, 21, 25, 13, 14, 1, 2, 52, 53, 21, 25, 13, 14, 28, 29, 348, 349, 354, 355, 337, 338, 28, 29, 28, 29, 32, 33, 17, 18, 52, 53, 385, 386, 48, 49, 44, 45, 72, 73, 76, 77, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 372, 373, 7, 8, 383, 384, 3, 4, 23, 24, 30, 31, 30, 31, 30, 31, 447, 448, 387, 388, 503, 504, 26, 27, 15, 16, 3, 4, 54, 55, 26, 27, 15, 16, 30, 31, 350, 31, 356, 31, 339, 31, 30, 31, 30, 31, 34, 35, 19, 20, 54, 55, 387, 388, 50, 51, 46, 47, 74, 75, 78, 79, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 28, 29, 363, 364, 28, 29, 348, 349, 28, 29, 28, 29, 28, 29, 441, 442, 17, 18, 509, 510, 52, 53, 48, 49, 9, 10, 473, 474, 529, 530, 512, 14, 40, 41, 344, 345, 9, 10, 340, 341, 36, 37, 9, 10, 1, 2, 21, 22, 32, 33, 17, 18, 5, 6, 52, 53, 64, 65, 80, 81, 150, 151, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 30, 31, 365, 31, 30, 31, 350, 31, 30, 31, 30, 31, 30, 31, 443, 444, 19, 20, 7, 511, 54, 55, 50, 51, 11, 12, 475, 476, 538, 532, 513, 514, 42, 43, 346, 347, 11, 12, 342, 343, 38, 39, 11, 12, 3, 4, 23, 24, 34, 35, 19, 20, 7, 8, 54, 55, 66, 67, 82, 83, 152, 153, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 317, 318, 319, 320, 344, 345, 9, 10, 40, 41, 401, 402, 44, 45, 48, 49, 9, 10, 32, 33, 389, 390, 48, 49, 44, 45, 21, 25, 48, 49, 44, 45, 393, 394, 48, 49, 44, 45, 17, 18, 21, 22, 40, 41, 36, 37, 44, 45, 13, 14, 40, 41, 44, 45, 68, 69, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 321, 322, 346, 347, 11, 12, 42, 43, 403, 404, 46, 47, 50, 51, 11, 12, 34, 35, 391, 392, 50, 51, 46, 47, 26, 27, 50, 51, 46, 47, 395, 396, 50, 51, 46, 47, 19, 20, 23, 24, 42, 43, 38, 39, 46, 47, 15, 16, 42, 43, 46, 47, 70, 71, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 48, 49, 44, 45, 21, 25, 389, 390, 21, 25, 48, 49, 44, 45, 385, 386, 21, 25, 111, 112, 100, 101, 100, 101, 100, 101, 115, 116, 21, 25, 21, 25, 48, 49, 401, 402, 44, 45, 72, 73, 76, 77, 48, 49, 44, 45, 72, 73, 84, 85, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 50, 51, 46, 47, 26, 27, 391, 392, 26, 27, 50, 51, 46, 47, 387, 388, 26, 27, 113, 114, 102, 103, 102, 103, 102, 103, 117, 118, 26, 27, 26, 27, 50, 51, 403, 404, 46, 47, 74, 75, 78, 79, 50, 51, 46, 47, 74, 75, 86, 87, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 248, 249, 393, 394, 21, 25, 21, 25, 21, 25, 21, 25, 21, 25, 385, 386, 389, 390, 21, 25, 119, 97, 142, 143, 104, 97, 104, 97, 104, 108, 385, 386, 21, 25, 21, 25, 393, 394, 72, 73, 84, 85, 80, 81, 60, 61, 56, 57, 84, 85, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 250, 251, 395, 396, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 387, 388, 391, 392, 26, 27, 120, 121, 144, 145, 130, 131, 117, 114, 109, 110, 387, 388, 26, 27, 26, 27, 395, 396, 74, 75, 86, 87, 82, 83, 62, 63, 58, 59, 86, 87, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 370, 371, 52, 53, 17, 18, 52, 53, 21, 25, 21, 25, 192, 193, 385, 386, 72, 73, 84, 85, 96, 97, 104, 97, 104, 129, 115, 116, 21, 25, 21, 25, 72, 73, 84, 85, 17, 18, 5, 6, 370, 371, 52, 53, 385, 386, 393, 394, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 372, 373, 54, 55, 19, 20, 54, 55, 26, 27, 26, 27, 194, 195, 387, 388, 74, 75, 86, 87, 98, 99, 117, 114, 117, 114, 117, 118, 26, 27, 26, 27, 74, 75, 86, 87, 19, 20, 7, 8, 372, 373, 54, 55, 387, 388, 395, 396, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 1, 2, 21, 382, 32, 33, 385, 386, 389, 390, 21, 25, 389, 390, 64, 65, 21, 25, 119, 97, 104, 97, 104, 97, 104, 138, 60, 61, 154, 155, 84, 85, 21, 25, 378, 379, 360, 361, 354, 355, 32, 33, 17, 18, 52, 53, 48, 49, 374, 375, 357, 358, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 3, 4, 383, 384, 34, 35, 387, 388, 391, 392, 26, 27, 391, 392, 66, 67, 26, 27, 120, 121, 130, 131, 117, 114, 117, 139, 62, 63, 156, 157, 86, 87, 26, 27, 380, 381, 362, 31, 356, 31, 34, 35, 19, 20, 54, 55, 50, 51, 376, 377, 359, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 363, 364, 397, 398, 389, 390, 21, 25, 21, 25, 72, 73, 84, 85, 111, 112, 100, 101, 126, 127, 104, 97, 104, 108, 21, 25, 21, 25, 21, 25, 17, 18, 21, 22, 28, 29, 28, 29, 1, 2, 21, 382, 1, 2, 5, 6, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 365, 31, 399, 400, 391, 392, 26, 27, 26, 27, 74, 75, 86, 87, 113, 114, 102, 103, 128, 114, 117, 114, 109, 110, 26, 27, 26, 27, 26, 27, 19, 20, 23, 24, 30, 31, 30, 31, 3, 4, 383, 384, 3, 4, 7, 8, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 453, 454, 469, 470, 465, 466, 9, 10, 1, 2, 52, 53, 385, 386, 72, 73, 84, 85, 385, 386, 119, 97, 104, 97, 104, 97, 104, 105, 122, 123, 389, 390, 385, 386, 385, 386, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 363, 364, 28, 29, 327, 328, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 455, 456, 471, 472, 467, 468, 11, 12, 3, 4, 54, 55, 387, 388, 74, 75, 86, 87, 387, 388, 120, 121, 130, 131, 132, 133, 106, 107, 124, 125, 391, 392, 387, 388, 387, 388, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 365, 31, 30, 31, 329, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 21, 25, 21, 25, 13, 14, 40, 41, 44, 45, 393, 394, 68, 69, 385, 386, 21, 25, 21, 25, 119, 97, 122, 123, 385, 386, 385, 386, 17, 18, 52, 53, 21, 25, 21, 25, 13, 14, 40, 41, 477, 478, 401, 402, 9, 10, 40, 41, 323, 324, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 26, 27, 26, 27, 15, 16, 42, 43, 46, 47, 395, 396, 70, 71, 387, 388, 26, 27, 26, 27, 120, 121, 124, 125, 387, 388, 387, 388, 19, 20, 54, 55, 26, 27, 26, 27, 15, 16, 42, 43, 479, 480, 403, 404, 11, 12, 42, 43, 325, 326, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 21, 25, 13, 14, 397, 398, 385, 386, 21, 25, 64, 65, 385, 386, 389, 390, 389, 390, 393, 394, 393, 394, 385, 386, 17, 18, 21, 22, 1, 2, 5, 6, 52, 53, 48, 49, 44, 45, 501, 502, 21, 25, 48, 49, 44, 45, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 26, 27, 15, 16, 399, 400, 387, 388, 26, 27, 66, 67, 387, 388, 391, 392, 391, 392, 395, 396, 395, 396, 387, 388, 19, 20, 23, 24, 3, 4, 7, 8, 54, 55, 50, 51, 46, 47, 503, 504, 26, 27, 50, 51, 46, 47, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 52, 53, 48, 49, 44, 45, 393, 394, 21, 25, 64, 65, 385, 386, 385, 386, 17, 18, 5, 6, 5, 6, 52, 53, 13, 14, 181, 182, 178, 179, 28, 29, 445, 446, 385, 386, 385, 386, 533, 541, 385, 386, 21, 25, 385, 386, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 54, 55, 50, 51, 46, 47, 395, 396, 26, 27, 66, 67, 387, 388, 387, 388, 19, 20, 7, 8, 7, 8, 54, 55, 15, 16, 183, 31, 180, 31, 30, 31, 447, 448, 387, 388, 387, 388, 535, 536, 387, 388, 26, 27, 387, 388, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 52, 53, 389, 390, 393, 394, 158, 159, 385, 386, 17, 18, 21, 22, 40, 41, 252, 253, 44, 45, 48, 49, 170, 171, 174, 175, 9, 10, 441, 442, 21, 25, 21, 25, 501, 502, 21, 25, 385, 386, 385, 386, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 54, 55, 391, 392, 395, 396, 160, 161, 387, 388, 19, 20, 23, 24, 42, 43, 254, 255, 46, 47, 50, 51, 172, 173, 176, 177, 11, 12, 443, 444, 26, 27, 26, 27, 503, 504, 26, 27, 387, 388, 387, 388, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 21, 25, 72, 73, 84, 85, 17, 18, 21, 22, 40, 41, 44, 45, 21, 25, 21, 25, 21, 25, 21, 25, 385, 386, 48, 49, 44, 45, 385, 386, 385, 386, 501, 502, 21, 25, 17, 18, 52, 53, 385, 386, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 26, 27, 74, 75, 86, 87, 19, 20, 23, 24, 42, 43, 46, 47, 26, 27, 26, 27, 26, 27, 26, 27, 387, 388, 50, 51, 46, 47, 387, 388, 387, 388, 503, 504, 26, 27, 19, 20, 54, 55, 387, 388, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 477, 478, 9, 10, 40, 41, 44, 45, 393, 394, 64, 65, 385, 386, 48, 49, 36, 37, 44, 45, 21, 25, 21, 25, 389, 390, 389, 390, 244, 245, 385, 386, 385, 386, 17, 18, 52, 53, 385, 386, 493, 494, 21, 25, 13, 14, 1, 2, 52, 53, 378, 379, 360, 361, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 479, 480, 11, 12, 42, 43, 46, 47, 395, 396, 66, 67, 387, 388, 50, 51, 38, 39, 46, 47, 26, 27, 26, 27, 391, 392, 391, 392, 246, 247, 387, 388, 387, 388, 19, 20, 54, 55, 387, 388, 495, 496, 26, 27, 15, 16, 3, 4, 54, 55, 380, 381, 362, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 501, 502, 48, 49, 44, 45, 17, 18, 52, 53, 80, 81, 60, 61, 76, 77, 389, 390, 17, 18, 5, 6, 52, 53, 385, 386, 21, 25, 21, 25, 21, 25, 17, 18, 21, 22, 1, 2, 5, 6, 509, 510, 52, 53, 48, 49, 36, 37, 44, 45, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 503, 504, 50, 51, 46, 47, 19, 20, 54, 55, 82, 83, 62, 63, 78, 79, 391, 392, 19, 20, 7, 8, 54, 55, 387, 388, 26, 27, 26, 27, 26, 27, 19, 20, 23, 24, 3, 4, 7, 8, 7, 511, 54, 55, 50, 51, 38, 39, 46, 47, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 501, 502, 21, 25, 21, 25, 13, 14, 397, 398, 17, 18, 52, 53, 64, 65, 17, 18, 21, 22, 28, 29, 1, 2, 52, 53, 17, 18, 52, 53, 389, 390, 13, 14, 28, 29, 28, 29, 28, 29, 28, 29, 445, 446, 385, 386, 385, 386, 17, 18, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 503, 504, 26, 27, 26, 27, 15, 16, 399, 400, 19, 20, 54, 55, 66, 67, 19, 20, 23, 24, 30, 31, 3, 4, 54, 55, 19, 20, 54, 55, 391, 392, 15, 16, 30, 31, 30, 31, 30, 31, 30, 31, 447, 448, 387, 388, 387, 388, 19, 20, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 32, 33, 389, 390, 533, 541, 17, 18, 52, 53, 13, 14, 1, 2, 21, 382, 1, 2, 146, 147, 21, 22, 28, 29, 28, 29, 28, 29, 1, 2, 21, 382, 1, 2, 370, 371, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 441, 442, 21, 25, 21, 25, 48, 49, 9, 10, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 35, 391, 392, 535, 536, 19, 20, 54, 55, 15, 16, 3, 4, 383, 384, 3, 4, 148, 149, 23, 24, 30, 31, 30, 31, 30, 31, 3, 4, 383, 384, 3, 4, 372, 373, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 443, 444, 26, 27, 26, 27, 50, 51, 11, 12, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 509, 510, 21, 22, 1, 2, 21, 22, 28, 29, 363, 364, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 363, 364, 28, 29, 354, 355, 28, 29, 28, 29, 28, 29, 28, 29, 40, 41, 44, 45, 21, 25, 17, 18, 5, 6, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 7, 511, 23, 24, 3, 4, 23, 24, 30, 31, 365, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 365, 31, 30, 31, 356, 31, 30, 31, 30, 31, 30, 31, 30, 31, 42, 43, 46, 47, 26, 27, 19, 20, 7, 8, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 1, 2, 5, 6, 370, 371, 21, 22, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 3, 4, 7, 8, 372, 373, 23, 24, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 354, 355, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 356, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":38, + "firstgid":1, + "image":"caves.png", + "imageheight":2400, + "imagewidth":2432, + "margin":0, + "name":"caves", + "spacing":0, + "tilecount":570, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/l9/level.json b/gamefilesd/level/l9/level.json new file mode 100755 index 00000000..04df09eb --- /dev/null +++ b/gamefilesd/level/l9/level.json @@ -0,0 +1,31 @@ +{ + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], + "palette": [ + { + "id": "l3_1", + "file": "levels/l3data/l3_1.pal" + }, + { + "id": "colorCycle", + "fromId": "l3_1" + } + ], + "level": { + "id": "level", + "palette": "l3_1", + "file": "levels/l3data/l3.cel", + "outOfBoundsTileLayer2": 7, + "til": "levels/l3data/l3.til", + "min": "levels/l3data/l3.min", + "minBlocks": 10, + "sol": "levels/l3data/l3.sol" + }, + "load": "level/automap/l3/load.json", + "load": "level/l9/levelObjects.json", + "load": "level/l9/monsters.json", + "load": "level/l9/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/l9/level2.json b/gamefilesd/level/l9/level2.json new file mode 100755 index 00000000..02c58a4e --- /dev/null +++ b/gamefilesd/level/l9/level2.json @@ -0,0 +1,16 @@ +{ + "level": { + "id": "level", + "path": "l9", + "name": "9", + "map": { "file": "level/l9/l9.json", "indexOffset": -1, "defaultTile": 6 } + }, + "load": "level/l9/levelObjects2.json", + "load": "level/l9/monsters2.json", + "load": ["level/town/loadPassages.json", "true", "true", "false"], + "event": { + "time": 1.5, + "addToFront": true, + "action": { "name": "load", "file": ["res/player/sound/load.json", 98, "", "playAudio", "currentLevel"] } + } +} \ No newline at end of file diff --git a/gamefilesd/level/l9/levelObjects2.json b/gamefilesd/level/l9/levelObjects2.json new file mode 100755 index 00000000..8ddd8c07 --- /dev/null +++ b/gamefilesd/level/l9/levelObjects2.json @@ -0,0 +1,33 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDown", + "mapPosition": [18, 37], + "properties": { + "x": 73, + "y": 69, + "level": 10 + } + }, + { + "id": "town", + "class": "levelTown", + "mapPosition": [49, 18], + "properties": { + "x": 18, + "y": 69 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [61, 74], + "properties": { + "x": 52, + "y": 28, + "level": 8 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/l9/music.json b/gamefilesd/level/l9/music.json new file mode 100755 index 00000000..dbeb6130 --- /dev/null +++ b/gamefilesd/level/l9/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvlc.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/l9/townToLevel.json b/gamefilesd/level/l9/townToLevel.json new file mode 100755 index 00000000..4e5692a7 --- /dev/null +++ b/gamefilesd/level/l9/townToLevel.json @@ -0,0 +1,11 @@ +{ + "levelObject": { + "id": "caves", + "class": "levelCaves", + "mapPosition": [17, 69], + "properties": { + "x": 49, + "y": 19 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/levelObject/classes.json b/gamefilesd/level/levelObject/classes.json new file mode 100755 index 00000000..ab621427 --- /dev/null +++ b/gamefilesd/level/levelObject/classes.json @@ -0,0 +1,4 @@ +{ + "load": "level/levelObject/classifiers.json", + "load": "level/levelObject/classes2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/levelObject/classes2.json b/gamefilesd/level/levelObject/classes2.json new file mode 100755 index 00000000..2c59c502 --- /dev/null +++ b/gamefilesd/level/levelObject/classes2.json @@ -0,0 +1,228 @@ +{ + "levelObjectClass": [ + { + "id": "levelDown", + "name": "Down to level", + "nameClassifier": "levelNameDown", + "text2": "cuttt", + "texture": "empty", + "textureRect": [32, 32], + "descriptions": [ + { "index": 0, "name": "levelPath" }, + { "index": 1, "name": "loadingScreenDown" } + ], + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.down.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.down.x%, %currentLevel.levelObject.down.y%]", + "%currentLevel.levelObject.down.d.1%" + ] + } + } + }, + { + "id": "levelBackDown", + "fromId": "levelDown", + "nameClassifier": "levelNameBack" + }, + { + "id": "levelDownDungeon", + "fromId": "levelDown", + "text1": "l1", + "text2": "cutl1d" + }, + { + "id": "levelDownCatacombs", + "fromId": "levelDown", + "text1": "l5", + "text2": "cut2" + }, + { + "id": "levelDownCaves", + "fromId": "levelDown", + "text1": "l9", + "text2": "cut3" + }, + { + "id": "levelDownHell", + "fromId": "levelDown", + "text1": "l13", + "text2": "cut4" + }, + { + "id": "levelDownDiablo", + "fromId": "levelDown", + "text1": "l16", + "text2": "cutgate" + }, + { + "id": "levelDownBluePortal", + "fromId": "levelDown", + "text2": "cutportl" + }, + { + "id": "levelDownRedPortal", + "fromId": "levelDown", + "text2": "cutportr" + }, + { + "id": "levelDown2", + "fromId": "levelDown", + "text2": "cuttt", + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.down2.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.down2.x%, %currentLevel.levelObject.down2.y%]", + "%currentLevel.levelObject.down2.d.1%" + ] + } + } + }, + { + "id": "levelDownDungeon2", + "fromId": "levelDown2", + "text1": "l1", + "text2": "cutl1d" + }, + { + "id": "levelDownCatacombs2", + "fromId": "levelDown2", + "text1": "l5", + "text2": "cut2" + }, + { + "id": "levelDownCaves2", + "fromId": "levelDown2", + "text1": "l9", + "text2": "cut3" + }, + { + "id": "levelDownHell2", + "fromId": "levelDown2", + "text1": "l13", + "text2": "cut4" + }, + { + "id": "levelDownDiablo2", + "fromId": "levelDown2", + "text1": "l16", + "text2": "cutgate" + }, + { + "id": "levelDownBluePortal2", + "fromId": "levelDown2", + "text2": "cutportl" + }, + { + "id": "levelDownRedPortal2", + "fromId": "levelDown2", + "text2": "cutportr" + }, + { + "id": "levelUp", + "fromId": "levelDown", + "name": "Up to level", + "nameClassifier": "levelNameUp", + "descriptions": [ + { "index": 0, "name": "levelPath" }, + { "index": 1, "name": "loadingScreenUp" } + ], + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.up.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.up.x%, %currentLevel.levelObject.up.y%]", + "%currentLevel.levelObject.up.d.1%" + ] + } + } + }, + { + "id": "levelBackUp", + "fromId": "levelUp", + "nameClassifier": "levelNameBack" + }, + { + "id": "levelTown", + "fromId": "levelUp", + "name": "Up to town", + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "town", + "positionPlayer", + "[%currentLevel.levelObject.town.x%, %currentLevel.levelObject.town.y%]", + "cuttt" + ] + } + } + }, + { + "id": "levelCatacombs", + "fromId": "levelTown", + "name": "Down to catacombs", + "text1": "l5", + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.catacombs.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.catacombs.x%, %currentLevel.levelObject.catacombs.y%]", + "cut2" + ] + } + } + }, + { + "id": "levelCaves", + "fromId": "levelTown", + "name": "Down to caves", + "text1": "l9", + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.caves.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.caves.x%, %currentLevel.levelObject.caves.y%]", + "cut3" + ] + } + } + }, + { + "id": "levelHell", + "fromId": "levelTown", + "name": "Down to hell", + "text1": "l13", + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.hell.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.hell.x%, %currentLevel.levelObject.hell.y%]", + "cut4" + ] + } + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/levelObject/classifiers.json b/gamefilesd/level/levelObject/classifiers.json new file mode 100755 index 00000000..fe812a5f --- /dev/null +++ b/gamefilesd/level/levelObject/classifiers.json @@ -0,0 +1,107 @@ +{ + "classifier": [ + { + "id": "levelNameDown", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": -1, "value": "Down to level %level%" }, + { "min": 0, "max": 0, "value": "Down to town" }, + { "min": 1, "max": 1, "value": "Down to dungeon" }, + { "min": 2, "max": "max", "value": "Down to level %level%" } + ] + }, + { + "property": "text1", + "value": [ + { "text": "poisonWater", "value": "A Dark Passage" }, + { "text": "skeletonKing", "value": "To King Leoric's Tomb" }, + { "text": "chamberBone", "value": "To The Chamber of Bone" } + ] + }, + { "value": { "value": "%simpleName%" } } + ] + }, + { + "id": "levelNameUp", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": -1, "value": "Up to level %level%" }, + { "min": 0, "max": 0, "value": "Up to town" }, + { "min": 1, "max": "max", "value": "Up to level %level%" } + ] + }, + { "value": { "value": "%simpleName%" } } + ] + }, + { + "id": "levelNameBack", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": -1, "value": "Back to level %level%" }, + { "min": 0, "max": 0, "value": "Back to town" }, + { "min": 1, "max": "max", "value": "Back to level %level%" } + ] + }, + { "value": { "value": "%simpleName%" } } + ] + }, + { + "id": "levelPath", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": -1, "value": "l%level%" }, + { "min": 0, "max": 0, "value": "town" }, + { "min": 1, "max": "max", "value": "l%level%" } + ] + }, + { "value": { "value": "%text1%" } } + ] + }, + { + "id": "loadingScreenText2", + "values": "%text2%" + }, + { + "id": "loadingScreenDown", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": 1, "value": "cuttt" }, + { "min": 2, "max": 5, "value": "cutl1d" }, + { "min": 6, "max": 9, "value": "cut2" }, + { "min": 10, "max": 13, "value": "cut3" }, + { "min": 14, "max": 15, "value": "cut4" }, + { "min": 16, "max": 16, "value": "cutgate" }, + { "min": 17, "max": "max", "value": "cut4" } + ] + }, + { "value": { "value": "%text2%" } } + ] + }, + { + "id": "loadingScreenUp", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": 0, "value": "cuttt" }, + { "min": 1, "max": 3, "value": "cutl1d" }, + { "min": 4, "max": 7, "value": "cut2" }, + { "min": 8, "max": 11, "value": "cut3" }, + { "min": 12, "max": "max", "value": "cut4" } + ] + }, + { "value": { "value": "%text2%" } } + ] + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/load.json b/gamefilesd/level/load.json index 0bd2eee0..50c4c090 100755 --- a/gamefilesd/level/load.json +++ b/gamefilesd/level/load.json @@ -6,9 +6,9 @@ "action": [ { "name": "resource.popAll", "id": "currentLevel" }, { "name": "load", "file": "loadingScreens/{4}.json" }, + { "name": "load", "file": ["level/saveCurrentLevel.json", "%currentLevel.path%"] }, { "name": "game.fadeIn", "action": [ - { "name": "level.pause", "pause": false }, { "name": "loadingScreen.setProgress", "progress": 35 }, { "name": "resource.add", "id": "currentLevel" }, { "name": "load", "file": "level/clearPlayers.json" }, @@ -16,9 +16,11 @@ { "name": "load", "file": "level/{1}/sounds.json" }, { "name": "loadingScreen.setProgress", "progress": 45 }, { "name": "load", "file": "level/{1}/level.json" }, + { "name": "load", "file": "res/level/actions/colorCycling.json" }, { "name": "loadingScreen.setProgress", "progress": 80 }, { "name": "load", "file": "level/{1}/music.json" }, - { "name": "load", "file": ["level/afterLevelLoad.json", "{1}", "{2}", "{3}"] }, + { "name": "load", "file": ["level/afterLevelLoad.json", "{2}", "{3}"] }, + { "name": "level.pause", "pause": false }, { "name": "loadingScreen.setProgress", "progress": 100 }, "clearPanelText" ] diff --git a/gamefilesd/level/loadBase.json b/gamefilesd/level/loadBase.json deleted file mode 100755 index 0b5768ff..00000000 --- a/gamefilesd/level/loadBase.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "action": { - "name": "game.fadeOut", - "action": [ - { "name": "resource.popAll" }, - { "name": "load", "file": "loadingScreens/{1}.json" }, - { "name": "load", "file": "gameSettings.json" }, - { "name": "game.fadeIn", - "action": [ - { "name": "loadingScreen.setProgress", "progress": 10 }, - { "name": "resource.add", "id": "level", "ignorePrevious": true }, - { "name": "load", "file": "level/clearPlayers.json" }, - { "name": "level.clearObjects" }, - { "name": "loadingScreen.setProgress", "progress": 15 }, - { "name": "load", "file": "level/variables.json" }, - { "name": "load", "file": "res/level/actions.json" }, - { "name": "load", "file": "res/level/baseLevelActions.json" }, - { "name": "loadingScreen.setProgress", "progress": 20 }, - { "name": "load", "file": "res/level/fonts.json" }, - { "name": "loadingScreen.setProgress", "progress": 25 }, - { "name": "load", "file": "res/level/sounds.json" }, - { "name": "loadingScreen.setProgress", "progress": 30 }, - { "name": "load", "file": "res/level/textures.json" }, - { "name": "loadingScreen.setProgress", "progress": 35 }, - { "name": "load", "file": "level/loadBaseLevel.json" }, - { "name": "loadingScreen.setProgress", "progress": 45 }, - { "name": "load", "file": "level/item/classes.json" }, - { "name": "loadingScreen.setProgress", "progress": 50 }, - { "name": "load", "file": "res/player/sounds.json" }, - { "name": "loadingScreen.setProgress", "progress": 55 }, - { "name": "load", "file": "level/player/loadCel.json" }, - { "name": "loadingScreen.setProgress", "progress": 60 }, - { "name": "resource.add", "id": "currentLevel" }, - { "name": "load", "file": "level/{2}/sounds.json" }, - { "name": "loadingScreen.setProgress", "progress": 65 }, - { "name": "load", "file": "{3}/loadPlayer.json" }, - { "name": "loadingScreen.setProgress", "progress": 70 }, - { "name": "load", "file": "level/{2}/level.json" }, - { "name": "loadingScreen.setProgress", "progress": 95 }, - { "name": "load", "file": "level/{2}/music.json" }, - { "name": "load", "file": ["level/afterLevelLoad.json", "{2}"] }, - { "name": "loadingScreen.setProgress", "progress": 100 } - ] - } - ] - } -} \ No newline at end of file diff --git a/gamefilesd/level/loadBaseLevel.json b/gamefilesd/level/loadBaseLevel.json index cae12c78..b0c6659f 100755 --- a/gamefilesd/level/loadBaseLevel.json +++ b/gamefilesd/level/loadBaseLevel.json @@ -3,6 +3,7 @@ "id": "level", "anchor": "all", "size": [640, 352], + "automapPlayerDirectionIndex": 1024, "playerClassClearIndex": 1, "playerClearIndex": 1, "onHoverEnter": "levelHoverAction", @@ -64,6 +65,5 @@ 1583495809 ] }, - "load": "ui/level/char/panel.json", - "load": "level/quests.json" + "load": "ui/level/char/panel.json" } \ No newline at end of file diff --git a/gamefilesd/level/loadCurrentSaveTemplate.json b/gamefilesd/level/loadCurrentSaveTemplate.json new file mode 100755 index 00000000..f20b4d98 --- /dev/null +++ b/gamefilesd/level/loadCurrentSaveTemplate.json @@ -0,0 +1,3 @@ +{ + "load": ["level/loadSavedGame.json", "{1}", "{2}"] +} \ No newline at end of file diff --git a/gamefilesd/level/loadFull.json b/gamefilesd/level/loadFull.json new file mode 100755 index 00000000..b2f4d29e --- /dev/null +++ b/gamefilesd/level/loadFull.json @@ -0,0 +1,17 @@ +{ + "action": { + "name": "game.fadeOut", + "action": [ + { "name": "variable.set", "key": "charName", "value": "{3}" }, + { "name": "resource.popAll" }, + { "name": "load", "file": "loadingScreens/{1}.json" }, + { "name": "load", "file": "gameSettings.json" }, + { "name": "game.fadeIn", + "action": [ + { "name": "load", "file": ["level/loadFull2.json", "{2}"] }, + { "name": "loadingScreen.setProgress", "progress": 100 } + ] + } + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/loadFull2.json b/gamefilesd/level/loadFull2.json new file mode 100755 index 00000000..2a299eb3 --- /dev/null +++ b/gamefilesd/level/loadFull2.json @@ -0,0 +1,38 @@ +{ + "action": [ + { "name": "loadingScreen.setProgress", "progress": 10 }, + { "name": "resource.add", "id": "level", "ignorePrevious": true }, + { "name": "loadingScreen.setProgress", "progress": 15 }, + { "name": "load", "file": "level/variables.json" }, + { "name": "load", "file": "res/level/actions.json" }, + { "name": "load", "file": "res/level/baseLevelActions.json" }, + { "name": "loadingScreen.setProgress", "progress": 20 }, + { "name": "load", "file": "res/level/fonts.json" }, + { "name": "loadingScreen.setProgress", "progress": 25 }, + { "name": "load", "file": "res/level/sounds.json" }, + { "name": "loadingScreen.setProgress", "progress": 30 }, + { "name": "load", "file": "res/level/textures.json" }, + { "name": "loadingScreen.setProgress", "progress": 35 }, + { "name": "load", "file": "level/loadBaseLevel.json" }, + { "name": "load", "file": "level/automap/loadAll.json" }, + { "name": "loadingScreen.setProgress", "progress": 45 }, + { "name": "load", "file": "level/item/classes.json" }, + { "name": "load", "file": "level/levelObject/classes.json" }, + { "name": "load", "file": "level/player/classifiers.json" }, + { "name": "load", "file": "level/spell/classes.json" }, + { "name": "loadingScreen.setProgress", "progress": 50 }, + { "name": "load", "file": "res/player/sounds.json" }, + { "name": "loadingScreen.setProgress", "progress": 60 }, + { "name": "load", "file": "level/player/loadCel.json" }, + { "name": "loadingScreen.setProgress", "progress": 70 }, + { "name": "resource.add", "id": "currentLevel" }, + { "name": "load", "file": "level/{1}/sounds.json" }, + { "name": "loadingScreen.setProgress", "progress": 80 }, + { "name": "load", "file": "level/{1}/level.json" }, + { "name": "load", "file": "res/level/actions/colorCycling.json" }, + { "name": "loadingScreen.setProgress", "progress": 95 }, + { "name": "load", "file": "level/{1}/music.json" }, + { "name": "load", "file": "level/showMap.json" }, + { "name": "load", "file": "level/afterLevelLoad.json" } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/loadGame.json b/gamefilesd/level/loadGame.json index 16b5ef07..374f0b0e 100755 --- a/gamefilesd/level/loadGame.json +++ b/gamefilesd/level/loadGame.json @@ -1,3 +1,7 @@ { - "load": ["level/loadBase.json", "cutstart", "town", "{1}"] + "action": [ + { "name": "io.deleteAll", "file": "%tempDir%", "deleteRoot": false }, + { "name": "dir.copy", "source": "{1}/level", "destination": "%tempDir%/level" } + ], + "load": ["level/loadGame2.json", "{1}"] } \ No newline at end of file diff --git a/gamefilesd/level/loadGame2.json b/gamefilesd/level/loadGame2.json new file mode 100755 index 00000000..35549a2a --- /dev/null +++ b/gamefilesd/level/loadGame2.json @@ -0,0 +1,3 @@ +{ + "load": ["level/loadFull.json", "cutstart", "town", "{1}"] +} \ No newline at end of file diff --git a/gamefilesd/level/loadGame2Template.json b/gamefilesd/level/loadGame2Template.json new file mode 100755 index 00000000..f76010a3 --- /dev/null +++ b/gamefilesd/level/loadGame2Template.json @@ -0,0 +1,3 @@ +{ + "load": ["level/loadFull.json", "cutstart", "{1}", "{2}"] +} \ No newline at end of file diff --git a/gamefilesd/level/load2.json b/gamefilesd/level/loadSavedGame.json similarity index 50% rename from gamefilesd/level/load2.json rename to gamefilesd/level/loadSavedGame.json index 980fc46c..dd7712bc 100755 --- a/gamefilesd/level/load2.json +++ b/gamefilesd/level/loadSavedGame.json @@ -1,16 +1,24 @@ { "action": [ - { "name": "level.pause", "pause": true }, { "name": "load", "file": ["ui/level/msgBox/show.json", "loading..."] }, + { "name": "level.pause", "pause": true }, + { "name": "io.deleteAll", "file": "%tempDir%", "deleteRoot": false }, + { "name": "dir.copy", "source": "{2}/level", "destination": "%tempDir%/level" }, + { "name": "variable.set", "key": "charName", "value": "{2}" }, + { "name": "level.clearPlayers", "index": 1 }, + { "name": "level.clearPlayerTextures" }, + { "name": "level.clearObjects" }, + { "name": "level.clearPlayers" }, + { "name": "level.clearQuests" }, { "name": "resource.popAll", "id": "currentLevel" }, - { "name": "level.pause", "pause": false }, { "name": "resource.add", "id": "currentLevel" }, - { "name": "load", "file": "level/clearPlayers.json" }, - { "name": "level.clearObjects" }, { "name": "load", "file": "level/{1}/sounds.json" }, { "name": "load", "file": "level/{1}/level.json" }, + { "name": "load", "file": "res/level/actions/colorCycling.json" }, { "name": "load", "file": "level/{1}/music.json" }, - { "name": "load", "file": ["level/afterLevelLoad.json", "{1}", "{2}", "{3}"] }, + { "name": "load", "file": "level/showMap.json" }, + { "name": "load", "file": "level/afterLevelLoad.json" }, + { "name": "level.pause", "pause": false }, { "name": "loadJson", "json": { "action": "closeMsgBox" } }, "clearPanelText" ] diff --git a/gamefilesd/level/monster/Butcher/class.json b/gamefilesd/level/monster/Butcher/class.json index 989789fb..e02f5b57 100755 --- a/gamefilesd/level/monster/Butcher/class.json +++ b/gamefilesd/level/monster/Butcher/class.json @@ -5,8 +5,8 @@ "name": "The Butcher", "type": "Demon", "description": "Some Magic Resistances\nNo Immunities", - "defaultOutline": "%outlineEnemy%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineEnemy|", + "outlineIgnore": "0x000000", "defaults": { "level": 10, "experience": 710, diff --git a/gamefilesd/level/monster/Diablo/class.json b/gamefilesd/level/monster/Diablo/class.json index b82ef69c..147f54f7 100755 --- a/gamefilesd/level/monster/Diablo/class.json +++ b/gamefilesd/level/monster/Diablo/class.json @@ -5,8 +5,8 @@ "name": "The Dark Lord", "type": "Demon", "description": "Some Magic Resistances\nSome Magic Immunities", - "defaultOutline": "%outlineEnemy%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineEnemy|", + "outlineIgnore": "0x000000", "defaults": { "level": 45, "experience": 31666, diff --git a/gamefilesd/level/monster/Scavenger/class.json b/gamefilesd/level/monster/Scavenger/class.json index 5c063c96..9f8b3a3a 100755 --- a/gamefilesd/level/monster/Scavenger/class.json +++ b/gamefilesd/level/monster/Scavenger/class.json @@ -5,8 +5,8 @@ "name": "Scavenger", "type": "Animal", "description": "Total Kills : %totalKills%", - "defaultOutline": "%outlineEnemy%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineEnemy|", + "outlineIgnore": "0x000000", "defaults": { "level": 2, "experience": 80, diff --git a/gamefilesd/level/monster/Skeleton King/class.json b/gamefilesd/level/monster/Skeleton King/class.json index 48282aab..2702d279 100755 --- a/gamefilesd/level/monster/Skeleton King/class.json +++ b/gamefilesd/level/monster/Skeleton King/class.json @@ -5,8 +5,8 @@ "name": "The Skeleton King", "type": "Undead", "description": "Some Magic Resistances\nSome Magic Immunities", - "defaultOutline": "%outlineEnemy%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineEnemy|", + "outlineIgnore": "0x000000", "defaults": { "level": 14, "experience": 570, diff --git a/gamefilesd/level/newGame.json b/gamefilesd/level/newGame.json index ddef1ebb..62bdc898 100755 --- a/gamefilesd/level/newGame.json +++ b/gamefilesd/level/newGame.json @@ -3,52 +3,16 @@ "name": "game.fadeOut", "action": [ { "name": "variable.setId", "key": "charName", "id": "heroName", "property": "text" }, - { "name": "dir.create", "file": "%charName%" }, + { "name": "variable.set", "key": "automapZoom", "value": 0 }, { "name": "resource.popAll" }, { "name": "load", "file": "loadingScreens/cutstart.json" }, + { "name": "io.deleteAll", "file": "%tempDir%", "deleteRoot": false }, + { "name": "dir.create", "file": "%charName%" }, { "name": "load", "file": "gameSettings.json" }, { "name": "game.fadeIn", "action": [ - { "name": "loadingScreen.setProgress", "progress": 10 }, - { "name": "resource.add", "id": "level", "ignorePrevious": true }, - { "name": "loadingScreen.setProgress", "progress": 15 }, - { "name": "load", "file": "level/variables.json" }, - { "name": "load", "file": "res/level/actions.json" }, - { "name": "load", "file": "res/level/baseLevelActions.json" }, - { "name": "loadingScreen.setProgress", "progress": 20 }, - { "name": "load", "file": "res/level/fonts.json" }, - { "name": "loadingScreen.setProgress", "progress": 25 }, - { "name": "load", "file": "res/level/sounds.json" }, - { "name": "loadingScreen.setProgress", "progress": 30 }, - { "name": "load", "file": "res/level/textures.json" }, - { "name": "loadingScreen.setProgress", "progress": 35 }, - { "name": "load", "file": "level/loadBaseLevel.json" }, - { "name": "loadingScreen.setProgress", "progress": 45 }, - { "name": "load", "file": "level/item/classes.json" }, - { "name": "loadingScreen.setProgress", "progress": 50 }, - { "name": "load", "file": "res/player/sounds.json" }, - { "name": "loadingScreen.setProgress", "progress": 55 }, - { "name": "load", "file": ["level/player/save.json", "%charName%", "%charClass%"] }, - { "name": "load", "file": ["level/player/loadCel.json", "%charName%"] }, - { "name": "resource.add", "id": "currentLevel" }, - { "name": "load", "file": "level/town/sounds.json" }, - { "name": "loadingScreen.setProgress", "progress": 60 }, - { "name": "load", "file": ["level/player/load.json", "%charName%"] }, - { "name": "load", "file": ["level/player/saveInfo.json", "%charName%"] }, - { "name": "loadingScreen.setProgress", "progress": 65 }, - { "name": "load", "file": "level/town/level.json" }, - { "name": "loadingScreen.setProgress", "progress": 95 }, - { "name": "load", "file": "level/town/music.json" }, - { "name": "load", "file": ["level/afterLevelLoad.json", "town"] }, - { - "name": "if.equal", - "param1": "%beta%", - "param2": true, - "else": [ - { "name": "load", "file": "level/town/soundWelcome.json" }, - { "name": "sound.play", "id": "gameWelcome" } - ] - }, + { "name": "load", "file": ["level/loadFull2.json", "town"] }, + { "name": "load", "file": "level/saveGame.json" }, { "name": "loadingScreen.setProgress", "progress": 100 } ] } diff --git a/gamefilesd/level/playOrStopMusic.json b/gamefilesd/level/playOrStopMusic.json index 3b05464e..3ebb9081 100755 --- a/gamefilesd/level/playOrStopMusic.json +++ b/gamefilesd/level/playOrStopMusic.json @@ -1,7 +1,7 @@ { "action": { "name": "if.equal", - "param1": "|game|musicVolume|", + "param1": "%game.musicVolume%", "param2": 0, "then": { "name": "audio.stop", "id": "main" }, "else": { "name": "audio.play", "id": "main" } diff --git a/gamefilesd/level/player/Rogue/celFiles.json b/gamefilesd/level/player/Rogue/celFiles.json index 63fa5edd..657f2fb9 100755 --- a/gamefilesd/level/player/Rogue/celFiles.json +++ b/gamefilesd/level/player/Rogue/celFiles.json @@ -254,6 +254,30 @@ { "id": "rmulm", "file": "plrgfx/rogue/rmu/rmulm.cl2" }, { "id": "rmuqm", "file": "plrgfx/rogue/rmu/rmuqm.cl2" }, { "id": "rmust", "file": "plrgfx/rogue/rmu/rmust.cl2" }, - { "id": "rmuwl", "file": "plrgfx/rogue/rmu/rmuwl.cl2" } + { "id": "rmuwl", "file": "plrgfx/rogue/rmu/rmuwl.cl2" }, + { "id": "rhadt", "fromId": "rhndt" }, + { "id": "rhbdt", "fromId": "rhndt" }, + { "id": "rhddt", "fromId": "rhndt" }, + { "id": "rhhdt", "fromId": "rhndt" }, + { "id": "rhmdt", "fromId": "rhndt" }, + { "id": "rhsdt", "fromId": "rhndt" }, + { "id": "rhtdt", "fromId": "rhndt" }, + { "id": "rhudt", "fromId": "rhndt" }, + { "id": "rladt", "fromId": "rlndt" }, + { "id": "rlbdt", "fromId": "rlndt" }, + { "id": "rlddt", "fromId": "rlndt" }, + { "id": "rlhdt", "fromId": "rlndt" }, + { "id": "rlmdt", "fromId": "rlndt" }, + { "id": "rlsdt", "fromId": "rlndt" }, + { "id": "rltdt", "fromId": "rlndt" }, + { "id": "rludt", "fromId": "rlndt" }, + { "id": "rmadt", "fromId": "rmndt" }, + { "id": "rmbdt", "fromId": "rmndt" }, + { "id": "rmddt", "fromId": "rmndt" }, + { "id": "rmhdt", "fromId": "rmndt" }, + { "id": "rmmdt", "fromId": "rmndt" }, + { "id": "rmsdt", "fromId": "rmndt" }, + { "id": "rmtdt", "fromId": "rmndt" }, + { "id": "rmudt", "fromId": "rmndt" } ] } \ No newline at end of file diff --git a/gamefilesd/level/player/Rogue/celFilesBeta.json b/gamefilesd/level/player/Rogue/celFilesBeta.json index 9617c8af..0dbe2d7c 100755 --- a/gamefilesd/level/player/Rogue/celFilesBeta.json +++ b/gamefilesd/level/player/Rogue/celFilesBeta.json @@ -254,6 +254,30 @@ { "id": "rmulm", "file": "plrgfx/rogue/rmu/rmulm.cel" }, { "id": "rmuqm", "file": "plrgfx/rogue/rmu/rmuqm.cel" }, { "id": "rmust", "file": "plrgfx/rogue/rmu/rmust.cel" }, - { "id": "rmuwl", "file": "plrgfx/rogue/rmu/rmuwl.cel" } + { "id": "rmuwl", "file": "plrgfx/rogue/rmu/rmuwl.cel" }, + { "id": "rhadt", "fromId": "rhndt" }, + { "id": "rhbdt", "fromId": "rhndt" }, + { "id": "rhddt", "fromId": "rhndt" }, + { "id": "rhhdt", "fromId": "rhndt" }, + { "id": "rhmdt", "fromId": "rhndt" }, + { "id": "rhsdt", "fromId": "rhndt" }, + { "id": "rhtdt", "fromId": "rhndt" }, + { "id": "rhudt", "fromId": "rhndt" }, + { "id": "rladt", "fromId": "rlndt" }, + { "id": "rlbdt", "fromId": "rlndt" }, + { "id": "rlddt", "fromId": "rlndt" }, + { "id": "rlhdt", "fromId": "rlndt" }, + { "id": "rlmdt", "fromId": "rlndt" }, + { "id": "rlsdt", "fromId": "rlndt" }, + { "id": "rltdt", "fromId": "rlndt" }, + { "id": "rludt", "fromId": "rlndt" }, + { "id": "rmadt", "fromId": "rmndt" }, + { "id": "rmbdt", "fromId": "rmndt" }, + { "id": "rmddt", "fromId": "rmndt" }, + { "id": "rmhdt", "fromId": "rmndt" }, + { "id": "rmmdt", "fromId": "rmndt" }, + { "id": "rmsdt", "fromId": "rmndt" }, + { "id": "rmtdt", "fromId": "rmndt" }, + { "id": "rmudt", "fromId": "rmndt" } ] } \ No newline at end of file diff --git a/gamefilesd/level/player/Rogue/class.json b/gamefilesd/level/player/Rogue/class.json index 5cb9d554..6094b72a 100755 --- a/gamefilesd/level/player/Rogue/class.json +++ b/gamefilesd/level/player/Rogue/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Rogue", "type": "Human", - "description": "Rogue", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -75,19 +74,23 @@ { "name": "Defend4", "index": 4 }, { "name": "Hit1", "index": 4 }, { "name": "Hit2", "index": 4 }, - { "name": "Die1", "index": 4 }, - { "name": "Die2", "index": 4 } + { "name": "Die1", "index": 9 }, + { "name": "Die2", "index": 9 } ], "animationSpeeds": [ { "name": "Walk1", "animation": 20, "walk": 25 }, - { "name": "Walk2", "animation": 20, "walk": 25 } + { "name": "Walk2", "animation": 20, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefilesd/level/player/Rogue/defaults.json b/gamefilesd/level/player/Rogue/defaults.json index 865abab5..d3843392 100755 --- a/gamefilesd/level/player/Rogue/defaults.json +++ b/gamefilesd/level/player/Rogue/defaults.json @@ -42,7 +42,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } } diff --git a/gamefilesd/level/player/Sorceror/celFiles.json b/gamefilesd/level/player/Sorceror/celFiles.json index 03daadac..689abad3 100755 --- a/gamefilesd/level/player/Sorceror/celFiles.json +++ b/gamefilesd/level/player/Sorceror/celFiles.json @@ -254,6 +254,30 @@ { "id": "smulm", "file": "plrgfx/sorceror/smu/smulm.cl2" }, { "id": "smuqm", "file": "plrgfx/sorceror/smu/smuqm.cl2" }, { "id": "smust", "file": "plrgfx/sorceror/smu/smust.cl2" }, - { "id": "smuwl", "file": "plrgfx/sorceror/smu/smuwl.cl2" } + { "id": "smuwl", "file": "plrgfx/sorceror/smu/smuwl.cl2" }, + { "id": "shadt", "fromId": "shndt" }, + { "id": "shbdt", "fromId": "shndt" }, + { "id": "shddt", "fromId": "shndt" }, + { "id": "shhdt", "fromId": "shndt" }, + { "id": "shmdt", "fromId": "shndt" }, + { "id": "shsdt", "fromId": "shndt" }, + { "id": "shtdt", "fromId": "shndt" }, + { "id": "shudt", "fromId": "shndt" }, + { "id": "sladt", "fromId": "slndt" }, + { "id": "slbdt", "fromId": "slndt" }, + { "id": "slddt", "fromId": "slndt" }, + { "id": "slhdt", "fromId": "slndt" }, + { "id": "slmdt", "fromId": "slndt" }, + { "id": "slsdt", "fromId": "slndt" }, + { "id": "sltdt", "fromId": "slndt" }, + { "id": "sludt", "fromId": "slndt" }, + { "id": "smadt", "fromId": "smndt" }, + { "id": "smbdt", "fromId": "smndt" }, + { "id": "smddt", "fromId": "smndt" }, + { "id": "smhdt", "fromId": "smndt" }, + { "id": "smmdt", "fromId": "smndt" }, + { "id": "smsdt", "fromId": "smndt" }, + { "id": "smtdt", "fromId": "smndt" }, + { "id": "smudt", "fromId": "smndt" } ] } \ No newline at end of file diff --git a/gamefilesd/level/player/Sorceror/celFilesBeta.json b/gamefilesd/level/player/Sorceror/celFilesBeta.json index 1286b32b..59b665b7 100755 --- a/gamefilesd/level/player/Sorceror/celFilesBeta.json +++ b/gamefilesd/level/player/Sorceror/celFilesBeta.json @@ -254,6 +254,30 @@ { "id": "smulm", "file": "plrgfx/sorceror/smu/smulm.cel" }, { "id": "smuqm", "file": "plrgfx/sorceror/smu/smuqm.cel" }, { "id": "smust", "file": "plrgfx/sorceror/smu/smust.cel" }, - { "id": "smuwl", "file": "plrgfx/sorceror/smu/smuwl.cel" } + { "id": "smuwl", "file": "plrgfx/sorceror/smu/smuwl.cel" }, + { "id": "shadt", "fromId": "shndt" }, + { "id": "shbdt", "fromId": "shndt" }, + { "id": "shddt", "fromId": "shndt" }, + { "id": "shhdt", "fromId": "shndt" }, + { "id": "shmdt", "fromId": "shndt" }, + { "id": "shsdt", "fromId": "shndt" }, + { "id": "shtdt", "fromId": "shndt" }, + { "id": "shudt", "fromId": "shndt" }, + { "id": "sladt", "fromId": "slndt" }, + { "id": "slbdt", "fromId": "slndt" }, + { "id": "slddt", "fromId": "slndt" }, + { "id": "slhdt", "fromId": "slndt" }, + { "id": "slmdt", "fromId": "slndt" }, + { "id": "slsdt", "fromId": "slndt" }, + { "id": "sltdt", "fromId": "slndt" }, + { "id": "sludt", "fromId": "slndt" }, + { "id": "smadt", "fromId": "smndt" }, + { "id": "smbdt", "fromId": "smndt" }, + { "id": "smddt", "fromId": "smndt" }, + { "id": "smhdt", "fromId": "smndt" }, + { "id": "smmdt", "fromId": "smndt" }, + { "id": "smsdt", "fromId": "smndt" }, + { "id": "smtdt", "fromId": "smndt" }, + { "id": "smudt", "fromId": "smndt" } ] } \ No newline at end of file diff --git a/gamefilesd/level/player/Sorceror/class.json b/gamefilesd/level/player/Sorceror/class.json index 16e01b9d..be244ca8 100755 --- a/gamefilesd/level/player/Sorceror/class.json +++ b/gamefilesd/level/player/Sorceror/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Sorceror", "type": "Human", - "description": "Sorceror", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -75,19 +74,23 @@ { "name": "Defend4", "index": 4 }, { "name": "Hit1", "index": 4 }, { "name": "Hit2", "index": 4 }, - { "name": "Die1", "index": 4 }, - { "name": "Die2", "index": 4 } + { "name": "Die1", "index": 9 }, + { "name": "Die2", "index": 9 } ], "animationSpeeds": [ { "name": "Walk1", "animation": 20, "walk": 25 }, - { "name": "Walk2", "animation": 20, "walk": 25 } + { "name": "Walk2", "animation": 20, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefilesd/level/player/Sorceror/defaults.json b/gamefilesd/level/player/Sorceror/defaults.json index 4c3c7ffa..313b5895 100755 --- a/gamefilesd/level/player/Sorceror/defaults.json +++ b/gamefilesd/level/player/Sorceror/defaults.json @@ -42,7 +42,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } } diff --git a/gamefilesd/level/player/Warrior/celFiles.json b/gamefilesd/level/player/Warrior/celFiles.json index 034b57d1..ac4e07dd 100755 --- a/gamefilesd/level/player/Warrior/celFiles.json +++ b/gamefilesd/level/player/Warrior/celFiles.json @@ -254,6 +254,30 @@ { "id": "wmulm", "file": "plrgfx/warrior/wmu/wmulm.cl2" }, { "id": "wmuqm", "file": "plrgfx/warrior/wmu/wmuqm.cl2" }, { "id": "wmust", "file": "plrgfx/warrior/wmu/wmust.cl2" }, - { "id": "wmuwl", "file": "plrgfx/warrior/wmu/wmuwl.cl2" } + { "id": "wmuwl", "file": "plrgfx/warrior/wmu/wmuwl.cl2" }, + { "id": "whadt", "fromId": "whndt" }, + { "id": "whbdt", "fromId": "whndt" }, + { "id": "whddt", "fromId": "whndt" }, + { "id": "whhdt", "fromId": "whndt" }, + { "id": "whmdt", "fromId": "whndt" }, + { "id": "whsdt", "fromId": "whndt" }, + { "id": "whtdt", "fromId": "whndt" }, + { "id": "whudt", "fromId": "whndt" }, + { "id": "wladt", "fromId": "wlndt" }, + { "id": "wlbdt", "fromId": "wlndt" }, + { "id": "wlddt", "fromId": "wlndt" }, + { "id": "wlhdt", "fromId": "wlndt" }, + { "id": "wlmdt", "fromId": "wlndt" }, + { "id": "wlsdt", "fromId": "wlndt" }, + { "id": "wltdt", "fromId": "wlndt" }, + { "id": "wludt", "fromId": "wlndt" }, + { "id": "wmadt", "fromId": "wmndt" }, + { "id": "wmbdt", "fromId": "wmndt" }, + { "id": "wmddt", "fromId": "wmndt" }, + { "id": "wmhdt", "fromId": "wmndt" }, + { "id": "wmmdt", "fromId": "wmndt" }, + { "id": "wmsdt", "fromId": "wmndt" }, + { "id": "wmtdt", "fromId": "wmndt" }, + { "id": "wmudt", "fromId": "wmndt" } ] } \ No newline at end of file diff --git a/gamefilesd/level/player/Warrior/celFilesBeta.json b/gamefilesd/level/player/Warrior/celFilesBeta.json index b4d2e474..84c4aef9 100755 --- a/gamefilesd/level/player/Warrior/celFilesBeta.json +++ b/gamefilesd/level/player/Warrior/celFilesBeta.json @@ -254,6 +254,30 @@ { "id": "wmulm", "file": "plrgfx/warrior/wmu/wmulm.cel" }, { "id": "wmuqm", "file": "plrgfx/warrior/wmu/wmuqm.cel" }, { "id": "wmust", "file": "plrgfx/warrior/wmu/wmust.cel" }, - { "id": "wmuwl", "file": "plrgfx/warrior/wmu/wmuwl.cel" } + { "id": "wmuwl", "file": "plrgfx/warrior/wmu/wmuwl.cel" }, + { "id": "whadt", "fromId": "whndt" }, + { "id": "whbdt", "fromId": "whndt" }, + { "id": "whddt", "fromId": "whndt" }, + { "id": "whhdt", "fromId": "whndt" }, + { "id": "whmdt", "fromId": "whndt" }, + { "id": "whsdt", "fromId": "whndt" }, + { "id": "whtdt", "fromId": "whndt" }, + { "id": "whudt", "fromId": "whndt" }, + { "id": "wladt", "fromId": "wlndt" }, + { "id": "wlbdt", "fromId": "wlndt" }, + { "id": "wlddt", "fromId": "wlndt" }, + { "id": "wlhdt", "fromId": "wlndt" }, + { "id": "wlmdt", "fromId": "wlndt" }, + { "id": "wlsdt", "fromId": "wlndt" }, + { "id": "wltdt", "fromId": "wlndt" }, + { "id": "wludt", "fromId": "wlndt" }, + { "id": "wmadt", "fromId": "wmndt" }, + { "id": "wmbdt", "fromId": "wmndt" }, + { "id": "wmddt", "fromId": "wmndt" }, + { "id": "wmhdt", "fromId": "wmndt" }, + { "id": "wmmdt", "fromId": "wmndt" }, + { "id": "wmsdt", "fromId": "wmndt" }, + { "id": "wmtdt", "fromId": "wmndt" }, + { "id": "wmudt", "fromId": "wmndt" } ] } \ No newline at end of file diff --git a/gamefilesd/level/player/Warrior/class.json b/gamefilesd/level/player/Warrior/class.json index 699c7ea0..8ad40332 100755 --- a/gamefilesd/level/player/Warrior/class.json +++ b/gamefilesd/level/player/Warrior/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Warrior", "type": "Human", - "description": "Warrior", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -75,19 +74,23 @@ { "name": "Defend4", "index": 4 }, { "name": "Hit1", "index": 4 }, { "name": "Hit2", "index": 4 }, - { "name": "Die1", "index": 4 }, - { "name": "Die2", "index": 4 } + { "name": "Die1", "index": 9 }, + { "name": "Die2", "index": 9 } ], "animationSpeeds": [ { "name": "Walk1", "animation": 20, "walk": 25 }, - { "name": "Walk2", "animation": 20, "walk": 25 } + { "name": "Walk2", "animation": 20, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefilesd/level/player/Warrior/defaults.json b/gamefilesd/level/player/Warrior/defaults.json index 0efecddc..23046806 100755 --- a/gamefilesd/level/player/Warrior/defaults.json +++ b/gamefilesd/level/player/Warrior/defaults.json @@ -56,7 +56,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } ] diff --git a/gamefilesd/level/player/classifiers.json b/gamefilesd/level/player/classifiers.json new file mode 100755 index 00000000..e879f807 --- /dev/null +++ b/gamefilesd/level/player/classifiers.json @@ -0,0 +1,12 @@ +{ + "classifier": { + "id": "deadGuy", + "values": { + "property": "isDead", + "value": [ + { "min": false, "max": false, "value": "Wounded Townsman" }, + { "min": true, "max": true, "value": "Slain Townsman" } + ] + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/player/load.json b/gamefilesd/level/player/load.json deleted file mode 100755 index 105fa10e..00000000 --- a/gamefilesd/level/player/load.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "load": "{1}/loadPlayer.json" -} \ No newline at end of file diff --git a/gamefilesd/level/player/loadCelTexture.json b/gamefilesd/level/player/loadCelTexture.json index c897e433..faf2f784 100755 --- a/gamefilesd/level/player/loadCelTexture.json +++ b/gamefilesd/level/player/loadCelTexture.json @@ -10,7 +10,8 @@ "{1}lm", "{1}qm", "{1}st", - "{1}wl" + "{1}wl", + "{1}dt" ], "palette": "{2}" } diff --git a/gamefilesd/level/player/save.json b/gamefilesd/level/player/save.json deleted file mode 100755 index e7a2598b..00000000 --- a/gamefilesd/level/player/save.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "action": { - "name": "file.copy", - "dir": "{1}", - "file": ["level/player/{2}/defaults.json", "{1}"], - "writeFile": "loadPlayer.json" - } -} \ No newline at end of file diff --git a/gamefilesd/level/player/saveInfo.json b/gamefilesd/level/player/saveInfo.json index 830bb334..dec44e64 100755 --- a/gamefilesd/level/player/saveInfo.json +++ b/gamefilesd/level/player/saveInfo.json @@ -1,15 +1,15 @@ { "action": { "name": "file.copy", - "dir": "{1}", + "dir": "%currentLevel.currentPlayer.name%", "file": [ "ui/charInfo.json", - "|currentLevel|currentPlayer.level|", - "|currentLevel|currentPlayer.strengthNow|", - "|currentLevel|currentPlayer.magicNow|", - "|currentLevel|currentPlayer.dexterityNow|", - "|currentLevel|currentPlayer.vitalityNow|", - "|currentLevel|currentPlayer.class|" + "%currentLevel.currentPlayer.level%", + "%currentLevel.currentPlayer.strengthNow%", + "%currentLevel.currentPlayer.magicNow%", + "%currentLevel.currentPlayer.dexterityNow%", + "%currentLevel.currentPlayer.vitalityNow%", + "%currentLevel.currentPlayer.class%" ] } } \ No newline at end of file diff --git a/gamefilesd/level/poisonWater/level.json b/gamefilesd/level/poisonWater/level.json new file mode 100755 index 00000000..33bf0aeb --- /dev/null +++ b/gamefilesd/level/poisonWater/level.json @@ -0,0 +1,31 @@ +{ + "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 32 } + ], + "palette": [ + { + "id": "l3pwater", + "file": "levels/l3data/l3pwater.pal" + }, + { + "id": "colorCycle", + "fromId": "l3pwater" + } + ], + "level": { + "id": "level", + "palette": "l3pwater", + "file": "levels/l3data/l3.cel", + "outOfBoundsTileLayer2": 7, + "til": "levels/l3data/l3.til", + "min": "levels/l3data/l3.min", + "minBlocks": 10, + "sol": "levels/l3data/l3.sol" + }, + "load": "level/automap/l3/load.json", + "load": "level/poisonWater/levelObjects.json", + "load": "level/poisonWater/monsters.json", + "load": "level/poisonWater/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/poisonWater/level2.json b/gamefilesd/level/poisonWater/level2.json new file mode 100755 index 00000000..fdee062f --- /dev/null +++ b/gamefilesd/level/poisonWater/level2.json @@ -0,0 +1,11 @@ +{ + "level": { + "id": "level", + "path": "poisonWater", + "name": "Poisoned Water Supply", + "map": { "file": "levels/l3data/foulwatr.dun", "defaultTile": 6 } + }, + "load": "level/poisonWater/levelObjects2.json", + "load": "level/poisonWater/monsters2.json", + "load": "level/poisonWater/quests.json" +} \ No newline at end of file diff --git a/gamefilesd/level/poisonWater/levelObjects2.json b/gamefilesd/level/poisonWater/levelObjects2.json new file mode 100755 index 00000000..5480ce58 --- /dev/null +++ b/gamefilesd/level/poisonWater/levelObjects2.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "up", + "class": "levelBackUp", + "mapPosition": [14, 67], + "properties": { + "x": 73, + "y": 67, + "level": 2 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/poisonWater/music.json b/gamefilesd/level/poisonWater/music.json new file mode 100755 index 00000000..a4b80564 --- /dev/null +++ b/gamefilesd/level/poisonWater/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvla.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/poisonWater/quests.json b/gamefilesd/level/poisonWater/quests.json new file mode 100755 index 00000000..bbeef1e2 --- /dev/null +++ b/gamefilesd/level/poisonWater/quests.json @@ -0,0 +1,9 @@ +{ + "action": { "name": "quest.setState", "quest": "poisonedWater", "state": -1 }, + "audio": { + "file": "Sfx/misc/questdon.wav", + "resource": "currentLevel", + "volume": "%game.soundVolume%", + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/saveCurrentLevel.json b/gamefilesd/level/saveCurrentLevel.json new file mode 100755 index 00000000..8b345d7f --- /dev/null +++ b/gamefilesd/level/saveCurrentLevel.json @@ -0,0 +1,6 @@ +{ + "action": { + "name": "level.save", + "file": "%tempDir%/level/{1}/level2.json" + } +} \ No newline at end of file diff --git a/gamefilesd/level/saveGame.json b/gamefilesd/level/saveGame.json new file mode 100755 index 00000000..766b9871 --- /dev/null +++ b/gamefilesd/level/saveGame.json @@ -0,0 +1,51 @@ +{ + "action": [ + { + "name": "level.save", + "file": "%tempDir%/level/%currentLevel.path%/level2.json", + "saveCurrentPlayer": true, + "saveQuests": true + }, + { + "name": "file.copy", + "dir": "%tempDir%/level", + "writeFile": "loadGame2.json", + "file": [ + "level/loadGame2Template.json", + "%currentLevel.path%", + "%charName%" + ] + }, + { + "name": "file.copy", + "dir": "%tempDir%/level", + "writeFile": "loadCurrentSave.json", + "file": [ + "level/loadCurrentSaveTemplate.json", + "%currentLevel.path%", + "%charName%" + ] + }, + { + "name": "file.copy", + "dir": "%tempDir%/level", + "writeFile": "showMap.json", + "file": [ + "level/showMapTemplate.json", + "%currentLevel.showAutomap%", + "%automapZoom%" + ] + }, + { + "name": "io.deleteAll", + "file": "%charName%/level", + "deleteRoot": false + }, + { + "name": "dir.copy", + "source": "%tempDir%/level", + "destination": "%charName%/level" + }, + { "name": "load", "file": "level/player/saveInfo.json" } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/setMapAction.json b/gamefilesd/level/setMapAction.json deleted file mode 100755 index 8812d3fb..00000000 --- a/gamefilesd/level/setMapAction.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "action": { - "name": "if.equal", - "param1": { "name": "file.exists", "file": "level/{1}/map.json" }, - "param2": true, - "then": [ - { "name": "drawable.setAction", - "id": "map", - "event": "click", - "action": [ - { - "name": "if.equal", - "param1": "%showMap%", - "param2": true, - "then": [ - { "name": "variable.set", "key": "showMap", "val": false }, - { "name": "drawable.visible", "id": "txtMapLabel", "visible": true } - ], - "else": [ - { "name": "variable.set", "key": "showMap", "val": true }, - { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } - ] - }, - { - "name": "load", "file": "level/{1}/map.json" - } - ] - }, - { "name": "load", "file": "level/{1}/map.json" } - ], - "else": [ - { - "name": "drawable.setAction", - "id": "map", - "event": "click", - "action": { "name": "load", "file": "ui/level/noMap.json" } - }, - { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } - ] - } -} \ No newline at end of file diff --git a/gamefilesd/level/setupTempFolder.json b/gamefilesd/level/setupTempFolder.json new file mode 100755 index 00000000..c7bee1b9 --- /dev/null +++ b/gamefilesd/level/setupTempFolder.json @@ -0,0 +1,5 @@ +{ + "variable": { "tempDir": ".temp" }, + "action": { "name": "dir.create", "file": ".temp" }, + "mountFile": { "file": ".temp", "append": false, "prependSaveDir": true } +} \ No newline at end of file diff --git a/gamefilesd/level/showMapTemplate.json b/gamefilesd/level/showMapTemplate.json new file mode 100755 index 00000000..d9f22ff7 --- /dev/null +++ b/gamefilesd/level/showMapTemplate.json @@ -0,0 +1,7 @@ +{ + "action": [ + { "name": "level.showAutomap", "show": {1} }, + { "name": "variable.set", "key": "automapZoom", "value": {2} }, + "updateAutomapZoom" + ] +} \ No newline at end of file diff --git a/gamefilesd/level/skeletonKing/level.json b/gamefilesd/level/skeletonKing/level.json new file mode 100755 index 00000000..656c17a3 --- /dev/null +++ b/gamefilesd/level/skeletonKing/level.json @@ -0,0 +1,24 @@ +{ + "palette": [ + { + "id": "l1_5", + "file": "levels/l1data/l1_5.pal" + } + ], + "load": ["level/l1/l1s.json", "l1_5"], + "level": { + "id": "level", + "palette": "l1_5", + "file": "levels/l1data/l1.cel", + "layers": { "index": 2, "texturePack": "l1s" }, + "outOfBoundsTileLayer2": 21, + "til": "levels/l1data/l1.til", + "min": "levels/l1data/l1.min", + "minBlocks": 10, + "sol": "levels/l1data/l1.sol" + }, + "load": "level/automap/l1/load.json", + "load": "level/skeletonKing/levelObjects.json", + "load": "level/skeletonKing/monsters.json", + "load": "level/skeletonKing/level2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/skeletonKing/level2.json b/gamefilesd/level/skeletonKing/level2.json new file mode 100755 index 00000000..ef55fc0a --- /dev/null +++ b/gamefilesd/level/skeletonKing/level2.json @@ -0,0 +1,25 @@ +{ + "level": { + "id": "level", + "path": "skeletonKing", + "name": "Skeleton King's Lair", + "map": { "file": "level/skeletonKing/skeletonKing.json", "indexOffset": -1, "defaultTile": 12 } + }, + "load": "level/skeletonKing/levelObjects2.json", + "load": "level/skeletonKing/monsters2.json", + "event": { + "time": 1.5, + "addToFront": true, + "action": { + "name": "loadJson", + "json": { + "audio": { + "file": "sfx/monsters/sking01.wav", + "resource": "currentLevel", + "volume": "%game.soundVolume%", + "play": true + } + } + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/skeletonKing/levelObjects2.json b/gamefilesd/level/skeletonKing/levelObjects2.json new file mode 100755 index 00000000..2e8f574a --- /dev/null +++ b/gamefilesd/level/skeletonKing/levelObjects2.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "up", + "class": "levelBackUp", + "mapPosition": [82, 41], + "properties": { + "x": 33, + "y": 55, + "level": 3 + } + } +} \ No newline at end of file diff --git a/gamefilesd/level/skeletonKing/music.json b/gamefilesd/level/skeletonKing/music.json new file mode 100755 index 00000000..a4b80564 --- /dev/null +++ b/gamefilesd/level/skeletonKing/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "music/dlvla.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefilesd/level/skeletonKing/skeletonKing.json b/gamefilesd/level/skeletonKing/skeletonKing.json new file mode 100755 index 00000000..dc0ca681 --- /dev/null +++ b/gamefilesd/level/skeletonKing/skeletonKing.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 247, 242, 5, 6, 5, 6, 245, 246, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 312, 2, 23, 2, 346, 347, 312, 2, 346, 347, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 313, 314, 7, 4, 348, 349, 313, 314, 348, 349, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 256, 2, 303, 304, 57, 2, 350, 351, 303, 304, 57, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 257, 4, 305, 306, 58, 4, 352, 353, 305, 306, 58, 4, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 260, 2, 303, 304, 62, 2, 346, 347, 303, 304, 62, 2, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 261, 4, 305, 306, 63, 4, 348, 349, 305, 306, 63, 4, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 303, 304, 62, 2, 300, 2, 303, 304, 62, 2, 346, 347, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 305, 306, 63, 4, 301, 302, 305, 306, 63, 4, 348, 349, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 441, 442, 9, 6, 22, 11, 5, 6, 445, 442, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 446, 440, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 350, 351, 350, 351, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 245, 246, 5, 6, 9, 6, 237, 238, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 352, 353, 352, 353, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 3, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 260, 2, 346, 347, 296, 297, 417, 2, 278, 279, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 261, 4, 348, 349, 298, 299, 418, 419, 280, 4, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 245, 246, 5, 6, 5, 6, 41, 31, 227, 2, 346, 347, 23, 2, 437, 438, 9, 6, 245, 246, 5, 6, 5, 6, 41, 31, 40, 31, 1, 2, 350, 351, 23, 2, 227, 2, 350, 351, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 39, 33, 228, 4, 348, 349, 7, 4, 439, 440, 3, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 3, 4, 352, 353, 7, 4, 228, 4, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 312, 2, 437, 438, 1, 2, 300, 2, 346, 347, 437, 438, 1, 2, 23, 2, 350, 351, 346, 347, 30, 31, 40, 31, 42, 35, 441, 442, 441, 442, 256, 2, 346, 347, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 313, 314, 439, 440, 3, 4, 301, 302, 348, 349, 439, 440, 3, 4, 7, 4, 352, 353, 348, 349, 32, 33, 36, 33, 36, 33, 443, 440, 443, 440, 257, 4, 348, 349, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 278, 279, 307, 308, 14, 15, 237, 238, 420, 421, 237, 238, 5, 6, 8, 2, 23, 2, 278, 279, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 300, 2, 23, 2, 437, 438, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 281, 280, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 281, 280, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 301, 302, 7, 4, 439, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 23, 2, 315, 316, 350, 351, 124, 2, 23, 2, 346, 347, 315, 316, 346, 347, 23, 2, 346, 347, 346, 347, 30, 31, 40, 31, 40, 31, 9, 6, 229, 230, 5, 6, 394, 395, 243, 244, 229, 230, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 137, 138, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 317, 318, 352, 353, 273, 274, 7, 4, 348, 349, 317, 318, 348, 349, 7, 4, 348, 349, 348, 349, 32, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 139, 140, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 441, 442, 13, 2, 307, 308, 25, 26, 275, 276, 270, 271, 350, 351, 307, 308, 25, 26, 296, 297, 445, 442, 34, 35, 37, 31, 40, 31, 40, 31, 231, 2, 124, 2, 346, 347, 23, 2, 124, 2, 350, 351, 312, 2, 437, 438, 40, 31, 40, 31, 9, 6, 5, 127, 129, 130, 133, 134, 5, 6, 41, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 27, 4, 7, 277, 272, 4, 352, 353, 7, 4, 27, 4, 298, 299, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 232, 4, 273, 274, 348, 349, 7, 4, 273, 274, 352, 353, 313, 314, 439, 440, 36, 33, 36, 33, 3, 4, 7, 128, 131, 132, 135, 136, 7, 4, 39, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 190, 2, 346, 347, 124, 2, 124, 2, 124, 2, 350, 351, 23, 2, 350, 351, 296, 297, 24, 6, 243, 244, 5, 6, 5, 6, 322, 323, 21, 2, 275, 276, 270, 271, 350, 351, 275, 276, 270, 271, 296, 297, 24, 6, 201, 202, 322, 323, 21, 2, 23, 2, 141, 142, 143, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 191, 4, 348, 349, 7, 156, 157, 158, 159, 4, 352, 353, 7, 4, 352, 353, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 298, 299, 12, 4, 7, 277, 272, 4, 352, 353, 7, 277, 272, 4, 298, 299, 12, 4, 7, 4, 298, 299, 12, 4, 7, 4, 7, 4, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 9, 6, 5, 6, 243, 244, 322, 323, 448, 438, 40, 31, 192, 2, 346, 347, 23, 2, 160, 2, 152, 153, 146, 2, 350, 351, 23, 2, 296, 297, 254, 2, 23, 2, 23, 2, 346, 347, 296, 297, 21, 2, 346, 347, 23, 2, 23, 2, 23, 2, 346, 347, 296, 297, 21, 2, 350, 351, 296, 297, 209, 210, 346, 347, 23, 2, 346, 347, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 7, 4, 298, 299, 446, 440, 36, 33, 193, 4, 348, 349, 7, 4, 7, 161, 154, 155, 147, 4, 352, 353, 7, 4, 298, 299, 255, 4, 7, 4, 7, 4, 348, 349, 298, 299, 12, 4, 348, 349, 7, 4, 7, 4, 7, 4, 348, 349, 298, 299, 12, 4, 352, 353, 298, 299, 211, 4, 348, 349, 7, 4, 348, 349, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 350, 351, 307, 308, 14, 15, 5, 6, 167, 2, 350, 351, 124, 162, 163, 164, 148, 149, 144, 2, 350, 351, 350, 351, 23, 2, 21, 2, 23, 2, 350, 351, 346, 347, 296, 297, 21, 2, 124, 2, 350, 351, 23, 2, 124, 2, 346, 347, 346, 347, 21, 2, 346, 347, 296, 297, 254, 2, 224, 225, 216, 217, 23, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 352, 353, 7, 4, 7, 4, 7, 4, 175, 4, 352, 353, 7, 4, 165, 166, 150, 151, 145, 4, 352, 353, 352, 353, 7, 4, 12, 4, 7, 4, 352, 353, 348, 349, 298, 299, 12, 4, 273, 274, 352, 353, 7, 4, 273, 274, 348, 349, 348, 349, 12, 4, 348, 349, 298, 299, 255, 4, 226, 4, 218, 219, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 350, 351, 346, 347, 296, 297, 392, 2, 315, 316, 23, 2, 124, 2, 346, 347, 23, 2, 315, 316, 346, 347, 312, 2, 445, 442, 34, 35, 34, 35, 34, 35, 441, 442, 231, 2, 275, 276, 270, 271, 350, 351, 275, 276, 270, 271, 350, 351, 445, 442, 441, 442, 441, 442, 13, 2, 350, 351, 346, 347, 350, 351, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 352, 353, 348, 349, 298, 299, 393, 4, 317, 318, 7, 4, 273, 274, 348, 349, 7, 4, 317, 318, 348, 349, 313, 314, 446, 440, 36, 33, 36, 33, 36, 33, 443, 440, 232, 4, 7, 277, 272, 4, 352, 353, 7, 277, 272, 4, 352, 353, 446, 440, 443, 440, 443, 440, 3, 4, 352, 353, 348, 349, 352, 353, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 350, 351, 23, 2, 346, 347, 9, 6, 5, 6, 8, 2, 307, 308, 25, 26, 275, 276, 270, 271, 346, 347, 307, 308, 25, 26, 307, 308, 14, 15, 5, 6, 41, 31, 40, 31, 40, 31, 1, 2, 23, 2, 346, 347, 350, 351, 346, 347, 350, 351, 346, 347, 30, 31, 40, 31, 40, 31, 449, 442, 441, 442, 441, 442, 441, 442, 441, 442, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 352, 353, 7, 4, 348, 349, 3, 4, 7, 4, 7, 4, 7, 4, 27, 4, 7, 277, 272, 4, 348, 349, 7, 4, 27, 4, 7, 4, 7, 4, 7, 4, 39, 33, 36, 33, 36, 33, 3, 4, 7, 4, 348, 349, 352, 353, 348, 349, 352, 353, 348, 349, 32, 33, 36, 33, 36, 33, 443, 440, 443, 440, 443, 440, 443, 440, 443, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 441, 442, 1, 2, 346, 347, 23, 2, 350, 351, 346, 347, 350, 351, 23, 2, 350, 351, 350, 351, 23, 2, 23, 2, 346, 347, 350, 351, 30, 31, 40, 31, 40, 31, 42, 35, 441, 442, 9, 6, 394, 395, 5, 6, 445, 442, 34, 35, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 348, 349, 7, 4, 352, 353, 348, 349, 352, 353, 7, 4, 352, 353, 352, 353, 7, 4, 7, 4, 348, 349, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 4, 7, 4, 446, 440, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 260, 2, 23, 2, 278, 279, 346, 347, 38, 35, 34, 35, 34, 35, 34, 35, 441, 442, 13, 2, 23, 2, 278, 279, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 256, 2, 23, 2, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 261, 4, 7, 281, 280, 4, 348, 349, 39, 33, 36, 33, 36, 33, 36, 33, 443, 440, 3, 4, 7, 281, 280, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 257, 4, 7, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 346, 347, 346, 347, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 350, 351, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 227, 2, 346, 347, 23, 2, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 348, 349, 348, 349, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 228, 4, 348, 349, 7, 4, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 34, 35, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 278, 279, 346, 347, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 280, 4, 348, 349, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 1, 2, 23, 2, 350, 351, 30, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 3, 4, 7, 4, 352, 353, 32, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 42, 35, 34, 35, 34, 35, 37, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 40, 31, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33, 36, 33], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":34, + "firstgid":1, + "image":"dungeon.png", + "imageheight":2240, + "imagewidth":2176, + "margin":0, + "name":"dungeon", + "spacing":0, + "tilecount":476, + "tileheight":160, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefilesd/level/spell/classes.json b/gamefilesd/level/spell/classes.json new file mode 100755 index 00000000..9fde4556 --- /dev/null +++ b/gamefilesd/level/spell/classes.json @@ -0,0 +1,4 @@ +{ + "load": "level/spell/textures.json", + "load": "level/spell/classes2.json" +} \ No newline at end of file diff --git a/gamefilesd/level/spell/classes2.json b/gamefilesd/level/spell/classes2.json new file mode 100755 index 00000000..d1946239 --- /dev/null +++ b/gamefilesd/level/spell/classes2.json @@ -0,0 +1,4 @@ +{ + "load": "level/spell/skills.json", + "load": "level/spell/spells.json" +} \ No newline at end of file diff --git a/gamefilesd/level/spell/skills.json b/gamefilesd/level/spell/skills.json new file mode 100755 index 00000000..fb2dc4b5 --- /dev/null +++ b/gamefilesd/level/spell/skills.json @@ -0,0 +1,281 @@ +{ + "spellClass": [ + { + "id": "firebolt", + "texturePack1": "spelli2", + "texturePack2": "spelicon", + "textureIndex1": 0, + "textureIndex2": 0, + "name": "Firebolt", + "type": "Spell", + "defaults": { + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "chargedBolt", + "fromId": "firebolt", + "textureIndex1": 38, + "textureIndex2": 38, + "name": "Charged Bolt", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "holyBolt", + "fromId": "firebolt", + "textureIndex1": 41, + "textureIndex2": 41, + "name": "Holy Bolt", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "healing", + "fromId": "firebolt", + "textureIndex1": 1, + "textureIndex2": 1, + "name": "Healing", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "healOther", + "fromId": "firebolt", + "textureIndex1": 9, + "textureIndex2": 9, + "name": "Heal Other", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "inferno", + "fromId": "firebolt", + "textureIndex1": 14, + "textureIndex2": 14, + "name": "Inferno", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "firewall", + "fromId": "firebolt", + "textureIndex1": 5, + "textureIndex2": 5, + "name": "Firewall", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "telekinesis", + "fromId": "firebolt", + "textureIndex1": 39, + "textureIndex2": 39, + "name": "Telekinesis", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "lightning", + "fromId": "firebolt", + "textureIndex1": 2, + "textureIndex2": 2, + "name": "Lightning", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "townPortal", + "fromId": "firebolt", + "textureIndex1": 6, + "textureIndex2": 6, + "name": "Town Portal", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "flash", + "fromId": "firebolt", + "textureIndex1": 3, + "textureIndex2": 3, + "name": "Flash", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "stoneCurse", + "fromId": "firebolt", + "textureIndex1": 7, + "textureIndex2": 7, + "name": "Stone Curse", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "phasing", + "fromId": "firebolt", + "textureIndex1": 27, + "textureIndex2": 27, + "name": "Phasing", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "manaShield", + "fromId": "firebolt", + "textureIndex1": 12, + "textureIndex2": 12, + "name": "Mana Shield", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "elemental", + "fromId": "firebolt", + "textureIndex1": 37, + "textureIndex2": 37, + "name": "Elemental", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "fireball", + "fromId": "firebolt", + "textureIndex1": 11, + "textureIndex2": 11, + "name": "Fireball", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "flameWave", + "fromId": "firebolt", + "textureIndex1": 13, + "textureIndex2": 13, + "name": "Flame Wave", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "chainLightning", + "fromId": "firebolt", + "textureIndex1": 15, + "textureIndex2": 15, + "name": "Chain Lightning", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "guardian", + "fromId": "firebolt", + "textureIndex1": 17, + "textureIndex2": 17, + "name": "Guardian", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "golem", + "fromId": "firebolt", + "textureIndex1": 20, + "textureIndex2": 20, + "name": "Golem", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "teleport", + "fromId": "firebolt", + "textureIndex1": 23, + "textureIndex2": 23, + "name": "Teleport", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "boneSpirit", + "fromId": "firebolt", + "textureIndex1": 29, + "textureIndex2": 29, + "name": "Bone Spirit", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "bloodStar", + "fromId": "firebolt", + "textureIndex1": 35, + "textureIndex2": 35, + "name": "Blood Star", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/spell/spells.json b/gamefilesd/level/spell/spells.json new file mode 100755 index 00000000..f9a79ba7 --- /dev/null +++ b/gamefilesd/level/spell/spells.json @@ -0,0 +1,74 @@ +{ + "spellClass": [ + { + "id": "identify", + "texturePack1": "spelli2", + "texturePack2": "spelicon", + "textureIndex1": 4, + "textureIndex2": 4, + "name": "Identify", + "type": "Skill", + "defaults": { + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "itemRepair", + "fromId": "identify", + "textureIndex1": 25, + "textureIndex2": 25, + "name": "Item Repair", + "defaults": { + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "rage", + "fromId": "identify", + "textureIndex1": 22, + "textureIndex2": 22, + "name": "Rage", + "defaults": { + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "search", + "fromId": "identify", + "textureIndex1": 8, + "textureIndex2": 8, + "name": "Search", + "defaults": { + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "staffRecharge", + "fromId": "identify", + "textureIndex1": 28, + "textureIndex2": 28, + "name": "Staff Recharge", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + }, + { + "id": "trapDisarm", + "fromId": "identify", + "textureIndex1": 36, + "textureIndex2": 36, + "name": "Trap Disarm", + "defaults": { + "price": 150, + "damageMin": 2, + "damageMax": 10 + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/spell/textures.json b/gamefilesd/level/spell/textures.json new file mode 100755 index 00000000..5bc8284b --- /dev/null +++ b/gamefilesd/level/spell/textures.json @@ -0,0 +1,10 @@ +{ + "imageContainer": [ + { "file": "ctrlpan/spelicon.cel" }, + { "file": "data/spelli2.cel" } + ], + "texturePack": [ + { "id": "spelicon", "imageContainer": "spelicon", "palette": "town" }, + { "id": "spelli2", "imageContainer": "spelli2", "palette": "town" } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/town/items.json b/gamefilesd/level/town/items.json index 8289198b..2fe3f406 100755 --- a/gamefilesd/level/town/items.json +++ b/gamefilesd/level/town/items.json @@ -114,7 +114,7 @@ "class": "gold", "mapPosition": [60, 75], "properties": { - "gold": 4800 + "quantity": 4800 } } ] diff --git a/gamefilesd/level/town/level.json b/gamefilesd/level/town/level.json index 87061a87..d9c250ca 100755 --- a/gamefilesd/level/town/level.json +++ b/gamefilesd/level/town/level.json @@ -1,29 +1,16 @@ { "level": { "id": "level", - "path": "town", - "name": "Town Center", "palette": "town", "file": "levels/towndata/town.cel", "mapSize": [96, 96], - "map": [ - { "file": "levels/towndata/sector1s.dun", "position": [46, 46] }, - { "file": "levels/towndata/sector2s.dun", "position": [46, 0] }, - { "file": "levels/towndata/sector3s.dun", "position": [0, 46] }, - { "file": "levels/towndata/sector4s.dun", "position": [0, 0] } - ], "til": "levels/towndata/town.til", "min": "levels/towndata/town.min", "minBlocks": 16, "sol": "levels/towndata/town.sol" }, - "action": { - "name": "if.equal", - "param1": "%beta%", - "param2": true, - "then": { "name": "load", "file": "level/town/levelObjectsBeta.json" }, - "else": { "name": "load", "file": "level/town/levelObjects.json" } - }, - "load": "level/town/items.json", - "load": "level/town/players.json" + "load": "level/town/levelObjects.json", + "load": "level/town/players.json", + "load": "level/town/level2.json", + "load": "level/town/levelPassages.json" } \ No newline at end of file diff --git a/gamefilesd/level/town/level2.json b/gamefilesd/level/town/level2.json new file mode 100755 index 00000000..3dff0c8c --- /dev/null +++ b/gamefilesd/level/town/level2.json @@ -0,0 +1,37 @@ +{ + "level": { + "id": "level", + "path": "town", + "name": "Town", + "map": { "file": "level/town/town.json", "indexOffset": -1 } + }, + "load": ["level/player/%charClass%/defaults.json", "%charName%"], + "load": "level/town/levelObjects2.json", + "load": "level/town/items.json", + "load": "level/town/players2.json", + "load": "level/town/quests.json", + "action": [ + { + "name": "if.equal", + "param1": "%beta%", + "param2": true, + "then": [ + { "name": "player.setDirection", "player": "griswold", "direction": "FrontLeft" }, + { "name": "player.setDirection", "player": "ogden", "direction": "FrontLeft" } + ] + }, + { + "name": "if.equal", + "param1": "%beta%", + "param2": true, + "else": [ + { "name": "load", "file": "level/town/soundWelcome.json" }, + { "name": "event.add", + "time": 1.5, + "addToFront": true, + "action": { "name": "sound.play", "id": "gameWelcome" } + } + ] + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/town/levelCatacombs.json b/gamefilesd/level/town/levelCatacombs.json new file mode 100755 index 00000000..bdca24f3 --- /dev/null +++ b/gamefilesd/level/town/levelCatacombs.json @@ -0,0 +1,8 @@ +{ + "level": { + "id": "level", + "resizeToFit": false, + "map": { "file": "level/town/town_catacombs.json", "indexOffset": -1, "position": [48, 20] } + }, + "load": "level/l5/townToLevel.json" +} \ No newline at end of file diff --git a/gamefilesd/level/town/levelCaves.json b/gamefilesd/level/town/levelCaves.json new file mode 100755 index 00000000..d1fb4172 --- /dev/null +++ b/gamefilesd/level/town/levelCaves.json @@ -0,0 +1,8 @@ +{ + "level": { + "id": "level", + "resizeToFit": false, + "map": { "file": "level/town/town_caves.json", "indexOffset": -1, "position": [16, 68] } + }, + "load": "level/l9/townToLevel.json" +} \ No newline at end of file diff --git a/gamefilesd/level/town/levelHell.json b/gamefilesd/level/town/levelHell.json new file mode 100755 index 00000000..06c7764a --- /dev/null +++ b/gamefilesd/level/town/levelHell.json @@ -0,0 +1,8 @@ +{ + "level": { + "id": "level", + "resizeToFit": false, + "map": { "file": "level/town/town_hell.json", "indexOffset": -1, "position": [36, 78] } + }, + "load": "level/l13/townToLevel.json" +} \ No newline at end of file diff --git a/gamefilesd/level/town/levelObjects.json b/gamefilesd/level/town/levelObjects.json deleted file mode 100755 index f7433962..00000000 --- a/gamefilesd/level/town/levelObjects.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "levelObject": [ - { - "id": "l1", - "name": "Down to dungeon", - "mapPosition": [25, 29], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/l1/load.json", "positionPlayer", "[67, 28]"] } - }, - { - "id": "l5", - "name": "Down to catacombs", - "mapPosition": [49, 21], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/l5/load.json", "positionPlayer", "[57, 22]"] } - }, - { - "id": "l10", - "name": "Down to caves", - "mapPosition": [17, 69], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/l10/load.json", "positionPlayer", "[15, 67]"] } - }, - { - "id": "l15", - "name": "Down to hell", - "mapPosition": [41, 79], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/l15/load.json", "positionPlayer", "[7, 7]"] } - } - ] -} \ No newline at end of file diff --git a/gamefilesd/level/town/levelObjects2.json b/gamefilesd/level/town/levelObjects2.json new file mode 100755 index 00000000..2eb59464 --- /dev/null +++ b/gamefilesd/level/town/levelObjects2.json @@ -0,0 +1,3 @@ +{ + "load": "level/l1/townToLevel.json" +} \ No newline at end of file diff --git a/gamefilesd/level/town/levelObjectsBeta.json b/gamefilesd/level/town/levelObjectsBeta.json deleted file mode 100755 index 6337a25c..00000000 --- a/gamefilesd/level/town/levelObjectsBeta.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "levelObject": [ - { - "id": "l1", - "name": "Down to dungeon", - "mapPosition": [25, 29], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/l1/load.json", "positionPlayer", "[67, 28]"] } - }, - { - "id": "l5", - "name": "Down to catacombs", - "mapPosition": [49, 21], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/l5/load.json", "positionPlayer", "[57, 22]"] } - } - ] -} \ No newline at end of file diff --git a/gamefilesd/level/town/levelPassagesTemplate.json b/gamefilesd/level/town/levelPassagesTemplate.json new file mode 100755 index 00000000..66713ba0 --- /dev/null +++ b/gamefilesd/level/town/levelPassagesTemplate.json @@ -0,0 +1,23 @@ +{ + "action": [ + { + "name": "if.equal", + "param1": {1}, + "param2": true, + "then": { "name": "load", "file": "level/town/levelCatacombs.json" } + }, + { + "name": "if.equal", + "param1": {2}, + "param2": true, + "then": { "name": "load", "file": "level/town/levelCaves.json" } + }, + { + "name": "if.equal", + "param1": {3}, + "param2": true, + "then": { "name": "load", "file": "level/town/levelHell.json" } + }, + { "name": "io.delete", "file": "%tempDir%/level/town/levelPassages.json" } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/town/load.json b/gamefilesd/level/town/load.json deleted file mode 100755 index 608ee59d..00000000 --- a/gamefilesd/level/town/load.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "load": ["level/load.json", "town", "{1}", "{2}", "cuttt"] -} \ No newline at end of file diff --git a/gamefilesd/level/town/loadPassages.json b/gamefilesd/level/town/loadPassages.json new file mode 100755 index 00000000..eb1141d6 --- /dev/null +++ b/gamefilesd/level/town/loadPassages.json @@ -0,0 +1,13 @@ +{ + "action": { + "name": "file.copy", + "dir": "%tempDir%/level/town", + "writeFile": "levelPassages.json", + "file": [ + "level/town/levelPassagesTemplate.json", + "{1}", + "{2}", + "{3}" + ] + } +} \ No newline at end of file diff --git a/gamefilesd/level/town/playerCelFiles.json b/gamefilesd/level/town/playerCelFiles.json index d50b712a..c4b087a9 100755 --- a/gamefilesd/level/town/playerCelFiles.json +++ b/gamefilesd/level/town/playerCelFiles.json @@ -10,6 +10,11 @@ "file": "towners/strytell/strytell.cel", "palette": "town" }, + { + "imageContainer": "deadguy", + "file": "towners/butch/deadguy.cel", + "palette": "town" + }, { "imageContainer": "healer", "file": "towners/healer/healer.cel", diff --git a/gamefilesd/level/town/playerCelFilesBeta.json b/gamefilesd/level/town/playerCelFilesBeta.json index 8d6c0a0c..4c82ef25 100755 --- a/gamefilesd/level/town/playerCelFilesBeta.json +++ b/gamefilesd/level/town/playerCelFilesBeta.json @@ -10,6 +10,11 @@ "file": "towners/strytell/strytell.cel", "palette": "town" }, + { + "imageContainer": "butch", + "file": "towners/butch/deadguy.cel", + "palette": "town" + }, { "imageContainer": "healer", "file": "towners/healer/healer.cel", diff --git a/gamefilesd/level/town/playerClasses.json b/gamefilesd/level/town/playerClasses.json index 25b554f8..43c780fe 100755 --- a/gamefilesd/level/town/playerClasses.json +++ b/gamefilesd/level/town/playerClasses.json @@ -3,83 +3,154 @@ { "id": "healer", "replaceVars": true, - "name": "Healer", + "name": "Pepin the healer", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "healer" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "healer", + "actions": { + "action": { "name": "load", "file": "towners/pepin/load.json" } + } }, { "id": "storyTeller", "replaceVars": true, - "name": "Story teller", + "name": "Cain the elder", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "strytell" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "strytell", + "actions": { + "action": { "name": "load", "file": "towners/cain/panel.json" } + } }, { "id": "blacksmith", "replaceVars": true, - "name": "Blacksmith", + "name": "Griswold the blacksmith", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "smithn" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "smithn", + "actions": { + "action": { "name": "load", "file": "towners/griswold/panel.json" } + } }, { "id": "tavernOwner", "replaceVars": true, - "name": "Tavern owner", + "name": "Ogden the tavern owner", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "twnfn" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "twnfn", + "actions": { + "action": { "name": "load", "file": "towners/ogden/load.json" } + } }, { "id": "drunk", "replaceVars": true, - "name": "Drunk", + "name": "Farnham the drunk", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "twndrunk" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "twndrunk", + "actions": { + "action": { "name": "load", "file": "towners/farnham/panel.json" } + } }, { "id": "barmaid", "replaceVars": true, - "name": "Barmaid", + "name": "Gillian the barmaid", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "wmnn" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "wmnn", + "actions": { + "action": { "name": "load", "file": "towners/gillian/panel.json" } + } }, { "id": "boy", "replaceVars": true, - "name": "Boy", + "name": "Wirt the peg-legged boy", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "pegkid1" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "pegkid1", + "actions": { + "action": { "name": "load", "file": "towners/wirt/panel.json" } + } }, { "id": "witch", "replaceVars": true, - "name": "Witch", + "name": "Adria the witch", "type": "Human", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "witch" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "witch", + "actions": { + "action": { "name": "load", "file": "towners/adria/panel.json" } + } + }, + { + "id": "deadGuy", + "replaceVars": true, + "nameClassifier": "deadGuy", + "type": "Human", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "deadguy", + "actions": { + "action": { "name": "load", "file": "towners/deadGuy/load.json" } + } }, { "id": "cow", "replaceVars": true, "name": "Cow", "type": "Animal", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", - "texturePacks": "cow" + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "cow", + "actions": { + "action": { + "name": "random", + "action1": [ + { "name": "sound.play", "id": "cow1", "unique": true }, + { + "name": "random", + "percentage": 0.1, + "action1": { + "name": "randomList", + "actions": [ + { "name": "sound.play", "id": "notThirsty", "unique": true }, + { "name": "sound.play", "id": "noMilkmaid", "unique": true }, + { "name": "sound.play", "id": "ThatsACowAlright", "unique": true } + ] + } + } + ], + "action2": [ + { "name": "sound.play", "id": "cow2", "unique": true }, + { + "name": "random", + "percentage": 0.1, + "action1": { + "name": "randomList", + "actions": [ + { "name": "sound.play", "id": "notThirsty", "unique": true }, + { "name": "sound.play", "id": "noMilkmaid", "unique": true }, + { "name": "sound.play", "id": "ThatsACowAlright", "unique": true } + ] + } + } + ] + } + } } ] } \ No newline at end of file diff --git a/gamefilesd/level/town/players.json b/gamefilesd/level/town/players.json index d85febc9..c035a494 100755 --- a/gamefilesd/level/town/players.json +++ b/gamefilesd/level/town/players.json @@ -7,16 +7,6 @@ "then": { "name": "load", "file": "level/town/playerCelFilesBeta.json" }, "else": { "name": "load", "file": "level/town/playerCelFiles.json" } }, - { "name": "load", "file": "level/town/playerClasses.json" }, - { "name": "load", "file": "level/town/players2.json" }, - { - "name": "if.equal", - "param1": "%beta%", - "param2": true, - "then": [ - { "name": "player.setDirection", "player": "griswold", "direction": "FrontLeft" }, - { "name": "player.setDirection", "player": "ogden", "direction": "FrontLeft" } - ] - } + { "name": "load", "file": "level/town/playerClasses.json" } ] } \ No newline at end of file diff --git a/gamefilesd/level/town/players2.json b/gamefilesd/level/town/players2.json index 814a17b4..cdc4258b 100755 --- a/gamefilesd/level/town/players2.json +++ b/gamefilesd/level/town/players2.json @@ -1,382 +1,3 @@ { - "action": { - "name": "action.set", - "id": "cow", - "action": { - "name": "random", - "action1": [ - { "name": "sound.play", "id": "cow1", "unique": true }, - { - "name": "random", - "percentage": 0.1, - "action1": { - "name": "randomList", - "actions": [ - { "name": "sound.play", "id": "notThirsty", "unique": true }, - { "name": "sound.play", "id": "noMilkmaid", "unique": true }, - { "name": "sound.play", "id": "ThatsACowAlright", "unique": true } - ] - } - } - ], - "action2": [ - { "name": "sound.play", "id": "cow2", "unique": true }, - { - "name": "random", - "percentage": 0.1, - "action1": { - "name": "randomList", - "actions": [ - { "name": "sound.play", "id": "notThirsty", "unique": true }, - { "name": "sound.play", "id": "noMilkmaid", "unique": true }, - { "name": "sound.play", "id": "ThatsACowAlright", "unique": true } - ] - } - } - ] - } - }, - "player": [ - { - "id": "pepin", - "class": "healer", - "name": "Pepin the healer", - "mapPosition": [55, 79], - "action": { "name": "load", "file": "towners/pepin/panel.json" }, - "inventory": { - "index": 0, - "size": 16, - "item": [ - { - "index": 0, - "class": "potionOfHealing" - }, - { - "index": 1, - "class": "potionOfFullHealing" - }, - { - "index": 2, - "class": "potionOfRejuvenation" - }, - { - "index": 3, - "class": "potionOfRejuvenation" - }, - { - "index": 4, - "class": "potionOfRejuvenation" - }, - { - "index": 5, - "class": "potionOfRejuvenation" - }, - { - "index": 6, - "class": "scrollOfHealing" - }, - { - "index": 7, - "class": "scrollOfHealing" - }, - { - "index": 8, - "class": "scrollOfHealing" - }, - { - "index": 9, - "class": "scrollOfHealing" - }, - { - "index": 10, - "class": "scrollOfHealing" - }, - { - "index": 11, - "class": "scrollOfHealing" - } - ] - } - }, - { - "id": "cain", - "class": "storyTeller", - "name": "Cain the elder", - "mapPosition": [62, 71], - "action": { "name": "load", "file": "towners/cain/panel.json" } - }, - { - "id": "griswold", - "class": "blacksmith", - "name": "Griswold the blacksmith", - "mapPosition": [62, 63], - "action": { "name": "load", "file": "towners/griswold/panel.json" }, - "inventory": [ - { - "index": 0, - "size": 20, - "item": [ - { - "index": 0, - "class": "cap" - }, - { - "index": 1, - "class": "cape", - "properties": { - "armor": 4 - } - }, - { - "index": 2, - "class": "cape", - "properties": { - "armor": 3 - } - }, - { - "index": 3, - "class": "rags" - }, - { - "index": 4, - "class": "quiltedArmor" - }, - { - "index": 5, - "class": "buckler", - "properties": { - "armor": 3 - } - }, - { - "index": 6, - "class": "shortSword" - }, - { - "index": 7, - "class": "falchion" - }, - { - "index": 8, - "class": "claymore" - }, - { - "index": 9, - "class": "blade" - }, - { - "index": 10, - "class": "sabre" - }, - { - "index": 11, - "class": "axe" - }, - { - "index": 12, - "class": "mace" - }, - { - "index": 13, - "class": "mace" - }, - { - "index": 14, - "class": "morningStar" - }, - { - "index": 15, - "class": "warHammer" - }, - { - "index": 16, - "class": "warHammer" - }, - { - "index": 17, - "class": "spikedClub" - }, - { - "index": 18, - "class": "spikedClub" - }, - { - "index": 19, - "class": "club" - } - ] - }, - { - "index": 1, - "size": 6, - "item": [ - { - "index": 0, - "class": "club", - "properties": { - "toHit": 5, - "price": 540, - "magical": true - } - }, - { - "index": 1, - "class": "bucklerShield", - "properties": { - "armor": 4, - "strength": 4, - "price": 860, - "magical": true - } - }, - { - "index": 2, - "class": "bucklerShield", - "properties": { - "armor": 2, - "toArmor": 21, - "price": 648, - "magical": true - } - }, - { - "index": 3, - "class": "dagger", - "properties": { - "dexterity": 4, - "price": 920, - "magical": true - } - }, - { - "index": 4, - "class": "cape", - "properties": { - "life": 12, - "price": 850, - "magical": true - } - }, - { - "index": 5, - "class": "morningStar", - "properties": { - "toHit": 5, - "price": 1100, - "magical": true - } - } - ] - } - ] - }, - { - "id": "ogden", - "class": "tavernOwner", - "name": "Ogden the tavern owner", - "mapPosition": [55, 62], - "action": { "name": "load", "file": "towners/ogden/panel.json" } - }, - { - "id": "farnham", - "class": "drunk", - "name": "Farnham the drunk", - "mapPosition": [71, 84], - "action": { "name": "load", "file": "towners/farnham/panel.json" } - }, - { - "id": "gillian", - "class": "barmaid", - "name": "Gillian the barmaid", - "mapPosition": [43, 66], - "action": { "name": "load", "file": "towners/gillian/panel.json" } - }, - { - "id": "wirt", - "class": "boy", - "name": "Wirt the peg-legged boy", - "mapPosition": [11, 53], - "action": { "name": "load", "file": "towners/wirt/panel.json" }, - "inventory": { - "index": 0, - "size": 1, - "item": { - "index": 0, - "class": "dagger", - "properties": { - "magic": 1, - "price": 480, - "magical": true - } - } - } - }, - { - "id": "adria", - "class": "witch", - "name": "Adria the witch", - "mapPosition": [80, 20], - "action": { "name": "load", "file": "towners/adria/panel.json" }, - "inventory": { - "index": 0, - "size": 16, - "item": [ - { - "index": 0, - "class": "potionOfMana" - }, - { - "index": 1, - "class": "potionOfFullMana" - }, - { - "index": 2, - "class": "scroll" - }, - { - "index": 3, - "class": "potionOfRejuvenation" - }, - { - "index": 6, - "class": "book" - }, - { - "index": 7, - "class": "shortStaff", - "properties": { - "magic": 5, - "price": 650, - "magical": true - } - } - ] - } - }, - { - "id": "cow1", - "class": "cow", - "name": "Cow", - "direction": "BackLeft", - "mapPosition": [55, 13], - "action": "cow" - }, - { - "id": "cow2", - "class": "cow", - "name": "Cow", - "direction": "FrontLeft", - "mapPosition": [57, 15], - "action": "cow" - }, - { - "id": "cow3", - "class": "cow", - "name": "Cow", - "direction": "Back", - "mapPosition": [58, 19], - "action": "cow" - } - ] + "load": "level/town/playersd.json" } \ No newline at end of file diff --git a/gamefilesd/level/town/playersd.json b/gamefilesd/level/town/playersd.json new file mode 100755 index 00000000..7019ab35 --- /dev/null +++ b/gamefilesd/level/town/playersd.json @@ -0,0 +1,328 @@ +{ + "player": [ + { + "id": "pepin", + "class": "healer", + "mapPosition": [55, 79], + "inventory": { + "index": 0, + "size": 16, + "item": [ + { + "index": 0, + "class": "potionOfHealing" + }, + { + "index": 1, + "class": "potionOfFullHealing" + }, + { + "index": 2, + "class": "potionOfRejuvenation" + }, + { + "index": 3, + "class": "potionOfRejuvenation" + }, + { + "index": 4, + "class": "potionOfRejuvenation" + }, + { + "index": 5, + "class": "potionOfRejuvenation" + }, + { + "index": 6, + "class": "scrollOfHealing" + }, + { + "index": 7, + "class": "scrollOfHealing" + }, + { + "index": 8, + "class": "scrollOfHealing" + }, + { + "index": 9, + "class": "scrollOfHealing" + }, + { + "index": 10, + "class": "scrollOfHealing" + }, + { + "index": 11, + "class": "scrollOfHealing" + } + ] + } + }, + { + "id": "cain", + "class": "storyTeller", + "mapPosition": [62, 71] + }, + { + "id": "griswold", + "class": "blacksmith", + "mapPosition": [62, 63], + "inventory": [ + { + "index": 0, + "size": 20, + "item": [ + { + "index": 0, + "class": "cap" + }, + { + "index": 1, + "class": "cape", + "properties": { + "armor": 4 + } + }, + { + "index": 2, + "class": "cape", + "properties": { + "armor": 3 + } + }, + { + "index": 3, + "class": "rags" + }, + { + "index": 4, + "class": "quiltedArmor" + }, + { + "index": 5, + "class": "buckler", + "properties": { + "armor": 3 + } + }, + { + "index": 6, + "class": "shortSword" + }, + { + "index": 7, + "class": "falchion" + }, + { + "index": 8, + "class": "claymore" + }, + { + "index": 9, + "class": "blade" + }, + { + "index": 10, + "class": "sabre" + }, + { + "index": 11, + "class": "axe" + }, + { + "index": 12, + "class": "mace" + }, + { + "index": 13, + "class": "mace" + }, + { + "index": 14, + "class": "morningStar" + }, + { + "index": 15, + "class": "warHammer" + }, + { + "index": 16, + "class": "warHammer" + }, + { + "index": 17, + "class": "spikedClub" + }, + { + "index": 18, + "class": "spikedClub" + }, + { + "index": 19, + "class": "club" + } + ] + }, + { + "index": 1, + "size": 6, + "item": [ + { + "index": 0, + "class": "club", + "properties": { + "toHit": 5, + "price": 540, + "magical": true + } + }, + { + "index": 1, + "class": "bucklerShield", + "properties": { + "armor": 4, + "strength": 4, + "price": 860, + "magical": true + } + }, + { + "index": 2, + "class": "bucklerShield", + "properties": { + "armor": 2, + "toArmor": 21, + "price": 648, + "magical": true + } + }, + { + "index": 3, + "class": "dagger", + "properties": { + "dexterity": 4, + "price": 920, + "magical": true + } + }, + { + "index": 4, + "class": "cape", + "properties": { + "life": 12, + "price": 850, + "magical": true + } + }, + { + "index": 5, + "class": "morningStar", + "properties": { + "toHit": 5, + "price": 1100, + "magical": true + } + } + ] + } + ] + }, + { + "id": "ogden", + "class": "tavernOwner", + "mapPosition": [55, 62] + }, + { + "id": "farnham", + "class": "drunk", + "mapPosition": [71, 84] + }, + { + "id": "gillian", + "class": "barmaid", + "mapPosition": [43, 66] + }, + { + "id": "wirt", + "class": "boy", + "mapPosition": [11, 53], + "inventory": { + "index": 0, + "size": 1, + "item": { + "index": 0, + "class": "dagger", + "properties": { + "magic": 1, + "price": 480, + "magical": true + } + } + } + }, + { + "id": "adria", + "class": "witch", + "mapPosition": [80, 20], + "inventory": { + "index": 0, + "size": 16, + "item": [ + { + "index": 0, + "class": "potionOfMana" + }, + { + "index": 1, + "class": "potionOfFullMana" + }, + { + "index": 2, + "class": "scroll" + }, + { + "index": 3, + "class": "potionOfRejuvenation" + }, + { + "index": 6, + "class": "book" + }, + { + "index": 7, + "class": "shortStaff", + "properties": { + "magic": 5, + "price": 650, + "magical": true + } + } + ] + } + }, + { + "id": "deadGuy", + "class": "deadGuy", + "mapPosition": [24, 32] + }, + { + "id": "cow1", + "class": "cow", + "direction": "BackLeft", + "mapPosition": [56, 14] + }, + { + "id": "cow2", + "class": "cow", + "direction": "FrontLeft", + "mapPosition": [58, 16] + }, + { + "id": "cow3", + "class": "cow", + "direction": "Back", + "mapPosition": [59, 20] + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/town/quests.json b/gamefilesd/level/town/quests.json new file mode 100755 index 00000000..9624fa5d --- /dev/null +++ b/gamefilesd/level/town/quests.json @@ -0,0 +1,11 @@ +{ + "quest": [ + { + "id": "ogdenInit" + }, + { + "id": "theButcher", + "name": "The Butcher" + } + ] +} \ No newline at end of file diff --git a/gamefilesd/level/town/sounds.json b/gamefilesd/level/town/sounds.json index a71b78be..1dfa37be 100755 --- a/gamefilesd/level/town/sounds.json +++ b/gamefilesd/level/town/sounds.json @@ -11,8 +11,8 @@ { "id": "cow1", "file": "sfx/Towners/Cow1.wav" }, { "id": "cow2", "file": "sfx/Towners/Cow2.wav" } ], - "load": ["res/player/sound/loadSetId.json", "|currentLevel|currentPlayer.class|", 49, "notThirsty"], - "load": ["res/player/sound/loadSetId.json", "|currentLevel|currentPlayer.class|", 50, "noMilkmaid"], - "load": ["res/player/sound/loadSetId.json", "|currentLevel|currentPlayer.class|", 52, "ThatsACowAlright"], + "load": ["res/player/sound/load.json", 49, "notThirsty", "loadSound", ""], + "load": ["res/player/sound/load.json", 50, "noMilkmaid", "loadSound", ""], + "load": ["res/player/sound/load.json", 52, "ThatsACowAlright", "loadSound", ""], "load": "level/town/sounds2.json" } \ No newline at end of file diff --git a/gamefilesd/level/town/town.json b/gamefilesd/level/town/town.json new file mode 100755 index 00000000..b3dc772c --- /dev/null +++ b/gamefilesd/level/town/town.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":96, + "infinite":false, + "layers":[ + { + "data":[218, 26, 282, 283, 290, 291, 17, 18, 21, 22, 17, 18, 25, 26, 172, 173, 180, 181, 114, 26, 109, 18, 25, 26, 21, 22, 105, 106, 111, 112, 172, 173, 180, 181, 1086, 10, 109, 18, 172, 173, 168, 169, 1090, 10, 105, 106, 5, 6, 29, 30, 109, 18, 37, 38, 1128, 1129, 1128, 1129, 1124, 1125, 61, 62, 282, 283, 290, 291, 218, 26, 9, 10, 111, 112, 1105, 1106, 1058, 1059, 1060, 1061, 1062, 1063, 105, 106, 274, 275, 109, 18, 29, 30, 25, 26, 17, 18, 29, 30, 9, 10, 219, 28, 284, 285, 292, 293, 19, 20, 23, 24, 19, 20, 27, 28, 174, 175, 182, 183, 115, 28, 19, 110, 27, 28, 23, 24, 107, 108, 23, 113, 174, 175, 182, 183, 1087, 12, 19, 110, 174, 175, 170, 171, 1091, 12, 107, 108, 7, 8, 31, 32, 19, 110, 39, 40, 1130, 1131, 1130, 1131, 1126, 1127, 63, 64, 284, 285, 292, 293, 219, 28, 11, 12, 23, 113, 11, 12, 11, 12, 11, 12, 11, 12, 107, 108, 276, 277, 19, 110, 31, 32, 27, 28, 19, 20, 31, 32, 11, 12, 29, 30, 278, 279, 286, 287, 172, 173, 168, 169, 140, 141, 136, 137, 160, 161, 17, 18, 25, 26, 105, 106, 124, 125, 128, 129, 29, 30, 21, 22, 224, 26, 227, 228, 1088, 10, 204, 205, 208, 209, 216, 22, 1084, 10, 21, 22, 114, 26, 220, 221, 114, 26, 33, 34, 45, 46, 45, 46, 45, 46, 57, 58, 278, 279, 286, 287, 231, 232, 109, 18, 184, 185, 180, 181, 25, 26, 204, 205, 208, 209, 216, 22, 282, 283, 290, 291, 9, 10, 1, 2, 5, 6, 220, 221, 109, 18, 31, 32, 280, 281, 288, 289, 174, 175, 170, 171, 142, 143, 138, 139, 162, 163, 19, 20, 27, 28, 107, 108, 126, 127, 130, 131, 31, 32, 23, 24, 225, 226, 229, 230, 1089, 12, 206, 207, 210, 211, 217, 24, 1085, 12, 23, 24, 115, 28, 19, 20, 115, 28, 35, 36, 47, 48, 47, 48, 47, 48, 59, 60, 280, 281, 288, 289, 233, 234, 19, 110, 186, 187, 182, 183, 27, 28, 206, 207, 210, 211, 217, 24, 284, 285, 292, 293, 11, 12, 3, 4, 7, 8, 19, 20, 19, 110, 105, 106, 231, 232, 282, 283, 290, 291, 109, 18, 132, 133, 156, 157, 144, 145, 204, 205, 208, 209, 216, 22, 116, 117, 120, 121, 21, 22, 136, 137, 136, 137, 160, 161, 1086, 10, 200, 201, 212, 213, 196, 197, 1072, 10, 109, 18, 17, 18, 21, 22, 109, 18, 140, 141, 136, 137, 160, 161, 105, 106, 21, 22, 114, 26, 274, 275, 9, 10, 114, 26, 176, 177, 29, 30, 109, 18, 200, 201, 212, 213, 196, 197, 278, 279, 286, 287, 114, 26, 140, 141, 136, 137, 160, 161, 25, 26, 107, 108, 233, 234, 284, 285, 292, 293, 19, 110, 134, 135, 158, 159, 146, 147, 206, 207, 210, 211, 217, 24, 118, 119, 122, 123, 23, 24, 138, 139, 138, 139, 162, 163, 1087, 12, 202, 203, 214, 215, 198, 199, 1073, 12, 19, 110, 19, 20, 23, 24, 19, 110, 142, 143, 138, 139, 162, 163, 107, 108, 23, 24, 115, 28, 276, 277, 11, 12, 115, 28, 178, 179, 31, 32, 19, 110, 202, 203, 214, 215, 198, 199, 280, 281, 288, 289, 115, 28, 142, 143, 138, 139, 162, 163, 27, 28, 29, 30, 220, 221, 278, 279, 286, 287, 0, 0, 148, 149, 152, 153, 231, 232, 200, 201, 212, 213, 196, 197, 25, 26, 172, 173, 168, 169, 132, 133, 156, 157, 144, 145, 1084, 10, 188, 189, 192, 193, 109, 18, 1088, 10, 114, 26, 124, 125, 128, 129, 29, 30, 132, 133, 156, 157, 144, 145, 218, 26, 25, 26, 111, 112, 282, 283, 290, 291, 105, 106, 124, 125, 128, 129, 17, 18, 188, 189, 192, 193, 172, 173, 168, 169, 266, 267, 21, 22, 132, 133, 156, 157, 144, 145, 105, 106, 31, 32, 19, 20, 280, 281, 288, 289, 0, 0, 150, 151, 154, 155, 233, 234, 202, 203, 214, 215, 198, 199, 27, 28, 174, 175, 170, 171, 134, 135, 158, 159, 146, 147, 1085, 12, 190, 191, 194, 195, 19, 110, 1089, 12, 115, 28, 126, 127, 130, 131, 31, 32, 134, 135, 158, 159, 146, 147, 219, 28, 27, 28, 23, 113, 284, 285, 292, 293, 107, 108, 126, 127, 130, 131, 19, 20, 190, 191, 194, 195, 174, 175, 170, 171, 268, 269, 23, 24, 134, 135, 158, 159, 146, 147, 107, 108, 111, 112, 9, 10, 298, 299, 306, 307, 0, 0, 0, 0, 847, 2, 222, 22, 188, 189, 192, 193, 21, 22, 21, 22, 164, 165, 21, 22, 148, 149, 152, 153, 105, 106, 1082, 10, 111, 112, 114, 26, 21, 22, 1086, 10, 105, 106, 116, 117, 120, 121, 105, 106, 148, 149, 152, 153, 224, 26, 227, 228, 29, 30, 109, 18, 278, 279, 286, 287, 114, 26, 116, 117, 120, 121, 111, 112, 218, 26, 105, 106, 164, 165, 114, 26, 266, 267, 105, 106, 148, 149, 152, 153, 111, 112, 114, 26, 23, 113, 11, 12, 300, 301, 308, 309, 0, 0, 0, 0, 848, 849, 23, 24, 190, 191, 194, 195, 23, 24, 23, 24, 166, 167, 23, 24, 150, 151, 154, 155, 107, 108, 1083, 12, 23, 113, 115, 28, 23, 24, 1087, 12, 107, 108, 118, 119, 122, 123, 107, 108, 150, 151, 154, 155, 225, 226, 229, 230, 31, 32, 19, 110, 280, 281, 288, 289, 115, 28, 118, 119, 122, 123, 23, 113, 219, 28, 107, 108, 166, 167, 115, 28, 268, 269, 107, 108, 150, 151, 154, 155, 23, 113, 115, 28, 109, 18, 1, 2, 294, 295, 302, 303, 114, 26, 843, 844, 1, 2, 111, 112, 1, 2, 1, 2, 1, 2, 1, 2, 109, 18, 1074, 1075, 1058, 1059, 1054, 1055, 1056, 1057, 1074, 1075, 1077, 1078, 1052, 1053, 1052, 1053, 1058, 1059, 1060, 1061, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 262, 263, 1105, 1106, 1103, 1104, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 350, 351, 354, 355, 13, 14, 17, 18, 109, 18, 29, 30, 19, 110, 3, 4, 296, 297, 304, 305, 115, 28, 845, 846, 3, 4, 23, 113, 3, 4, 3, 4, 3, 4, 3, 4, 19, 110, 1076, 12, 11, 12, 11, 12, 11, 12, 1076, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 264, 265, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 352, 353, 356, 357, 15, 16, 19, 20, 19, 110, 31, 32, 29, 30, 13, 14, 282, 283, 290, 291, 105, 106, 9, 10, 17, 18, 839, 840, 105, 106, 0, 0, 0, 0, 832, 833, 0, 0, 1092, 10, 111, 112, 25, 26, 231, 232, 1111, 1112, 172, 173, 180, 181, 196, 197, 41, 42, 65, 66, 21, 22, 9, 10, 9, 10, 5, 6, 184, 185, 180, 181, 13, 14, 105, 106, 172, 173, 168, 169, 310, 311, 176, 177, 114, 26, 111, 112, 172, 173, 168, 169, 21, 22, 114, 26, 342, 343, 346, 347, 362, 363, 218, 26, 184, 185, 180, 181, 17, 18, 31, 32, 15, 16, 284, 285, 292, 293, 107, 108, 11, 12, 19, 20, 841, 842, 107, 108, 0, 0, 0, 0, 834, 835, 0, 0, 1093, 12, 23, 113, 27, 28, 233, 234, 1113, 1114, 174, 175, 182, 183, 198, 199, 43, 44, 67, 68, 23, 24, 11, 12, 11, 12, 7, 8, 186, 187, 182, 183, 15, 16, 107, 108, 174, 175, 170, 171, 312, 313, 178, 179, 115, 28, 23, 113, 174, 175, 170, 171, 23, 24, 115, 28, 344, 345, 348, 349, 364, 365, 219, 28, 186, 187, 182, 183, 19, 20, 114, 26, 9, 10, 278, 279, 286, 287, 114, 26, 1, 2, 836, 837, 17, 18, 0, 0, 0, 0, 0, 0, 828, 829, 0, 0, 231, 232, 17, 18, 9, 10, 114, 26, 1107, 1108, 176, 177, 21, 22, 1018, 1019, 93, 94, 57, 58, 13, 14, 172, 173, 168, 169, 13, 14, 176, 177, 13, 14, 204, 205, 128, 129, 164, 165, 114, 26, 282, 283, 290, 291, 25, 26, 29, 30, 164, 165, 585, 586, 588, 589, 314, 315, 322, 323, 358, 359, 338, 339, 25, 26, 176, 177, 21, 22, 111, 112, 115, 28, 11, 12, 280, 281, 288, 289, 115, 28, 3, 4, 3, 838, 19, 20, 0, 0, 0, 0, 0, 0, 830, 831, 0, 0, 233, 234, 19, 20, 11, 12, 115, 28, 1109, 1110, 178, 179, 23, 24, 1020, 1021, 95, 96, 59, 60, 15, 16, 174, 175, 170, 171, 15, 16, 178, 179, 15, 16, 206, 207, 130, 131, 166, 167, 115, 28, 284, 285, 292, 293, 27, 28, 31, 32, 166, 167, 11, 587, 590, 591, 316, 317, 324, 325, 360, 361, 340, 341, 27, 28, 178, 179, 23, 24, 23, 113, 111, 112, 172, 173, 180, 181, 282, 283, 290, 291, 204, 205, 208, 209, 216, 22, 0, 0, 0, 0, 0, 0, 824, 825, 0, 0, 0, 0, 813, 814, 801, 802, 1038, 1039, 1105, 1106, 1103, 1104, 1100, 1101, 1098, 10, 1014, 1015, 111, 112, 21, 22, 164, 165, 111, 112, 204, 205, 208, 209, 216, 22, 116, 117, 120, 121, 17, 18, 21, 22, 278, 279, 286, 287, 29, 30, 29, 30, 231, 232, 231, 232, 639, 640, 318, 319, 326, 327, 330, 331, 334, 335, 13, 14, 17, 18, 114, 26, 222, 22, 23, 113, 174, 175, 182, 183, 284, 285, 292, 293, 206, 207, 210, 211, 217, 24, 0, 0, 0, 0, 0, 0, 826, 827, 0, 0, 0, 0, 538, 815, 803, 804, 1040, 1041, 11, 12, 11, 12, 11, 1102, 1099, 12, 1016, 1017, 23, 113, 23, 24, 166, 167, 23, 113, 206, 207, 210, 211, 217, 24, 118, 119, 122, 123, 19, 20, 23, 24, 280, 281, 288, 289, 31, 32, 31, 32, 233, 234, 233, 234, 641, 642, 320, 321, 328, 329, 332, 333, 336, 337, 15, 16, 19, 20, 115, 28, 23, 24, 29, 30, 176, 177, 111, 112, 278, 279, 286, 287, 200, 201, 212, 213, 196, 197, 0, 0, 231, 232, 0, 0, 820, 821, 0, 0, 0, 0, 0, 0, 797, 798, 1022, 1023, 1026, 1027, 1030, 1031, 1034, 1035, 1096, 10, 986, 987, 29, 30, 9, 10, 231, 232, 1183, 1184, 200, 201, 212, 213, 196, 197, 5, 6, 111, 112, 21, 22, 5, 6, 109, 18, 270, 271, 21, 22, 624, 566, 231, 232, 0, 0, 635, 636, 553, 554, 557, 558, 274, 275, 109, 18, 124, 125, 128, 129, 9, 10, 109, 18, 31, 32, 178, 179, 23, 113, 280, 281, 288, 289, 202, 203, 214, 215, 198, 199, 0, 0, 233, 234, 0, 0, 822, 823, 0, 0, 0, 0, 0, 0, 799, 800, 1024, 1025, 1028, 1029, 1032, 1033, 1036, 1037, 1097, 12, 988, 989, 31, 32, 11, 12, 233, 234, 1185, 1186, 202, 203, 214, 215, 198, 199, 7, 8, 23, 113, 23, 24, 7, 8, 19, 110, 272, 273, 23, 24, 625, 626, 233, 234, 0, 0, 637, 638, 555, 556, 559, 560, 276, 277, 19, 110, 126, 127, 130, 131, 11, 12, 19, 110, 29, 30, 204, 205, 208, 209, 216, 22, 262, 263, 188, 189, 192, 193, 114, 26, 17, 18, 231, 232, 816, 817, 0, 0, 0, 0, 0, 0, 0, 0, 793, 794, 1006, 1007, 1010, 1011, 1014, 1015, 1018, 1019, 1094, 10, 172, 173, 168, 169, 1195, 1196, 1175, 1176, 1179, 1180, 188, 189, 192, 193, 29, 30, 114, 26, 13, 14, 5, 6, 17, 18, 13, 14, 266, 267, 105, 106, 620, 621, 627, 628, 631, 632, 616, 617, 561, 562, 569, 570, 282, 283, 290, 291, 116, 117, 120, 121, 223, 26, 29, 30, 31, 32, 206, 207, 210, 211, 217, 24, 264, 265, 190, 191, 194, 195, 115, 28, 19, 20, 233, 234, 818, 819, 0, 0, 0, 0, 0, 0, 0, 0, 795, 796, 1008, 1009, 1012, 1013, 1016, 1017, 1020, 1021, 1095, 12, 174, 175, 170, 171, 1197, 1198, 1177, 1178, 1181, 1182, 190, 191, 194, 195, 31, 32, 115, 28, 15, 16, 7, 8, 19, 20, 15, 16, 268, 269, 107, 108, 622, 623, 629, 630, 633, 634, 618, 619, 563, 564, 571, 572, 284, 285, 292, 293, 118, 119, 122, 123, 27, 28, 31, 32, 105, 106, 200, 201, 212, 213, 196, 197, 262, 263, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 809, 810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 789, 790, 1042, 1043, 994, 995, 998, 999, 1002, 1003, 1092, 10, 164, 165, 218, 26, 1187, 1188, 1191, 1192, 21, 22, 17, 18, 5, 6, 21, 22, 220, 221, 218, 26, 21, 22, 13, 14, 105, 106, 274, 275, 109, 18, 600, 601, 604, 605, 608, 609, 612, 613, 565, 566, 573, 574, 278, 279, 286, 287, 105, 106, 1098, 10, 21, 22, 25, 26, 107, 108, 202, 203, 214, 215, 198, 199, 264, 265, 11, 12, 11, 12, 11, 12, 11, 12, 811, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 791, 792, 1044, 1045, 996, 997, 1000, 1001, 1004, 1005, 1093, 12, 166, 167, 219, 28, 1189, 1190, 1193, 1194, 23, 24, 19, 20, 7, 8, 23, 24, 19, 20, 219, 28, 23, 24, 15, 16, 107, 108, 276, 277, 19, 110, 602, 603, 606, 607, 610, 611, 614, 615, 567, 568, 575, 576, 280, 281, 288, 289, 107, 108, 1099, 12, 23, 24, 27, 28, 218, 26, 188, 189, 192, 193, 111, 112, 282, 283, 290, 291, 172, 173, 180, 181, 754, 755, 758, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 785, 786, 777, 778, 982, 983, 986, 987, 990, 991, 1090, 10, 224, 26, 227, 228, 140, 141, 136, 137, 160, 161, 21, 22, 172, 173, 168, 169, 13, 14, 109, 18, 13, 14, 5, 6, 9, 10, 350, 351, 354, 355, 218, 26, 592, 593, 596, 597, 1, 2, 21, 22, 9, 10, 231, 232, 270, 271, 9, 10, 1090, 10, 109, 18, 21, 22, 219, 28, 190, 191, 194, 195, 23, 113, 284, 285, 292, 293, 174, 175, 182, 183, 756, 757, 759, 760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 787, 788, 779, 780, 984, 985, 988, 989, 992, 993, 1091, 12, 225, 226, 229, 230, 142, 143, 138, 139, 162, 163, 23, 24, 174, 175, 170, 171, 15, 16, 19, 110, 15, 16, 7, 8, 11, 12, 352, 353, 356, 357, 219, 28, 594, 595, 598, 599, 3, 4, 23, 24, 11, 12, 233, 234, 272, 273, 11, 12, 1091, 12, 19, 110, 23, 24, 223, 26, 224, 26, 227, 228, 114, 26, 278, 279, 286, 287, 176, 177, 735, 736, 739, 740, 743, 744, 747, 538, 0, 0, 0, 0, 0, 0, 805, 806, 781, 782, 773, 774, 970, 971, 974, 975, 978, 979, 1088, 10, 204, 205, 208, 209, 132, 133, 156, 157, 144, 145, 13, 14, 164, 165, 21, 22, 17, 18, 5, 6, 184, 185, 180, 181, 342, 343, 346, 347, 362, 363, 222, 22, 21, 22, 25, 26, 17, 18, 223, 26, 29, 30, 114, 26, 266, 267, 17, 18, 1096, 10, 5, 6, 105, 106, 27, 28, 225, 226, 229, 230, 115, 28, 280, 281, 288, 289, 178, 179, 737, 738, 741, 742, 745, 746, 748, 749, 0, 0, 0, 0, 0, 0, 807, 808, 783, 784, 775, 776, 972, 973, 976, 977, 980, 981, 1089, 12, 206, 207, 210, 211, 134, 135, 158, 159, 146, 147, 15, 16, 166, 167, 23, 24, 19, 20, 7, 8, 186, 187, 182, 183, 344, 345, 348, 349, 364, 365, 23, 24, 23, 24, 27, 28, 19, 20, 27, 28, 31, 32, 115, 28, 268, 269, 19, 20, 1097, 12, 7, 8, 107, 108, 231, 232, 231, 232, 222, 22, 124, 125, 128, 129, 266, 267, 105, 106, 703, 704, 707, 708, 711, 712, 731, 732, 727, 728, 723, 724, 719, 720, 761, 762, 765, 766, 769, 770, 958, 959, 962, 963, 966, 967, 1086, 10, 200, 201, 212, 213, 148, 149, 152, 153, 21, 22, 9, 10, 5, 6, 13, 14, 9, 10, 111, 112, 176, 177, 314, 315, 322, 323, 358, 359, 338, 339, 204, 205, 208, 209, 216, 22, 21, 22, 140, 141, 136, 137, 160, 161, 274, 275, 21, 22, 29, 30, 231, 232, 17, 18, 233, 234, 233, 234, 23, 24, 126, 127, 130, 131, 268, 269, 107, 108, 705, 706, 709, 710, 713, 714, 733, 734, 729, 730, 725, 726, 721, 722, 763, 764, 767, 768, 771, 772, 960, 961, 964, 965, 968, 969, 1087, 12, 202, 203, 214, 215, 150, 151, 154, 155, 23, 24, 11, 12, 7, 8, 15, 16, 11, 12, 23, 113, 178, 179, 316, 317, 324, 325, 360, 361, 340, 341, 206, 207, 210, 211, 217, 24, 23, 24, 142, 143, 138, 139, 162, 163, 276, 277, 23, 24, 31, 32, 233, 234, 19, 20, 222, 22, 223, 26, 109, 18, 116, 117, 120, 121, 270, 271, 109, 18, 29, 30, 17, 18, 25, 26, 109, 18, 683, 684, 715, 716, 687, 688, 691, 692, 695, 696, 699, 700, 114, 26, 1046, 1047, 1030, 1031, 1084, 10, 188, 189, 192, 193, 13, 14, 17, 18, 13, 14, 17, 18, 29, 30, 21, 22, 231, 232, 5, 6, 105, 106, 318, 319, 326, 327, 330, 331, 334, 335, 200, 201, 212, 213, 196, 197, 111, 112, 132, 133, 156, 157, 144, 145, 262, 263, 111, 112, 172, 173, 168, 169, 29, 30, 23, 24, 27, 28, 19, 110, 118, 119, 122, 123, 272, 273, 19, 110, 31, 32, 19, 20, 27, 28, 19, 110, 685, 686, 717, 718, 689, 690, 693, 694, 697, 698, 701, 702, 115, 28, 1048, 1049, 1032, 1033, 1085, 12, 190, 191, 194, 195, 15, 16, 19, 20, 15, 16, 19, 20, 31, 32, 23, 24, 233, 234, 7, 8, 107, 108, 320, 321, 328, 329, 332, 333, 336, 337, 202, 203, 214, 215, 198, 199, 23, 113, 134, 135, 158, 159, 146, 147, 264, 265, 23, 113, 174, 175, 170, 171, 31, 32, 231, 232, 218, 26, 172, 173, 168, 169, 298, 299, 306, 307, 25, 26, 5, 6, 140, 141, 136, 137, 160, 161, 667, 668, 671, 672, 675, 676, 679, 680, 25, 26, 17, 18, 25, 26, 223, 26, 109, 18, 1082, 10, 9, 10, 114, 26, 124, 125, 128, 129, 5, 6, 9, 10, 5, 6, 17, 18, 114, 26, 140, 141, 136, 137, 160, 161, 114, 26, 262, 263, 105, 106, 188, 189, 192, 193, 17, 18, 9, 10, 148, 149, 152, 153, 298, 299, 306, 307, 223, 26, 164, 165, 17, 18, 13, 14, 233, 234, 219, 28, 174, 175, 170, 171, 300, 301, 308, 309, 27, 28, 7, 8, 142, 143, 138, 139, 162, 163, 669, 670, 673, 674, 677, 678, 681, 682, 27, 28, 19, 20, 27, 28, 27, 28, 19, 110, 1083, 12, 11, 12, 115, 28, 126, 127, 130, 131, 7, 8, 11, 12, 7, 8, 19, 20, 115, 28, 142, 143, 138, 139, 162, 163, 115, 28, 264, 265, 107, 108, 190, 191, 194, 195, 19, 20, 11, 12, 150, 151, 154, 155, 300, 301, 308, 309, 27, 28, 166, 167, 19, 20, 15, 16, 220, 221, 231, 232, 164, 165, 109, 18, 294, 295, 302, 303, 17, 18, 222, 22, 132, 133, 156, 157, 144, 145, 651, 652, 655, 656, 659, 660, 663, 664, 124, 125, 128, 129, 1074, 1075, 1077, 1078, 1079, 1080, 1081, 10, 29, 30, 105, 106, 116, 117, 120, 121, 184, 185, 180, 181, 13, 14, 218, 26, 109, 18, 132, 133, 156, 157, 144, 145, 218, 26, 282, 283, 290, 291, 220, 221, 114, 26, 25, 26, 21, 22, 109, 18, 1, 2, 294, 295, 302, 303, 29, 30, 21, 22, 109, 18, 1, 2, 19, 20, 233, 234, 166, 167, 19, 110, 296, 297, 304, 305, 19, 20, 23, 24, 134, 135, 158, 159, 146, 147, 653, 654, 657, 658, 661, 662, 665, 666, 126, 127, 130, 131, 1076, 12, 11, 12, 11, 12, 11, 12, 31, 32, 107, 108, 118, 119, 122, 123, 186, 187, 182, 183, 15, 16, 219, 28, 19, 110, 134, 135, 158, 159, 146, 147, 219, 28, 284, 285, 292, 293, 19, 20, 115, 28, 27, 28, 23, 24, 19, 110, 3, 4, 296, 297, 304, 305, 31, 32, 23, 24, 19, 110, 3, 4, 224, 26, 227, 228, 227, 228, 218, 26, 282, 283, 290, 291, 29, 30, 114, 26, 148, 149, 152, 153, 17, 18, 111, 112, 643, 644, 647, 648, 105, 106, 116, 117, 120, 121, 1072, 10, 140, 141, 136, 137, 160, 161, 25, 26, 21, 22, 21, 22, 5, 6, 176, 177, 21, 22, 105, 106, 224, 26, 227, 228, 148, 149, 152, 153, 124, 125, 128, 129, 278, 279, 286, 287, 109, 18, 21, 22, 1, 2, 9, 10, 224, 26, 227, 228, 282, 283, 290, 291, 184, 185, 180, 181, 105, 106, 17, 18, 225, 226, 229, 230, 229, 230, 219, 28, 284, 285, 292, 293, 31, 32, 115, 28, 150, 151, 154, 155, 19, 20, 23, 113, 645, 646, 649, 650, 107, 108, 118, 119, 122, 123, 1073, 12, 142, 143, 138, 139, 162, 163, 27, 28, 23, 24, 23, 24, 7, 8, 178, 179, 23, 24, 107, 108, 225, 226, 229, 230, 150, 151, 154, 155, 126, 127, 130, 131, 280, 281, 288, 289, 19, 110, 23, 24, 3, 4, 11, 12, 225, 226, 229, 230, 284, 285, 292, 293, 186, 187, 182, 183, 107, 108, 19, 20, 231, 232, 231, 232, 222, 22, 220, 221, 278, 279, 286, 287, 1050, 1051, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1119, 1120, 1122, 14, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 10, 132, 133, 156, 157, 144, 145, 29, 30, 114, 26, 5, 6, 114, 26, 5, 6, 17, 18, 29, 30, 220, 221, 9, 10, 17, 18, 13, 14, 116, 117, 120, 121, 111, 112, 270, 271, 231, 232, 25, 26, 29, 30, 124, 125, 128, 129, 990, 991, 278, 279, 286, 287, 176, 177, 114, 26, 25, 26, 5, 6, 233, 234, 233, 234, 23, 24, 19, 20, 280, 281, 288, 289, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 1121, 84, 1123, 16, 11, 12, 11, 12, 11, 12, 11, 12, 134, 135, 158, 159, 146, 147, 31, 32, 115, 28, 7, 8, 115, 28, 7, 8, 19, 20, 31, 32, 19, 20, 11, 12, 19, 20, 15, 16, 118, 119, 122, 123, 23, 113, 272, 273, 233, 234, 27, 28, 31, 32, 126, 127, 130, 131, 992, 993, 280, 281, 288, 289, 178, 179, 115, 28, 27, 28, 7, 8, 218, 26, 231, 232, 231, 232, 227, 228, 222, 22, 282, 283, 290, 291, 204, 205, 208, 209, 216, 22, 172, 173, 168, 169, 81, 82, 220, 221, 224, 26, 227, 228, 114, 26, 17, 18, 148, 149, 152, 153, 1, 2, 9, 10, 109, 18, 262, 263, 262, 263, 262, 263, 218, 26, 21, 22, 97, 98, 5, 6, 29, 30, 204, 205, 208, 209, 216, 22, 21, 22, 274, 275, 1, 2, 9, 10, 21, 22, 116, 117, 120, 121, 17, 18, 1, 2, 274, 275, 25, 26, 17, 18, 218, 26, 25, 26, 219, 28, 233, 234, 233, 234, 229, 230, 23, 24, 284, 285, 292, 293, 206, 207, 210, 211, 217, 24, 174, 175, 170, 171, 83, 84, 19, 20, 225, 226, 229, 230, 115, 28, 19, 20, 150, 151, 154, 155, 3, 4, 11, 12, 19, 110, 264, 265, 264, 265, 264, 265, 219, 28, 23, 24, 99, 100, 7, 8, 31, 32, 206, 207, 210, 211, 217, 24, 23, 24, 276, 277, 3, 4, 11, 12, 23, 24, 118, 119, 122, 123, 19, 20, 3, 4, 276, 277, 27, 28, 19, 20, 219, 28, 27, 28, 222, 22, 224, 26, 227, 228, 231, 232, 231, 232, 1166, 279, 286, 287, 200, 201, 212, 213, 196, 197, 164, 165, 111, 112, 93, 94, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 89, 90, 9, 10, 1, 2, 477, 478, 0, 0, 477, 478, 274, 275, 485, 486, 81, 82, 5, 6, 21, 22, 200, 201, 212, 213, 196, 197, 109, 18, 282, 283, 290, 291, 172, 173, 168, 169, 41, 42, 53, 54, 65, 66, 298, 299, 306, 307, 204, 205, 208, 209, 216, 22, 29, 30, 23, 24, 225, 226, 229, 230, 233, 234, 233, 234, 1167, 1168, 288, 289, 202, 203, 214, 215, 198, 199, 166, 167, 23, 113, 95, 96, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 91, 92, 11, 12, 3, 4, 479, 480, 0, 0, 479, 480, 276, 277, 487, 488, 83, 84, 7, 8, 23, 24, 202, 203, 214, 215, 198, 199, 19, 110, 284, 285, 292, 293, 174, 175, 170, 171, 43, 44, 55, 56, 67, 68, 300, 301, 308, 309, 206, 207, 210, 211, 217, 24, 31, 32, 231, 232, 218, 26, 224, 26, 227, 228, 227, 228, 231, 232, 282, 283, 290, 291, 192, 193, 29, 30, 21, 22, 114, 26, 5, 6, 184, 185, 180, 181, 29, 30, 17, 18, 5, 6, 111, 112, 218, 26, 81, 82, 462, 463, 466, 26, 0, 0, 0, 0, 0, 0, 0, 0, 481, 482, 81, 82, 21, 22, 13, 14, 188, 189, 192, 193, 5, 6, 21, 22, 278, 279, 286, 287, 176, 177, 25, 26, 33, 34, 45, 46, 57, 58, 294, 295, 302, 303, 200, 201, 212, 213, 196, 197, 5, 6, 233, 234, 219, 28, 225, 226, 229, 230, 229, 230, 233, 234, 284, 285, 292, 293, 194, 195, 31, 32, 23, 24, 115, 28, 7, 8, 186, 187, 182, 183, 31, 32, 19, 20, 7, 8, 23, 113, 219, 28, 83, 84, 464, 465, 467, 468, 0, 0, 0, 0, 0, 0, 0, 0, 483, 484, 83, 84, 23, 24, 15, 16, 190, 191, 194, 195, 7, 8, 23, 24, 280, 281, 288, 289, 178, 179, 27, 28, 35, 36, 47, 48, 59, 60, 296, 297, 304, 305, 202, 203, 214, 215, 198, 199, 7, 8, 231, 232, 231, 232, 224, 26, 227, 228, 231, 232, 5, 6, 278, 279, 286, 287, 13, 14, 29, 30, 124, 125, 128, 129, 17, 18, 29, 30, 29, 30, 29, 30, 114, 26, 140, 141, 136, 137, 160, 161, 81, 82, 1, 2, 458, 459, 469, 470, 473, 474, 469, 470, 473, 474, 454, 455, 81, 82, 9, 10, 17, 18, 25, 26, 29, 30, 204, 205, 208, 209, 216, 22, 310, 311, 5, 6, 17, 18, 5, 6, 25, 26, 25, 26, 274, 275, 111, 112, 136, 137, 136, 137, 160, 161, 105, 106, 233, 234, 233, 234, 225, 226, 229, 230, 233, 234, 7, 8, 280, 281, 288, 289, 15, 16, 31, 32, 126, 127, 130, 131, 19, 20, 31, 32, 31, 32, 31, 32, 115, 28, 142, 143, 138, 139, 162, 163, 83, 84, 3, 4, 460, 461, 471, 472, 475, 476, 471, 472, 475, 476, 456, 457, 83, 84, 11, 12, 19, 20, 27, 28, 31, 32, 206, 207, 210, 211, 217, 24, 312, 313, 7, 8, 19, 20, 7, 8, 27, 28, 27, 28, 276, 277, 23, 113, 138, 139, 138, 139, 162, 163, 107, 108, 224, 26, 227, 228, 223, 26, 222, 22, 224, 26, 227, 228, 111, 112, 282, 283, 290, 291, 9, 10, 116, 117, 120, 121, 13, 14, 231, 232, 231, 232, 850, 851, 105, 106, 132, 133, 156, 157, 144, 145, 93, 94, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 101, 102, 89, 90, 29, 30, 231, 232, 21, 22, 200, 201, 212, 213, 196, 197, 282, 283, 290, 291, 25, 26, 25, 26, 224, 26, 227, 228, 270, 271, 25, 26, 132, 133, 156, 157, 144, 145, 21, 22, 225, 226, 229, 230, 27, 28, 23, 24, 225, 226, 229, 230, 23, 113, 284, 285, 292, 293, 11, 12, 118, 119, 122, 123, 15, 16, 233, 234, 233, 234, 852, 853, 107, 108, 134, 135, 158, 159, 146, 147, 95, 96, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 103, 104, 91, 92, 31, 32, 233, 234, 23, 24, 202, 203, 214, 215, 198, 199, 284, 285, 292, 293, 27, 28, 27, 28, 225, 226, 229, 230, 272, 273, 27, 28, 134, 135, 158, 159, 146, 147, 23, 24, 223, 26, 224, 26, 227, 228, 231, 232, 231, 232, 136, 137, 160, 161, 278, 279, 286, 287, 29, 30, 204, 205, 208, 209, 216, 22, 231, 232, 1145, 1153, 854, 855, 5, 6, 148, 149, 152, 153, 25, 26, 1, 2, 17, 18, 13, 14, 136, 137, 160, 161, 172, 173, 168, 169, 21, 22, 109, 18, 81, 82, 124, 125, 128, 129, 29, 30, 188, 189, 192, 193, 9, 10, 278, 279, 286, 287, 111, 112, 9, 10, 21, 22, 298, 299, 306, 307, 109, 18, 148, 149, 152, 153, 29, 30, 114, 26, 27, 28, 225, 226, 229, 230, 233, 234, 233, 234, 138, 139, 162, 163, 280, 281, 288, 289, 31, 32, 206, 207, 210, 211, 217, 24, 233, 234, 1145, 1145, 856, 857, 7, 8, 150, 151, 154, 155, 27, 28, 3, 4, 19, 20, 15, 16, 138, 139, 162, 163, 174, 175, 170, 171, 23, 24, 19, 110, 83, 84, 126, 127, 130, 131, 31, 32, 190, 191, 194, 195, 11, 12, 280, 281, 288, 289, 23, 113, 11, 12, 23, 24, 300, 301, 308, 309, 19, 110, 150, 151, 154, 155, 31, 32, 115, 28, 231, 232, 220, 221, 231, 232, 227, 228, 231, 232, 156, 157, 144, 145, 29, 30, 282, 283, 290, 291, 200, 201, 212, 213, 21, 22, 870, 871, 866, 867, 111, 112, 1, 2, 21, 22, 25, 26, 218, 26, 114, 26, 13, 14, 105, 106, 156, 157, 144, 145, 164, 165, 222, 22, 114, 26, 21, 22, 81, 82, 116, 117, 120, 121, 21, 22, 114, 26, 21, 22, 21, 22, 5, 6, 266, 267, 25, 26, 220, 221, 13, 14, 294, 295, 302, 303, 21, 22, 41, 42, 53, 54, 53, 54, 53, 54, 233, 234, 19, 20, 233, 234, 229, 230, 233, 234, 158, 159, 146, 147, 31, 32, 284, 285, 292, 293, 202, 203, 214, 215, 23, 24, 872, 873, 868, 869, 23, 113, 3, 4, 23, 24, 27, 28, 219, 28, 115, 28, 15, 16, 107, 108, 158, 159, 146, 147, 166, 167, 23, 24, 115, 28, 23, 24, 83, 84, 118, 119, 122, 123, 23, 24, 115, 28, 23, 24, 23, 24, 7, 8, 268, 269, 27, 28, 19, 20, 15, 16, 296, 297, 304, 305, 23, 24, 43, 44, 55, 56, 55, 56, 55, 56, 220, 221, 231, 232, 220, 221, 231, 232, 224, 26, 227, 228, 223, 26, 105, 106, 278, 279, 286, 287, 188, 189, 192, 193, 13, 14, 874, 875, 184, 185, 180, 181, 5, 6, 1094, 10, 114, 26, 224, 26, 227, 228, 9, 10, 29, 30, 274, 275, 274, 275, 438, 439, 274, 275, 227, 228, 29, 30, 81, 82, 1, 2, 1, 2, 1, 2, 227, 228, 105, 106, 218, 26, 109, 18, 282, 283, 290, 291, 180, 181, 298, 299, 306, 307, 172, 173, 168, 169, 37, 38, 1124, 1125, 1124, 1125, 1124, 1125, 19, 20, 233, 234, 19, 20, 233, 234, 225, 226, 229, 230, 27, 28, 107, 108, 280, 281, 288, 289, 190, 191, 194, 195, 15, 16, 876, 877, 186, 187, 182, 183, 7, 8, 1095, 12, 115, 28, 225, 226, 229, 230, 11, 12, 31, 32, 276, 277, 276, 277, 440, 441, 276, 277, 229, 230, 31, 32, 83, 84, 3, 4, 3, 4, 3, 4, 229, 230, 107, 108, 219, 28, 19, 110, 284, 285, 292, 293, 182, 183, 300, 301, 308, 309, 174, 175, 170, 171, 39, 40, 1126, 1127, 1126, 1127, 1126, 1127, 231, 232, 224, 26, 227, 228, 223, 26, 231, 232, 21, 22, 25, 26, 109, 18, 176, 177, 282, 283, 290, 291, 109, 18, 29, 30, 25, 26, 25, 26, 97, 98, 109, 18, 1082, 10, 105, 106, 204, 205, 208, 209, 216, 22, 25, 26, 274, 275, 434, 435, 274, 275, 274, 275, 231, 232, 414, 415, 81, 82, 231, 232, 231, 232, 231, 232, 231, 232, 231, 232, 942, 943, 5, 6, 278, 279, 286, 287, 29, 30, 294, 295, 302, 303, 164, 165, 17, 18, 37, 38, 49, 50, 1124, 1125, 1128, 1129, 233, 234, 225, 226, 229, 230, 27, 28, 233, 234, 23, 24, 27, 28, 19, 110, 178, 179, 284, 285, 292, 293, 19, 110, 31, 32, 27, 28, 27, 28, 99, 100, 19, 110, 1083, 12, 107, 108, 206, 207, 210, 211, 217, 24, 27, 28, 276, 277, 436, 437, 276, 277, 276, 277, 233, 234, 416, 417, 83, 84, 233, 234, 233, 234, 233, 234, 233, 234, 233, 234, 944, 945, 7, 8, 280, 281, 288, 289, 31, 32, 296, 297, 304, 305, 166, 167, 19, 20, 39, 40, 51, 52, 1126, 1127, 1130, 1131, 218, 26, 231, 232, 218, 26, 231, 232, 231, 232, 223, 26, 172, 173, 168, 169, 111, 112, 278, 279, 286, 287, 196, 197, 25, 26, 9, 10, 5, 6, 81, 82, 218, 26, 1065, 1066, 1062, 1063, 200, 201, 212, 213, 1, 2, 17, 18, 430, 431, 0, 0, 0, 0, 231, 232, 231, 232, 410, 411, 81, 82, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 938, 939, 17, 18, 9, 10, 282, 283, 1158, 1159, 306, 307, 29, 30, 218, 26, 105, 106, 37, 38, 1128, 1129, 1128, 1129, 1124, 1125, 219, 28, 233, 234, 219, 28, 233, 234, 233, 234, 27, 28, 174, 175, 170, 171, 23, 113, 280, 281, 288, 289, 198, 199, 27, 28, 11, 12, 7, 8, 83, 84, 219, 28, 11, 12, 11, 12, 202, 203, 214, 215, 3, 4, 19, 20, 432, 433, 0, 0, 0, 0, 233, 234, 233, 234, 412, 413, 83, 84, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 940, 941, 19, 20, 11, 12, 284, 285, 1160, 1161, 308, 309, 31, 32, 219, 28, 107, 108, 39, 40, 1130, 1131, 1130, 1131, 1126, 1127, 224, 26, 227, 228, 231, 232, 227, 228, 231, 232, 218, 26, 164, 165, 218, 26, 1, 2, 220, 221, 282, 283, 290, 291, 172, 173, 180, 181, 5, 6, 93, 94, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 89, 90, 1169, 1170, 0, 0, 231, 232, 231, 232, 426, 427, 406, 407, 81, 82, 0, 0, 926, 927, 954, 955, 950, 951, 946, 947, 934, 935, 29, 30, 114, 26, 278, 279, 1162, 1163, 302, 303, 204, 205, 208, 209, 216, 22, 37, 38, 1128, 1129, 49, 50, 1128, 1129, 225, 226, 229, 230, 233, 234, 229, 230, 233, 234, 219, 28, 166, 167, 219, 28, 3, 4, 19, 20, 284, 285, 292, 293, 174, 175, 182, 183, 7, 8, 95, 96, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 91, 92, 1167, 1170, 0, 0, 233, 234, 233, 234, 428, 429, 408, 409, 83, 84, 0, 0, 928, 929, 956, 957, 952, 953, 948, 949, 936, 937, 31, 32, 115, 28, 280, 281, 1164, 1165, 304, 305, 206, 207, 210, 211, 217, 24, 39, 40, 1130, 1131, 51, 52, 1130, 1131, 231, 232, 231, 232, 223, 26, 222, 22, 223, 26, 224, 26, 227, 228, 29, 30, 224, 26, 227, 228, 278, 279, 286, 287, 176, 177, 21, 22, 25, 26, 136, 137, 136, 137, 160, 161, 25, 26, 25, 26, 124, 125, 128, 129, 81, 82, 442, 443, 747, 538, 231, 232, 422, 423, 418, 419, 402, 403, 81, 82, 930, 931, 922, 923, 918, 919, 902, 903, 9, 10, 204, 205, 208, 209, 216, 22, 1098, 10, 274, 275, 25, 26, 200, 201, 212, 213, 196, 197, 37, 38, 1124, 1125, 1128, 1129, 1128, 1129, 233, 234, 233, 234, 27, 28, 23, 24, 27, 28, 225, 226, 229, 230, 31, 32, 225, 226, 229, 230, 280, 281, 288, 289, 178, 179, 23, 24, 27, 28, 138, 139, 138, 139, 162, 163, 27, 28, 27, 28, 126, 127, 130, 131, 83, 84, 444, 445, 748, 749, 233, 234, 424, 425, 420, 421, 404, 405, 83, 84, 932, 933, 924, 925, 920, 921, 904, 905, 11, 12, 206, 207, 210, 211, 217, 24, 1099, 12, 276, 277, 27, 28, 202, 203, 214, 215, 198, 199, 39, 40, 1126, 1127, 1130, 1131, 1130, 1131, 231, 232, 223, 26, 231, 232, 220, 221, 224, 26, 227, 228, 231, 232, 223, 26, 109, 18, 224, 26, 227, 228, 282, 283, 290, 291, 105, 106, 114, 26, 132, 133, 156, 157, 144, 145, 231, 232, 477, 478, 0, 0, 485, 486, 81, 82, 378, 379, 382, 383, 386, 387, 390, 391, 394, 395, 398, 399, 81, 82, 906, 907, 910, 911, 914, 915, 898, 899, 25, 26, 200, 201, 212, 213, 196, 197, 1096, 10, 282, 283, 290, 291, 188, 189, 192, 193, 111, 112, 37, 38, 1128, 1129, 49, 50, 1124, 1125, 233, 234, 27, 28, 233, 234, 19, 20, 225, 226, 229, 230, 233, 234, 27, 28, 19, 110, 225, 226, 229, 230, 284, 285, 292, 293, 107, 108, 115, 28, 134, 135, 158, 159, 146, 147, 233, 234, 479, 480, 0, 0, 487, 488, 83, 84, 380, 381, 384, 385, 388, 389, 392, 393, 396, 397, 400, 401, 83, 84, 908, 909, 912, 913, 916, 917, 900, 901, 27, 28, 202, 203, 214, 215, 198, 199, 1097, 12, 284, 285, 292, 293, 190, 191, 194, 195, 23, 113, 39, 40, 1130, 1131, 51, 52, 1126, 1127, 222, 22, 231, 232, 224, 26, 227, 228, 220, 221, 231, 232, 224, 26, 231, 232, 227, 228, 220, 221, 231, 232, 1166, 279, 286, 287, 25, 26, 218, 26, 148, 149, 152, 153, 164, 165, 466, 26, 0, 0, 0, 0, 481, 482, 93, 94, 85, 86, 89, 90, 114, 26, 21, 22, 105, 106, 41, 42, 77, 78, 53, 54, 886, 887, 890, 891, 894, 895, 25, 26, 231, 232, 1154, 1155, 850, 851, 17, 18, 278, 279, 286, 287, 29, 30, 13, 14, 21, 22, 37, 38, 1124, 1125, 1128, 1129, 1124, 1125, 23, 24, 233, 234, 225, 226, 229, 230, 19, 20, 233, 234, 225, 226, 233, 234, 229, 230, 19, 20, 233, 234, 1167, 1168, 288, 289, 27, 28, 219, 28, 150, 151, 154, 155, 166, 167, 467, 468, 0, 0, 0, 0, 483, 484, 95, 96, 87, 88, 91, 92, 115, 28, 23, 24, 107, 108, 43, 44, 79, 80, 55, 56, 888, 889, 892, 893, 896, 897, 27, 28, 233, 234, 1156, 1157, 852, 853, 19, 20, 280, 281, 288, 289, 31, 32, 15, 16, 23, 24, 39, 40, 1126, 1127, 1130, 1131, 1126, 1127, 231, 232, 224, 26, 227, 228, 222, 22, 231, 232, 220, 221, 220, 221, 222, 22, 1210, 1211, 29, 30, 223, 26, 218, 26, 310, 311, 220, 221, 224, 26, 227, 228, 111, 112, 1, 2, 458, 459, 469, 470, 473, 474, 454, 455, 25, 26, 218, 26, 93, 94, 85, 86, 85, 86, 85, 86, 73, 74, 1128, 1129, 1124, 1125, 1124, 1125, 61, 62, 29, 30, 25, 26, 231, 232, 1145, 1153, 854, 855, 124, 125, 128, 129, 282, 283, 290, 291, 184, 185, 180, 181, 37, 38, 1124, 1125, 1128, 1129, 1128, 1129, 233, 234, 225, 226, 229, 230, 23, 24, 233, 234, 19, 20, 19, 20, 23, 24, 1212, 1213, 31, 32, 27, 28, 219, 28, 312, 313, 19, 20, 225, 226, 229, 230, 23, 113, 3, 4, 460, 461, 471, 472, 475, 476, 456, 457, 27, 28, 219, 28, 95, 96, 87, 88, 87, 88, 87, 88, 75, 76, 1130, 1131, 1126, 1127, 1126, 1127, 63, 64, 31, 32, 27, 28, 233, 234, 1145, 1145, 856, 857, 126, 127, 130, 131, 284, 285, 292, 293, 186, 187, 182, 183, 39, 40, 1126, 1127, 1130, 1131, 1130, 1131, 224, 26, 227, 228, 231, 232, 227, 228, 218, 26, 231, 232, 224, 26, 1203, 1200, 1206, 1207, 218, 26, 220, 221, 231, 232, 282, 283, 290, 291, 220, 221, 231, 232, 223, 26, 9, 10, 5, 6, 25, 26, 176, 177, 25, 26, 114, 26, 17, 18, 204, 205, 208, 209, 216, 22, 231, 232, 37, 38, 254, 255, 258, 259, 49, 50, 61, 62, 172, 173, 168, 169, 231, 232, 0, 0, 862, 863, 116, 117, 120, 121, 278, 279, 286, 287, 176, 177, 21, 22, 33, 34, 45, 46, 45, 46, 69, 70, 225, 226, 229, 230, 233, 234, 229, 230, 219, 28, 233, 234, 225, 226, 1204, 1205, 1208, 1209, 219, 28, 19, 20, 233, 234, 284, 285, 292, 293, 19, 20, 233, 234, 27, 28, 11, 12, 7, 8, 27, 28, 178, 179, 27, 28, 115, 28, 19, 20, 206, 207, 210, 211, 217, 24, 233, 234, 39, 40, 256, 257, 260, 261, 51, 52, 63, 64, 174, 175, 170, 171, 233, 234, 0, 0, 864, 865, 118, 119, 122, 123, 280, 281, 288, 289, 178, 179, 23, 24, 35, 36, 47, 48, 47, 48, 71, 72, 231, 232, 222, 22, 220, 221, 231, 232, 220, 221, 218, 26, 231, 232, 223, 26, 231, 232, 224, 26, 227, 228, 218, 26, 278, 279, 286, 287, 25, 26, 231, 232, 109, 18, 114, 26, 204, 205, 208, 209, 216, 22, 231, 232, 25, 26, 1, 2, 1, 2, 212, 213, 196, 197, 109, 18, 37, 38, 1124, 1125, 1124, 1125, 1128, 1129, 61, 62, 164, 165, 882, 883, 870, 871, 866, 867, 858, 859, 184, 185, 180, 181, 111, 112, 262, 263, 5, 6, 222, 22, 140, 141, 136, 137, 160, 161, 81, 82, 233, 234, 23, 24, 19, 20, 233, 234, 19, 20, 219, 28, 233, 234, 27, 28, 233, 234, 225, 226, 229, 230, 219, 28, 280, 281, 288, 289, 27, 28, 233, 234, 19, 110, 115, 28, 206, 207, 210, 211, 217, 24, 233, 234, 27, 28, 3, 4, 3, 4, 214, 215, 198, 199, 19, 110, 39, 40, 1126, 1127, 1126, 1127, 1130, 1131, 63, 64, 166, 167, 884, 885, 872, 873, 868, 869, 860, 861, 186, 187, 182, 183, 23, 113, 264, 265, 7, 8, 23, 24, 142, 143, 138, 139, 162, 163, 83, 84, 223, 26, 224, 26, 227, 228, 223, 26, 231, 232, 231, 232, 231, 232, 227, 228, 224, 26, 227, 228, 231, 232, 231, 232, 220, 221, 282, 283, 290, 291, 223, 26, 220, 221, 231, 232, 200, 201, 212, 213, 21, 22, 1, 2, 21, 22, 1, 2, 231, 232, 231, 232, 537, 538, 533, 534, 33, 34, 45, 46, 45, 46, 69, 70, 57, 58, 223, 26, 878, 879, 874, 875, 1, 2, 97, 98, 176, 177, 29, 30, 29, 30, 350, 351, 354, 355, 105, 106, 132, 133, 156, 157, 144, 145, 81, 82, 27, 28, 225, 226, 229, 230, 27, 28, 233, 234, 233, 234, 233, 234, 229, 230, 225, 226, 229, 230, 233, 234, 233, 234, 19, 20, 284, 285, 292, 293, 27, 28, 19, 20, 233, 234, 202, 203, 214, 215, 23, 24, 3, 4, 23, 24, 3, 4, 233, 234, 233, 234, 539, 538, 535, 536, 35, 36, 47, 48, 47, 48, 71, 72, 59, 60, 27, 28, 880, 881, 876, 877, 3, 4, 99, 100, 178, 179, 31, 32, 31, 32, 352, 353, 356, 357, 107, 108, 134, 135, 158, 159, 146, 147, 83, 84, 231, 232, 231, 232, 231, 232, 227, 228, 231, 232, 223, 26, 231, 232, 223, 26, 231, 232, 223, 26, 224, 26, 227, 228, 218, 26, 1166, 279, 286, 287, 13, 14, 218, 26, 25, 26, 188, 189, 192, 193, 196, 197, 111, 112, 21, 22, 224, 26, 231, 232, 521, 522, 0, 0, 529, 530, 29, 30, 218, 26, 111, 112, 114, 26, 109, 18, 85, 86, 85, 86, 85, 86, 85, 86, 101, 102, 218, 26, 109, 18, 342, 343, 346, 347, 362, 363, 21, 22, 148, 149, 152, 153, 105, 106, 81, 82, 233, 234, 233, 234, 233, 234, 229, 230, 233, 234, 27, 28, 233, 234, 27, 28, 233, 234, 27, 28, 225, 226, 229, 230, 219, 28, 1167, 1168, 288, 289, 15, 16, 219, 28, 27, 28, 190, 191, 194, 195, 198, 199, 23, 113, 23, 24, 225, 226, 233, 234, 523, 524, 0, 0, 531, 532, 31, 32, 219, 28, 23, 113, 115, 28, 19, 110, 87, 88, 87, 88, 87, 88, 87, 88, 103, 104, 219, 28, 19, 110, 344, 345, 348, 349, 364, 365, 23, 24, 150, 151, 154, 155, 107, 108, 83, 84, 220, 221, 224, 26, 227, 228, 222, 22, 224, 26, 227, 228, 140, 141, 136, 137, 160, 161, 224, 26, 227, 228, 231, 232, 231, 232, 231, 232, 282, 283, 290, 291, 231, 232, 223, 26, 1237, 1238, 1241, 1242, 1245, 1246, 1249, 1250, 1253, 1254, 548, 494, 231, 232, 0, 0, 538, 551, 517, 518, 505, 506, 25, 26, 21, 22, 184, 185, 180, 181, 1, 2, 477, 478, 0, 0, 485, 486, 25, 26, 111, 112, 314, 315, 322, 323, 358, 359, 338, 339, 172, 173, 168, 169, 41, 42, 53, 54, 77, 78, 19, 20, 225, 226, 229, 230, 23, 24, 225, 226, 229, 230, 142, 143, 138, 139, 162, 163, 225, 226, 229, 230, 233, 234, 233, 234, 233, 234, 284, 285, 292, 293, 233, 234, 27, 28, 1239, 1240, 1243, 1244, 1247, 1248, 1251, 1252, 1255, 1256, 549, 550, 233, 234, 0, 0, 538, 552, 519, 520, 507, 508, 27, 28, 23, 24, 186, 187, 182, 183, 3, 4, 479, 480, 0, 0, 487, 488, 27, 28, 23, 113, 316, 317, 324, 325, 360, 361, 340, 341, 174, 175, 170, 171, 43, 44, 55, 56, 79, 80, 224, 26, 227, 228, 223, 26, 231, 232, 231, 232, 231, 232, 132, 133, 156, 157, 144, 145, 220, 221, 231, 232, 224, 26, 227, 228, 231, 232, 1166, 279, 286, 287, 172, 173, 180, 181, 218, 26, 21, 22, 9, 10, 196, 197, 17, 18, 544, 545, 540, 541, 525, 526, 513, 514, 509, 510, 501, 502, 493, 494, 17, 18, 176, 177, 462, 463, 466, 26, 0, 0, 0, 0, 481, 482, 450, 451, 21, 22, 318, 319, 326, 327, 330, 331, 334, 335, 164, 165, 109, 18, 37, 38, 1124, 1125, 1124, 1125, 225, 226, 229, 230, 27, 28, 233, 234, 233, 234, 233, 234, 134, 135, 158, 159, 146, 147, 19, 20, 233, 234, 225, 226, 229, 230, 233, 234, 1167, 1168, 288, 289, 174, 175, 182, 183, 219, 28, 23, 24, 11, 12, 198, 199, 19, 20, 546, 547, 542, 543, 527, 528, 515, 516, 511, 512, 503, 504, 495, 496, 19, 20, 178, 179, 464, 465, 467, 468, 0, 0, 0, 0, 483, 484, 452, 453, 23, 24, 320, 321, 328, 329, 332, 333, 336, 337, 166, 167, 19, 110, 39, 40, 1126, 1127, 1126, 1127, 231, 232, 220, 221, 224, 26, 227, 228, 231, 232, 218, 26, 148, 149, 152, 153, 990, 991, 224, 26, 227, 228, 223, 26, 231, 232, 218, 26, 231, 232, 282, 283, 290, 291, 224, 26, 227, 228, 218, 26, 25, 26, 21, 22, 223, 26, 17, 18, 140, 141, 136, 137, 160, 161, 105, 106, 497, 498, 489, 490, 25, 26, 109, 18, 218, 26, 458, 459, 469, 470, 473, 474, 454, 455, 446, 447, 218, 26, 5, 6, 223, 26, 266, 267, 29, 30, 21, 22, 220, 221, 37, 38, 1128, 1129, 1124, 1125, 233, 234, 19, 20, 225, 226, 229, 230, 233, 234, 219, 28, 150, 151, 154, 155, 992, 993, 225, 226, 229, 230, 27, 28, 233, 234, 219, 28, 233, 234, 284, 285, 292, 293, 225, 226, 229, 230, 219, 28, 27, 28, 23, 24, 27, 28, 19, 20, 142, 143, 138, 139, 162, 163, 107, 108, 499, 500, 491, 492, 27, 28, 19, 110, 219, 28, 460, 461, 471, 472, 475, 476, 456, 457, 448, 449, 219, 28, 7, 8, 27, 28, 268, 269, 31, 32, 23, 24, 19, 20, 39, 40, 1130, 1131, 1126, 1127, 218, 26, 231, 232, 218, 26, 231, 232, 220, 221, 231, 232, 218, 26, 224, 26, 227, 228, 231, 232, 224, 26, 227, 228, 231, 232, 231, 232, 227, 228, 1166, 279, 286, 287, 222, 22, 231, 232, 231, 232, 227, 228, 231, 232, 227, 228, 222, 22, 132, 133, 156, 157, 231, 232, 222, 22, 124, 125, 128, 129, 218, 26, 231, 232, 218, 26, 220, 221, 231, 232, 227, 228, 124, 125, 128, 129, 231, 232, 227, 228, 298, 299, 306, 307, 105, 106, 124, 125, 128, 129, 37, 38, 1124, 1125, 1128, 1129, 219, 28, 233, 234, 219, 28, 233, 234, 19, 20, 233, 234, 219, 28, 225, 226, 229, 230, 233, 234, 225, 226, 229, 230, 233, 234, 233, 234, 229, 230, 1167, 1168, 288, 289, 23, 24, 233, 234, 233, 234, 229, 230, 233, 234, 229, 230, 23, 24, 134, 135, 158, 159, 233, 234, 23, 24, 126, 127, 130, 131, 219, 28, 233, 234, 219, 28, 19, 20, 233, 234, 229, 230, 126, 127, 130, 131, 233, 234, 229, 230, 300, 301, 308, 309, 107, 108, 126, 127, 130, 131, 39, 40, 1126, 1127, 1130, 1131, 223, 26, 231, 232, 227, 228, 218, 26, 224, 26, 227, 228, 231, 232, 231, 232, 224, 26, 227, 228, 220, 221, 231, 232, 223, 26, 224, 26, 227, 228, 231, 232, 274, 275, 224, 26, 227, 228, 220, 221, 231, 232, 231, 232, 231, 232, 231, 232, 231, 232, 231, 232, 227, 228, 231, 232, 231, 232, 227, 228, 231, 232, 227, 228, 231, 232, 231, 232, 227, 228, 231, 232, 231, 232, 231, 232, 227, 228, 231, 232, 294, 295, 302, 303, 109, 18, 116, 117, 120, 121, 37, 38, 1128, 1129, 1124, 1125, 27, 28, 233, 234, 229, 230, 219, 28, 225, 226, 229, 230, 233, 234, 233, 234, 225, 226, 229, 230, 19, 20, 233, 234, 27, 28, 225, 226, 229, 230, 233, 234, 276, 277, 225, 226, 229, 230, 19, 20, 233, 234, 233, 234, 233, 234, 233, 234, 233, 234, 233, 234, 229, 230, 233, 234, 233, 234, 229, 230, 233, 234, 229, 230, 233, 234, 233, 234, 229, 230, 233, 234, 233, 234, 233, 234, 229, 230, 233, 234, 296, 297, 304, 305, 19, 110, 118, 119, 122, 123, 39, 40, 1130, 1131, 1126, 1127, 231, 232, 222, 22, 231, 232, 227, 228, 231, 232, 222, 22, 220, 221, 231, 232, 227, 228, 222, 22, 231, 232, 223, 26, 224, 26, 227, 228, 222, 22, 298, 299, 306, 307, 231, 232, 220, 221, 231, 232, 231, 232, 227, 228, 231, 232, 224, 26, 227, 228, 231, 232, 231, 232, 224, 26, 227, 228, 231, 232, 231, 232, 218, 26, 231, 232, 227, 228, 231, 232, 220, 221, 231, 232, 222, 22, 231, 232, 227, 228, 282, 283, 290, 291, 224, 26, 227, 228, 5, 6, 33, 34, 45, 46, 45, 46, 233, 234, 23, 24, 233, 234, 229, 230, 233, 234, 23, 24, 19, 20, 233, 234, 229, 230, 23, 24, 233, 234, 27, 28, 225, 226, 229, 230, 23, 24, 300, 301, 308, 309, 233, 234, 19, 20, 233, 234, 233, 234, 229, 230, 233, 234, 225, 226, 229, 230, 233, 234, 233, 234, 225, 226, 229, 230, 233, 234, 233, 234, 219, 28, 233, 234, 229, 230, 233, 234, 19, 20, 233, 234, 23, 24, 233, 234, 229, 230, 284, 285, 292, 293, 225, 226, 229, 230, 7, 8, 35, 36, 47, 48, 47, 48, 224, 26, 227, 228, 220, 221, 218, 26, 224, 26, 227, 228, 218, 26, 231, 232, 222, 22, 231, 232, 224, 26, 227, 228, 218, 26, 231, 232, 227, 228, 294, 295, 302, 303, 218, 26, 224, 26, 227, 228, 223, 26, 224, 26, 227, 228, 231, 232, 231, 232, 220, 221, 231, 232, 227, 228, 231, 232, 218, 26, 220, 221, 224, 26, 227, 228, 223, 26, 231, 232, 224, 26, 227, 228, 231, 232, 220, 221, 231, 232, 1166, 279, 286, 287, 231, 232, 223, 26, 218, 26, 172, 173, 180, 181, 105, 106, 225, 226, 229, 230, 19, 20, 219, 28, 225, 226, 229, 230, 219, 28, 233, 234, 23, 24, 233, 234, 225, 226, 229, 230, 219, 28, 233, 234, 229, 230, 296, 297, 304, 305, 219, 28, 225, 226, 229, 230, 27, 28, 225, 226, 229, 230, 233, 234, 233, 234, 19, 20, 233, 234, 229, 230, 233, 234, 219, 28, 19, 20, 225, 226, 229, 230, 27, 28, 233, 234, 225, 226, 229, 230, 233, 234, 19, 20, 233, 234, 1167, 1168, 288, 289, 233, 234, 27, 28, 219, 28, 174, 175, 182, 183, 107, 108, 231, 232, 224, 26, 227, 228, 231, 232, 218, 26, 231, 232, 231, 232, 218, 26, 224, 26, 227, 228, 218, 26, 231, 232, 220, 221, 231, 232, 231, 232, 282, 283, 290, 291, 224, 26, 227, 228, 222, 22, 218, 26, 220, 221, 224, 26, 227, 228, 231, 232, 227, 228, 223, 26, 231, 232, 224, 26, 227, 228, 231, 232, 222, 22, 231, 232, 224, 26, 227, 228, 231, 232, 222, 22, 224, 26, 227, 228, 220, 221, 222, 22, 282, 283, 290, 291, 224, 26, 227, 228, 231, 232, 5, 6, 111, 112, 233, 234, 225, 226, 229, 230, 233, 234, 219, 28, 233, 234, 233, 234, 219, 28, 225, 226, 229, 230, 219, 28, 233, 234, 19, 20, 233, 234, 233, 234, 284, 285, 292, 293, 225, 226, 229, 230, 23, 24, 219, 28, 19, 20, 225, 226, 229, 230, 233, 234, 229, 230, 27, 28, 233, 234, 225, 226, 229, 230, 233, 234, 23, 24, 233, 234, 225, 226, 229, 230, 233, 234, 23, 24, 225, 226, 229, 230, 19, 20, 23, 24, 284, 285, 292, 293, 225, 226, 229, 230, 233, 234, 7, 8, 23, 113, 224, 26, 227, 228, 231, 232, 220, 221, 222, 22, 224, 26, 227, 228, 231, 232, 231, 232, 224, 26, 227, 228, 223, 26, 218, 26, 224, 26, 227, 228, 1166, 279, 286, 287, 220, 221, 231, 232, 224, 26, 227, 228, 231, 232, 224, 26, 227, 228, 227, 228, 231, 232, 224, 26, 227, 228, 231, 232, 222, 22, 224, 26, 227, 228, 218, 26, 220, 221, 231, 232, 224, 26, 227, 228, 223, 26, 220, 221, 224, 26, 227, 228, 1166, 279, 286, 287, 223, 26, 218, 26, 220, 221, 109, 18, 222, 22, 225, 226, 229, 230, 233, 234, 19, 20, 23, 24, 225, 226, 229, 230, 233, 234, 233, 234, 225, 226, 229, 230, 27, 28, 219, 28, 225, 226, 229, 230, 1167, 1168, 288, 289, 19, 20, 233, 234, 225, 226, 229, 230, 233, 234, 225, 226, 229, 230, 229, 230, 233, 234, 225, 226, 229, 230, 233, 234, 23, 24, 225, 226, 229, 230, 219, 28, 19, 20, 233, 234, 225, 226, 229, 230, 27, 28, 19, 20, 225, 226, 229, 230, 1167, 1168, 288, 289, 27, 28, 219, 28, 19, 20, 19, 110, 23, 24], + "height":96, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":96, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":71, + "firstgid":1, + "image":"town.png", + "imageheight":4608, + "imagewidth":4544, + "margin":0, + "name":"town", + "spacing":0, + "tilecount":1278, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":96 +} \ No newline at end of file diff --git a/gamefilesd/level/town/town_catacombs.json b/gamefilesd/level/town/town_catacombs.json new file mode 100755 index 00000000..72cbe87d --- /dev/null +++ b/gamefilesd/level/town/town_catacombs.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":2, + "infinite":false, + "layers":[ + { + "data":[1175, 1176, 1177, 1178], + "height":2, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":2, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":71, + "firstgid":1, + "image":"town.png", + "imageheight":4608, + "imagewidth":4544, + "margin":0, + "name":"town", + "spacing":0, + "tilecount":1278, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":2 +} \ No newline at end of file diff --git a/gamefilesd/level/town/town_caves.json b/gamefilesd/level/town/town_caves.json new file mode 100755 index 00000000..c6ff4c48 --- /dev/null +++ b/gamefilesd/level/town/town_caves.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":4, + "infinite":false, + "layers":[ + { + "data":[1210, 1211, 1212, 1213, 1206, 1207, 1208, 1209], + "height":4, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":2, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":71, + "firstgid":1, + "image":"town.png", + "imageheight":4608, + "imagewidth":4544, + "margin":0, + "name":"town", + "spacing":0, + "tilecount":1278, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":2 +} \ No newline at end of file diff --git a/gamefilesd/level/town/town_hell.json b/gamefilesd/level/town/town_hell.json new file mode 100755 index 00000000..cf6a4852 --- /dev/null +++ b/gamefilesd/level/town/town_hell.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":2, + "infinite":false, + "layers":[ + { + "data":[1237, 1238, 1241, 1242, 1245, 1246, 1249, 1250, 1253, 1254, 548, 1239, 1240, 1243, 1244, 1247, 1248, 1251, 1252, 1255, 1256, 549], + "height":2, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":11, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":71, + "firstgid":1, + "image":"town.png", + "imageheight":4608, + "imagewidth":4544, + "margin":0, + "name":"town", + "spacing":0, + "tilecount":1278, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":11 +} \ No newline at end of file diff --git a/gamefilesd/level/variables.json b/gamefilesd/level/variables.json index 6ce545aa..80e0f5e7 100755 --- a/gamefilesd/level/variables.json +++ b/gamefilesd/level/variables.json @@ -1,7 +1,9 @@ { "variable": [ + { "colorCycleSpeed": 60 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 1 }, { "identifyPrice": 100 }, - { "showMap": false }, { "outlineCantUse": "0xCF4949" }, { "outlineEnemy": "0x931E1E" }, { "outlineFriend": "0xA55A5A" }, diff --git a/gamefilesd/loadingScreens/cut2.json b/gamefilesd/loadingScreens/cut2.json index b50955cd..83b4b871 100755 --- a/gamefilesd/loadingScreens/cut2.json +++ b/gamefilesd/loadingScreens/cut2.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cut2", - "file":"gendata/cut2.pal" + "file": "gendata/cut2.pal" }, "texture": { "id": "cut2", - "file":"gendata/cut2.cel", + "file": "gendata/cut2.cel", "palette": "cut2" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cut3.json b/gamefilesd/loadingScreens/cut3.json index 36fbed9f..5463dcb3 100755 --- a/gamefilesd/loadingScreens/cut3.json +++ b/gamefilesd/loadingScreens/cut3.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cut3", - "file":"gendata/cut3.pal" + "file": "gendata/cut3.pal" }, "texture": { "id": "cut3", - "file":"gendata/cut3.cel", + "file": "gendata/cut3.cel", "palette": "cut3" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cut4.json b/gamefilesd/loadingScreens/cut4.json index 4c70a7c0..4df1675d 100755 --- a/gamefilesd/loadingScreens/cut4.json +++ b/gamefilesd/loadingScreens/cut4.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cut4", - "file":"gendata/cut4.pal" + "file": "gendata/cut4.pal" }, "texture": { "id": "cut4", - "file":"gendata/cut4.cel", + "file": "gendata/cut4.cel", "palette": "cut4" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cutgate.json b/gamefilesd/loadingScreens/cutgate.json index e6701566..526c07f5 100755 --- a/gamefilesd/loadingScreens/cutgate.json +++ b/gamefilesd/loadingScreens/cutgate.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cutgate", - "file":"gendata/cutgate.pal" + "file": "gendata/cutgate.pal" }, "texture": { "id": "cutgate", - "file":"gendata/cutgate.cel", + "file": "gendata/cutgate.cel", "palette": "cutgate" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cutl1d.json b/gamefilesd/loadingScreens/cutl1d.json index fc4cdbd2..4ee02f00 100755 --- a/gamefilesd/loadingScreens/cutl1d.json +++ b/gamefilesd/loadingScreens/cutl1d.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cutl1d", - "file":"gendata/cutl1d.pal" + "file": "gendata/cutl1d.pal" }, "texture": { "id": "cutl1d", - "file":"gendata/cutl1d.cel", + "file": "gendata/cutl1d.cel", "palette": "cutl1d" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cutportl.json b/gamefilesd/loadingScreens/cutportl.json index b73e7da9..de2ce49f 100755 --- a/gamefilesd/loadingScreens/cutportl.json +++ b/gamefilesd/loadingScreens/cutportl.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cutportl", - "file":"gendata/cutportl.pal" + "file": "gendata/cutportl.pal" }, "texture": { "id": "cutportl", - "file":"gendata/Cutportl.cel", + "file": "gendata/Cutportl.cel", "palette": "cutportl" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cutportr.json b/gamefilesd/loadingScreens/cutportr.json index c1d6b46b..d23bf925 100755 --- a/gamefilesd/loadingScreens/cutportr.json +++ b/gamefilesd/loadingScreens/cutportr.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cutportr", - "file":"gendata/cutportr.pal" + "file": "gendata/cutportr.pal" }, "texture": { "id": "cutportr", - "file":"gendata/cutportr.cel", + "file": "gendata/cutportr.cel", "palette": "cutportr" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cutstart.json b/gamefilesd/loadingScreens/cutstart.json index b3a05455..f188cd38 100755 --- a/gamefilesd/loadingScreens/cutstart.json +++ b/gamefilesd/loadingScreens/cutstart.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cutstart", - "file":"gendata/cutstart.pal" + "file": "gendata/cutstart.pal" }, "texture": { "id": "cutstart", - "file":"gendata/cutstart.cel", + "file": "gendata/cutstart.cel", "palette": "cutstart" }, "loadingScreen": { diff --git a/gamefilesd/loadingScreens/cuttt.json b/gamefilesd/loadingScreens/cuttt.json index 27fe108b..5b530266 100755 --- a/gamefilesd/loadingScreens/cuttt.json +++ b/gamefilesd/loadingScreens/cuttt.json @@ -2,11 +2,11 @@ "action": { "name": "resource.add", "id": "loadingScreen" }, "palette": { "id": "cuttt", - "file":"gendata/cuttt.pal" + "file": "gendata/cuttt.pal" }, "texture": { "id": "cuttt", - "file":"gendata/cuttt.cel", + "file": "gendata/cuttt.cel", "palette": "cuttt" }, "loadingScreen": { diff --git a/gamefilesd/main.json b/gamefilesd/main.json index f0977096..a85e2e9c 100755 --- a/gamefilesd/main.json +++ b/gamefilesd/main.json @@ -5,6 +5,7 @@ "refWindowSize": [640, 480], "minWindowSize": [640, 480], "windowSize": [800, 600], + "framerate": 60, "keepAR": true, "stretchToFit": true, "smoothScreen": true, diff --git a/gamefilesd/res/fonts.json b/gamefilesd/res/fonts.json index 8d4eec13..421413b7 100755 --- a/gamefilesd/res/fonts.json +++ b/gamefilesd/res/fonts.json @@ -2,7 +2,6 @@ "font": [ { "id": "font16g", - "texture": "font16g", "file": "ui_art/font16g.pcx", "charSizeFile": "ui_art/font16.bin", "rows": 16, @@ -14,8 +13,7 @@ }, { "id": "font16s", - "texture": "font16s", - "file":"ui_art/font16s.pcx", + "file": "ui_art/font16s.pcx", "charSizeFile": "ui_art/font16.bin", "rows": 16, "cols": 16, @@ -27,7 +25,7 @@ { "id": "font24g", "texture": "font24g", - "file":"ui_art/font24g.pcx", + "file": "ui_art/font24g.pcx", "charSizeFile": "ui_art/font24.bin", "rows": 16, "cols": 16, @@ -38,8 +36,7 @@ }, { "id": "font24s", - "texture": "font24s", - "file":"ui_art/font24s.pcx", + "file": "ui_art/font24s.pcx", "charSizeFile": "ui_art/font24.bin", "rows": 16, "cols": 16, @@ -50,8 +47,7 @@ }, { "id": "font30g", - "texture": "font30g", - "file":"ui_art/font30g.pcx", + "file": "ui_art/font30g.pcx", "charSizeFile": "ui_art/font30.bin", "rows": 16, "cols": 16, @@ -62,8 +58,7 @@ }, { "id": "font30s", - "texture": "font30s", - "file":"ui_art/font30s.pcx", + "file": "ui_art/font30s.pcx", "charSizeFile": "ui_art/font30.bin", "rows": 16, "cols": 16, @@ -74,8 +69,7 @@ }, { "id": "font42g", - "texture": "font42g", - "file":"ui_art/font42g.pcx", + "file": "ui_art/font42g.pcx", "charSizeFile": "ui_art/font42.bin", "rows": 16, "cols": 16, @@ -86,8 +80,7 @@ }, { "id": "font42y", - "texture": "font42y", - "file":"ui_art/font42y.pcx", + "file": "ui_art/font42y.pcx", "charSizeFile": "ui_art/font42.bin", "rows": 16, "cols": 16, diff --git a/gamefilesd/res/level/actions.json b/gamefilesd/res/level/actions.json index cfa4ffe6..9c110f43 100755 --- a/gamefilesd/res/level/actions.json +++ b/gamefilesd/res/level/actions.json @@ -1,9 +1,10 @@ { "load": "res/level/actions/sounds.json", - "load": "res/level/actions/colorCycling.json", "load": "res/level/actions/resizeLevel.json", "load": "res/level/actions/itemPanel.json", "load": "res/level/actions/basePanel.json", + "load": "res/level/actions/automap.json", + "load": "res/level/actions/automapZoom.json", "load": "res/level/actions/charPanel.json", "load": "res/level/actions/playerTexture.json", "load": "res/level/actions/playerBelt.json", diff --git a/gamefilesd/res/level/actions/automap.json b/gamefilesd/res/level/actions/automap.json new file mode 100755 index 00000000..4fc45079 --- /dev/null +++ b/gamefilesd/res/level/actions/automap.json @@ -0,0 +1,66 @@ +{ + "action": [ + { + "name": "action.set", + "id": "showMap", + "action": { + "name": "if.equal", + "param1": "%currentLevel.hasAutomap%", + "param2": true, + "then": { + "name": "if.equal", + "param1": "%currentLevel.showAutomap%", + "param2": true, + "then": [ + { "name": "level.showAutomap", "show": false }, + { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + ], + "else": [ + { "name": "level.showAutomap", "show": true }, + { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, + { "name": "if.regex", + "param1": "\\d*", + "param2": "%currentLevel.name%", + "then": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "Level: [1]" }, + "else": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "[1]" } + } + ] + }, + "else": [ + { "name": "if.regex", + "param1": "\\d*", + "param2": "%currentLevel.name%", + "then": { "name": "load", "file": ["ui/level/noMap.json", "level ", "%currentLevel.name%"] }, + "else": { "name": "load", "file": ["ui/level/noMap.json", "", "%currentLevel.name%"] } + }, + { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + ] + } + }, + { + "name": "action.set", + "id": "updateMap", + "action": { + "name": "if.equal", + "param1": "%currentLevel.hasAutomap%", + "param2": true, + "then": { + "name": "if.equal", + "param1": "%currentLevel.showAutomap%", + "param2": true, + "then": [ + { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, + { "name": "if.regex", + "param1": "\\d*", + "param2": "%currentLevel.name%", + "then": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "Level: [1]" }, + "else": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "[1]" } + } + ], + "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + }, + "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/res/level/actions/automapZoom.json b/gamefilesd/res/level/actions/automapZoom.json new file mode 100755 index 00000000..ec9a96cd --- /dev/null +++ b/gamefilesd/res/level/actions/automapZoom.json @@ -0,0 +1,96 @@ +{ + "action": [ + { + "name": "action.set", + "id": "updateAutomapZoom", + "action": { + "name": "switch", + "param": "%automapZoom%", + "case": [ + { + "value": 0, + "action": { "name": "level.setAutomap", "automap": "automap0", "tileSize": [16, 8] } + }, + { + "value": 1, + "action": { "name": "level.setAutomap", "automap": "automap1", "tileSize": [20, 10] } + }, + { + "value": 2, + "action": { "name": "level.setAutomap", "automap": "automap2", "tileSize": [24, 12] } + }, + { + "value": 3, + "action": { "name": "level.setAutomap", "automap": "automap3", "tileSize": [28, 14] } + }, + { + "value": 4, + "action": { "name": "level.setAutomap", "automap": "automap4", "tileSize": [32, 16] } + }, + { + "value": 5, + "action": { "name": "level.setAutomap", "automap": "automap5", "tileSize": [36, 18] } + }, + { + "value": 6, + "action": { "name": "level.setAutomap", "automap": "automap6", "tileSize": [40, 20] } + }, + { + "value": 7, + "action": { "name": "level.setAutomap", "automap": "automap7", "tileSize": [44, 22] } + }, + { + "value": 8, + "action": { "name": "level.setAutomap", "automap": "automap8", "tileSize": [48, 24] } + }, + { + "value": 9, + "action": { "name": "level.setAutomap", "automap": "automap9", "tileSize": [52, 26] } + }, + { + "value": 10, + "action": { "name": "level.setAutomap", "automap": "automap10", "tileSize": [56, 28] } + }, + { + "value": 11, + "action": { "name": "level.setAutomap", "automap": "automap11", "tileSize": [60, 30] } + }, + { + "value": 12, + "action": { "name": "level.setAutomap", "automap": "automap12", "tileSize": [64, 32] } + } + ], + "default": [ + { "name": "level.setAutomap", "automap": "automap0", "tileSize": [16, 8] }, + { "name": "variable.set", "key": "automapZoom", "value": 0 } + ] + } + }, + { + "name": "action.set", + "id": "automapZoomIn", + "action": { + "name": "if", + "params": ["%automapZoom%", ">=", 0, "and", "%automapZoom%", "<", 2], + "then": [ + { "name": "variable.add", "key": "automapZoom", "value": 2 }, + "updateAutomapZoom" + ], + "else": "updateAutomapZoom" + } + }, + { + "name": "action.set", + "id": "automapZoomOut", + "action": { + "name": "if", + "params": ["%automapZoom%", ">", 0, "and", "%automapZoom%", "<=", 2], + "then": [ + { "name": "variable.add", "key": "automapZoom", "value": -2 }, + "updateAutomapZoom" + ], + "else": "updateAutomapZoom" + } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/res/level/actions/basePanel.json b/gamefilesd/res/level/actions/basePanel.json index ab5dc9dd..0086a4dc 100755 --- a/gamefilesd/res/level/actions/basePanel.json +++ b/gamefilesd/res/level/actions/basePanel.json @@ -2,38 +2,45 @@ "action": [ { "name": "action.set", - "replaceVars": true, + "id": "saveSettings", + "action": { "name": "load", "file": "ui/level/saveSettings.json" } + }, + { + "name": "action.set", "id": "setPanelTextColorBlue", - "action": { "name": "text.setColor", "id": "txtPanel", "color": "%textBlue%" } + "action": { "name": "text.setFont", "id": "txtPanel", "font": "smaltextBlue" } }, { "name": "action.set", - "replaceVars": true, "id": "setPanelTextColorGold", - "action": { "name": "text.setColor", "id": "txtPanel", "color": "%textGold%" } + "action": { "name": "text.setFont", "id": "txtPanel", "font": "smaltextGold" } }, { "name": "action.set", - "replaceVars": true, "id": "setPanelTextColorRed", - "action": { "name": "text.setColor", "id": "txtPanel", "color": "%textRed%" } + "action": { "name": "text.setFont", "id": "txtPanel", "font": "smaltextRed" } }, { "name": "action.set", "id": "setPanelTextColorWhite", - "action": { "name": "text.setColor", "id": "txtPanel" } + "action": { "name": "text.setFont", "id": "txtPanel", "font": "smaltext" } }, { "name": "action.set", "id": "rightClickLevel", "action": { "name": "drawable.executeAction", "id": "level", "action": "rightClick" } }, + { + "name": "action.set", + "id": "closeRemoveGold", + "action": { "name": "resource.pop", "id": "removeGold" } + }, { "name": "action.set", "id": "clearPanelText", "action": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "" }, @@ -46,7 +53,7 @@ "id": "updatePanelTextSpacing", "action": { "name": "switch", - "param": "|txtPanel|lineCount|", + "param": "%txtPanel.lineCount%", "case": [ { "value": 2, @@ -74,7 +81,7 @@ "action": [ { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseSelectedItem|", + "param1": "%currentLevel.currentPlayer.canUseSelectedItem%", "param2": false, "then": { "name": "cursor.setPalette", "palette": "infra", "color": "0xFF0000" }, "else": { "name": "cursor.setPalette", "palette": "town" } @@ -82,17 +89,17 @@ { "name": "text.setText", "id": "txtPanel", - "text": "|currentLevel|currentPlayer.selectedItem.name|" + "text": "%currentLevel.currentPlayer.selectedItem.name%" }, "updatePanelTextSpacing", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.selectedItem.magical|", + "param1": "%currentLevel.currentPlayer.selectedItem.magical%", "param2": 1, "then": "setPanelTextColorBlue", "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.selectedItem.unique|", + "param1": "%currentLevel.currentPlayer.selectedItem.unique%", "param2": 1, "then": [ "setPanelTextColorGold", diff --git a/gamefilesd/res/level/actions/beltClick.json b/gamefilesd/res/level/actions/beltClick.json index cde17ee6..a7f710a1 100755 --- a/gamefilesd/res/level/actions/beltClick.json +++ b/gamefilesd/res/level/actions/beltClick.json @@ -7,7 +7,7 @@ "update{1}Item", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": "updateSelectedItem", "else": "update{1}Text" diff --git a/gamefilesd/res/level/actions/beltItem.json b/gamefilesd/res/level/actions/beltItem.json index 042d9846..e05acfe3 100755 --- a/gamefilesd/res/level/actions/beltItem.json +++ b/gamefilesd/res/level/actions/beltItem.json @@ -5,42 +5,54 @@ "replaceVars": true, "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.{2}.{3}|", + "param1": "%currentLevel.currentPlayer.hasItem.{2}.{3}%", "param2": true, "then": [ - { "name": "image.setTexture", "id": "img{1}", "inventory": "{2}", "item": {3}, "resetRect": false }, + { "name": "image.setTexture", "id": "img{1}", "query": "currentLevel.currentPlayer.item.{2}.{3}", "resetRect": false }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.{2}.{3}|", + "param1": "%currentLevel.currentPlayer.canUseItem.{2}.{3}%", "param2": false, "then": [ { "name": "image.setPalette", "id": "img{1}", "palette": "infra", "color": "0xFF0000" }, - { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineCantUse%", "ignore": "0x000000" } + { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineCantUse|", "ignore": "0x000000" } ], "else": [ { "name": "image.setPalette", "id": "img{1}", "palette": "town" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.magical|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.magical%", "param2": 1, - "then": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItem%", "ignore": "0x000000" }, + "then": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItem|", "ignore": "0x000000" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.unique|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.unique%", "param2": 1, - "then": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItem%", "ignore": "0x000000" }, - "else": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItemInv%", "ignore": "0x000000" } + "then": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItem|", "ignore": "0x000000" }, + "else": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItemInv|", "ignore": "0x000000" } } } ] }, { "name": "drawable.center", "id": "img{1}", "idCenterOn": "player{1}" }, { "name": "image.setTexture", "id": "player{1}", "texture": "red" }, + { + "name": "if.greater", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.quantity%", + "param2": 1, + "then": { + "name": "text.setText", + "id": "txtQuant{1}", + "text": "%currentLevel.currentPlayer.item.{2}.{3}.quantity%" + }, + "else": { "name": "text.setText", "id": "txtQuant{1}", "text": "" } + }, { "name": "drawable.visible", "id": "txt{1}", "visible": true } ], "else": [ { "name": "image.setTexture", "id": "img{1}", "texture": "empty" }, { "name": "image.setTexture", "id": "player{1}", "texture": "empty" }, + { "name": "text.setText", "id": "txtQuant{1}", "text": "" }, { "name": "drawable.visible", "id": "txt{1}", "visible": false } ] } diff --git a/gamefilesd/res/level/actions/beltUse.json b/gamefilesd/res/level/actions/beltUse.json index 4c5e66ed..75514b1b 100755 --- a/gamefilesd/res/level/actions/beltUse.json +++ b/gamefilesd/res/level/actions/beltUse.json @@ -4,19 +4,32 @@ "id": "use{1}Item", "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.{2}.isUsable|", + "param1": "%currentLevel.currentPlayer.item.belt.{2}.isUsable%", "param2": true, "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.belt.{2}|", + "param1": "%currentLevel.currentPlayer.canUseItem.belt.{2}%", "param2": true, "then": [ + "closeRemoveGold", { "name": "item.use", "inventory": "belt", "item": {2} }, - "updateAllPlayerStats" + "updateAllPlayerStats", + "clearPanelText" ], "else": "sCantUseThisYet" }, - "else": "rightClickLevel" + "else": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.item.belt.{2}.rightClick%", + "param2": 1, + "then": { + "name": "item.executeAction", + "inventory": "belt", + "item": {2}, + "action": "rightClick" + }, + "else": "sCantUseThisYet" + } } } } \ No newline at end of file diff --git a/gamefilesd/res/level/actions/bodyClick.json b/gamefilesd/res/level/actions/bodyClick.json index 2c487f42..280dad1c 100755 --- a/gamefilesd/res/level/actions/bodyClick.json +++ b/gamefilesd/res/level/actions/bodyClick.json @@ -5,15 +5,15 @@ "action": [ { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.selectedItem.itemType|", + "param1": "%currentLevel.currentPlayer.selectedItem.itemType%", "param2": "{2}", "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseSelectedItem|", + "param1": "%currentLevel.currentPlayer.canUseSelectedItem%", "param2": true, "then": [ { "name": "image.setTexture", "id": "img{1}", "texture": "empty" }, @@ -34,7 +34,7 @@ "updateAllPlayerStats", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": "updateSelectedItem", "else": "update{1}Text" diff --git a/gamefilesd/res/level/actions/bodyItem.json b/gamefilesd/res/level/actions/bodyItem.json index fdd8c038..8aa2ee1d 100755 --- a/gamefilesd/res/level/actions/bodyItem.json +++ b/gamefilesd/res/level/actions/bodyItem.json @@ -4,25 +4,25 @@ "id": "update{1}Item", "replaceVars": true, "action": [ - { "name": "image.setTexture", "id": "img{1}", "inventory": "body", "item": "{1}" }, + { "name": "image.setTexture", "id": "img{1}", "query": "currentLevel.currentPlayer.item.body.{1}" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.{1}|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.{1}%", "param2": false, "then": { "name": "image.setPalette", "id": "img{1}", "palette": "infra", "color": "0xFF0000" }, "else": [ { "name": "image.setPalette", "id": "img{1}", "palette": "town" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.{1}.magical|", + "param1": "%currentLevel.currentPlayer.item.body.{1}.magical%", "param2": 1, - "then": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItem%", "ignore": "0x000000" }, + "then": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItem|", "ignore": "0x000000" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.{1}.unique|", + "param1": "%currentLevel.currentPlayer.item.body.{1}.unique%", "param2": 1, - "then": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItem%", "ignore": "0x000000" }, - "else": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItemInv%", "ignore": "0x000000" } + "then": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItem|", "ignore": "0x000000" }, + "else": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItemInv|", "ignore": "0x000000" } } } ] @@ -30,7 +30,7 @@ { "name": "drawable.center", "id": "img{1}", "idCenterOn": "player{1}" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.body.{1}|", + "param1": "%currentLevel.currentPlayer.hasItem.body.{1}%", "param2": true, "then": { "name": "image.setTexture", "id": "player{1}", "texture": "red" }, "else": { "name": "image.setTexture", "id": "player{1}", "texture": "empty" } diff --git a/gamefilesd/res/level/actions/charPanel.json b/gamefilesd/res/level/actions/charPanel.json index 5f5d84ad..ef1f115b 100755 --- a/gamefilesd/res/level/actions/charPanel.json +++ b/gamefilesd/res/level/actions/charPanel.json @@ -4,34 +4,34 @@ "name": "action.set", "id": "showCharPoints", "action": [ - { "name": "text.setText", "id": "charPoints", "text": "|currentLevel|currentPlayer.points|" }, + { "name": "text.setText", "id": "charPoints", "text": "%currentLevel.currentPlayer.points%" }, { "name": "drawable.visible", "id": "txtLevelUp", "visible": true }, { "name": "drawable.visible", "id": "btnLevelUp", "visible": true }, { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.strength|", - "param2": "|currentLevel|currentPlayer.maxStrength|", + "param1": "%currentLevel.currentPlayer.strength%", + "param2": "%currentLevel.currentPlayer.maxStrength%", "then": { "name": "drawable.visible", "id": "charStrAddPoint", "visible": true }, "else": { "name": "drawable.visible", "id": "charStrAddPoint", "visible": false } }, { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.magic|", - "param2": "|currentLevel|currentPlayer.maxMagic|", + "param1": "%currentLevel.currentPlayer.magic%", + "param2": "%currentLevel.currentPlayer.maxMagic%", "then": { "name": "drawable.visible", "id": "charMagAddPoint", "visible": true }, "else": { "name": "drawable.visible", "id": "charMagAddPoint", "visible": false } }, { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.dexterity|", - "param2": "|currentLevel|currentPlayer.maxDexterity|", + "param1": "%currentLevel.currentPlayer.dexterity%", + "param2": "%currentLevel.currentPlayer.maxDexterity%", "then": { "name": "drawable.visible", "id": "charDexAddPoint", "visible": true }, "else": { "name": "drawable.visible", "id": "charDexAddPoint", "visible": false } }, { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.vitality|", - "param2": "|currentLevel|currentPlayer.maxVitality|", + "param1": "%currentLevel.currentPlayer.vitality%", + "param2": "%currentLevel.currentPlayer.maxVitality%", "then": { "name": "drawable.visible", "id": "charVitAddPoint", "visible": true }, "else": { "name": "drawable.visible", "id": "charVitAddPoint", "visible": false } } @@ -55,11 +55,11 @@ "id": "updateCharPoints", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.points|", + "param1": "%currentLevel.currentPlayer.points%", "param2": 0, "then": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasMaxStats|", + "param1": "%currentLevel.currentPlayer.hasMaxStats%", "param2": true, "then": "showCharPoints", "else": [ @@ -75,73 +75,73 @@ "id": "updateCharLabels", "action": { "name": "if.equal", - "param1": "|game|hasResource.charPanelLabels|", + "param1": "%game.hasResource.charPanelLabels%", "param2": true, "then": [ - { "name": "text.setText", "id": "charName", "text": "|currentLevel|currentPlayer.name|" }, - { "name": "text.setText", "id": "charClass", "text": "|currentLevel|currentPlayer.class|" }, - { "name": "text.setText", "id": "charLevel", "text": "|currentLevel|currentPlayer.level|" }, - { "name": "text.setText", "id": "charExp", "text": "|currentLevel|currentPlayer.experience|" }, - { "name": "text.setText", "id": "charExpNext", "text": "|currentLevel|currentPlayer.expNextLevel|" }, - { "name": "text.setText", "id": "charStr", "text": "|currentLevel|currentPlayer.strength|" }, - { "name": "text.setText", "id": "charStrNow", "text": "|currentLevel|currentPlayer.strengthNow|" }, - { "name": "text.setText", "id": "charMag", "text": "|currentLevel|currentPlayer.magic|" }, - { "name": "text.setText", "id": "charMagNow", "text": "|currentLevel|currentPlayer.magicNow|" }, - { "name": "text.setText", "id": "charDex", "text": "|currentLevel|currentPlayer.dexterity|" }, - { "name": "text.setText", "id": "charDexNow", "text": "|currentLevel|currentPlayer.dexterityNow|" }, - { "name": "text.setText", "id": "charVit", "text": "|currentLevel|currentPlayer.vitality|" }, - { "name": "text.setText", "id": "charVitNow", "text": "|currentLevel|currentPlayer.vitalityNow|" }, - { "name": "text.setText", "id": "charLife", "text": "|currentLevel|currentPlayer.life|" }, - { "name": "text.setText", "id": "charLifeNow", "text": "|currentLevel|currentPlayer.lifeNow|" }, - { "name": "text.setText", "id": "charMana", "text": "|currentLevel|currentPlayer.mana|" }, - { "name": "text.setText", "id": "charManaNow", "text": "|currentLevel|currentPlayer.manaNow|" }, - { "name": "text.setText", "id": "charArmor", "text": "|currentLevel|currentPlayer.armor|" }, + { "name": "text.setText", "id": "charName", "text": "%currentLevel.currentPlayer.name%" }, + { "name": "text.setText", "id": "charClass", "text": "%currentLevel.currentPlayer.class%" }, + { "name": "text.setText", "id": "charLevel", "text": "%currentLevel.currentPlayer.level%" }, + { "name": "text.setText", "id": "charExp", "text": "%currentLevel.currentPlayer.experience%" }, + { "name": "text.setText", "id": "charExpNext", "text": "%currentLevel.currentPlayer.expNextLevel%" }, + { "name": "text.setText", "id": "charStr", "text": "%currentLevel.currentPlayer.strength%" }, + { "name": "text.setText", "id": "charStrNow", "text": "%currentLevel.currentPlayer.strengthNow%" }, + { "name": "text.setText", "id": "charMag", "text": "%currentLevel.currentPlayer.magic%" }, + { "name": "text.setText", "id": "charMagNow", "text": "%currentLevel.currentPlayer.magicNow%" }, + { "name": "text.setText", "id": "charDex", "text": "%currentLevel.currentPlayer.dexterity%" }, + { "name": "text.setText", "id": "charDexNow", "text": "%currentLevel.currentPlayer.dexterityNow%" }, + { "name": "text.setText", "id": "charVit", "text": "%currentLevel.currentPlayer.vitality%" }, + { "name": "text.setText", "id": "charVitNow", "text": "%currentLevel.currentPlayer.vitalityNow%" }, + { "name": "text.setText", "id": "charLife", "text": "%currentLevel.currentPlayer.life%" }, + { "name": "text.setText", "id": "charLifeNow", "text": "%currentLevel.currentPlayer.lifeNow%" }, + { "name": "text.setText", "id": "charMana", "text": "%currentLevel.currentPlayer.mana%" }, + { "name": "text.setText", "id": "charManaNow", "text": "%currentLevel.currentPlayer.manaNow%" }, + { "name": "text.setText", "id": "charArmor", "text": "%currentLevel.currentPlayer.armor%" }, { "name": "text.setText", "id": "charToHit", - "binding": "|currentLevel|currentPlayer.toHit|", + "binding": "%currentLevel.currentPlayer.toHit%", "format": "[1]%" }, { "name": "text.setText", "id": "charDamage", - "binding": ["|currentLevel|currentPlayer.damageMin|", "|currentLevel|currentPlayer.damageMax|"], + "binding": ["%currentLevel.currentPlayer.damageMin%", "%currentLevel.currentPlayer.damageMax%"], "format": "[1]-[2]" }, "updateCharPoints", { "name": ">=", - "param1": "|currentLevel|currentPlayer.resistMagic|", - "param2": "|currentLevel|currentPlayer.maxResistMagic|", + "param1": "%currentLevel.currentPlayer.resistMagic%", + "param2": "%currentLevel.currentPlayer.maxResistMagic%", "then": { "name": "text.setText", "id": "charResMagic", "text": "Max" }, "else": { "name": "text.setText", "id": "charResMagic", - "binding": "|currentLevel|currentPlayer.resistMagic|", + "binding": "%currentLevel.currentPlayer.resistMagic%", "format": "[1]%" } }, { "name": ">=", - "param1": "|currentLevel|currentPlayer.resistFire|", - "param2": "|currentLevel|currentPlayer.maxResistFire|", + "param1": "%currentLevel.currentPlayer.resistFire%", + "param2": "%currentLevel.currentPlayer.maxResistFire%", "then": { "name": "text.setText", "id": "charResFire", "text": "Max" }, "else": { "name": "text.setText", "id": "charResFire", - "binding": "|currentLevel|currentPlayer.resistFire|", + "binding": "%currentLevel.currentPlayer.resistFire%", "format": "[1]%" } }, { "name": ">=", - "param1": "|currentLevel|currentPlayer.resistLightning|", - "param2": "|currentLevel|currentPlayer.maxResistLightning|", + "param1": "%currentLevel.currentPlayer.resistLightning%", + "param2": "%currentLevel.currentPlayer.maxResistLightning%", "then": { "name": "text.setText", "id": "charResLight", "text": "Max" }, "else": { "name": "text.setText", "id": "charResLight", - "binding": "|currentLevel|currentPlayer.resistLightning|", + "binding": "%currentLevel.currentPlayer.resistLightning%", "format": "[1]%" } } @@ -150,331 +150,313 @@ }, { "name": "action.set", - "replaceVars": true, "id": "updateCharStrengthColor", "action": { "name": ">=", - "param1": "|currentLevel|currentPlayer.strength|", - "param2": "|currentLevel|currentPlayer.maxStrength|", - "then": { "name": "text.setColor", "id": "charStr", "color": "%textGold%" }, - "else": { "name": "text.setColor", "id": "charStr" } + "param1": "%currentLevel.currentPlayer.strength%", + "param2": "%currentLevel.currentPlayer.maxStrength%", + "then": { "name": "text.setFont", "id": "charStr", "font": "smaltextGold" }, + "else": { "name": "text.setFont", "id": "charStr", "font": "smaltext" } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharStrengthNowColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.strengthItems|", + "param1": "%currentLevel.currentPlayer.strengthItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charStrNow", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charStrNow", "font": "smaltextBlue" }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.strengthItems|", + "param1": "%currentLevel.currentPlayer.strengthItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charStrNow", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charStrNow" } + "then": { "name": "text.setFont", "id": "charStrNow", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charStrNow", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharMagicColor", "action": { "name": ">=", - "param1": "|currentLevel|currentPlayer.magic|", - "param2": "|currentLevel|currentPlayer.maxMagic|", - "then": { "name": "text.setColor", "id": "charMag", "color": "%textGold%" }, - "else": { "name": "text.setColor", "id": "charMag" } + "param1": "%currentLevel.currentPlayer.magic%", + "param2": "%currentLevel.currentPlayer.maxMagic%", + "then": { "name": "text.setFont", "id": "charMag", "font": "smaltextGold" }, + "else": { "name": "text.setFont", "id": "charMag", "font": "smaltext" } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharMagicNowColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.magicItems|", + "param1": "%currentLevel.currentPlayer.magicItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charMagNow", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charMagNow", "font": "smaltextBlue" }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.magicItems|", + "param1": "%currentLevel.currentPlayer.magicItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charMagNow", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charMagNow" } + "then": { "name": "text.setFont", "id": "charMagNow", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charMagNow", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharDexterityColor", "action": { "name": ">=", - "param1": "|currentLevel|currentPlayer.dexterity|", - "param2": "|currentLevel|currentPlayer.maxDexterity|", - "then": { "name": "text.setColor", "id": "charDex", "color": "%textGold%" }, - "else": { "name": "text.setColor", "id": "charDex" } + "param1": "%currentLevel.currentPlayer.dexterity%", + "param2": "%currentLevel.currentPlayer.maxDexterity%", + "then": { "name": "text.setFont", "id": "charDex", "font": "smaltextGold" }, + "else": { "name": "text.setFont", "id": "charDex", "font": "smaltext" } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharDexterityNowColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.dexterityItems|", + "param1": "%currentLevel.currentPlayer.dexterityItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charDexNow", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charDexNow", "font": "smaltextBlue" }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.dexterityItems|", + "param1": "%currentLevel.currentPlayer.dexterityItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charDexNow", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charDexNow" } + "then": { "name": "text.setFont", "id": "charDexNow", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charDexNow", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharVitalityColor", "action": { "name": ">=", - "param1": "|currentLevel|currentPlayer.vitality|", - "param2": "|currentLevel|currentPlayer.maxVitality|", - "then": { "name": "text.setColor", "id": "charVit", "color": "%textGold%" }, - "else": { "name": "text.setColor", "id": "charVit" } + "param1": "%currentLevel.currentPlayer.vitality%", + "param2": "%currentLevel.currentPlayer.maxVitality%", + "then": { "name": "text.setFont", "id": "charVit", "font": "smaltextGold" }, + "else": { "name": "text.setFont", "id": "charVit", "font": "smaltext" } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharVitalityNowColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.vitalityItems|", + "param1": "%currentLevel.currentPlayer.vitalityItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charVitNow", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charVitNow", "font": "smaltextBlue" }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.vitalityItems|", + "param1": "%currentLevel.currentPlayer.vitalityItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charVitNow", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charVitNow" } + "then": { "name": "text.setFont", "id": "charVitNow", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charVitNow", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharLifeColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.vitalityItems|", + "param1": "%currentLevel.currentPlayer.vitalityItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charLife", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charLife", "font": "smaltextBlue" }, "else": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.lifeItems|", + "param1": "%currentLevel.currentPlayer.lifeItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charLife", "color": "%textBlue%" }, - "else": { "name": "text.setColor", "id": "charLife" } + "then": { "name": "text.setFont", "id": "charLife", "font": "smaltextBlue" }, + "else": { "name": "text.setFont", "id": "charLife", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharLifeNowColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.lifeDamage|", + "param1": "%currentLevel.currentPlayer.lifeDamage%", "param2": 0, - "then": { "name": "text.setColor", "id": "charLifeNow", "color": "%textRed%" }, + "then": { "name": "text.setFont", "id": "charLifeNow", "font": "smaltextRed" }, "else": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.vitalityItems|", + "param1": "%currentLevel.currentPlayer.vitalityItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charLifeNow", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charLifeNow", "font": "smaltextBlue" }, "else": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.lifeItems|", + "param1": "%currentLevel.currentPlayer.lifeItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charLifeNow", "color": "%textBlue%" }, - "else": { "name": "text.setColor", "id": "charLifeNow" } + "then": { "name": "text.setFont", "id": "charLifeNow", "font": "smaltextBlue" }, + "else": { "name": "text.setFont", "id": "charLifeNow", "font": "smaltext" } } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharManaColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.magicItems|", + "param1": "%currentLevel.currentPlayer.magicItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charMana", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charMana", "font": "smaltextBlue" }, "else": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.manaItems|", + "param1": "%currentLevel.currentPlayer.manaItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charMana", "color": "%textBlue%" }, - "else": { "name": "text.setColor", "id": "charMana" } + "then": { "name": "text.setFont", "id": "charMana", "font": "smaltextBlue" }, + "else": { "name": "text.setFont", "id": "charMana", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharManaNowColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.manaDamage|", + "param1": "%currentLevel.currentPlayer.manaDamage%", "param2": 0, - "then": { "name": "text.setColor", "id": "charManaNow", "color": "%textRed%" }, + "then": { "name": "text.setFont", "id": "charManaNow", "font": "smaltextRed" }, "else": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.magicItems|", + "param1": "%currentLevel.currentPlayer.magicItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charManaNow", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charManaNow", "font": "smaltextBlue" }, "else": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.manaItems|", + "param1": "%currentLevel.currentPlayer.manaItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charManaNow", "color": "%textBlue%" }, - "else": { "name": "text.setColor", "id": "charManaNow" } + "then": { "name": "text.setFont", "id": "charManaNow", "font": "smaltextBlue" }, + "else": { "name": "text.setFont", "id": "charManaNow", "font": "smaltext" } } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharArmorColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.toArmor|", + "param1": "%currentLevel.currentPlayer.toArmor%", "param2": 0, - "then": { "name": "text.setColor", "id": "charArmor", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charArmor", "font": "smaltextBlue" }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.toArmor|", + "param1": "%currentLevel.currentPlayer.toArmor%", "param2": 0, - "then": { "name": "text.setColor", "id": "charArmor", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charArmor" } + "then": { "name": "text.setFont", "id": "charArmor", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charArmor", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharToHitColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.toHitItems|", + "param1": "%currentLevel.currentPlayer.toHitItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charToHit", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charToHit", "font": "smaltextBlue" }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.toHitItems|", + "param1": "%currentLevel.currentPlayer.toHitItems%", "param2": 0, - "then": { "name": "text.setColor", "id": "charToHit", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charToHit" } + "then": { "name": "text.setFont", "id": "charToHit", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charToHit", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharDamageColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.toDamage|", + "param1": "%currentLevel.currentPlayer.toDamage%", "param2": 0, - "then": { "name": "text.setColor", "id": "charDamage", "color": "%textBlue%" }, + "then": { "name": "text.setFont", "id": "charDamage", "font": "smaltextBlue" }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.toDamage|", + "param1": "%currentLevel.currentPlayer.toDamage%", "param2": 0, - "then": { "name": "text.setColor", "id": "charDamage", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charDamage" } + "then": { "name": "text.setFont", "id": "charDamage", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charDamage", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharResistMagicColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.resistMagic|", + "param1": "%currentLevel.currentPlayer.resistMagic%", "param2": 0, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.resistMagic|", - "param2": "|currentLevel|currentPlayer.maxResistMagic|", - "then": { "name": "text.setColor", "id": "charResMagic", "color": "%textGold%" }, - "else": { "name": "text.setColor", "id": "charResMagic", "color": "%textBlue%" } + "param1": "%currentLevel.currentPlayer.resistMagic%", + "param2": "%currentLevel.currentPlayer.maxResistMagic%", + "then": { "name": "text.setFont", "id": "charResMagic", "font": "smaltextGold" }, + "else": { "name": "text.setFont", "id": "charResMagic", "font": "smaltextBlue" } }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.resistMagic|", + "param1": "%currentLevel.currentPlayer.resistMagic%", "param2": 0, - "then": { "name": "text.setColor", "id": "charResMagic", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charResMagic" } + "then": { "name": "text.setFont", "id": "charResMagic", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charResMagic", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharResistFireColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.resistFire|", + "param1": "%currentLevel.currentPlayer.resistFire%", "param2": 0, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.resistFire|", - "param2": "|currentLevel|currentPlayer.maxResistFire|", - "then": { "name": "text.setColor", "id": "charResFire", "color": "%textGold%" }, - "else": { "name": "text.setColor", "id": "charResFire", "color": "%textBlue%" } + "param1": "%currentLevel.currentPlayer.resistFire%", + "param2": "%currentLevel.currentPlayer.maxResistFire%", + "then": { "name": "text.setFont", "id": "charResFire", "font": "smaltextGold" }, + "else": { "name": "text.setFont", "id": "charResFire", "font": "smaltextBlue" } }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.resistFire|", + "param1": "%currentLevel.currentPlayer.resistFire%", "param2": 0, - "then": { "name": "text.setColor", "id": "charResFire", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charResFire" } + "then": { "name": "text.setFont", "id": "charResFire", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charResFire", "font": "smaltext" } } } }, { "name": "action.set", - "replaceVars": true, "id": "updateCharResistLightningColor", "action": { "name": "if.greater", - "param1": "|currentLevel|currentPlayer.resistLightning|", + "param1": "%currentLevel.currentPlayer.resistLightning%", "param2": 0, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.resistLightning|", - "param2": "|currentLevel|currentPlayer.maxResistLightning|", - "then": { "name": "text.setColor", "id": "charResLight", "color": "%textGold%" }, - "else": { "name": "text.setColor", "id": "charResLight", "color": "%textBlue%" } + "param1": "%currentLevel.currentPlayer.resistLightning%", + "param2": "%currentLevel.currentPlayer.maxResistLightning%", + "then": { "name": "text.setFont", "id": "charResLight", "font": "smaltextGold" }, + "else": { "name": "text.setFont", "id": "charResLight", "font": "smaltextBlue" } }, "else": { "name": "if.lower", - "param1": "|currentLevel|currentPlayer.resistLightning|", + "param1": "%currentLevel.currentPlayer.resistLightning%", "param2": 0, - "then": { "name": "text.setColor", "id": "charResLight", "color": "%textRed%" }, - "else": { "name": "text.setColor", "id": "charResLight" } + "then": { "name": "text.setFont", "id": "charResLight", "font": "smaltextRed" }, + "else": { "name": "text.setFont", "id": "charResLight", "font": "smaltext" } } } }, diff --git a/gamefilesd/res/level/actions/colorCycling.json b/gamefilesd/res/level/actions/colorCycling.json index 4b49b912..14dc1117 100755 --- a/gamefilesd/res/level/actions/colorCycling.json +++ b/gamefilesd/res/level/actions/colorCycling.json @@ -1,19 +1,22 @@ { - "action": { - "name": "if.equal", - "param1": "%colorCycling%", - "param2": true, - "then": { + "action": [ + { "name": "event.delete", "id": "colorCycle" }, + { + "replaceVars": "value", "name": "if.equal", - "param1": "|game|hasEvent.colorCycle|", - "param2": false, + "param1": "%colorCycling%", + "param2": true, "then": { "name": "event.add", "id": "colorCycle", - "action": { "name": "palette.shiftLeft", "id": "colorCycle", "shift": 1, "range": [1, 32] }, - "time": 60 + "action": { + "name": "palette.shiftRight", + "id": "colorCycle", + "shift": 1, + "range": ["|colorCycleStart|", "|colorCycleStop|"] + }, + "time": "|colorCycleSpeed|" } - }, - "else": { "name": "event.delete", "id": "colorCycle" } - } + } + ] } \ No newline at end of file diff --git a/gamefilesd/res/level/actions/inventoryText.json b/gamefilesd/res/level/actions/inventoryText.json index 74640f0b..9d06c06d 100755 --- a/gamefilesd/res/level/actions/inventoryText.json +++ b/gamefilesd/res/level/actions/inventoryText.json @@ -4,17 +4,17 @@ "id": "update{1}Text", "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": false, "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.{2}.{3}|", + "param1": "%currentLevel.currentPlayer.hasItem.{2}.{3}%", "param2": true, "then": [ { "name": "image.enableOutline", "id": "img{1}" }, { "name": "if.inList", - "param": "|currentLevel|currentPlayer.item.{2}.{3}.itemType|", + "param": "%currentLevel.currentPlayer.item.{2}.{3}.itemType%", "list": ["Amulet", "Ring"], "then": { "name": "text.setText", @@ -34,22 +34,22 @@ "updatePanelTextSpacing", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.magical|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.magical%", "param2": 1, "then": "setPanelTextColorBlue", "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.unique|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.unique%", "param2": 1, "then": [ "setPanelTextColorGold", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.identified|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.identified%", "param2": true, "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.hasDescription.4|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.hasDescription.4%", "param2": true, "then": [ "showItemInfo", diff --git a/gamefilesd/res/level/actions/playerBodyHands.json b/gamefilesd/res/level/actions/playerBodyHands.json index b811c41a..e6db2673 100755 --- a/gamefilesd/res/level/actions/playerBodyHands.json +++ b/gamefilesd/res/level/actions/playerBodyHands.json @@ -5,28 +5,28 @@ "id": "updateLeftHandItem", "replaceVars": true, "action": [ - { "name": "image.setTexture", "id": "imgLeftHand", "inventory": "body", "item": "LeftHand" }, + { "name": "image.setTexture", "id": "imgLeftHand", "query": "currentLevel.currentPlayer.item.body.LeftHand" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.LeftHand|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.LeftHand%", "param2": false, "then": [ { "name": "image.setPalette", "id": "imgLeftHand", "palette": "infra", "color": "0xFF0000" }, - { "name": "image.setOutline", "id": "imgLeftHand", "outline": "%outlineCantUse%", "ignore": "0x000000" } + { "name": "image.setOutline", "id": "imgLeftHand", "outline": "|outlineCantUse|", "ignore": "0x000000" } ], "else": [ { "name": "image.setPalette", "id": "imgLeftHand", "palette": "town" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.LeftHand.magical|", + "param1": "%currentLevel.currentPlayer.item.body.LeftHand.magical%", "param2": 1, - "then": { "name": "image.setOutline", "id": "imgLeftHand", "outline": "%outlineItem%", "ignore": "0x000000" }, + "then": { "name": "image.setOutline", "id": "imgLeftHand", "outline": "|outlineItem|", "ignore": "0x000000" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.LeftHand.unique|", + "param1": "%currentLevel.currentPlayer.item.body.LeftHand.unique%", "param2": 1, - "then": { "name": "image.setOutline", "id": "imgLeftHand", "outline": "%outlineItem%", "ignore": "0x000000" }, - "else": { "name": "image.setOutline", "id": "imgLeftHand", "outline": "%outlineItemInv%", "ignore": "0x000000" } + "then": { "name": "image.setOutline", "id": "imgLeftHand", "outline": "|outlineItem|", "ignore": "0x000000" }, + "else": { "name": "image.setOutline", "id": "imgLeftHand", "outline": "|outlineItemInv|", "ignore": "0x000000" } } } ] @@ -34,7 +34,7 @@ { "name": "drawable.center", "id": "imgLeftHand", "idCenterOn": "playerLeftHand" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.body.LeftHand|", + "param1": "%currentLevel.currentPlayer.hasItem.body.LeftHand%", "param2": true, "then": { "name": "image.setTexture", "id": "playerLeftHand", "texture": "red" }, "else": { "name": "image.setTexture", "id": "playerLeftHand", "texture": "empty" } @@ -46,28 +46,28 @@ "id": "updateRightHandItem", "replaceVars": true, "action": [ - { "name": "image.setTexture", "id": "imgRightHand", "inventory": "body", "item": "RightHand" }, + { "name": "image.setTexture", "id": "imgRightHand", "query": "currentLevel.currentPlayer.item.body.RightHand" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.RightHand|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.RightHand%", "param2": false, "then": [ { "name": "image.setPalette", "id": "imgRightHand", "palette": "infra", "color": "0xFF0000" }, - { "name": "image.setOutline", "id": "imgRightHand", "outline": "%outlineCantUse%", "ignore": "0x000000" } + { "name": "image.setOutline", "id": "imgRightHand", "outline": "|outlineCantUse|", "ignore": "0x000000" } ], "else": [ { "name": "image.setPalette", "id": "imgRightHand", "palette": "town" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.RightHand.magical|", + "param1": "%currentLevel.currentPlayer.item.body.RightHand.magical%", "param2": 1, - "then": { "name": "image.setOutline", "id": "imgRightHand", "outline": "%outlineItem%", "ignore": "0x000000" }, + "then": { "name": "image.setOutline", "id": "imgRightHand", "outline": "|outlineItem|", "ignore": "0x000000" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.RightHand.unique|", + "param1": "%currentLevel.currentPlayer.item.body.RightHand.unique%", "param2": 1, - "then": { "name": "image.setOutline", "id": "imgRightHand", "outline": "%outlineItem%", "ignore": "0x000000" }, - "else": { "name": "image.setOutline", "id": "imgRightHand", "outline": "%outlineItemInv%", "ignore": "0x000000" } + "then": { "name": "image.setOutline", "id": "imgRightHand", "outline": "|outlineItem|", "ignore": "0x000000" }, + "else": { "name": "image.setOutline", "id": "imgRightHand", "outline": "|outlineItemInv|", "ignore": "0x000000" } } } ] @@ -75,7 +75,7 @@ { "name": "drawable.center", "id": "imgRightHand", "idCenterOn": "playerRightHand" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.body.RightHand|", + "param1": "%currentLevel.currentPlayer.hasItem.body.RightHand%", "param2": true, "then": { "name": "image.setTexture", "id": "playerRightHand", "texture": "red" }, "else": { "name": "image.setTexture", "id": "playerRightHand", "texture": "empty" } diff --git a/gamefilesd/res/level/actions/playerBodyHands2.json b/gamefilesd/res/level/actions/playerBodyHands2.json index 6b3d554b..39bb7835 100755 --- a/gamefilesd/res/level/actions/playerBodyHands2.json +++ b/gamefilesd/res/level/actions/playerBodyHands2.json @@ -1,162 +1,20 @@ { "action": [ - { - "name": "action.set", - "id": "updateLeftHandText", - "action": { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.body.LeftHand|", - "param2": true, - "then": [ - { - "name": "if.inList", - "param": "|currentLevel|currentPlayer.item.body.LeftHand.itemType|", - "list": ["Amulet", "Ring"], - "then": { - "name": "text.setText", - "id": "txtPanel", - "query": "currentLevel.currentPlayer.item.body.LeftHand", - "text": "%name%\n%d.1%\n%d.2%", - "removeEmptyLines": true - }, - "else": { - "name": "text.setText", - "id": "txtPanel", - "query": "currentLevel.currentPlayer.item.body.LeftHand", - "text": "%name%\n%d.0%\n%d.1%\n%d.2%\n%d.3%", - "removeEmptyLines": true - } - }, - "updatePanelTextSpacing", - { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.LeftHand.magical|", - "param2": 1, - "then": "setPanelTextColorBlue", - "else": { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.LeftHand.unique|", - "param2": 1, - "then": [ - "setPanelTextColorGold", - { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.LeftHand.identified|", - "param2": true, - "then": { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.LeftHand.hasDescription.4|", - "param2": true, - "then": [ - "showItemInfo", - { - "name": "text.setText", - "id": "itemInfoTitle", - "query": "currentLevel.currentPlayer.item.body.LeftHand", - "text": "%name%" - }, - { - "name": "text.setText", - "id": "itemInfoDescr", - "query": "currentLevel.currentPlayer.item.body.LeftHand", - "text": "%d.4%" - } - ] - } - } - ], - "else": "setPanelTextColorWhite" - } - } - ] - } - }, - { - "name": "action.set", - "id": "updateRightHandText", - "action": { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.body.RightHand|", - "param2": true, - "then": [ - { - "name": "if.inList", - "param": "|currentLevel|currentPlayer.item.body.RightHand.itemType|", - "list": ["Amulet", "Ring"], - "then": { - "name": "text.setText", - "id": "txtPanel", - "query": "currentLevel.currentPlayer.item.body.RightHand", - "text": "%name%\n%d.1%\n%d.2%", - "removeEmptyLines": true - }, - "else": { - "name": "text.setText", - "id": "txtPanel", - "query": "currentLevel.currentPlayer.item.body.RightHand", - "text": "%name%\n%d.0%\n%d.1%\n%d.2%\n%d.3%", - "removeEmptyLines": true - } - }, - "updatePanelTextSpacing", - { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.RightHand.magical|", - "param2": 1, - "then": "setPanelTextColorBlue", - "else": { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.RightHand.unique|", - "param2": 1, - "then": [ - "setPanelTextColorGold", - { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.RightHand.identified|", - "param2": true, - "then": { - "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.RightHand.hasDescription.4|", - "param2": true, - "then": [ - "showItemInfo", - { - "name": "text.setText", - "id": "itemInfoTitle", - "query": "currentLevel.currentPlayer.item.body.RightHand", - "text": "%name%" - }, - { - "name": "text.setText", - "id": "itemInfoDescr", - "query": "currentLevel.currentPlayer.item.body.RightHand", - "text": "%d.4%" - } - ] - } - } - ], - "else": "setPanelTextColorWhite" - } - } - ] - } - }, { "name": "action.set", "id": "updateLeftHandClick", "action": [ { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": { "name": "if.inList", - "param": "|currentLevel|currentPlayer.selectedItem.itemType|", + "param": "%currentLevel.currentPlayer.selectedItem.itemType%", "list": ["Axe", "Bow", "Club", "Shield", "Staff", "Sword"], "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseSelectedItem|", + "param1": "%currentLevel.currentPlayer.canUseSelectedItem%", "param2": true, "then": [ { "name": "image.setTexture", "id": "imgLeftHand", "texture": "empty" }, @@ -177,7 +35,7 @@ "updateAllPlayerStats", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": "updateSelectedItem", "else": "updateLeftHandText" @@ -190,15 +48,15 @@ "action": [ { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": { "name": "if.inList", - "param": "|currentLevel|currentPlayer.selectedItem.itemType|", + "param": "%currentLevel.currentPlayer.selectedItem.itemType%", "list": ["Axe", "Bow", "Club", "Shield", "Staff", "Sword"], "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseSelectedItem|", + "param1": "%currentLevel.currentPlayer.canUseSelectedItem%", "param2": true, "then": [ { "name": "image.setTexture", "id": "imgRightHand", "texture": "empty" }, @@ -219,7 +77,7 @@ "updateAllPlayerStats", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": "updateSelectedItem", "else": "updateRightHandText" diff --git a/gamefilesd/res/level/actions/playerTexture.json b/gamefilesd/res/level/actions/playerTexture.json index 3fadd8f4..b3b7918e 100755 --- a/gamefilesd/res/level/actions/playerTexture.json +++ b/gamefilesd/res/level/actions/playerTexture.json @@ -4,37 +4,37 @@ "id": "updatePlayerTexture", "action": { "name": "switch", - "param": "|currentLevel|currentPlayer.item.body.Armor.itemSubType|", + "param": "%currentLevel.currentPlayer.item.body.Armor.itemSubType%", "case": [ { "value": "Leather", "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Axe|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Axe%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 10 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Bow|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Bow%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 11 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Staff|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Staff%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 16 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Shield|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Shield%", "param2": true, "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Club|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Club%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 13 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Sword|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Sword%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 12 }, "else": { "name": "player.setTextureIndex", "index": 17 } @@ -42,12 +42,12 @@ }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Club|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Club%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 14 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Sword|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Sword%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 15 }, "else": { "name": "player.setTextureIndex", "index": 9 } @@ -62,31 +62,31 @@ "value": "Plate", "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Axe|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Axe%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 19 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Bow|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Bow%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 20 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Staff|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Staff%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 25 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Shield|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Shield%", "param2": true, "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Club|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Club%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 22 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Sword|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Sword%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 21 }, "else": { "name": "player.setTextureIndex", "index": 26 } @@ -94,12 +94,12 @@ }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Club|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Club%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 23 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Sword|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Sword%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 24 }, "else": { "name": "player.setTextureIndex", "index": 18 } @@ -113,31 +113,31 @@ ], "default": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Axe|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Axe%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 1 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Bow|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Bow%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 2 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Staff|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Staff%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 7 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Shield|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Shield%", "param2": true, "then": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Club|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Club%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 4 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Sword|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Sword%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 3 }, "else": { "name": "player.setTextureIndex", "index": 8 } @@ -145,12 +145,12 @@ }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Club|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Club%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 5 }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasEquipedItemType.Sword|", + "param1": "%currentLevel.currentPlayer.hasEquipedItemType.Sword%", "param2": true, "then": { "name": "player.setTextureIndex", "index": 6 }, "else": { "name": "player.setTextureIndex", "index": 0 } diff --git a/gamefilesd/res/level/actions/playerUpdate.json b/gamefilesd/res/level/actions/playerUpdate.json index 6b1bc7dc..755ad616 100755 --- a/gamefilesd/res/level/actions/playerUpdate.json +++ b/gamefilesd/res/level/actions/playerUpdate.json @@ -6,7 +6,7 @@ "action": [ { "name": "<=", - "param1": "|currentLevel|currentPlayer.life|", + "param1": "%currentLevel.currentPlayer.life%", "param2": 0, "then": [ { @@ -28,22 +28,22 @@ { "name": "drawable.resizeY", "id": "lifeOrbEmpty", - "size": "|currentLevel|currentPlayer.lifeDamage|", - "inputRangeMax": "|currentLevel|currentPlayer.life|", + "size": "%currentLevel.currentPlayer.lifeDamage%", + "inputRangeMax": "%currentLevel.currentPlayer.life%", "range": [0, 88] }, { "name": "image.inverseResizeY", "id": "lifeOrbFull", - "size": "|currentLevel|currentPlayer.lifeDamage|", - "inputRangeMax": "|currentLevel|currentPlayer.life|", + "size": "%currentLevel.currentPlayer.lifeDamage%", + "inputRangeMax": "%currentLevel.currentPlayer.life%", "range": [0, 88] } ] }, { "name": "<=", - "param1": "|currentLevel|currentPlayer.mana|", + "param1": "%currentLevel.currentPlayer.mana%", "param2": 0, "then": [ { @@ -65,15 +65,15 @@ { "name": "drawable.resizeY", "id": "manaOrbEmpty", - "size": "|currentLevel|currentPlayer.manaDamage|", - "inputRangeMax": "|currentLevel|currentPlayer.mana|", + "size": "%currentLevel.currentPlayer.manaDamage%", + "inputRangeMax": "%currentLevel.currentPlayer.mana%", "range": [0, 88] }, { "name": "image.inverseResizeY", "id": "manaOrbFull", - "size": "|currentLevel|currentPlayer.manaDamage|", - "inputRangeMax": "|currentLevel|currentPlayer.mana|", + "size": "%currentLevel.currentPlayer.manaDamage%", + "inputRangeMax": "%currentLevel.currentPlayer.mana%", "range": [0, 88] } ] @@ -88,7 +88,7 @@ "updateBeltItems", { "name": "if.equal", - "param1": "|game|hasResource.charPanelInventory|", + "param1": "%game.hasResource.charPanelInventory%", "param2": true, "then": ["updateStashItems", "updateBodyItems"] }, diff --git a/gamefilesd/res/level/actions/resizeLevel.json b/gamefilesd/res/level/actions/resizeLevel.json index 1212b788..36ba09e7 100755 --- a/gamefilesd/res/level/actions/resizeLevel.json +++ b/gamefilesd/res/level/actions/resizeLevel.json @@ -4,24 +4,24 @@ "id": "resizeLevel", "action": { "name": "if.equal", - "param1": "|game|stretchToFit|", + "param1": "%game.stretchToFit%", "param2": true, "then": { "name": "if.equal", - "param1": "|game|minSize.x|", + "param1": "%game.minSize.x%", "param2": 640, "then": { "name": "if.equal", - "param1": "|game|minSize.y|", + "param1": "%game.minSize.y%", "param2": 480, "then": { "name": "if.inList", "param": true, - "list": ["|charPanel|visible|", "|questPanel|visible|"], + "list": ["%charPanel.visible%", "%questPanel.visible%"], "then": { "name": "if.inList", "param": true, - "list": ["|invPanel|visible|", "|spellPanel|visible|"], + "list": ["%invPanel.visible%", "%spellPanel.visible%"], "then": { "name": "drawable.setSizeX", "id": "level", "size": 0 }, "else": [ { "name": "drawable.setPositionX", "id": "level", "position": 320 }, @@ -31,7 +31,7 @@ "else": { "name": "if.inList", "param": true, - "list": ["|invPanel|visible|", "|spellPanel|visible|"], + "list": ["%invPanel.visible%", "%spellPanel.visible%"], "then": [ { "name": "drawable.setPositionX", "id": "level", "position": 0 }, { "name": "drawable.setSizeX", "id": "level", "size": 320 } diff --git a/gamefilesd/res/level/actions/stashClick.json b/gamefilesd/res/level/actions/stashClick.json index 8873e732..96edb519 100755 --- a/gamefilesd/res/level/actions/stashClick.json +++ b/gamefilesd/res/level/actions/stashClick.json @@ -7,7 +7,7 @@ "updateStashItems", { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": "updateSelectedItem", "else": "update{1}Text" diff --git a/gamefilesd/res/level/actions/stashItem.json b/gamefilesd/res/level/actions/stashItem.json index 86d143e5..e2158d97 100755 --- a/gamefilesd/res/level/actions/stashItem.json +++ b/gamefilesd/res/level/actions/stashItem.json @@ -6,50 +6,49 @@ "action": [ { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.isItemSlotInUse.{2}.{3}|", + "param1": "%currentLevel.currentPlayer.isItemSlotInUse.{2}.{3}%", "param2": true, "then": [ { "name": "if.equal", - "param1": "|game|hasDrawable.img{1}|", + "param1": "%game.hasDrawable.img{1}%", "param2": false, "then": { "name": "load", "file": [ "ui/level/char/inventoryItem.json", "{1}", - "|btn{1}|position.x|", - "|btn{1}|position.y|" + "%btn{1}.position.x%", + "%btn{1}.position.y%" ] } }, { "name": "image.setTexture", "id": "img{1}", - "inventory": "{2}", - "item": [{3}] + "query": "currentLevel.currentPlayer.item.{2}.{3}" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.{2}.{3}|", + "param1": "%currentLevel.currentPlayer.canUseItem.{2}.{3}%", "param2": false, "then": [ { "name": "image.setPalette", "id": "img{1}", "palette": "infra", "color": "0xFF0000" }, - { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineCantUse%", "ignore": "0x000000" } + { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineCantUse|", "ignore": "0x000000" } ], "else": [ { "name": "image.setPalette", "id": "img{1}", "palette": "town" }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.magical|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.magical%", "param2": 1, - "then": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItem%", "ignore": "0x000000" }, + "then": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItem|", "ignore": "0x000000" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.{2}.{3}.unique|", + "param1": "%currentLevel.currentPlayer.item.{2}.{3}.unique%", "param2": 1, - "then": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItem%", "ignore": "0x000000" }, - "else": { "name": "image.setOutline", "id": "img{1}", "outline": "%outlineItemInv%", "ignore": "0x000000" } + "then": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItem|", "ignore": "0x000000" }, + "else": { "name": "image.setOutline", "id": "img{1}", "outline": "|outlineItemInv|", "ignore": "0x000000" } } } ] @@ -59,7 +58,7 @@ }, { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasItem.{2}.{3}|", + "param1": "%currentLevel.currentPlayer.hasItem.{2}.{3}%", "param2": true, "then": { "name": "image.setTexture", "id": "btn{1}", "texture": "red" }, "else": { "name": "image.setTexture", "id": "btn{1}", "texture": "empty" } diff --git a/gamefilesd/res/level/actions/stashUse.json b/gamefilesd/res/level/actions/stashUse.json index afb118d3..5b059466 100755 --- a/gamefilesd/res/level/actions/stashUse.json +++ b/gamefilesd/res/level/actions/stashUse.json @@ -4,13 +4,43 @@ "id": "use{1}Item", "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.{2}.isUsable|", + "param1": "%currentLevel.currentPlayer.item.stash.{2}.isUsable%", "param2": true, - "then": [ - { "name": "item.use", "inventory": "stash", "item": [{2}] }, - "updateAllPlayerStats" - ], - "else": "rightClickLevel" + "then": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.canUseItem.stash.{2}%", + "param2": true, + "then": [ + "closeRemoveGold", + { "name": "item.use", "inventory": "stash", "item": [{2}] }, + "updateAllPlayerStats", + "clearPanelText" + ], + "else": "sCantUseThisYet" + }, + "else": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.item.stash.{2}.rightClick%", + "param2": 1, + "then": { + "name": "item.executeAction", + "inventory": "stash", + "item": [{2}], + "action": "rightClick" + }, + "else": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.item.stash.{2}.classId%", + "param2": "gold", + "then": { + "name": "load", + "file": ["ui/level/char/removeGold.json", + "{2}", + "%currentLevel.currentPlayer.item.stash.{2}.quantity%"] + }, + "else": "rightClickLevel" + } + } } } } \ No newline at end of file diff --git a/gamefilesd/res/level/automap.png b/gamefilesd/res/level/automap.png new file mode 100755 index 00000000..2b35199b Binary files /dev/null and b/gamefilesd/res/level/automap.png differ diff --git a/gamefilesd/res/level/baseLevelActions.json b/gamefilesd/res/level/baseLevelActions.json index 9e335404..041dc215 100755 --- a/gamefilesd/res/level/baseLevelActions.json +++ b/gamefilesd/res/level/baseLevelActions.json @@ -5,7 +5,7 @@ "id": "levelLeftClickAction", "action": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "item.drop" }, @@ -13,7 +13,7 @@ ], "else": { "name": "if.equal", - "param1": "|currentLevel|hasCurrentPlayer|", + "param1": "%currentLevel.hasCurrentPlayer%", "param2": true, "then": { "name": "player.moveToClick", "player": "hero" }, "else": { "name": "level.moveToClick" } @@ -30,13 +30,13 @@ "id": "levelHoverAction", "action": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ - { "name": "text.setText", "id": "txtPanel", "text": "|currentLevel|hoverObject.name|" }, + { "name": "text.setText", "id": "txtPanel", "text": "%currentLevel.hoverObject.name%" }, { "name": "if.equal", - "param1": "|currentLevel|hoverObject.type|", + "param1": "%currentLevel.hoverObject.type%", "param2": "player", "then": { "name": "text.appendText", @@ -49,12 +49,12 @@ "updatePanelTextSpacing", { "name": "if.equal", - "param1": "|currentLevel|hoverObject.magical|", + "param1": "%currentLevel.hoverObject.magical%", "param2": 1, "then": "setPanelTextColorBlue", "else": { "name": "if.equal", - "param1": "|currentLevel|hoverObject.unique|", + "param1": "%currentLevel.hoverObject.unique%", "param2": 1, "then": "setPanelTextColorGold", "else": "setPanelTextColorWhite" @@ -68,13 +68,13 @@ "id": "levelShowZoomAction", "action": { "name": "if.equal", - "param1": "|txtZoom|visible|", + "param1": "%txtZoom.visible%", "param2": false, "then": [ { "name": "drawable.visible", "id": "txtZoom", "visible": true }, { "name": "if.equal", - "param1": "|game|hasEvent.closeZoom|", + "param1": "%game.hasEvent.closeZoom%", "param2": false, "then": { "name": "event.add", @@ -118,6 +118,17 @@ { "name": "drawable.setAction", "id": "level", "event": "hoverEnter", "action": "levelHoverAction" }, { "name": "drawable.setAction", "id": "level", "event": "hoverLeave", "action": "clearPanelText" } ] + }, + { + "name": "action.set", + "id": "zoomLevel", + "action": { + "name": "if.equal", + "param1": "%currentLevel.zoomPercentage%", + "param2": 100, + "then": { "name": "level.zoom", "zoom": 200 }, + "else": { "name": "level.zoom", "zoom": 100 } + } } ] } \ No newline at end of file diff --git a/gamefilesd/res/level/fonts.json b/gamefilesd/res/level/fonts.json index 47d2b2ed..f75def31 100755 --- a/gamefilesd/res/level/fonts.json +++ b/gamefilesd/res/level/fonts.json @@ -1,16 +1,47 @@ { + "texture": { + "id": "smaltext", + "file": "ctrlpan/smaltext.cel", + "palette": "town", + "indexed": true, + "charMapFile": "res/level/smaltextCharMap.bin" + }, + "texturePack": { + "id": "smaltext", + "font": true, + "texture": "smaltext", + "charSizeFile": "res/level/smaltextSize.bin", + "palette": "town" + }, "font": [ { "id": "smaltext", - "texture": "smaltext", - "palette": "town", - "file": "ctrlpan/smaltext.cel", - "charMapFile": "res/level/smaltextCharMap.bin", - "charSizeFile": "res/level/smaltextSize.bin" + "texturePack": "smaltext", + "fontPalette": "town" + }, + { + "id": "smaltextBlue", + "replaceVars": true, + "texturePack": "smaltext", + "fontPalette": "textBlue", + "fontColor": "|textBlue|" + }, + { + "id": "smaltextGold", + "replaceVars": true, + "texturePack": "smaltext", + "fontPalette": "textGold", + "fontColor": "|textGold|" + }, + { + "id": "smaltextRed", + "replaceVars": true, + "texturePack": "smaltext", + "fontPalette": "textRed", + "fontColor": "|textRed|" }, { "id": "medtexts", - "texture": "medtexts", "palette": "town", "file": "data/medtexts.cel", "charMapFile": "res/level/medtextsCharMap.bin", @@ -18,7 +49,6 @@ }, { "id": "bigtgold", - "texture": "bigtgold", "palette": "town", "file": "data/bigtgold.cel", "charMapFile": "res/level/bigtgoldCharMap.bin", diff --git a/gamefilesd/res/level/textures.json b/gamefilesd/res/level/textures.json index 5efb361d..650338a8 100755 --- a/gamefilesd/res/level/textures.json +++ b/gamefilesd/res/level/textures.json @@ -1,5 +1,10 @@ { "texture": [ + { + "id": "golddrop", + "file": "ctrlpan/golddrop.cel", + "palette": "town" + }, { "id": "p8bulbs", "file": "ctrlpan/p8bulbs.cel", @@ -65,6 +70,16 @@ "file": "data/textslid.cel", "frame": 13, "palette": "town" + }, + { + "id": "noSpell", + "file": "ctrlpan/spelicon.cel", + "frame": 26, + "palette": "spell4" + }, + { + "id": "automap", + "file": "res/level/automap.png" } ], "texturePack": { diff --git a/gamefilesd/res/palettes.json b/gamefilesd/res/palettes.json index b31cd6ff..b9d9c687 100755 --- a/gamefilesd/res/palettes.json +++ b/gamefilesd/res/palettes.json @@ -1,15 +1,38 @@ { "palette": [ { - "file":"levels/towndata/town.pal" + "file": "levels/towndata/town.pal" + }, + { + "id": "textBlue", + "clone": "town" + }, + { + "id": "textGold", + "clone": "town" + }, + { + "id": "textRed", + "clone": "town" + }, + { + "palette": "town", + "trnFile": "plrgfx/infra.trn" }, { "palette": "town", - "trnFile":"plrgfx/infra.trn" + "trnFile": "plrgfx/stone.trn" }, { "palette": "town", - "trnFile":"plrgfx/stone.trn" + "trnFile": "res/trn/spell4.trn" } + ], + "action": [ + { "name": "palette.replace", "id": "textBlue", "idSource": "town", "srcStart": 178, "size": 14, "dstStart": 240 }, + { "name": "palette.replace", "id": "textBlue", "idSource": "town", "srcStart": 189, "size": 2, "dstStart": 254 }, + { "name": "palette.replace", "id": "textGold", "idSource": "town", "srcStart": 194, "size": 14, "dstStart": 240 }, + { "name": "palette.replace", "id": "textGold", "idSource": "town", "srcStart": 205, "size": 2, "dstStart": 254 }, + { "name": "palette.replace", "id": "textRed", "idSource": "town", "srcStart": 224, "size": 16, "dstStart": 240 } ] } \ No newline at end of file diff --git a/gamefilesd/res/player/rogueSounds.json b/gamefilesd/res/player/rogueSounds.json index 978e9ea0..a1efb70b 100755 --- a/gamefilesd/res/player/rogueSounds.json +++ b/gamefilesd/res/player/rogueSounds.json @@ -6,6 +6,7 @@ { "id": "whereWouldIPutThis", "file": "sfx/rogue/rogue16.wav" }, { "id": "cantCastThatHere", "file": "sfx/rogue/rogue27.wav" }, { "id": "dontHaveASpellReady", "file": "sfx/rogue/rogue34.wav" }, - { "id": "notEnoughMana", "file": "sfx/rogue/rogue35.wav" } + { "id": "notEnoughMana", "file": "sfx/rogue/rogue35.wav" }, + { "id": "die", "file": "sfx/rogue/rogue71.wav" } ] } \ No newline at end of file diff --git a/gamefilesd/res/player/sorcerorSounds.json b/gamefilesd/res/player/sorcerorSounds.json index 5d7ae556..4b3dfac1 100755 --- a/gamefilesd/res/player/sorcerorSounds.json +++ b/gamefilesd/res/player/sorcerorSounds.json @@ -6,6 +6,7 @@ { "id": "whereWouldIPutThis", "file": "sfx/sorceror/mage16.wav" }, { "id": "cantCastThatHere", "file": "sfx/sorceror/mage27.wav" }, { "id": "dontHaveASpellReady", "file": "sfx/sorceror/mage34.wav" }, - { "id": "notEnoughMana", "file": "sfx/sorceror/mage35.wav" } + { "id": "notEnoughMana", "file": "sfx/sorceror/mage35.wav" }, + { "id": "die", "file": "sfx/sorceror/mage71.wav" } ] } \ No newline at end of file diff --git a/gamefilesd/res/player/sound/load.json b/gamefilesd/res/player/sound/load.json index 81be946b..f9de2325 100755 --- a/gamefilesd/res/player/sound/load.json +++ b/gamefilesd/res/player/sound/load.json @@ -1,3 +1,57 @@ { - "load": ["res/player/sound/loadSetId.json", "{1}", "{2}", ".", "{3}"] + "action": { + "name": "switch", + "param": "%currentLevel.currentPlayer.class%", + "case": [ + { + "value": "Warrior", + "action": { + "name": "if.equal", + "param1": "{2}", + "param2": "", + "then": { + "name": "load", + "file": ["res/player/sound/loadWarrior.json", "{1}", "warrior{1}", "{3}", "{4}"] + }, + "else": { + "name": "load", + "file": ["res/player/sound/loadWarrior.json", "{1}", "{2}", "{3}", "{4}"] + } + } + }, + { + "value": "Rogue", + "action": { + "name": "if.equal", + "param1": "{2}", + "param2": "", + "then": { + "name": "load", + "file": ["res/player/sound/loadRogue.json", "{1}", "rogue{1}", "{3}", "{4}"] + }, + "else": { + "name": "load", + "file": ["res/player/sound/loadRogue.json", "{1}", "{2}", "{3}", "{4}"] + } + } + }, + { + "value": "Sorceror", + "action": { + "name": "if.equal", + "param1": "{2}", + "param2": "", + "then": { + "name": "load", + "file": ["res/player/sound/loadSorceror.json", "{1}", "sorceror{1}", "{3}", "{4}"] + }, + "else": { + "name": "load", + "file": ["res/player/sound/loadSorceror.json", "{1}", "{2}", "{3}", "{4}"] + } + } + } + ], + "default": "Warrior" + } } \ No newline at end of file diff --git a/gamefilesd/res/player/sound/loadAudio.json b/gamefilesd/res/player/sound/loadAudio.json index 4dcffe90..f9b0a17c 100755 --- a/gamefilesd/res/player/sound/loadAudio.json +++ b/gamefilesd/res/player/sound/loadAudio.json @@ -2,6 +2,7 @@ "audio": { "id": "{1}", "file": "{2}/{3}.wav", - "volume": "|game|soundVolume|" + "resource": "{4}", + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/res/player/sound/loadByClass.json b/gamefilesd/res/player/sound/loadByClass.json deleted file mode 100755 index 87ff0877..00000000 --- a/gamefilesd/res/player/sound/loadByClass.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "action": { - "name": "switch", - "param": "{1}", - "case": [ - { - "value": "Warrior", - "action": { - "name": "if.equal", - "param1": "{3}", - "param2": ".", - "then": { - "name": "load", - "file": ["res/player/sound/loadWarrior.json", "{2}", "warrior{2}", "{4}"] - }, - "else": { - "name": "load", - "file": ["res/player/sound/loadWarrior.json", "{2}", "{3}", "{4}"] - } - } - }, - { - "value": "Rogue", - "action": { - "name": "if.equal", - "param1": "{3}", - "param2": ".", - "then": { - "name": "load", - "file": ["res/player/sound/loadRogue.json", "{2}", "rogue{2}", "{4}"] - }, - "else": { - "name": "load", - "file": ["res/player/sound/loadRogue.json", "{2}", "{3}", "{4}"] - } - } - }, - { - "value": "Sorceror", - "action": { - "name": "if.equal", - "param1": "{3}", - "param2": ".", - "then": { - "name": "load", - "file": ["res/player/sound/loadSorceror.json", "{2}", "sorceror{2}", "{4}"] - }, - "else": { - "name": "load", - "file": ["res/player/sound/loadSorceror.json", "{2}", "{3}", "{4}"] - } - } - } - ], - "default": "Warrior" - } -} \ No newline at end of file diff --git a/gamefilesd/res/player/sound/loadRogue.json b/gamefilesd/res/player/sound/loadRogue.json index fcf0f92a..47763f6f 100755 --- a/gamefilesd/res/player/sound/loadRogue.json +++ b/gamefilesd/res/player/sound/loadRogue.json @@ -5,11 +5,11 @@ "param2": 10, "then": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/rogue", "rogue0{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/rogue", "rogue0{1}", "{4}"] }, "else": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/rogue", "rogue{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/rogue", "rogue{1}", "{4}"] } } } \ No newline at end of file diff --git a/gamefilesd/res/player/sound/loadSetId.json b/gamefilesd/res/player/sound/loadSetId.json deleted file mode 100755 index c2a1c2a8..00000000 --- a/gamefilesd/res/player/sound/loadSetId.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "action": { - "name": "if.inList", - "param": "{4}", - "list": [ "loadSound", "playSound", "loadAudio", "playAudio" ], - "then": { - "name": "load", - "file": ["res/player/sound/loadByClass.json", "{1}", "{2}", "{3}", "{4}"] - }, - "else": { - "name": "load", - "file": ["res/player/sound/loadByClass.json", "{1}", "{2}", "{3}", "loadSound"] - } - } -} \ No newline at end of file diff --git a/gamefilesd/res/player/sound/loadSorceror.json b/gamefilesd/res/player/sound/loadSorceror.json index 506d131c..7993e683 100755 --- a/gamefilesd/res/player/sound/loadSorceror.json +++ b/gamefilesd/res/player/sound/loadSorceror.json @@ -5,11 +5,11 @@ "param2": 10, "then": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/sorceror", "mage0{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/sorceror", "mage0{1}", "{4}"] }, "else": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/sorceror", "mage{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/sorceror", "mage{1}", "{4}"] } } } \ No newline at end of file diff --git a/gamefilesd/res/player/sound/loadSound.json b/gamefilesd/res/player/sound/loadSound.json index 84128fa8..ff419332 100755 --- a/gamefilesd/res/player/sound/loadSound.json +++ b/gamefilesd/res/player/sound/loadSound.json @@ -1,6 +1,7 @@ { "sound": { "id": "{1}", - "file": "{2}/{3}.wav" + "file": "{2}/{3}.wav", + "resource": "{4}" } } \ No newline at end of file diff --git a/gamefilesd/res/player/sound/loadWarrior.json b/gamefilesd/res/player/sound/loadWarrior.json index cc6f9c8a..b1ccfce7 100755 --- a/gamefilesd/res/player/sound/loadWarrior.json +++ b/gamefilesd/res/player/sound/loadWarrior.json @@ -5,7 +5,7 @@ "param2": 10, "then": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "warior0{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "warior0{1}", "{4}"] }, "else": { "name": "if.inList", @@ -15,27 +15,36 @@ 58, 60, 63, 64, 70, 71, 72, 74, 75, 76, 77, 78, 79 ], "then": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "Warior{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "Warior{1}", "{4}"] }, "else": { - "name": "if.inList", - "param": {1}, - "list": [ 97, 98, 100, 101 ], + "name": "if.equal", + "param1": {1}, + "param2": 96, "then": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "Wario{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "Wario{1}b", "{4}"] }, "else": { - "name": "if.equal", - "param1": {1}, - "param2": 102, + "name": "if.inList", + "param": {1}, + "list": [ 97, 98, 100, 101 ], "then": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "wario{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "Wario{1}", "{4}"] }, "else": { - "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "warior{1}"] + "name": "if.equal", + "param1": {1}, + "param2": 102, + "then": { + "name": "load", + "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "wario{1}", "{4}"] + }, + "else": { + "name": "load", + "file": ["res/player/sound/{3}.json", "{2}", "sfx/Warrior", "warior{1}", "{4}"] + } } } } diff --git a/gamefilesd/res/player/sound/playAudio.json b/gamefilesd/res/player/sound/playAudio.json index fa16838b..fe3d197d 100755 --- a/gamefilesd/res/player/sound/playAudio.json +++ b/gamefilesd/res/player/sound/playAudio.json @@ -2,7 +2,8 @@ "audio": { "id": "{1}", "file": "{2}/{3}.wav", + "resource": "{4}", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/res/player/sound/playSound.json b/gamefilesd/res/player/sound/playSound.json index f829295e..47e519ca 100755 --- a/gamefilesd/res/player/sound/playSound.json +++ b/gamefilesd/res/player/sound/playSound.json @@ -2,6 +2,7 @@ "sound": { "id": "{1}", "file": "{2}/{3}.wav", + "resource": "{4}", "play": true } } \ No newline at end of file diff --git a/gamefilesd/res/player/warriorSounds.json b/gamefilesd/res/player/warriorSounds.json index ca2af1f8..17fc220d 100755 --- a/gamefilesd/res/player/warriorSounds.json +++ b/gamefilesd/res/player/warriorSounds.json @@ -6,6 +6,7 @@ { "id": "whereWouldIPutThis", "file": "sfx/Warrior/Warior16.wav" }, { "id": "cantCastThatHere", "file": "sfx/Warrior/warior27.wav" }, { "id": "dontHaveASpellReady", "file": "sfx/Warrior/warior34.wav" }, - { "id": "notEnoughMana", "file": "sfx/Warrior/Warior35.wav" } + { "id": "notEnoughMana", "file": "sfx/Warrior/Warior35.wav" }, + { "id": "die", "file": "sfx/misc/dead.wav" } ] } \ No newline at end of file diff --git a/gamefilesd/res/trn/spell0.trn b/gamefilesd/res/trn/spell0.trn new file mode 100755 index 00000000..369384ed Binary files /dev/null and b/gamefilesd/res/trn/spell0.trn differ diff --git a/gamefilesd/res/trn/spell1.trn b/gamefilesd/res/trn/spell1.trn new file mode 100755 index 00000000..33ce8ab5 Binary files /dev/null and b/gamefilesd/res/trn/spell1.trn differ diff --git a/gamefilesd/res/trn/spell2.trn b/gamefilesd/res/trn/spell2.trn new file mode 100755 index 00000000..104d135a Binary files /dev/null and b/gamefilesd/res/trn/spell2.trn differ diff --git a/gamefilesd/res/trn/spell3.trn b/gamefilesd/res/trn/spell3.trn new file mode 100755 index 00000000..3d543d79 Binary files /dev/null and b/gamefilesd/res/trn/spell3.trn differ diff --git a/gamefilesd/res/trn/spell4.trn b/gamefilesd/res/trn/spell4.trn new file mode 100755 index 00000000..22c3f984 Binary files /dev/null and b/gamefilesd/res/trn/spell4.trn differ diff --git a/gamefilesd/texts/adria/gossip/gossip1.json b/gamefilesd/texts/adria/gossip/gossip1.json index 7a1799b1..be62142a 100755 --- a/gamefilesd/texts/adria/gossip/gossip1.json +++ b/gamefilesd/texts/adria/gossip/gossip1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch39.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip1.txt b/gamefilesd/texts/adria/gossip/gossip1.txt index 2fb8581a..7b07760d 100755 --- a/gamefilesd/texts/adria/gossip/gossip1.txt +++ b/gamefilesd/texts/adria/gossip/gossip1.txt @@ -1 +1,6 @@ -Wisdom is earned, not given. If you discover a tome of knowledge, devour its words. Should you already have knowledge of the racane mysteries scribed whithin a book, remember - that level of mastery can always be increased. \ No newline at end of file +Wisdom is earned, not given. If you +discover a tome of knowledge, devour its +words. Should you already have +knowledge of the arcane mysteries scribed +within a book, remember - that level of +mastery can always increase. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip10.json b/gamefilesd/texts/adria/gossip/gossip10.json index ea187402..1790e1e9 100755 --- a/gamefilesd/texts/adria/gossip/gossip10.json +++ b/gamefilesd/texts/adria/gossip/gossip10.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "58", "texts/adria/gossip/gossip10.txt" ], "audio": { "file": "sfx/Towners/witch49.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip10.txt b/gamefilesd/texts/adria/gossip/gossip10.txt index c21a5d52..a2d7ac2e 100755 --- a/gamefilesd/texts/adria/gossip/gossip10.txt +++ b/gamefilesd/texts/adria/gossip/gossip10.txt @@ -1 +1,12 @@ -There is much about the future we cannot see, but when it comes it will be the children who wield it. The boy Wirt has a blackness upon his soul, but he poses no threat to the town or its people. His secretive dealings with the urchins and unspoken guilds of nearby towns gain him access to many devices that cannot be easily found in Tristram. While his methods may be reproachful, Wirt can provide assistance for your battle against the encroaching Darkness. \ No newline at end of file +There is much about the future we +cannot see, but when it comes it will be +the children who wield it. The boy Wirt +has a blackness upon his soul, but he poses +no threat to the town or its people. His +secretive dealings with the urchins and +unspoken guilds of nearby towns gain him +access to many devices that cannot be +easily found in Tristram. While his +methods may be reproachful, Wirt can +provide assistance for your battle +against the encroaching Darkness. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip11.json b/gamefilesd/texts/adria/gossip/gossip11.json index 911976d0..f4f2bd6f 100755 --- a/gamefilesd/texts/adria/gossip/gossip11.json +++ b/gamefilesd/texts/adria/gossip/gossip11.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "58", "texts/adria/gossip/gossip11.txt" ], "audio": { "file": "sfx/Towners/witch50.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip11.txt b/gamefilesd/texts/adria/gossip/gossip11.txt index e3b27013..053a59ab 100755 --- a/gamefilesd/texts/adria/gossip/gossip11.txt +++ b/gamefilesd/texts/adria/gossip/gossip11.txt @@ -1 +1,14 @@ -Earthen walls and thatched canopy do not a home create. The innkeeper Ogden serves more of a purpose in this town than many understand. He provides shelter for Gillian and her matriarch, maintains what life Farnham has left to him, and provides an anchor for all who are left in the town to what Tristram once was. His tavern, and the simple pleasures that can still be found there, provide a glimpse of a life that the people here remember. It is that memory that continues to feed their hopes for your success. \ No newline at end of file +Earthen walls and thatched canopy do +not a home create. The innkeeper Ogden +serves more of a purpose in this town +than many understand. He provides +shelter for Gillian and her matriarch, +maintains what life Farnham has left to +him, and provides an anchor for all who +are left in the town to what Tristram +once was. His tavern, and the simple +pleasures that can still be found there, +provide a glimpse of a life that the people +here remember. It is that memory that +continues to feed their hopes for your +success. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip2.json b/gamefilesd/texts/adria/gossip/gossip2.json index dd6af8f4..806e3510 100755 --- a/gamefilesd/texts/adria/gossip/gossip2.json +++ b/gamefilesd/texts/adria/gossip/gossip2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch40.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip2.txt b/gamefilesd/texts/adria/gossip/gossip2.txt index 22b76653..e636ae74 100755 --- a/gamefilesd/texts/adria/gossip/gossip2.txt +++ b/gamefilesd/texts/adria/gossip/gossip2.txt @@ -1 +1,11 @@ -The greatest power is often the shortest lived. You may find ancient words of power written upon scrolls of parchment. The strength of these scrolls lies in the ability of either apprentice or adept to cast them with equal ability. Their weakness is that they must first be read aloud and can never be kept at the ready in your mind. Know also that these scrolls can be read but once, so use them with care. \ No newline at end of file +The greatest power is often the shortest +lived. You may find ancient words of +power written upon scrolls of +parchment. The strength of these scrolls +lies in the ability of either apprentice or +adept to cast them with equal ability. +Their weakness is that they must first be +read aloud and can never be kept at the +ready in your mind. Know also that these +scrolls can be read but once, so use them +with care. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip3.json b/gamefilesd/texts/adria/gossip/gossip3.json index b512308b..8c7ecc59 100755 --- a/gamefilesd/texts/adria/gossip/gossip3.json +++ b/gamefilesd/texts/adria/gossip/gossip3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch41.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip3.txt b/gamefilesd/texts/adria/gossip/gossip3.txt index 4050a530..4bab0c99 100755 --- a/gamefilesd/texts/adria/gossip/gossip3.txt +++ b/gamefilesd/texts/adria/gossip/gossip3.txt @@ -1 +1,9 @@ -Though the heat of the sun is beyond measure, the mere flame of a candle is of greater danger. No energies, no matter how great, can be used without the proper focus. For many spells, ensorcelled Staves may be charged with magical energies many times over. I have the ability to restore their power - but know that nothing is done without a price. \ No newline at end of file +Though the heat of the sun is beyond +measure, the mere flame of a candle is of +greater danger. No energies, no matter +how great, can be used without the +proper focus. For many spells, ensorcelled +Staves may be charged with magical +energies many times over. I have the +ability to restore their power - but know +that nothing is done without a price. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip4.json b/gamefilesd/texts/adria/gossip/gossip4.json index 9c79421e..ac895797 100755 --- a/gamefilesd/texts/adria/gossip/gossip4.json +++ b/gamefilesd/texts/adria/gossip/gossip4.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch42.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip4.txt b/gamefilesd/texts/adria/gossip/gossip4.txt index 851449f8..c547ee11 100755 --- a/gamefilesd/texts/adria/gossip/gossip4.txt +++ b/gamefilesd/texts/adria/gossip/gossip4.txt @@ -1 +1,5 @@ -The sum of our knowledge is in the sum of its people. Should you find a book or scroll that you cannot decipher, do not hesitate to bring it to me. If I can make sense of it I will share what I find. \ No newline at end of file +The sum of our knowledge is in the sum of +its people. Should you find a book or +scroll that you cannot decipher, do not +hesitate to bring it to me. If I can make +sense of it I will share what I find. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip5.json b/gamefilesd/texts/adria/gossip/gossip5.json index 4ee7e24b..3709d1ad 100755 --- a/gamefilesd/texts/adria/gossip/gossip5.json +++ b/gamefilesd/texts/adria/gossip/gossip5.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch43.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip5.txt b/gamefilesd/texts/adria/gossip/gossip5.txt index bd0ac1f6..4b3e598f 100755 --- a/gamefilesd/texts/adria/gossip/gossip5.txt +++ b/gamefilesd/texts/adria/gossip/gossip5.txt @@ -1 +1,5 @@ -To a man who only knows Iron, there is no greater magic than Steel. The blacksmith Griswold is more of a sorcerer than he knows. His ability to meld fire and metal is unequaled in this land. \ No newline at end of file +To a man who only knows Iron, there is +no greater magic than Steel. The +blacksmith Griswold is more of a sorcerer +than he knows. His ability to meld fire and +metal is unequaled in this land. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip6.json b/gamefilesd/texts/adria/gossip/gossip6.json index 47d91e8d..6d77c2fa 100755 --- a/gamefilesd/texts/adria/gossip/gossip6.json +++ b/gamefilesd/texts/adria/gossip/gossip6.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch44.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip6.txt b/gamefilesd/texts/adria/gossip/gossip6.txt index d727a74f..0ccd5921 100755 --- a/gamefilesd/texts/adria/gossip/gossip6.txt +++ b/gamefilesd/texts/adria/gossip/gossip6.txt @@ -1 +1,6 @@ -Corruption has the strength of deceit, but innocence holds the power of purity. The young woman Gillian has a pure heart, placing the needs of her matriarch over her own. She fears me, but it is only because she does not understand me. \ No newline at end of file +Corruption has the strength of deceit, +but innocence holds the power of purity. +The young woman Gillian has a pure +heart, placing the needs of her matriarch +over her own. She fears me, but it is only +because she does not understand me. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip7.json b/gamefilesd/texts/adria/gossip/gossip7.json index 5fd66619..dc3dc40b 100755 --- a/gamefilesd/texts/adria/gossip/gossip7.json +++ b/gamefilesd/texts/adria/gossip/gossip7.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch45.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip7.txt b/gamefilesd/texts/adria/gossip/gossip7.txt index e65d8db3..96b17353 100755 --- a/gamefilesd/texts/adria/gossip/gossip7.txt +++ b/gamefilesd/texts/adria/gossip/gossip7.txt @@ -1 +1,7 @@ -A chest opened in darkness holds no greater treasure than when it is opened in the light. The storyteller Cain is an enigma, but only to those who do not look. His knowledge of what lies beneath the cathedral is far greater than even he allows himself to realize. \ No newline at end of file +A chest opened in darkness holds no +greater treasure than when it is opened in +the light. The storyteller Cain is an +enigma, but only to those who do not +look. His knowledge of what lies beneath +the cathedral is far greater than even he +allows himself to realize. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip8.json b/gamefilesd/texts/adria/gossip/gossip8.json index e484c10a..622d3393 100755 --- a/gamefilesd/texts/adria/gossip/gossip8.json +++ b/gamefilesd/texts/adria/gossip/gossip8.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch46.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip8.txt b/gamefilesd/texts/adria/gossip/gossip8.txt index c3cc199c..734b6821 100755 --- a/gamefilesd/texts/adria/gossip/gossip8.txt +++ b/gamefilesd/texts/adria/gossip/gossip8.txt @@ -1 +1,8 @@ -The higher you place your faith in one man, the farther it has to fall. Farnham has lost his soul, but not to any demon. It was lost when he saw his fellow townspeople betrayed by the Archbishop Lazarus. He has knowledge to be gleaned, but you must separate fact from fantasy. \ No newline at end of file +The higher you place your faith in one +man, the farther it has to fall. Farnham +has lost his soul, but not to any demon. +It was lost when he saw his fellow +townspeople betrayed by the Archbishop +Lazarus. He has knowledge to be gleaned, +but you must separate fact from +fantasy. \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip9.json b/gamefilesd/texts/adria/gossip/gossip9.json index fe1b390c..d2459603 100755 --- a/gamefilesd/texts/adria/gossip/gossip9.json +++ b/gamefilesd/texts/adria/gossip/gossip9.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch47.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/gossip/gossip9.txt b/gamefilesd/texts/adria/gossip/gossip9.txt index 27702a4d..f348a25c 100755 --- a/gamefilesd/texts/adria/gossip/gossip9.txt +++ b/gamefilesd/texts/adria/gossip/gossip9.txt @@ -1 +1,8 @@ -The hand, the heart and the mind can perform miracles when they are in perfect harmony. The healer Pepin sees into the body in a way that even I cannot. His ability to restore the sick and injured is magnified by his understanding of the creation of elixirs and potions. He is as great an ally as you have in Tristram. \ No newline at end of file +The hand, the heart and the mind can +perform miracles when they are in perfect +harmony. The healer Pepin sees into the +body in a way that even I cannot. His +ability to restore the sick and injured is +magnified by his understanding of the +creation of elixirs and potions. He is as +great an ally as you have in Tristram. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/anvilOfFury.json b/gamefilesd/texts/adria/quests/anvilOfFury.json index fd29c825..ca1eba16 100755 --- a/gamefilesd/texts/adria/quests/anvilOfFury.json +++ b/gamefilesd/texts/adria/quests/anvilOfFury.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch14.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/anvilOfFury.txt b/gamefilesd/texts/adria/quests/anvilOfFury.txt index d2223c5b..6318d626 100755 --- a/gamefilesd/texts/adria/quests/anvilOfFury.txt +++ b/gamefilesd/texts/adria/quests/anvilOfFury.txt @@ -1 +1,7 @@ -There are many artifacts within the Labyrinth that hold powers beyond the comprehension of mortals. Some of these hold fantastic power that can be used by either the Light or the Darkness. Securing the Anvil from below could shift the course of the Sin War towards the Light. \ No newline at end of file +There are many artifacts within the +Labyrinth that hold powers beyond the +comprehension of mortals. Some of these +hold fantastic power that can be used by +either the Light or the Darkness. Securing +the Anvil from below could shift the +course of the Sin War towards the Light. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/archbishopLazarus.json b/gamefilesd/texts/adria/quests/archbishopLazarus.json index a046a162..4d74a207 100755 --- a/gamefilesd/texts/adria/quests/archbishopLazarus.json +++ b/gamefilesd/texts/adria/quests/archbishopLazarus.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/archbishopLazarus.txt b/gamefilesd/texts/adria/quests/archbishopLazarus.txt index 6d33bae1..87645402 100755 --- a/gamefilesd/texts/adria/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/adria/quests/archbishopLazarus.txt @@ -1 +1,6 @@ -I did not know this Lazarus of whom you speak, but I do sense a great conflict within his being. He poses a great danger, and will stop at nothing to serve the Powers of Darkness which have claimed him as theirs. \ No newline at end of file +I did not know this Lazarus of whom you +speak, but I do sense a great conflict +within his being. He poses a great danger, +and will stop at nothing to serve the +powers of darkness which have claimed him +as theirs. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/arkainesValor.json b/gamefilesd/texts/adria/quests/arkainesValor.json index 075fa6ac..ebb70287 100755 --- a/gamefilesd/texts/adria/quests/arkainesValor.json +++ b/gamefilesd/texts/adria/quests/arkainesValor.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/arkainesValor.txt" ], "audio": { "file": "sfx/Towners/witch15.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/arkainesValor.txt b/gamefilesd/texts/adria/quests/arkainesValor.txt index d92e1e42..ecec6df5 100755 --- a/gamefilesd/texts/adria/quests/arkainesValor.txt +++ b/gamefilesd/texts/adria/quests/arkainesValor.txt @@ -1,3 +1,5 @@ -Should you find these stones of blood, use them carefully. +Should you find these Stones of Blood, +use them carefully. -The way is fraught with danger and your only hope rests within your self-trust. \ No newline at end of file +The way is fraught with danger and your +only hope rests within your self trust. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/blackMushroom.json b/gamefilesd/texts/adria/quests/blackMushroom.json index 9e879b81..128aa32f 100755 --- a/gamefilesd/texts/adria/quests/blackMushroom.json +++ b/gamefilesd/texts/adria/quests/blackMushroom.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.blackMushroom.state|", + "param": "%currentLevel.quest.blackMushroom.state%", "case": [ { "value": 0, diff --git a/gamefilesd/texts/adria/quests/blackMushroom1.json b/gamefilesd/texts/adria/quests/blackMushroom1.json index 72abce93..b84f3a32 100755 --- a/gamefilesd/texts/adria/quests/blackMushroom1.json +++ b/gamefilesd/texts/adria/quests/blackMushroom1.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/blackMushroom1.txt" ], "audio": { "file": "sfx/Towners/witch23.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/blackMushroom1.txt b/gamefilesd/texts/adria/quests/blackMushroom1.txt index a7d34b1c..b5a2d29d 100755 --- a/gamefilesd/texts/adria/quests/blackMushroom1.txt +++ b/gamefilesd/texts/adria/quests/blackMushroom1.txt @@ -1 +1,4 @@ -It's a big, Black Mushroom that I need. Now run off and get it for me so that I can use it for a special concoction that I am working on. \ No newline at end of file +It's a big, black mushroom that I need. +Now run off and get it for me so that I +can use it for a special concoction that I +am working on. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/blackMushroom2.json b/gamefilesd/texts/adria/quests/blackMushroom2.json index 98d0f0b6..05bd95eb 100755 --- a/gamefilesd/texts/adria/quests/blackMushroom2.json +++ b/gamefilesd/texts/adria/quests/blackMushroom2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch24.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/blackMushroom2.txt b/gamefilesd/texts/adria/quests/blackMushroom2.txt index f59a0098..bc7e35b3 100755 --- a/gamefilesd/texts/adria/quests/blackMushroom2.txt +++ b/gamefilesd/texts/adria/quests/blackMushroom2.txt @@ -1 +1,9 @@ -Yes. This will be perfect for a brew that I am creating. By the way, the Healer is looking for the Brain of some Demon or another so he can treat those who have been afflicted by their poisonous venom. I believe that he intends to make an elixir from it. If you can help him find what he needs, please see if you can get a sample of the elixir for me. \ No newline at end of file +Yes, this will be perfect for a brew that I +am creating. By the way, the healer is +looking for the brain of some demon or +another so he can treat those who have +been afflicted by their poisonous venom. I +believe that he intends to make an elixir +from it. If you help him find what he needs, +please see if you can get a sample of the +elixir for me. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/blackMushroom3.json b/gamefilesd/texts/adria/quests/blackMushroom3.json index 124c7d6d..b4ef33b7 100755 --- a/gamefilesd/texts/adria/quests/blackMushroom3.json +++ b/gamefilesd/texts/adria/quests/blackMushroom3.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/blackMushroom3.txt" ], "audio": { "file": "sfx/Towners/witch26.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/blackMushroom3.txt b/gamefilesd/texts/adria/quests/blackMushroom3.txt index d9b35438..1c9ac519 100755 --- a/gamefilesd/texts/adria/quests/blackMushroom3.txt +++ b/gamefilesd/texts/adria/quests/blackMushroom3.txt @@ -1 +1,3 @@ -What? Now you bring me that elixir from the healer? I was able to finish my brew without it. Why don't you just keep it... \ No newline at end of file +What? Now you bring me that elixir from +the healer? I was able to finish my brew +without it. Why don't you just keep it... \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/chamberOfBone.json b/gamefilesd/texts/adria/quests/chamberOfBone.json index b433daf0..c2654327 100755 --- a/gamefilesd/texts/adria/quests/chamberOfBone.json +++ b/gamefilesd/texts/adria/quests/chamberOfBone.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/chamberOfBone.txt" ], "audio": { "file": "sfx/Towners/witch07.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/chamberOfBone.txt b/gamefilesd/texts/adria/quests/chamberOfBone.txt index 429a6f52..23641487 100755 --- a/gamefilesd/texts/adria/quests/chamberOfBone.txt +++ b/gamefilesd/texts/adria/quests/chamberOfBone.txt @@ -1,3 +1,6 @@ -You will become an eternal servant of the Dark Lords should you perish within this cursed domain. +You will become an eternal servant of +the dark lords should you perish within +this cursed domain. -Enter the Chamber of Bone at your own peril. \ No newline at end of file +Enter the Chamber of Bone at your own +peril. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/hallsOfTheBlind.json b/gamefilesd/texts/adria/quests/hallsOfTheBlind.json index 7f979af8..d38a9ee2 100755 --- a/gamefilesd/texts/adria/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/adria/quests/hallsOfTheBlind.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/hallsOfTheBlind.txt" ], "audio": { "file": "sfx/Towners/witch12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/hallsOfTheBlind.txt b/gamefilesd/texts/adria/quests/hallsOfTheBlind.txt index 02848ef8..62e96637 100755 --- a/gamefilesd/texts/adria/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/adria/quests/hallsOfTheBlind.txt @@ -1,3 +1,6 @@ -This is a place of great anguish and terror, and so serves its master well. +This is a place of great anguish and +terror, and so serves its master well. -Tread carefully or you may yourself be staying much longer than you had anticipated. \ No newline at end of file +Tread carefully or you may yourself be +staying much longer than you had +anticipated. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/lachdanan.json b/gamefilesd/texts/adria/quests/lachdanan.json index 2fc1a127..417ef046 100755 --- a/gamefilesd/texts/adria/quests/lachdanan.json +++ b/gamefilesd/texts/adria/quests/lachdanan.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/lachdanan.txt" ], "audio": { "file": "sfx/Towners/witch13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/lachdanan.txt b/gamefilesd/texts/adria/quests/lachdanan.txt index 3a52b47d..facf12d0 100755 --- a/gamefilesd/texts/adria/quests/lachdanan.txt +++ b/gamefilesd/texts/adria/quests/lachdanan.txt @@ -1,3 +1,5 @@ -You may meet people who are trapped within the labyrinth, such as Lachdanan. +You may meet people who are trapped +within the Labyrinth, such as Lachdanan. -I sense in him honor and great guilt. Aid him, and you aid all of Tristram. \ No newline at end of file +I sense in him honor and great guilt. Aid +him, and you aid all of Tristram. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/magicRock.json b/gamefilesd/texts/adria/quests/magicRock.json index 90dbceaf..11850ee8 100755 --- a/gamefilesd/texts/adria/quests/magicRock.json +++ b/gamefilesd/texts/adria/quests/magicRock.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch20.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/magicRock.txt b/gamefilesd/texts/adria/quests/magicRock.txt index db3ee0c1..4a4b1d98 100755 --- a/gamefilesd/texts/adria/quests/magicRock.txt +++ b/gamefilesd/texts/adria/quests/magicRock.txt @@ -1 +1,5 @@ -The Heaven Stone is very powerful, and were it any but Griswold who bid you find it, I would prevent it. He will harness its powers and its use will be for the good of us all. \ No newline at end of file +The Heaven Stone is very powerful, and +were it any but Griswold who bid you +find it, I would prevent it. He will harness +its powers and its use will be for the +good of us all. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/ogdensSign.json b/gamefilesd/texts/adria/quests/ogdensSign.json index 2cd0a9d5..130c2b79 100755 --- a/gamefilesd/texts/adria/quests/ogdensSign.json +++ b/gamefilesd/texts/adria/quests/ogdensSign.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/ogdensSign.txt" ], "audio": { "file": "sfx/Towners/witch02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/ogdensSign.txt b/gamefilesd/texts/adria/quests/ogdensSign.txt index 4d543a87..b0e15f04 100755 --- a/gamefilesd/texts/adria/quests/ogdensSign.txt +++ b/gamefilesd/texts/adria/quests/ogdensSign.txt @@ -1,3 +1,5 @@ -No Mortal can truly understand the mind of the Demon. +No mortal can truly understand the +mind of the demon. -Never let their erratic actions confuse you, as that too may be their plan. \ No newline at end of file +Never let their erratic actions confuse +you, as that too may be their plan. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/poisonedWater.json b/gamefilesd/texts/adria/quests/poisonedWater.json index 1b8e6786..9588612c 100755 --- a/gamefilesd/texts/adria/quests/poisonedWater.json +++ b/gamefilesd/texts/adria/quests/poisonedWater.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/adria/quests/poisonedWater.txt" ], "audio": { "file": "sfx/Towners/witch04.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/poisonedWater.txt b/gamefilesd/texts/adria/quests/poisonedWater.txt index 32ddb9af..95c9d5ad 100755 --- a/gamefilesd/texts/adria/quests/poisonedWater.txt +++ b/gamefilesd/texts/adria/quests/poisonedWater.txt @@ -1,3 +1,7 @@ -The people of Tristram will die if you cannot restore fresh water to their wells. +The people of Tristram will die if you +cannot restore fresh water to their +wells. -Know this - Demons are at the heart of this matter, but they remain ignorant of what they have spawned. \ No newline at end of file +Know this - demons are at the heart of +this matter, but they remain ignorant of +what they have spawned. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/skeletonKing.json b/gamefilesd/texts/adria/quests/skeletonKing.json index fcf4e57c..0b088142 100755 --- a/gamefilesd/texts/adria/quests/skeletonKing.json +++ b/gamefilesd/texts/adria/quests/skeletonKing.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/skeletonKing.txt b/gamefilesd/texts/adria/quests/skeletonKing.txt index 18e1c333..040d07b3 100755 --- a/gamefilesd/texts/adria/quests/skeletonKing.txt +++ b/gamefilesd/texts/adria/quests/skeletonKing.txt @@ -1 +1,7 @@ -The dead who walk among the living follow the cursed King. He holds the power to raise yet more warriors for an ever-growing army of the Undead. If you do not stop his reign, he will surely march across this land and slay all who still live here. \ No newline at end of file +The dead who walk among the living +follow the cursed King. He holds the +power to raise yet more warriors for an +ever growing army of the undead. If you +do not stop his reign, he will surely +march across this land and slay all who +still live here. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/theButcher.json b/gamefilesd/texts/adria/quests/theButcher.json index d3a2a58c..b2f349f5 100755 --- a/gamefilesd/texts/adria/quests/theButcher.json +++ b/gamefilesd/texts/adria/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/theButcher.txt b/gamefilesd/texts/adria/quests/theButcher.txt index 7fd5c67f..be2e52cd 100755 --- a/gamefilesd/texts/adria/quests/theButcher.txt +++ b/gamefilesd/texts/adria/quests/theButcher.txt @@ -1 +1,6 @@ -The Butcher is a sadistic creature that delights in the torture and pain of others. You have seen his handiwork in the drunkard Farnham. His destruction will do much to ensure the safety of this village. \ No newline at end of file +The Butcher is a sadistic creature that +delights in the torture and pain of +others. You have seen his handiwork in the +drunkard Farnham. His destruction will +do much to ensure the safety of this +village. \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/warlordOfBlood.json b/gamefilesd/texts/adria/quests/warlordOfBlood.json index daf95ee5..1b5f76c3 100755 --- a/gamefilesd/texts/adria/quests/warlordOfBlood.json +++ b/gamefilesd/texts/adria/quests/warlordOfBlood.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch18.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/adria/quests/warlordOfBlood.txt b/gamefilesd/texts/adria/quests/warlordOfBlood.txt index 71be0a0d..b362958a 100755 --- a/gamefilesd/texts/adria/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/adria/quests/warlordOfBlood.txt @@ -1 +1,4 @@ -His prowess with the blade is awesome, and he has lived for thousands of years knowing only warfare. I am sorry... I can not see if you will defeat him. \ No newline at end of file +His prowess with the blade is awesome, and +he has lived for thousands of years +knowing only warfare. I am sorry... I can +not see if you will defeat him. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip1.json b/gamefilesd/texts/cain/gossip/gossip1.json index 0b5e6775..33949220 100755 --- a/gamefilesd/texts/cain/gossip/gossip1.json +++ b/gamefilesd/texts/cain/gossip/gossip1.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/cain/gossip/gossip1.txt" ], "audio": { "file": "sfx/Towners/storyt26.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip1.txt b/gamefilesd/texts/cain/gossip/gossip1.txt index 1ff4e67a..3eaeef27 100755 --- a/gamefilesd/texts/cain/gossip/gossip1.txt +++ b/gamefilesd/texts/cain/gossip/gossip1.txt @@ -1 +1,6 @@ -While you are venturing deeper into the Labyrinth you may find tomes of great knowledge hidden there. Read them carefully for they can tell you things that even I cannot. \ No newline at end of file +While you are venturing deeper into the +Labyrinth you may find tomes of great +knowledge hidden there. + +Read them carefully for they can tell +you things that even I cannot. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip2.json b/gamefilesd/texts/cain/gossip/gossip2.json index 161b306b..46ef0893 100755 --- a/gamefilesd/texts/cain/gossip/gossip2.json +++ b/gamefilesd/texts/cain/gossip/gossip2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt27.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip2.txt b/gamefilesd/texts/cain/gossip/gossip2.txt index bb337290..defcea93 100755 --- a/gamefilesd/texts/cain/gossip/gossip2.txt +++ b/gamefilesd/texts/cain/gossip/gossip2.txt @@ -1 +1,7 @@ -I know of many myths and legends that may contain answers to questions that may arise in your journeys into the Labyrinth. If you come across challenges and questions to which you seek knowledge, seek me out and I will tell you what I can. \ No newline at end of file +I know of many myths and legends that +may contain answers to questions that +may arise in your journeys into the +Labyrinth. If you come across challenges +and questions to which you seek +knowledge, seek me out and I will tell +you what I can. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip3.json b/gamefilesd/texts/cain/gossip/gossip3.json index 978261b2..85f16795 100755 --- a/gamefilesd/texts/cain/gossip/gossip3.json +++ b/gamefilesd/texts/cain/gossip/gossip3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt28.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip3.txt b/gamefilesd/texts/cain/gossip/gossip3.txt index 1fef82e2..980aba37 100755 --- a/gamefilesd/texts/cain/gossip/gossip3.txt +++ b/gamefilesd/texts/cain/gossip/gossip3.txt @@ -1 +1,9 @@ -Griswold - a man of great action and great courage. I bet he never told you about the time he went into the Labyrinth to save Wirt, did he? He knows his fair share of the dangers to be found there, but then again - so do you. He is a skilled craftsman, and if he claims to be able to help you in any way, you can count on his honesty and his skill. \ No newline at end of file +Griswold - a man of great action and +great courage. I bet he never told you +about the time he went into the Labyrinth +to save Wirt, did he? He knows his fair +share of the dangers to be found there, +but then again - so do you. He is a skilled +craftsman, and if he claims to be able to +help you in any way, you can count on +his honesty and his skill. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip4.json b/gamefilesd/texts/cain/gossip/gossip4.json index d4da0f24..835ee2ba 100755 --- a/gamefilesd/texts/cain/gossip/gossip4.json +++ b/gamefilesd/texts/cain/gossip/gossip4.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt29.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip4.txt b/gamefilesd/texts/cain/gossip/gossip4.txt index 0f32e8b1..8f33dcdf 100755 --- a/gamefilesd/texts/cain/gossip/gossip4.txt +++ b/gamefilesd/texts/cain/gossip/gossip4.txt @@ -1 +1,9 @@ -Ogden has owned and run the Rising Sun Inn and Tavern for almost four years now. He purchased it just a few short months before everything here went to hell. He and his wife Garda do not have the money to leave as they invested all they had in making a life for themselves here. He is a good man with a deep sense of responsibility. \ No newline at end of file +Ogden has owned and run the Rising Sun +Inn and Tavern for almost four years +now. He purchased it just a few short +months before everything here went to +hell. He and his wife Garda do not have the +money to leave as they invested all they +had in making a life for themselves here. He +is a good man with a deep sense of +responsibility. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip5.json b/gamefilesd/texts/cain/gossip/gossip5.json index 461f1aad..493e0263 100755 --- a/gamefilesd/texts/cain/gossip/gossip5.json +++ b/gamefilesd/texts/cain/gossip/gossip5.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt30.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip5.txt b/gamefilesd/texts/cain/gossip/gossip5.txt index 7d9d0c9a..8ea730b8 100755 --- a/gamefilesd/texts/cain/gossip/gossip5.txt +++ b/gamefilesd/texts/cain/gossip/gossip5.txt @@ -1 +1,9 @@ -Poor Farnham. He is a disquieting reminder of the doomed assembly that entered into the Cathedral with Lazarus on that dark day. He escaped with his life, but his courage and much of his sanity were left in some dark pit. He finds comfort only at the bottom of his tankard nowadays, but there are occasional bits of truth buried within his constant ramblings. \ No newline at end of file +Poor Farnham. He is a disquieting reminder +of the doomed assembly that entered into +the Cathedral with Lazarus on that dark +day. He escaped with his life, but his +courage and much of his sanity were left +in some dark pit. He finds comfort only at +the bottom of his tankard nowadays, but +there are occasional bits of truth buried +within his constant ramblings. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip6.json b/gamefilesd/texts/cain/gossip/gossip6.json index e2f7a7bb..51150553 100755 --- a/gamefilesd/texts/cain/gossip/gossip6.json +++ b/gamefilesd/texts/cain/gossip/gossip6.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt31.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip6.txt b/gamefilesd/texts/cain/gossip/gossip6.txt index aee543c1..d1e29dc6 100755 --- a/gamefilesd/texts/cain/gossip/gossip6.txt +++ b/gamefilesd/texts/cain/gossip/gossip6.txt @@ -1 +1,9 @@ -The witch, Adria, is an anomaly here in Tristram. She arrived shortly after the Cathedral was desecrated while most everyone else was fleeing. She had a small hut constructed at the edge of town, seemingly overnight, and has access to many strange and arcane artifacts and tomes of knowledge that even I have never seen before. \ No newline at end of file +The witch, Adria, is an anomaly here in +Tristram. She arrived shortly after the +Cathedral was desecrated while most +everyone else was fleeing. She had a small +hut constructed at the edge of town, +seemingly overnight, and has access to +many strange and arcane artifacts and +tomes of knowledge that even I have +never seen before. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip7.json b/gamefilesd/texts/cain/gossip/gossip7.json index b4196bb1..2e312c9e 100755 --- a/gamefilesd/texts/cain/gossip/gossip7.json +++ b/gamefilesd/texts/cain/gossip/gossip7.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt33.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip7.txt b/gamefilesd/texts/cain/gossip/gossip7.txt index 6744de32..89421b39 100755 --- a/gamefilesd/texts/cain/gossip/gossip7.txt +++ b/gamefilesd/texts/cain/gossip/gossip7.txt @@ -1 +1,11 @@ -The story of Wirt is a frightening and tragic one. He was taken from the arms of his mother and dragged into the labyrinth by the small, foul demons that wield wicked spears. There were many other children taken that day, including the son of King Leoric. The Knights of the palace went below, but never returned. The Blacksmith found the boy, but only after the foul beasts had begun to torture him for their sadistic pleasures. \ No newline at end of file +The story of Wirt is a frightening and +tragic one. He was taken from the arms of +his mother and dragged into the labyrinth +by the small, foul demons that wield +wicked spears. There were many other +children taken that day, including the +son of King Leoric. The Knights of the +palace went below, but never returned. +The Blacksmith found the boy, but only +after the foul beasts had begun to +torture him for their sadistic pleasures. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip8.json b/gamefilesd/texts/cain/gossip/gossip8.json index 2101722a..1c846038 100755 --- a/gamefilesd/texts/cain/gossip/gossip8.json +++ b/gamefilesd/texts/cain/gossip/gossip8.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt34.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip8.txt b/gamefilesd/texts/cain/gossip/gossip8.txt index f31218ab..59e7ab57 100755 --- a/gamefilesd/texts/cain/gossip/gossip8.txt +++ b/gamefilesd/texts/cain/gossip/gossip8.txt @@ -1 +1,6 @@ -Ah, Pepin. I count him as a true friend - perhaps the closest I have here. He is a bit addled at times, but never a more caring or considerate soul has existed. His knowledge and skills are equaled by few, and his door is always open. \ No newline at end of file +Ah, Pepin. I count him as a true friend - +perhaps the closest I have here. He is a bit +addled at times, but never a more caring +or considerate soul has existed. His +knowledge and skills are equaled by few, +and his door is always open. \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip9.json b/gamefilesd/texts/cain/gossip/gossip9.json index 59ac9f12..d22ca34a 100755 --- a/gamefilesd/texts/cain/gossip/gossip9.json +++ b/gamefilesd/texts/cain/gossip/gossip9.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt35.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/gossip/gossip9.txt b/gamefilesd/texts/cain/gossip/gossip9.txt index 595c7a2d..8f397f37 100755 --- a/gamefilesd/texts/cain/gossip/gossip9.txt +++ b/gamefilesd/texts/cain/gossip/gossip9.txt @@ -1 +1,8 @@ -Gillian is a fine woman. Much adored for her high spirits and her quick laugh, she holds a special place in my heart. She stays on at the tavern to support her elderly grandmother who is too sick to travel. I sometimes fear for her safety, but I know that any man in the village would rather die than see her harmed. \ No newline at end of file +Gillian is a fine woman. Much adored for +her high spirits and her quick laugh, she +holds a special place in my heart. She +stays on at the tavern to support her +elderly grandmother who is too sick to +travel. I sometimes fear for her safety, +but I know that any man in the village +would rather die than see her harmed. \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/anvilOfFury.json b/gamefilesd/texts/cain/quests/anvilOfFury.json index f804321d..e57f7c9c 100755 --- a/gamefilesd/texts/cain/quests/anvilOfFury.json +++ b/gamefilesd/texts/cain/quests/anvilOfFury.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "58", "texts/cain/quests/anvilOfFury.txt" ], "audio": { "file": "sfx/Towners/storyt14.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/anvilOfFury.txt b/gamefilesd/texts/cain/quests/anvilOfFury.txt index e02d19cc..bf4a1a1c 100755 --- a/gamefilesd/texts/cain/quests/anvilOfFury.txt +++ b/gamefilesd/texts/cain/quests/anvilOfFury.txt @@ -1 +1,14 @@ -Griswold speaks of the Anvil of Fury - a legendary artifact long searched for, but never found. Crafted from the metallic bones of the razor pit demons, the Anvil of Fury was smelt around the skulls of the five most powerful Magi of the underworld. Carved with runes of power and chaos, any weapon or armor forged upon this anvil will be immersed into the realm of chaos, imbedding it with magical properties. It is said that the unpredictable nature of chaos makes it difficult to know what the outcome of this smithing will be... \ No newline at end of file +Griswold speaks of The Anvil of Fury - a +legendary artifact long searched for, +but never found. Crafted from the +metallic bones of the Razor Pit demons, +the Anvil of Fury was smelt around the +skulls of the five most powerful magi of +the underworld. Carved with runes of +power and chaos, any weapon or armor +forged upon this Anvil will be immersed +into the realm of Chaos, imbedding it with +magical properties. It is said that the +unpredictable nature of Chaos makes it +difficult to know what the outcome of +this smithing will be... \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/archbishopLazarus.json b/gamefilesd/texts/cain/quests/archbishopLazarus.json index de11b959..e94a23a7 100755 --- a/gamefilesd/texts/cain/quests/archbishopLazarus.json +++ b/gamefilesd/texts/cain/quests/archbishopLazarus.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "58", "texts/cain/quests/archbishopLazarus.txt" ], "audio": { "file": "sfx/Towners/storyt37.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/archbishopLazarus.txt b/gamefilesd/texts/cain/quests/archbishopLazarus.txt index 204f662b..c766ae85 100755 --- a/gamefilesd/texts/cain/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/cain/quests/archbishopLazarus.txt @@ -1 +1,4 @@ -You must hurry and rescue Albrecht from the hands of Lazarus. The Prince and the people of this Kingdom are counting on you! \ No newline at end of file +You must hurry and rescue Albrecht +from the hands of Lazarus. The prince and +the people of this kingdom are counting +on you! \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/arkainesValor.json b/gamefilesd/texts/cain/quests/arkainesValor.json index a8326ac1..73cb3e09 100755 --- a/gamefilesd/texts/cain/quests/arkainesValor.json +++ b/gamefilesd/texts/cain/quests/arkainesValor.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "58", "texts/cain/quests/arkainesValor.txt" ], "audio": { "file": "sfx/Towners/storyt15.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/arkainesValor.txt b/gamefilesd/texts/cain/quests/arkainesValor.txt index 2f8fb754..c5adf1ed 100755 --- a/gamefilesd/texts/cain/quests/arkainesValor.txt +++ b/gamefilesd/texts/cain/quests/arkainesValor.txt @@ -1,7 +1,25 @@ -The Gateway of Blood and the Halls of Fire are landmarks of mystic origin. Wherever this book you read from resides, it is surely a place of great power. +The Gateway of Blood and the Halls of +Fire are landmarks of mystic origin. +Wherever this book you read from resides +it is surely a place of great power. -Legends speak of a pedestal that is carved from obsidian stone and has a pool of boiling blood atop its bone-encrusted surface. There are also allusions to stones of blood that will open a door that guards an ancient treasure... +Legends speak of a pedestal that is carved +from obsidian stone and has a pool of +boiling blood atop its bone encrusted +surface. There are also allusions to +Stones of Blood that will open a door +that guards an ancient treasure... -The nature of this treasure is shrouded in speculation, my friend, but it is said that the ancient hero Arkaine placed the holy armor Valor in a secret vault. Arkaine was the first mortal to turn the tide of the Sin War and chase the Legions of Darkness back to the Burning Hells. +The nature of this treasure is shrouded in +speculation, my friend, but it is said that +the ancient hero Arkaine placed the holy +armor Valor in a secret vault. Arkaine +was the first mortal to turn the tide of +the Sin War and chase the legions of +darkness back to the Burning Hells. -Just before Arkaine died, his armor was hidden away in a secret vault. It is said that when this holy armor is again needed, a hero will arise to don Valor once more. Perhaps you are that hero... \ No newline at end of file +Just before Arkaine died, his armor was +hidden away in a secret vault. It is said +that when this holy armor is again +needed, a hero will arise to don Valor +once more. Perhaps you are that hero... \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/blackMushroom.json b/gamefilesd/texts/cain/quests/blackMushroom.json index 83b38686..e49339aa 100755 --- a/gamefilesd/texts/cain/quests/blackMushroom.json +++ b/gamefilesd/texts/cain/quests/blackMushroom.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt21.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/blackMushroom.txt b/gamefilesd/texts/cain/quests/blackMushroom.txt index 84bdc14a..db0aec13 100755 --- a/gamefilesd/texts/cain/quests/blackMushroom.txt +++ b/gamefilesd/texts/cain/quests/blackMushroom.txt @@ -1 +1,6 @@ -The Witch Adria seeks a Black Mushroom? I know as much about Black Mushrooms as I do about Red Herrings. Perhaps Pepin the Healer could tell you more, but this is something that cannot be found in any of my stories or books. \ No newline at end of file +The witch Adria seeks a black mushroom? I +know as much about Black Mushrooms as I +do about Red Herrings. Perhaps Pepin the +Healer could tell you more, but this is +something that cannot be found in any of +my stories or books. \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/chamberOfBone.json b/gamefilesd/texts/cain/quests/chamberOfBone.json index 9006fd45..2b0287fb 100755 --- a/gamefilesd/texts/cain/quests/chamberOfBone.json +++ b/gamefilesd/texts/cain/quests/chamberOfBone.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "58", "texts/cain/quests/chamberOfBone.txt" ], "audio": { "file": "sfx/Towners/storyt07.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/chamberOfBone.txt b/gamefilesd/texts/cain/quests/chamberOfBone.txt index e86da362..bdb8a959 100755 --- a/gamefilesd/texts/cain/quests/chamberOfBone.txt +++ b/gamefilesd/texts/cain/quests/chamberOfBone.txt @@ -1 +1,11 @@ -A book that speaks of a chamber of human bones? Well, a Chamber of Bone is mentioned in certain archaic writings that I studied in the Libraries of the East. These tomes inferred that when the Lords of the Underworld desired to protect great treasures, they would create domains where those who died in attempt to steal that treasure would be forever bound to defend it. A twisted, but strangely fitting, end? \ No newline at end of file +A book that speaks of a chamber of human +bones? Well, a Chamber of Bone is +mentioned in certain archaic writings +that I studied in the libraries of the East. +These tomes inferred that when the Lords +of the underworld desired to protect +great treasures, they would create +domains where those who died in the +attempt to steal that treasure would +be forever bound to defend it. A twisted, +but strangely fitting, end? \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/diablo.json b/gamefilesd/texts/cain/quests/diablo.json index 7cfd97eb..d6543ceb 100755 --- a/gamefilesd/texts/cain/quests/diablo.json +++ b/gamefilesd/texts/cain/quests/diablo.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt38.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/diablo.txt b/gamefilesd/texts/cain/quests/diablo.txt index 4b15a8e5..7a4fe758 100755 --- a/gamefilesd/texts/cain/quests/diablo.txt +++ b/gamefilesd/texts/cain/quests/diablo.txt @@ -1,3 +1,17 @@ -Your story is quite grim, my friend. Lazarus will surely burn in Hell for his horrific deed. The boy that you describe is NOT our Prince, but I believe that Albrecht may yet be in danger. The symbol of power that you speak of must be a portal in the very heart of the Labyrinth. +Your story is quite grim, my friend. +Lazarus will surely burn in Hell for his +horrific deed. The boy that you describe is +not our prince, but I believe that +Albrecht may yet be in danger. The symbol +of power that you speak of must be a +portal in the very heart of the labyrinth. -Know this, my friend - the Evil that you move against is the Dark Lord of Terror. He is known to mortal men as Diablo. It was he who was imprisoned within the labyrinth many centuries ago and I fear that he seeks to once again sow chaos in the Realm of Mankind. You must venture through the portal and destroy Diablo before it is too late! \ No newline at end of file +Know this, my friend - The evil that you +move against is the dark Lord of Terror. +He is known to mortal men as Diablo. It +was he who was imprisoned within the +Labyrinth many centuries ago and I fear +that he seeks to once again sow chaos in +the realm of mankind. You must venture +through the portal and destroy Diablo +before it is too late! \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/hallsOfTheBlind.json b/gamefilesd/texts/cain/quests/hallsOfTheBlind.json index d36b3a1b..858c32ec 100755 --- a/gamefilesd/texts/cain/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/cain/quests/hallsOfTheBlind.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/hallsOfTheBlind.txt b/gamefilesd/texts/cain/quests/hallsOfTheBlind.txt index c36f0978..746eba32 100755 --- a/gamefilesd/texts/cain/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/cain/quests/hallsOfTheBlind.txt @@ -1,3 +1,11 @@ -You recite an interesting rhyme written in a style that reminds me of other works. Let me think now - what was it? - -...Darkness shrouds the Hidden. Eyes glowing unseen with only the sounds of razor claws briefly scraping to torment those poor souls who have been made sightless for all eternity. The prison for those so damned is named the Halls of the Blind... \ No newline at end of file +You recite an interesting rhyme written +in a style that reminds me of other works. +Let me think now - what was it? + +...Darkness shrouds the Hidden. Eyes +glowing unseen with only the sounds of +razor claws briefly scraping to torment +those poor souls who have been made +sightless for all eternity. The prison for +those so damned is named the Halls of the +Blind... \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/lachdanan.json b/gamefilesd/texts/cain/quests/lachdanan.json index 3d193aad..ae8c14c5 100755 --- a/gamefilesd/texts/cain/quests/lachdanan.json +++ b/gamefilesd/texts/cain/quests/lachdanan.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/lachdanan.txt b/gamefilesd/texts/cain/quests/lachdanan.txt index 8b304720..55a8b0b4 100755 --- a/gamefilesd/texts/cain/quests/lachdanan.txt +++ b/gamefilesd/texts/cain/quests/lachdanan.txt @@ -1 +1,14 @@ -You claim to have spoken with Lachdanan? He was a great hero during his life. Lachdanan was an honorable and just man who served his King faithfully for years. But of course, you already know that. Of those who were caught within the grasp of the King's curse, Lachdanan would be the least likely to submit to the Darkness without a fight, so I suppose that your story could be true. If I were in your place, my friend, I would find a way to release him from his torture. \ No newline at end of file +You claim to have spoken with +Lachdanan? He was a great hero during +his life. Lachdanan was an honorable and +just man who served his King faithfully +for years. But of course, you already +know that. + +Of those who were caught within the +grasp of the King's Curse, Lachdanan +would be the least likely to submit to +the darkness without a fight, so I suppose +that your story could be true. If I were +in your place, my friend, I would find a +way to release him from his torture. \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/magicRock.json b/gamefilesd/texts/cain/quests/magicRock.json index 2374b4f3..4261fd00 100755 --- a/gamefilesd/texts/cain/quests/magicRock.json +++ b/gamefilesd/texts/cain/quests/magicRock.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt20.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/magicRock.txt b/gamefilesd/texts/cain/quests/magicRock.txt index 80ec0060..28afb145 100755 --- a/gamefilesd/texts/cain/quests/magicRock.txt +++ b/gamefilesd/texts/cain/quests/magicRock.txt @@ -1 +1,9 @@ -Griswold speaks of the Heaven Stone that was destined for the enclave located in the East. It was being taken there for further study. This stone glowed with an Energy that somehow granted vision beyond that which a normal man could possess. I do not know what secrets it holds, my friend, but finding this stone would certainly prove most valuable. \ No newline at end of file +Griswold speaks of the Heaven Stone that +was destined for the enclave located in +the east. It was being taken there for +further study. This stone glowed with an +energy that somehow granted vision +beyond that which a normal man could +possess. I do not know what secrets it +holds, my friend, but finding this stone +would certainly prove most valuable. \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/ogdensSign.json b/gamefilesd/texts/cain/quests/ogdensSign.json index 7b0f42df..4d95f53e 100755 --- a/gamefilesd/texts/cain/quests/ogdensSign.json +++ b/gamefilesd/texts/cain/quests/ogdensSign.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/ogdensSign.txt b/gamefilesd/texts/cain/quests/ogdensSign.txt index a673673a..d5143775 100755 --- a/gamefilesd/texts/cain/quests/ogdensSign.txt +++ b/gamefilesd/texts/cain/quests/ogdensSign.txt @@ -1 +1,9 @@ -I see that this strange behavior puzzles you as well. I would surmise that since many Demons fear the Light of the Sun and believe that it holds great power, it may be that the Rising Sun depicted on the sign you speak of has led them to believe that it too holds some arcane powers. Hmm, perhaps they are not all as smart as we had feared... \ No newline at end of file +I see that this strange behavior puzzles +you as well. I would surmise that since +many demons fear the light of the sun and +believe that it holds great power, it may +be that the rising sun depicted on the sign +you speak of has led them to believe that +it too holds some arcane powers. Hmm, +perhaps they are not all as smart as we +had feared... \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/poisonedWater.json b/gamefilesd/texts/cain/quests/poisonedWater.json index 87a7e818..f36f4f0f 100755 --- a/gamefilesd/texts/cain/quests/poisonedWater.json +++ b/gamefilesd/texts/cain/quests/poisonedWater.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt04.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/poisonedWater.txt b/gamefilesd/texts/cain/quests/poisonedWater.txt index 012f3eca..b7e42133 100755 --- a/gamefilesd/texts/cain/quests/poisonedWater.txt +++ b/gamefilesd/texts/cain/quests/poisonedWater.txt @@ -1 +1,9 @@ -Hmm, I don't know what I can really tell you about this that will be of any help. The water that fills our wells comes from an underground spring. I have heard of a tunnel that leads to a great lake - perhaps they are one and the same. Unfortunately, I do not know what would cause our water supply to be tainted. \ No newline at end of file +Hmm, I don't know what I can really tell +you about this that will be of any help. +The water that fills our wells comes +from an underground spring. I have heard +of a tunnel that leads to a great lake - +perhaps they are one and the same. +Unfortunately, I do not know what +would cause our water supply to be +tainted. \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/skeletonKing.json b/gamefilesd/texts/cain/quests/skeletonKing.json index 17b1fe7b..57f1bc6c 100755 --- a/gamefilesd/texts/cain/quests/skeletonKing.json +++ b/gamefilesd/texts/cain/quests/skeletonKing.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/skeletonKing.txt b/gamefilesd/texts/cain/quests/skeletonKing.txt index dd483ad1..99e82ff4 100755 --- a/gamefilesd/texts/cain/quests/skeletonKing.txt +++ b/gamefilesd/texts/cain/quests/skeletonKing.txt @@ -1 +1,10 @@ -Ahh, the story of our King, is it? The tragic fall of Leoric was a harsh blow to this land. The people always loved the King, and now they live in mortal fear of him. The question that I keep asking myself is how he could have fallen so far from the Light, as Leoric had always been the holiest of men. Only the vilest powers of Hell could so utterly destroy a man from within... \ No newline at end of file + Ahh, the story of our King, is it? The +tragic fall of Leoric was a harsh blow to +this land. The people always loved the +King, and now they live in mortal fear of +him. The question that I keep asking myself +is how he could have fallen so far from +the Light, as Leoric had always been the +holiest of men. Only the vilest powers of +Hell could so utterly destroy a man +from within... \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/theButcher.json b/gamefilesd/texts/cain/quests/theButcher.json index 3ae26edd..9e901e81 100755 --- a/gamefilesd/texts/cain/quests/theButcher.json +++ b/gamefilesd/texts/cain/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/theButcher.txt b/gamefilesd/texts/cain/quests/theButcher.txt index 4480ae39..6b26ec58 100755 --- a/gamefilesd/texts/cain/quests/theButcher.txt +++ b/gamefilesd/texts/cain/quests/theButcher.txt @@ -1 +1,9 @@ -It seems that the Archbishop Lazarus goaded many of the townsmen into venturing into the Labyrinth to find the King's missing son. He played upon their fears and whipped them into a frenzied mob. None of them were prepared for what lay within the cold earth... Lazarus abandoned them down there - left in the clutches of unspeakable horrors - to die. \ No newline at end of file +It seems that the Archbishop Lazarus +goaded many of the townsmen into +venturing into the Labyrinth to find the +King's missing son. He played upon their +fears and whipped them into a frenzied +mob. None of them were prepared for what +lay within the cold earth... Lazarus +abandoned them down there - left in the +clutches of unspeakable horrors - to die. \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/warlordOfBlood.json b/gamefilesd/texts/cain/quests/warlordOfBlood.json index 39189081..4cf8250c 100755 --- a/gamefilesd/texts/cain/quests/warlordOfBlood.json +++ b/gamefilesd/texts/cain/quests/warlordOfBlood.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/storyt18.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/cain/quests/warlordOfBlood.txt b/gamefilesd/texts/cain/quests/warlordOfBlood.txt index d95ba472..6afb25d8 100755 --- a/gamefilesd/texts/cain/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/cain/quests/warlordOfBlood.txt @@ -1,5 +1,18 @@ -I know of only one legend that speaks of such a warrior as you describe. His story is found within the ancient chronicles of the Sin War... - -Stained by a thousand years of war, blood and death, the Warlord of Blood stands upon a mountain of his tattered victims. His dark blade screams a black curse to the living; a tortured invitation to any who would stand before this Executioner of Hell. - -It is also written that although he was once a mortal who fought beside the Legion of Darkness during the Sin War, he lost his humanity to his insatiable hunger for blood. \ No newline at end of file +I know of only one legend that speaks of +such a warrior as you describe. His story +is found within the ancient chronicles of +the Sin War... + +Stained by a thousand years of war, +blood and death, the Warlord of Blood +stands upon a mountain of his tattered +victims. His dark blade screams a black +curse to the living; a tortured +invitation to any who would stand +before this Executioner of Hell. + +It is also written that although he was +once a mortal who fought beside the +Legion of Darkness during the Sin War, he +lost his humanity to his insatiable hunger +for blood. \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip1.json b/gamefilesd/texts/farnham/gossip/gossip1.json index be523bd1..293054f6 100755 --- a/gamefilesd/texts/farnham/gossip/gossip1.json +++ b/gamefilesd/texts/farnham/gossip/gossip1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk23.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip1.txt b/gamefilesd/texts/farnham/gossip/gossip1.txt index a0821908..f78d0b74 100755 --- a/gamefilesd/texts/farnham/gossip/gossip1.txt +++ b/gamefilesd/texts/farnham/gossip/gossip1.txt @@ -1 +1,5 @@ -I wanna tell ya something, `cause I know all `bout this stuff. It's my specialty! This here is the best! Theee best! That other ale ain' no good since those stupid dogs. \ No newline at end of file +I wanna tell ya sumthin', 'cause I know +all about this stuff. It's my specialty. +This here is the best... theeeee best! That +other ale ain't no good since those stupid +dogs... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip10.json b/gamefilesd/texts/farnham/gossip/gossip10.json index 4bb36ae9..5451d24c 100755 --- a/gamefilesd/texts/farnham/gossip/gossip10.json +++ b/gamefilesd/texts/farnham/gossip/gossip10.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk34.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip10.txt b/gamefilesd/texts/farnham/gossip/gossip10.txt index 53c5e08a..fa72b963 100755 --- a/gamefilesd/texts/farnham/gossip/gossip10.txt +++ b/gamefilesd/texts/farnham/gossip/gossip10.txt @@ -1 +1,6 @@ -Wirt is a kid with more problems'n even me, and I know all about problems! Listen here, that kid got sweet deal, but he's been there, you know. Lost a leg. Gotta walk around on a piece of wood. So sad, so sad. \ No newline at end of file +Wirt is a kid with more problems than even +me, and I know all about problems. Listen +here - that kid is gotta sweet deal, but +he's been there, you know? Lost a leg! +Gotta walk around on a piece of wood. +So sad, so sad... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip11.json b/gamefilesd/texts/farnham/gossip/gossip11.json index 7bba7fe4..318d491d 100755 --- a/gamefilesd/texts/farnham/gossip/gossip11.json +++ b/gamefilesd/texts/farnham/gossip/gossip11.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk35.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip11.txt b/gamefilesd/texts/farnham/gossip/gossip11.txt index d4902730..29b70bb2 100755 --- a/gamefilesd/texts/farnham/gossip/gossip11.txt +++ b/gamefilesd/texts/farnham/gossip/gossip11.txt @@ -1 +1,5 @@ -Odgen is the best man in town! I don't think his wife likes me much, but as long as she keeps tapping kegs, I' like her just fine. Seems like I've been spending more time with Odgen, you know, but he's so good to me. \ No newline at end of file +Ogden is the best man in town. I don't +think his wife likes me much, but as long as +she keeps tappin' kegs, I'll like her just fine. +Seems like I been spendin' more time with +Ogden than most, but he's so good to me... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip2.json b/gamefilesd/texts/farnham/gossip/gossip2.json index 68eb8d96..7bc4b7ee 100755 --- a/gamefilesd/texts/farnham/gossip/gossip2.json +++ b/gamefilesd/texts/farnham/gossip/gossip2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk24.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip2.txt b/gamefilesd/texts/farnham/gossip/gossip2.txt index ed44479d..20c6495a 100755 --- a/gamefilesd/texts/farnham/gossip/gossip2.txt +++ b/gamefilesd/texts/farnham/gossip/gossip2.txt @@ -1 +1,5 @@ -No one ever lis... listens to me. Somewhere, I ain 't too sure, but somewhere under the church - a whole pile `o dough!. Gleamin' and shinin', just waitin' for someone to get it. \ No newline at end of file +No one ever lis... listens to me. Somewhere +- I ain't too sure - but somewhere under +the church is a whole pile o' gold. Gleamin' +and shinin' and just waitin' for someone +to get it. \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip3.json b/gamefilesd/texts/farnham/gossip/gossip3.json index 425723e3..9808b57f 100755 --- a/gamefilesd/texts/farnham/gossip/gossip3.json +++ b/gamefilesd/texts/farnham/gossip/gossip3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk25.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip3.txt b/gamefilesd/texts/farnham/gossip/gossip3.txt index 894b04fd..03a21725 100755 --- a/gamefilesd/texts/farnham/gossip/gossip3.txt +++ b/gamefilesd/texts/farnham/gossip/gossip3.txt @@ -1 +1,7 @@ -I know you got your ideas, and I know you'r not gonna believe this, but that weapon you got there? It just ain't no good against those big brutes. Oh, I don't care what Griswold says, they can't make anything like they used to `n the old days. \ No newline at end of file +I know you gots your own ideas, and I +know you're not gonna believe this, but +that weapon you got there - it just ain't +no good against those big brutes! Oh, I +don't care what Griswold says, they +can't make anything like they used to in +the old days... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip4.json b/gamefilesd/texts/farnham/gossip/gossip4.json index 907e50c9..65a57a1c 100755 --- a/gamefilesd/texts/farnham/gossip/gossip4.json +++ b/gamefilesd/texts/farnham/gossip/gossip4.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk26.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip4.txt b/gamefilesd/texts/farnham/gossip/gossip4.txt index 282685a5..56ade578 100755 --- a/gamefilesd/texts/farnham/gossip/gossip4.txt +++ b/gamefilesd/texts/farnham/gossip/gossip4.txt @@ -1 +1,6 @@ -If I was you - and I ain't, but if I was - I'd sell all that stuff you got, and get out of here. That boy out there, he's always got somethin good, but you gotta give him some gold , or he won 't even show you what he's got. \ No newline at end of file +If I was you... and I ain't... but if I was, I'd +sell all that stuff you got and get out +of here. That boy out there... He's always +got somethin good, but you gotta give +him some gold or he won't even show you +what he's got. \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip5.json b/gamefilesd/texts/farnham/gossip/gossip5.json index 8e1874b8..d8e88284 100755 --- a/gamefilesd/texts/farnham/gossip/gossip5.json +++ b/gamefilesd/texts/farnham/gossip/gossip5.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/farnham/gossip/gossip5.txt" ], "audio": { "file": "sfx/Towners/drunk28.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip5.txt b/gamefilesd/texts/farnham/gossip/gossip5.txt index 4a025df9..b2bda280 100755 --- a/gamefilesd/texts/farnham/gossip/gossip5.txt +++ b/gamefilesd/texts/farnham/gossip/gossip5.txt @@ -1 +1,2 @@ -The gal who brings the drinks? Oh, yeah. what a pretty lady. So nice, too! \ No newline at end of file +The gal who brings the drinks? Oh, yeah, +what a pretty lady. So nice, too. \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip6.json b/gamefilesd/texts/farnham/gossip/gossip6.json index bf153585..dd150ee4 100755 --- a/gamefilesd/texts/farnham/gossip/gossip6.json +++ b/gamefilesd/texts/farnham/gossip/gossip6.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk29.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip6.txt b/gamefilesd/texts/farnham/gossip/gossip6.txt index f0714a18..9c23ab49 100755 --- a/gamefilesd/texts/farnham/gossip/gossip6.txt +++ b/gamefilesd/texts/farnham/gossip/gossip6.txt @@ -1 +1,6 @@ -Why don't that old crone do something for a change? Sure, sure, she's got stuff, but you listen to me - she's unnatural! She doesn't eat or drink, and you can't trust somebody that desn't drink at least a little. \ No newline at end of file +Why don't that old crone do somethin' +for a change. Sure, sure, she's got stuff, +but you listen to me... she's unnatural. I +ain't never seen her eat or drink - and you +can't trust somebody who doesn't drink +at least a little. \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip7.json b/gamefilesd/texts/farnham/gossip/gossip7.json index 84970b81..1552b646 100755 --- a/gamefilesd/texts/farnham/gossip/gossip7.json +++ b/gamefilesd/texts/farnham/gossip/gossip7.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk30.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip7.txt b/gamefilesd/texts/farnham/gossip/gossip7.txt index d456f3c0..1cd62f2c 100755 --- a/gamefilesd/texts/farnham/gossip/gossip7.txt +++ b/gamefilesd/texts/farnham/gossip/gossip7.txt @@ -1 +1,4 @@ -Cain isn't what he says he is. Sure, sure, he talks a good story - some of `hm are real scary, or funny - but he knows more than he knows he knows. \ No newline at end of file +Cain isn't what he says he is. Sure, sure, he +talks a good story... some of 'em are real +scary or funny... but I think he knows +more than he knows he knows. \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip8.json b/gamefilesd/texts/farnham/gossip/gossip8.json index c0550e19..09547ae8 100755 --- a/gamefilesd/texts/farnham/gossip/gossip8.json +++ b/gamefilesd/texts/farnham/gossip/gossip8.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk31.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip8.txt b/gamefilesd/texts/farnham/gossip/gossip8.txt index fcf97ae4..75e40ffc 100755 --- a/gamefilesd/texts/farnham/gossip/gossip8.txt +++ b/gamefilesd/texts/farnham/gossip/gossip8.txt @@ -1 +1,4 @@ -Griswold? Good ol' Griswold! I love him like a brother. We fought together, you know, back when we. Lazarus Lazarus Lazaruuuus! \ No newline at end of file +Griswold? Good old Griswold. I love him +like a brother! We fought together, you +know, back when... we... Lazarus... +Lazarus... Lazarus!!! \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip9.json b/gamefilesd/texts/farnham/gossip/gossip9.json index 12dc03c7..cffe00f5 100755 --- a/gamefilesd/texts/farnham/gossip/gossip9.json +++ b/gamefilesd/texts/farnham/gossip/gossip9.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk32.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/gossip/gossip9.txt b/gamefilesd/texts/farnham/gossip/gossip9.txt index c2158b41..b699469b 100755 --- a/gamefilesd/texts/farnham/gossip/gossip9.txt +++ b/gamefilesd/texts/farnham/gossip/gossip9.txt @@ -1 +1,6 @@ -I like Pepin. He really tries, you know? Listen here, you should make sure you get to know him. Good fella like him, with people always wantin ' help. Hey, I guess that'd be kinda like you are, hero. I was a hero too, ya know. \ No newline at end of file +Hehehe, I like Pepin. He really tries, you +know. Listen here, you should make sure +you get to know him. Good fella like that +with people always wantin' help. Hey, I +guess that would be kinda like you, huh +hero? I was a hero too... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/anvilOfFury.json b/gamefilesd/texts/farnham/quests/anvilOfFury.json index acd84928..8aa295b9 100755 --- a/gamefilesd/texts/farnham/quests/anvilOfFury.json +++ b/gamefilesd/texts/farnham/quests/anvilOfFury.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/farnham/quests/anvilOfFury.txt" ], "audio": { "file": "sfx/Towners/drunk14.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/anvilOfFury.txt b/gamefilesd/texts/farnham/quests/anvilOfFury.txt index 6ac00541..36c3e5b0 100755 --- a/gamefilesd/texts/farnham/quests/anvilOfFury.txt +++ b/gamefilesd/texts/farnham/quests/anvilOfFury.txt @@ -1 +1,3 @@ -Griswold can't sell his anvil. What will he do then? And I'd be angry too if someone took my anvil! \ No newline at end of file +Griswold can't sell his anvil. What will +he do then? And I'd be angry too if +someone took my anvil! \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/archbishopLazarus.json b/gamefilesd/texts/farnham/quests/archbishopLazarus.json index 5e063936..2318dae3 100755 --- a/gamefilesd/texts/farnham/quests/archbishopLazarus.json +++ b/gamefilesd/texts/farnham/quests/archbishopLazarus.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/archbishopLazarus.txt b/gamefilesd/texts/farnham/quests/archbishopLazarus.txt index 50d82459..cab07e41 100755 --- a/gamefilesd/texts/farnham/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/farnham/quests/archbishopLazarus.txt @@ -1 +1,5 @@ -They stab, then bite, then they're all around you. Liar! Liar! They're all dead! Dead! Do you hear me? They just keep falling and falling... their blood spilling out all over the floor... All his fault... \ No newline at end of file +They stab, then bite, then they're all +around you. Liar! LIAR! They're all dead! +Dead! Do you hear me? They just keep +falling and falling... their blood spilling +out all over the floor... all his fault... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/arkainesValor.json b/gamefilesd/texts/farnham/quests/arkainesValor.json index b8b070d2..a57b926a 100755 --- a/gamefilesd/texts/farnham/quests/arkainesValor.json +++ b/gamefilesd/texts/farnham/quests/arkainesValor.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "16", "texts/farnham/quests/arkainesValor.txt" ], "audio": { "file": "sfx/Towners/drunk06.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/blackMushroom.json b/gamefilesd/texts/farnham/quests/blackMushroom.json index 08fded80..a7502a57 100755 --- a/gamefilesd/texts/farnham/quests/blackMushroom.json +++ b/gamefilesd/texts/farnham/quests/blackMushroom.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk20.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/blackMushroom.txt b/gamefilesd/texts/farnham/quests/blackMushroom.txt index 199a2fce..7854c71a 100755 --- a/gamefilesd/texts/farnham/quests/blackMushroom.txt +++ b/gamefilesd/texts/farnham/quests/blackMushroom.txt @@ -1 +1,3 @@ -Ogden mixes a mean Black Mushroom, but I get sick if I drink that. Listen, listen... Here's the secret - moderation is the key! \ No newline at end of file +Ogden mixes a MEAN black mushroom, but I +get sick if I drink that. Listen, listen... +here's the secret - moderation is the key! \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/chamberOfBone.json b/gamefilesd/texts/farnham/quests/chamberOfBone.json index 3d4d4362..649b725d 100755 --- a/gamefilesd/texts/farnham/quests/chamberOfBone.json +++ b/gamefilesd/texts/farnham/quests/chamberOfBone.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk07.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/chamberOfBone.txt b/gamefilesd/texts/farnham/quests/chamberOfBone.txt index a34d60b4..16561f68 100755 --- a/gamefilesd/texts/farnham/quests/chamberOfBone.txt +++ b/gamefilesd/texts/farnham/quests/chamberOfBone.txt @@ -1 +1,6 @@ -Okay, so listen. There's this Chamber of Wood, see. And his wife, you know - her - tells the tree... cause you gotta wait. Then I says, that might work against him, but if you think I'm gonna pay for this... You... uh... yeah. \ No newline at end of file +Okay, so listen. There's this chamber of +wood, see. And his wife, you know - her - +tells the tree... cause you gotta wait. +Then I says, that might work against him, +but if you think I'm gonna PAY for this... +you... uh... yeah. \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/hallsOfTheBlind.json b/gamefilesd/texts/farnham/quests/hallsOfTheBlind.json index fb7a5b53..3526348f 100755 --- a/gamefilesd/texts/farnham/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/farnham/quests/hallsOfTheBlind.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/farnham/quests/hallsOfTheBlind.txt" ], "audio": { "file": "sfx/Towners/drunk12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/hallsOfTheBlind.txt b/gamefilesd/texts/farnham/quests/hallsOfTheBlind.txt index 8d0b93b4..0f6cd70a 100755 --- a/gamefilesd/texts/farnham/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/farnham/quests/hallsOfTheBlind.txt @@ -1 +1,2 @@ -Look here... that's pretty funny, huh? Get it? Blind - look here? \ No newline at end of file +Look here... that's pretty funny, huh? Get +it? Blind - look here? \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/lachdanan.json b/gamefilesd/texts/farnham/quests/lachdanan.json index 8bb820d9..33873ae6 100755 --- a/gamefilesd/texts/farnham/quests/lachdanan.json +++ b/gamefilesd/texts/farnham/quests/lachdanan.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/lachdanan.txt b/gamefilesd/texts/farnham/quests/lachdanan.txt index 8f46ed67..12a7b547 100755 --- a/gamefilesd/texts/farnham/quests/lachdanan.txt +++ b/gamefilesd/texts/farnham/quests/lachdanan.txt @@ -1 +1,4 @@ -Lachdanan is dead. Everybody knows that, and you can't fool me into thinking any other way. You can't talk to the dead. I know! \ No newline at end of file + Lachdanan is dead. Everybody knows +that, and you can't fool me into thinking +any other way. You can't talk to the +dead. I know! \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/magicRock.json b/gamefilesd/texts/farnham/quests/magicRock.json index 760eb855..c2ffd404 100755 --- a/gamefilesd/texts/farnham/quests/magicRock.json +++ b/gamefilesd/texts/farnham/quests/magicRock.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk19.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/magicRock.txt b/gamefilesd/texts/farnham/quests/magicRock.txt index 1dee68e3..7cd546dd 100755 --- a/gamefilesd/texts/farnham/quests/magicRock.txt +++ b/gamefilesd/texts/farnham/quests/magicRock.txt @@ -1 +1,4 @@ -I used to have a nice ring; it was a really expensive one, with blue and green and red and silver. Don't remember what happened to it, though. I really miss that ring... \ No newline at end of file +I used to have a nice ring; it was a really +expensive one, with blue and green and red +and silver. Don't remember what happened +to it, though. I really miss that ring... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/ogdensSign.json b/gamefilesd/texts/farnham/quests/ogdensSign.json index 0cd9b557..87ab7cb9 100755 --- a/gamefilesd/texts/farnham/quests/ogdensSign.json +++ b/gamefilesd/texts/farnham/quests/ogdensSign.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/ogdensSign.txt b/gamefilesd/texts/farnham/quests/ogdensSign.txt index 1c83c06e..529da7d2 100755 --- a/gamefilesd/texts/farnham/quests/ogdensSign.txt +++ b/gamefilesd/texts/farnham/quests/ogdensSign.txt @@ -1 +1,6 @@ -You know what I think? Somebody took that sign, and they gonna want lots of money for it. If I was Ogden... and I'm not, but if I was... I'd just buy a new sign with some pretty drawing on it. Maybe a nice mug of ale or a piece of cheese... \ No newline at end of file +You know what I think? Somebody took +that sign, and they gonna want lots of +money for it. If I was Ogden... and I'm not, +but if I was... I'd just buy a new sign with +some pretty drawing on it. Maybe a nice +mug of ale or a piece of cheese... \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/poisonedWater.json b/gamefilesd/texts/farnham/quests/poisonedWater.json index 9258714b..c558da02 100755 --- a/gamefilesd/texts/farnham/quests/poisonedWater.json +++ b/gamefilesd/texts/farnham/quests/poisonedWater.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "12", "texts/farnham/quests/poisonedWater.txt" ], "audio": { "file": "sfx/Towners/drunk04.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/skeletonKing.json b/gamefilesd/texts/farnham/quests/skeletonKing.json index 969a79ae..97d62c05 100755 --- a/gamefilesd/texts/farnham/quests/skeletonKing.json +++ b/gamefilesd/texts/farnham/quests/skeletonKing.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/skeletonKing.txt b/gamefilesd/texts/farnham/quests/skeletonKing.txt index 404555ea..d8dadee4 100755 --- a/gamefilesd/texts/farnham/quests/skeletonKing.txt +++ b/gamefilesd/texts/farnham/quests/skeletonKing.txt @@ -1 +1,3 @@ -I don't care about that. Listen, no skeleton is gonna be MY king. Leoric is King. King, so you hear me? HAIL TO THE KING! \ No newline at end of file +I don't care about that. Listen, no +skeleton is gonna be MY king. Leoric is King. +King, so you hear me? HAIL TO THE KING! \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/theButcher.json b/gamefilesd/texts/farnham/quests/theButcher.json index 94a4a1f1..87c74754 100755 --- a/gamefilesd/texts/farnham/quests/theButcher.json +++ b/gamefilesd/texts/farnham/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/theButcher.txt b/gamefilesd/texts/farnham/quests/theButcher.txt index cc9f79c0..1b201117 100755 --- a/gamefilesd/texts/farnham/quests/theButcher.txt +++ b/gamefilesd/texts/farnham/quests/theButcher.txt @@ -1 +1,5 @@ -Big! Big cleaver killing all my friends. Couldn't stop him, had to run away, couldn't save them. Trapped in a room with so many bodies... so many friends... NOOOOOOOOOO! \ No newline at end of file +Big! Big cleaver killing all my friends. +Couldn't stop him, had to run away, +couldn't save them. Trapped in a room +with so many bodies... so many friends... +NOOOOOOOOOO! \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/warlordOfBlood.json b/gamefilesd/texts/farnham/quests/warlordOfBlood.json index 25455422..7135d56e 100755 --- a/gamefilesd/texts/farnham/quests/warlordOfBlood.json +++ b/gamefilesd/texts/farnham/quests/warlordOfBlood.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/drunk17.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/farnham/quests/warlordOfBlood.txt b/gamefilesd/texts/farnham/quests/warlordOfBlood.txt index 8cb9e14e..8ce5964f 100755 --- a/gamefilesd/texts/farnham/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/farnham/quests/warlordOfBlood.txt @@ -1 +1,5 @@ -Always you gotta talk about blood? What about flowers, and sunshine, and that pretty girl that brings the drinks. Listen here, friend - you're obsessive, you know that? \ No newline at end of file +Always you gotta talk about Blood? +What about flowers, and sunshine, and +that pretty girl that brings the drinks. +Listen here, friend - you're obsessive, you +know that? \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip1.json b/gamefilesd/texts/gillian/gossip/gossip1.json index 59f06f94..358d84eb 100755 --- a/gamefilesd/texts/gillian/gossip/gossip1.json +++ b/gamefilesd/texts/gillian/gossip/gossip1.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/gossip/gossip1.txt" ], "audio": { "file": "sfx/Towners/bmaid32.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip1.txt b/gamefilesd/texts/gillian/gossip/gossip1.txt index 2d347841..ad1b5f7d 100755 --- a/gamefilesd/texts/gillian/gossip/gossip1.txt +++ b/gamefilesd/texts/gillian/gossip/gossip1.txt @@ -1 +1,4 @@ -My grandmother had a dream that you would come and talk to me. She has visions, you know and can see into the future. \ No newline at end of file +My grandmother had a dream that you +would come and talk to me. She has +visions, you know and can see into the +future. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip2.json b/gamefilesd/texts/gillian/gossip/gossip2.json index 0f7ac87a..7cf1404f 100755 --- a/gamefilesd/texts/gillian/gossip/gossip2.json +++ b/gamefilesd/texts/gillian/gossip/gossip2.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/gossip/gossip2.txt" ], "audio": { "file": "sfx/Towners/bmaid33.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip2.txt b/gamefilesd/texts/gillian/gossip/gossip2.txt index 9efbe5b7..b94ae3bc 100755 --- a/gamefilesd/texts/gillian/gossip/gossip2.txt +++ b/gamefilesd/texts/gillian/gossip/gossip2.txt @@ -1 +1,7 @@ -The woman at the edge of town is a witch! She seems nice enough, and her name, Adria, is very pleasing to the ear, but I am very afraid of her. It would take someone quite brave, like you, to see what she is doing out there. \ No newline at end of file +The woman at the edge of town is a +witch! She seems nice enough, and her name, +Adria, is very pleasing to the ear, but I am +very afraid of her. + +It would take someone quite brave, like +you, to see what she is doing out there. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip3.json b/gamefilesd/texts/gillian/gossip/gossip3.json index f79cc20f..a230b0b1 100755 --- a/gamefilesd/texts/gillian/gossip/gossip3.json +++ b/gamefilesd/texts/gillian/gossip/gossip3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bmaid34.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip3.txt b/gamefilesd/texts/gillian/gossip/gossip3.txt index 6333cb0e..ca3eeaeb 100755 --- a/gamefilesd/texts/gillian/gossip/gossip3.txt +++ b/gamefilesd/texts/gillian/gossip/gossip3.txt @@ -1 +1,7 @@ -Our Blacksmith is a point of pride to the people of Tristram. Not only is he a master craftsman who has won many contests within his guild, but he received praises from our King Leoric himself - may his soul rest in peace. Griswold is also a great hero; just ask Cain. \ No newline at end of file +Our Blacksmith is a point of pride to the +people of Tristram. Not only is he a +master craftsman who has won many +contests within his guild, but he received +praises from our King Leoric himself - may +his soul rest in peace. Griswold is also a +great hero; just ask Cain. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip4.json b/gamefilesd/texts/gillian/gossip/gossip4.json index adf21f74..47e81d7f 100755 --- a/gamefilesd/texts/gillian/gossip/gossip4.json +++ b/gamefilesd/texts/gillian/gossip/gossip4.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/gossip/gossip4.txt" ], "audio": { "file": "sfx/Towners/bmaid35.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip4.txt b/gamefilesd/texts/gillian/gossip/gossip4.txt index f8ed9ebf..8538d53a 100755 --- a/gamefilesd/texts/gillian/gossip/gossip4.txt +++ b/gamefilesd/texts/gillian/gossip/gossip4.txt @@ -1 +1,4 @@ -Cain has been the storyteller of Tristram for as long as I can remember. He knows so much, and can tell you just about anything about almost everything. \ No newline at end of file +Cain has been the storyteller of Tristram +for as long as I can remember. He knows so +much, and can tell you just about +anything about almost everything. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip5.json b/gamefilesd/texts/gillian/gossip/gossip5.json index 57b2d66f..f3fa87cb 100755 --- a/gamefilesd/texts/gillian/gossip/gossip5.json +++ b/gamefilesd/texts/gillian/gossip/gossip5.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/gossip/gossip5.txt" ], "audio": { "file": "sfx/Towners/bmaid36.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip5.txt b/gamefilesd/texts/gillian/gossip/gossip5.txt index 6fa7e192..45911800 100755 --- a/gamefilesd/texts/gillian/gossip/gossip5.txt +++ b/gamefilesd/texts/gillian/gossip/gossip5.txt @@ -1 +1,8 @@ -Farnham is a drunkard who fills his belly with ale and everyone else's ears with nonsense. I know that both Pepin and Ogden feel sympathy for him, but I get so frustrated watching him slip farther and farther into a befuddled stupor every night. \ No newline at end of file +Farnham is a drunkard who fills his belly +with ale and everyone else's ears with +nonsense. + +I know that both Pepin and Ogden feel +sympathy for him, but I get so frustrated +watching him slip farther and farther +into a befuddled stupor every night. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip6.json b/gamefilesd/texts/gillian/gossip/gossip6.json index 3b2c2d43..fedc82a5 100755 --- a/gamefilesd/texts/gillian/gossip/gossip6.json +++ b/gamefilesd/texts/gillian/gossip/gossip6.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bmaid37.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip6.txt b/gamefilesd/texts/gillian/gossip/gossip6.txt index b163f480..f4b798e2 100755 --- a/gamefilesd/texts/gillian/gossip/gossip6.txt +++ b/gamefilesd/texts/gillian/gossip/gossip6.txt @@ -1 +1,7 @@ -Pepin saved my grandmother's life, and I know that I can never repay him for that. His ability to heal any sickness is more powerful than the mightiest sword and more mysterious than any spell you can name. If you ever are in need of healing, Pepin can help you. \ No newline at end of file +Pepin saved my grandmother's life, and I +know that I can never repay him for that. +His ability to heal any sickness is more +powerful than the mightiest sword and +more mysterious than any spell you can +name. If you ever are in need of healing, +Pepin can help you. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip7.json b/gamefilesd/texts/gillian/gossip/gossip7.json index 5a6ef7b9..f8a7e0bc 100755 --- a/gamefilesd/texts/gillian/gossip/gossip7.json +++ b/gamefilesd/texts/gillian/gossip/gossip7.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bmaid39.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip7.txt b/gamefilesd/texts/gillian/gossip/gossip7.txt index 11298a78..2efb3b64 100755 --- a/gamefilesd/texts/gillian/gossip/gossip7.txt +++ b/gamefilesd/texts/gillian/gossip/gossip7.txt @@ -1 +1,10 @@ -I grew up with Wirt's mother, Canace. Although she was only slightly hurt when those hideous creatures stole him, she never recovered. I think she died of a broken heart. Wirt has become a mean-spirited youngster, looking only to profit from the sweat of others. I know that he suffered and has seen horrors that I cannot even imagine, but some of that darkness hangs over him still. \ No newline at end of file +I grew up with Wirt's mother, Canace. +Although she was only slightly hurt +when those hideous creatures stole him, +she never recovered. I think she died of a +broken heart. Wirt has become a +mean-spirited youngster, looking only to +profit from the sweat of others. I know +that he suffered and has seen horrors +that I cannot even imagine, but some of +that darkness hangs over him still. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip8.json b/gamefilesd/texts/gillian/gossip/gossip8.json index 4f152ec3..b3b7a039 100755 --- a/gamefilesd/texts/gillian/gossip/gossip8.json +++ b/gamefilesd/texts/gillian/gossip/gossip8.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bmaid40.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/gossip/gossip8.txt b/gamefilesd/texts/gillian/gossip/gossip8.txt index 5ffedbec..df1257f3 100755 --- a/gamefilesd/texts/gillian/gossip/gossip8.txt +++ b/gamefilesd/texts/gillian/gossip/gossip8.txt @@ -1 +1,7 @@ -Ogden and his wife have taken me and my grandmother into their home and have even let me earn a few gold pieces by working at the inn. I owe so much to them, and hope one day to leave this place and help them start a grand hotel in the east. \ No newline at end of file +Ogden and his wife have taken me and my +grandmother into their home and have +even let me earn a few gold pieces by +working at the inn. I owe so much to +them, and hope one day to leave this +place and help them start a grand hotel in +the east. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/anvilOfFury.json b/gamefilesd/texts/gillian/quests/anvilOfFury.json index b31b7211..724b91e7 100755 --- a/gamefilesd/texts/gillian/quests/anvilOfFury.json +++ b/gamefilesd/texts/gillian/quests/anvilOfFury.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bmaid12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/anvilOfFury.txt b/gamefilesd/texts/gillian/quests/anvilOfFury.txt index 6a16dea5..a70b97f6 100755 --- a/gamefilesd/texts/gillian/quests/anvilOfFury.txt +++ b/gamefilesd/texts/gillian/quests/anvilOfFury.txt @@ -1 +1,8 @@ -Griswold's father used to tell some of us when we were growing up about a giant anvil that was used to make mighty weapons. He said that when a hammer was struck upon this anvil, the ground would shake with a great fury. Whenever the Earth moves, I always remember that story... \ No newline at end of file +Griswold's father used to tell some of us +when we were growing up about a giant +anvil that was used to make mighty +weapons. He said that when a hammer was +struck upon this anvil, the ground +would shake with a great fury. Whenever +the earth moves, I always remember that +story. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/archbishopLazarus.json b/gamefilesd/texts/gillian/quests/archbishopLazarus.json index ea83d25a..edc919fa 100755 --- a/gamefilesd/texts/gillian/quests/archbishopLazarus.json +++ b/gamefilesd/texts/gillian/quests/archbishopLazarus.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bmaid03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/archbishopLazarus.txt b/gamefilesd/texts/gillian/quests/archbishopLazarus.txt index e206c950..6dcee8b1 100755 --- a/gamefilesd/texts/gillian/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/gillian/quests/archbishopLazarus.txt @@ -1 +1,6 @@ -I remember Lazarus as being a very kind and giving man. He spoke at my mother's funeral, and was supportive of my grandmother and myself in a very troubled time. I pray every night that somehow, he is still alive and safe. \ No newline at end of file +I remember Lazarus as being a very kind +and giving man. He spoke at my mother's +funeral, and was supportive of my +grandmother and myself in a very +troubled time. I pray every night that +somehow, he is still alive and safe. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/arkainesValor.json b/gamefilesd/texts/gillian/quests/arkainesValor.json index 6ff2023a..1c800750 100755 --- a/gamefilesd/texts/gillian/quests/arkainesValor.json +++ b/gamefilesd/texts/gillian/quests/arkainesValor.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/arkainesValor.txt" ], "audio": { "file": "sfx/Towners/bmaid13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/arkainesValor.txt b/gamefilesd/texts/gillian/quests/arkainesValor.txt index a1e65549..170cf7ce 100755 --- a/gamefilesd/texts/gillian/quests/arkainesValor.txt +++ b/gamefilesd/texts/gillian/quests/arkainesValor.txt @@ -1 +1,4 @@ -The story of the magic armor called Valor is something I often heard the boys talk about. You had better ask one of the men in the village. \ No newline at end of file +The story of the magic armor called +Valor is something I often heard the boys +talk about. You had better ask one of +the men in the village. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/blackMushroom.json b/gamefilesd/texts/gillian/quests/blackMushroom.json index 37e9fa68..c6fdefc3 100755 --- a/gamefilesd/texts/gillian/quests/blackMushroom.json +++ b/gamefilesd/texts/gillian/quests/blackMushroom.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "16", "texts/gillian/quests/blackMushroom.txt" ], "audio": { "file": "sfx/Towners/bmaid19.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/blackMushroom.txt b/gamefilesd/texts/gillian/quests/blackMushroom.txt index 4bbe0920..a62d7308 100755 --- a/gamefilesd/texts/gillian/quests/blackMushroom.txt +++ b/gamefilesd/texts/gillian/quests/blackMushroom.txt @@ -1 +1,3 @@ -I think Ogden might have some mushrooms in the storage cellar. Why don't you ask him? \ No newline at end of file +I think Ogden might have some mushrooms +in the storage cellar. Why don't you ask +him? \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/chamberOfBone.json b/gamefilesd/texts/gillian/quests/chamberOfBone.json index b7d99f7a..af097243 100755 --- a/gamefilesd/texts/gillian/quests/chamberOfBone.json +++ b/gamefilesd/texts/gillian/quests/chamberOfBone.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/chamberOfBone.txt" ], "audio": { "file": "sfx/Towners/bmaid06.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/chamberOfBone.txt b/gamefilesd/texts/gillian/quests/chamberOfBone.txt index 862dbc1c..f0a82794 100755 --- a/gamefilesd/texts/gillian/quests/chamberOfBone.txt +++ b/gamefilesd/texts/gillian/quests/chamberOfBone.txt @@ -1 +1,3 @@ -I am afraid that I haven't heard anything about that. Perhaps Cain the storyteller could be of some help. \ No newline at end of file +I am afraid that I haven't heard anything +about that. Perhaps Cain the Storyteller +could be of some help. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/hallsOfTheBlind.json b/gamefilesd/texts/gillian/quests/hallsOfTheBlind.json index 1dca744e..98487388 100755 --- a/gamefilesd/texts/gillian/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/gillian/quests/hallsOfTheBlind.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/hallsOfTheBlind.txt" ], "audio": { "file": "sfx/Towners/bmaid10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/hallsOfTheBlind.txt b/gamefilesd/texts/gillian/quests/hallsOfTheBlind.txt index 56439904..6af9cf04 100755 --- a/gamefilesd/texts/gillian/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/gillian/quests/hallsOfTheBlind.txt @@ -1 +1,5 @@ -If you have questions about blindness, you should talk to Pepin. I know that he gave my grandmother a potion that helped clear her vision, so maybe he can help you, too. \ No newline at end of file +If you have questions about blindness, +you should talk to Pepin. I know that he +gave my grandmother a potion that +helped clear her vision, so maybe he can +help you, too. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/lachdanan.json b/gamefilesd/texts/gillian/quests/lachdanan.json index b576b412..f94a7d4d 100755 --- a/gamefilesd/texts/gillian/quests/lachdanan.json +++ b/gamefilesd/texts/gillian/quests/lachdanan.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "16", "texts/gillian/quests/lachdanan.txt" ], "audio": { "file": "sfx/Towners/bmaid11.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/lachdanan.txt b/gamefilesd/texts/gillian/quests/lachdanan.txt index 4cc4c45a..3d3dda07 100755 --- a/gamefilesd/texts/gillian/quests/lachdanan.txt +++ b/gamefilesd/texts/gillian/quests/lachdanan.txt @@ -1 +1,3 @@ -I've never heard of a Lachdanan before. I'm sorry, but I don't think that I can be of much help to you. \ No newline at end of file +I've never heard of a Lachdanan before. I'm +sorry, but I don't think that I can be of +much help to you. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/magicRock.json b/gamefilesd/texts/gillian/quests/magicRock.json index b2e9cdb2..72553763 100755 --- a/gamefilesd/texts/gillian/quests/magicRock.json +++ b/gamefilesd/texts/gillian/quests/magicRock.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/magicRock.txt" ], "audio": { "file": "sfx/Towners/bmaid18.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/magicRock.txt b/gamefilesd/texts/gillian/quests/magicRock.txt index 7463d5a5..814c358a 100755 --- a/gamefilesd/texts/gillian/quests/magicRock.txt +++ b/gamefilesd/texts/gillian/quests/magicRock.txt @@ -1,3 +1,9 @@ -Well, a caravan of some very important people did stop here, but that was quite a while ago. They had strange accents and were starting on a long journey, as I recall. +Well, a caravan of some very important +people did stop here, but that was quite a +while ago. They had strange accents and +were starting on a long journey, as I +recall. -I don't see how you could hope to find anything that they would have been carrying. \ No newline at end of file +I don't see how you could hope to find +anything that they would have been +carrying. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/ogdensSign.json b/gamefilesd/texts/gillian/quests/ogdensSign.json index 31e51b97..44541e55 100755 --- a/gamefilesd/texts/gillian/quests/ogdensSign.json +++ b/gamefilesd/texts/gillian/quests/ogdensSign.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/ogdensSign.txt" ], "audio": { "file": "sfx/Towners/bmaid02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/poisonedWater.json b/gamefilesd/texts/gillian/quests/poisonedWater.json index 18527e9c..211d373d 100755 --- a/gamefilesd/texts/gillian/quests/poisonedWater.json +++ b/gamefilesd/texts/gillian/quests/poisonedWater.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/poisonedWater.txt" ], "audio": { "file": "sfx/Towners/bmaid04.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/poisonedWater.txt b/gamefilesd/texts/gillian/quests/poisonedWater.txt index e2ec6253..033e8d7f 100755 --- a/gamefilesd/texts/gillian/quests/poisonedWater.txt +++ b/gamefilesd/texts/gillian/quests/poisonedWater.txt @@ -1 +1,4 @@ -My grandmother is very weak, and Garda says that we cannot drink the water from the wells. Please, can you do something to help us? \ No newline at end of file +My grandmother is very weak, and Garda +says that we cannot drink the water +from the wells. Please, can you do +something to help us? \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/skeletonKing.json b/gamefilesd/texts/gillian/quests/skeletonKing.json index bce92ecb..fff942c0 100755 --- a/gamefilesd/texts/gillian/quests/skeletonKing.json +++ b/gamefilesd/texts/gillian/quests/skeletonKing.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/skeletonKing.txt" ], "audio": { "file": "sfx/Towners/bmaid01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/skeletonKing.txt b/gamefilesd/texts/gillian/quests/skeletonKing.txt index 8ce04a73..0a420018 100755 --- a/gamefilesd/texts/gillian/quests/skeletonKing.txt +++ b/gamefilesd/texts/gillian/quests/skeletonKing.txt @@ -1 +1,4 @@ -I don't like to think about how the King died. I like to remember him for the kind and just ruler that he was. His death was so sad and seemed very wrong, somehow. \ No newline at end of file +I don't like to think about how the King +died. I like to remember him for the kind and +just ruler that he was. His death was so +sad and seemed very wrong, somehow. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/theButcher.json b/gamefilesd/texts/gillian/quests/theButcher.json index e2a6cf57..b42f3bd7 100755 --- a/gamefilesd/texts/gillian/quests/theButcher.json +++ b/gamefilesd/texts/gillian/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bmaid08.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/theButcher.txt b/gamefilesd/texts/gillian/quests/theButcher.txt index 125210f0..010c62df 100755 --- a/gamefilesd/texts/gillian/quests/theButcher.txt +++ b/gamefilesd/texts/gillian/quests/theButcher.txt @@ -1 +1,4 @@ -When Farnham said something about a butcher killing people, I immediately discounted it. But since you brought it up, maybe it is true. \ No newline at end of file +When Farnham said something about a +butcher killing people, I immediately +discounted it. But since you brought it +up, maybe it is true. \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/warlordOfBlood.json b/gamefilesd/texts/gillian/quests/warlordOfBlood.json index 9b44fe13..ed5baa62 100755 --- a/gamefilesd/texts/gillian/quests/warlordOfBlood.json +++ b/gamefilesd/texts/gillian/quests/warlordOfBlood.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/gillian/quests/warlordOfBlood.txt" ], "audio": { "file": "sfx/Towners/bmaid16.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/gillian/quests/warlordOfBlood.txt b/gamefilesd/texts/gillian/quests/warlordOfBlood.txt index 8ce9aad8..5dd21569 100755 --- a/gamefilesd/texts/gillian/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/gillian/quests/warlordOfBlood.txt @@ -1 +1,4 @@ -If you are to battle such a fierce opponent, may Light be your guide and your defender. I will keep you in my thoughts. \ No newline at end of file +If you are to battle such a fierce +opponent, may Light be your guide and +your defender. I will keep you in my +thoughts. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip1.json b/gamefilesd/texts/griswold/gossip/gossip1.json index f7fea98e..ce3cc0f7 100755 --- a/gamefilesd/texts/griswold/gossip/gossip1.json +++ b/gamefilesd/texts/griswold/gossip/gossip1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith45.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip1.txt b/gamefilesd/texts/griswold/gossip/gossip1.txt index 46b9479b..92d9e6be 100755 --- a/gamefilesd/texts/griswold/gossip/gossip1.txt +++ b/gamefilesd/texts/griswold/gossip/gossip1.txt @@ -1 +1,6 @@ -If you're looking for a good weapon, let me show this to you. Take your basic blunt weapon, such as a mace. Works like a charm against most of those undying horrors down there, and there's nothing better to shatter skinny little skeletons! \ No newline at end of file +If you're looking for a good weapon, let +me show this to you. Take your basic +blunt weapon, such as a mace. Works like +a charm against most of those undying +horrors down there, and there's nothing +better to shatter skinny little skeletons! \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip10.json b/gamefilesd/texts/griswold/gossip/gossip10.json index 9f2c1653..dbb30ba1 100755 --- a/gamefilesd/texts/griswold/gossip/gossip10.json +++ b/gamefilesd/texts/griswold/gossip/gossip10.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith55.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip10.txt b/gamefilesd/texts/griswold/gossip/gossip10.txt index 3380ef10..4706b1a6 100755 --- a/gamefilesd/texts/griswold/gossip/gossip10.txt +++ b/gamefilesd/texts/griswold/gossip/gossip10.txt @@ -1 +1,9 @@ -That lad is going to get himself into serious trouble... or I guess I should say, again. I've tried to interest him in working here and learning an honest trade, but he prefers the high profits of dealing in goods of dubious origin. I cannot hold that against him after what happened to him, but I do wish he would at least be careful. \ No newline at end of file +That lad is going to get himself into +serious trouble... or I guess I should say, +again. I've tried to interest him in working +here and learning an honest trade, but he +prefers the high profits of dealing in goods +of dubious origin. I cannot hold that +against him after what happened to him, +but I do wish he would at least be +careful. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip11.json b/gamefilesd/texts/griswold/gossip/gossip11.json index b118e47e..0e6f73cd 100755 --- a/gamefilesd/texts/griswold/gossip/gossip11.json +++ b/gamefilesd/texts/griswold/gossip/gossip11.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith56.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip11.txt b/gamefilesd/texts/griswold/gossip/gossip11.txt index e2164fe3..f275062d 100755 --- a/gamefilesd/texts/griswold/gossip/gossip11.txt +++ b/gamefilesd/texts/griswold/gossip/gossip11.txt @@ -1 +1,12 @@ -The Innkeeper has little business and no real way of turning a profit. He manages to make ends meet by providing food and lodging for those who occasionally drift through the village, but they are as likely to sneak off into the night as they are to pay him. If it weren't for the stores of grains and dried meats he kept in his cellar, why, most of us would have starved during that first year when the entire countryside was overrun by demons. \ No newline at end of file +The Innkeeper has little business and no +real way of turning a profit. He manages +to make ends meet by providing food and +lodging for those who occasionally drift +through the village, but they are as +likely to sneak off into the night as they +are to pay him. If it weren't for the stores +of grains and dried meats he kept in his +cellar, why, most of us would have +starved during that first year when the +entire countryside was overrun by +demons. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip2.json b/gamefilesd/texts/griswold/gossip/gossip2.json index 43868c7c..d4a24ee9 100755 --- a/gamefilesd/texts/griswold/gossip/gossip2.json +++ b/gamefilesd/texts/griswold/gossip/gossip2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith46.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip2.txt b/gamefilesd/texts/griswold/gossip/gossip2.txt index e14f3b67..fc9c1484 100755 --- a/gamefilesd/texts/griswold/gossip/gossip2.txt +++ b/gamefilesd/texts/griswold/gossip/gossip2.txt @@ -1 +1,6 @@ -The axe? Aye, that's a good weapon, balanced against any foe. Look how it cleaves the air, and then imagine a nice fat demon head in its path. Keep in mind, however, that it is slow to swing - but talk about dealing a heavy blow! \ No newline at end of file +The axe? Aye, that's a good weapon, +balanced against any foe. Look how it +cleaves the air, and then imagine a nice +fat demon head in its path. Keep in mind, +however, that it is slow to swing - but +talk about dealing a heavy blow! \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip3.json b/gamefilesd/texts/griswold/gossip/gossip3.json index 7f794a28..d20f7d36 100755 --- a/gamefilesd/texts/griswold/gossip/gossip3.json +++ b/gamefilesd/texts/griswold/gossip/gossip3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith47.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip3.txt b/gamefilesd/texts/griswold/gossip/gossip3.txt index 9c99cae4..c1811cf8 100755 --- a/gamefilesd/texts/griswold/gossip/gossip3.txt +++ b/gamefilesd/texts/griswold/gossip/gossip3.txt @@ -1 +1,7 @@ -Look at that edge, that balance. A sword in the right hands, and against the right foe, is the master of all weapons. Its keen blade finds little to hack or pierce on the undead, but against a living, breathing enemy, a sword will better slice their flesh! \ No newline at end of file +Look at that edge, that balance. A sword +in the right hands, and against the right +foe, is the master of all weapons. Its keen +blade finds little to hack or pierce on the +undead, but against a living, breathing +enemy, a sword will better slice their +flesh! \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip4.json b/gamefilesd/texts/griswold/gossip/gossip4.json index ef779fef..6602149a 100755 --- a/gamefilesd/texts/griswold/gossip/gossip4.json +++ b/gamefilesd/texts/griswold/gossip/gossip4.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/gossip/gossip4.txt" ], "audio": { "file": "sfx/Towners/bsmith48.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip4.txt b/gamefilesd/texts/griswold/gossip/gossip4.txt index 19b04943..6ecc4ead 100755 --- a/gamefilesd/texts/griswold/gossip/gossip4.txt +++ b/gamefilesd/texts/griswold/gossip/gossip4.txt @@ -1 +1,5 @@ -Your weapons and armor will show the signs of your struggles against the Darkness. If you bring them to me, with a bit of work and a hot forge, I can restore them to top fighting form. \ No newline at end of file +Your weapons and armor will show the +signs of your struggles against the +Darkness. If you bring them to me, with a +bit of work and a hot forge, I can restore +them to top fighting form. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip5.json b/gamefilesd/texts/griswold/gossip/gossip5.json index 8468e248..0d0af077 100755 --- a/gamefilesd/texts/griswold/gossip/gossip5.json +++ b/gamefilesd/texts/griswold/gossip/gossip5.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith49.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip5.txt b/gamefilesd/texts/griswold/gossip/gossip5.txt index 6cd08c9c..5423653a 100755 --- a/gamefilesd/texts/griswold/gossip/gossip5.txt +++ b/gamefilesd/texts/griswold/gossip/gossip5.txt @@ -1 +1,8 @@ -While I have to practically smuggle in the metals and tools I need from caravans that skirt the edges of our damned town, that witch, Adria, always seems to get whatever she needs. If I knew even the smallest bit about how to harness magic as she did, I could make some truly incredible things. \ No newline at end of file +While I have to practically smuggle in the +metals and tools I need from caravans +that skirt the edges of our damned town, +that witch, Adria, always seems to get +whatever she needs. If I knew even the +smallest bit about how to harness magic +as she did, I could make some truly +incredible things. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip6.json b/gamefilesd/texts/griswold/gossip/gossip6.json index dd7c53a4..7d37d9a7 100755 --- a/gamefilesd/texts/griswold/gossip/gossip6.json +++ b/gamefilesd/texts/griswold/gossip/gossip6.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/gossip/gossip6.txt" ], "audio": { "file": "sfx/Towners/bsmith50.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip6.txt b/gamefilesd/texts/griswold/gossip/gossip6.txt index 7358f8cd..eeeb0349 100755 --- a/gamefilesd/texts/griswold/gossip/gossip6.txt +++ b/gamefilesd/texts/griswold/gossip/gossip6.txt @@ -1 +1,4 @@ -Gillian is a nice lass. Shame that her gammer is in such poor health or I would arrange to get both of them out of here on one of the trading caravans. \ No newline at end of file +Gillian is a nice lass. Shame that her +gammer is in such poor health or I would +arrange to get both of them out of here +on one of the trading caravans. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip7.json b/gamefilesd/texts/griswold/gossip/gossip7.json index 62f38bdf..58ee4fa5 100755 --- a/gamefilesd/texts/griswold/gossip/gossip7.json +++ b/gamefilesd/texts/griswold/gossip/gossip7.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith51.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip7.txt b/gamefilesd/texts/griswold/gossip/gossip7.txt index b0a748df..0e140904 100755 --- a/gamefilesd/texts/griswold/gossip/gossip7.txt +++ b/gamefilesd/texts/griswold/gossip/gossip7.txt @@ -1 +1,5 @@ -Sometimes I think that Cain talks too much, but I guess that is his calling in life. If I could bend steel as well as he can bend your ear, I could make a suit of court plate good enough for an Emperor! \ No newline at end of file +Sometimes I think that Cain talks too +much, but I guess that is his calling in life. +If I could bend steel as well as he can bend +your ear, I could make a suit of court +plate good enough for an Emperor! \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip8.json b/gamefilesd/texts/griswold/gossip/gossip8.json index f1b97620..13e6e5de 100755 --- a/gamefilesd/texts/griswold/gossip/gossip8.json +++ b/gamefilesd/texts/griswold/gossip/gossip8.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith52.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip8.txt b/gamefilesd/texts/griswold/gossip/gossip8.txt index e961c36d..7342b0df 100755 --- a/gamefilesd/texts/griswold/gossip/gossip8.txt +++ b/gamefilesd/texts/griswold/gossip/gossip8.txt @@ -1 +1,8 @@ -I was with Farnham that night that Lazarus led us into Labyrinth. I never saw the Archbishop again, and I may not have survived if Farnham was not at my side. I fear that the attack left his soul as crippled as, well, another did my leg. I cannot fight this battle for him now, but I would if I could. \ No newline at end of file +I was with Farnham that night that +Lazarus led us into Labyrinth. I never +saw the Archbishop again, and I may not +have survived if Farnham was not at my +side. I fear that the attack left his soul +as crippled as, well, another did my leg. I +cannot fight this battle for him now, but +I would if I could. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip9.json b/gamefilesd/texts/griswold/gossip/gossip9.json index 2ca71ee9..313c38c6 100755 --- a/gamefilesd/texts/griswold/gossip/gossip9.json +++ b/gamefilesd/texts/griswold/gossip/gossip9.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/gossip/gossip9.txt" ], "audio": { "file": "sfx/Towners/bsmith53.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/gossip/gossip9.txt b/gamefilesd/texts/griswold/gossip/gossip9.txt index 62d28075..c9144ac9 100755 --- a/gamefilesd/texts/griswold/gossip/gossip9.txt +++ b/gamefilesd/texts/griswold/gossip/gossip9.txt @@ -1 +1,5 @@ -A good man who puts the needs of others above his own. You won't find anyone left in Tristram - or anywhere else for that matter - who has a bad thing to say about the healer. \ No newline at end of file +A good man who puts the needs of others +above his own. You won't find anyone +left in Tristram - or anywhere else for +that matter - who has a bad thing to say +about the healer. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/anvilOfFury.json b/gamefilesd/texts/griswold/quests/anvilOfFury.json index 3a834622..cbf16983 100755 --- a/gamefilesd/texts/griswold/quests/anvilOfFury.json +++ b/gamefilesd/texts/griswold/quests/anvilOfFury.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith22.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/anvilOfFury.txt b/gamefilesd/texts/griswold/quests/anvilOfFury.txt index aebeefd8..d39cbca4 100755 --- a/gamefilesd/texts/griswold/quests/anvilOfFury.txt +++ b/gamefilesd/texts/griswold/quests/anvilOfFury.txt @@ -1 +1,4 @@ -Nothing yet, eh? Well, keep searching. A weapon forged upon the Anvil could be your best hope, and I am sure that I can make you one of the legendary proportions. \ No newline at end of file +Nothing yet, eh? Well, keep searching. A +weapon forged upon the Anvil could be +your best hope, and I am sure that I can +make you one of legendary proportions. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/archbishopLazarus.json b/gamefilesd/texts/griswold/quests/archbishopLazarus.json index 060a76a2..c807e941 100755 --- a/gamefilesd/texts/griswold/quests/archbishopLazarus.json +++ b/gamefilesd/texts/griswold/quests/archbishopLazarus.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/archbishopLazarus.txt b/gamefilesd/texts/griswold/quests/archbishopLazarus.txt index 8cecc473..f9db2098 100755 --- a/gamefilesd/texts/griswold/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/griswold/quests/archbishopLazarus.txt @@ -1 +1,7 @@ -I was there when Lazarus led us into the Labyrinth. He spoke of holy retribution, but when we started fighting those Hellspawn, he did not so much as lift his mace against them. He just ran deeper into the dim, endless chambers that were filled with the Servants of Darkness! \ No newline at end of file +I was there when Lazarus led us into the +labyrinth. He spoke of holy retribution, +but when we started fighting those +hellspawn, he did not so much as lift his +mace against them. He just ran deeper into +the dim, endless chambers that were filled +with the servants of darkness! \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/arkainesValor.json b/gamefilesd/texts/griswold/quests/arkainesValor.json index 709e84bc..415d7c03 100755 --- a/gamefilesd/texts/griswold/quests/arkainesValor.json +++ b/gamefilesd/texts/griswold/quests/arkainesValor.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith14.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/arkainesValor.txt b/gamefilesd/texts/griswold/quests/arkainesValor.txt index 713cae90..bfaca156 100755 --- a/gamefilesd/texts/griswold/quests/arkainesValor.txt +++ b/gamefilesd/texts/griswold/quests/arkainesValor.txt @@ -1 +1,7 @@ -The armor known as Valor could be what tips the scales in your favor. I will tell you that many have looked for it - including myself. Arkaine hid it well, my friend, and it will take more than a bit of luck to unlock the secrets that have kept it concealed oh, lo these many years. \ No newline at end of file +The armor known as Valor could be what +tips the scales in your favor. I will tell +you that many have looked for it - +including myself. Arkaine hid it well, my +friend, and it will take more than a bit of +luck to unlock the secrets that have +kept it concealed oh, lo these many years. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/blackMushroom.json b/gamefilesd/texts/griswold/quests/blackMushroom.json index e2eb9282..dc16e830 100755 --- a/gamefilesd/texts/griswold/quests/blackMushroom.json +++ b/gamefilesd/texts/griswold/quests/blackMushroom.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith19.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/blackMushroom.txt b/gamefilesd/texts/griswold/quests/blackMushroom.txt index dad4825b..ac4baaf4 100755 --- a/gamefilesd/texts/griswold/quests/blackMushroom.txt +++ b/gamefilesd/texts/griswold/quests/blackMushroom.txt @@ -1 +1,6 @@ -If Adria doesn't have one of these, you can bet that's a rare thing indeed. I can offer you no more help than that, but it sounds like a... why, a huge, gargantuan, swollen, bloated mushroom! Well, good hunting, I suppose. \ No newline at end of file +If Adria doesn't have one of these, you +can bet that's a rare thing indeed. I can +offer you no more help than that, but it +sounds like... a huge, gargantuan, +swollen, bloated mushroom! Well, good +hunting, I suppose. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/chamberOfBone.json b/gamefilesd/texts/griswold/quests/chamberOfBone.json index 816139fe..ff5c01fa 100755 --- a/gamefilesd/texts/griswold/quests/chamberOfBone.json +++ b/gamefilesd/texts/griswold/quests/chamberOfBone.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/quests/chamberOfBone.txt" ], "audio": { "file": "sfx/Towners/bsmith07.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/chamberOfBone.txt b/gamefilesd/texts/griswold/quests/chamberOfBone.txt index 85fbeb67..f87f40d3 100755 --- a/gamefilesd/texts/griswold/quests/chamberOfBone.txt +++ b/gamefilesd/texts/griswold/quests/chamberOfBone.txt @@ -1 +1,4 @@ -I know nothing of this place, but you may try asking Cain. He talks about many things, and it would not surprise me if he had some answers to your question. \ No newline at end of file +I know nothing of this place, but you may +try asking Cain. He talks about many +things, and it would not surprise me if he +had some answers to your question. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/hallsOfTheBlind.json b/gamefilesd/texts/griswold/quests/hallsOfTheBlind.json index 2e90a663..599cd2ca 100755 --- a/gamefilesd/texts/griswold/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/griswold/quests/hallsOfTheBlind.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/quests/hallsOfTheBlind.txt" ], "audio": { "file": "sfx/Towners/bsmith12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/hallsOfTheBlind.txt b/gamefilesd/texts/griswold/quests/hallsOfTheBlind.txt index b75bfa48..f8c9360b 100755 --- a/gamefilesd/texts/griswold/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/griswold/quests/hallsOfTheBlind.txt @@ -1 +1,4 @@ -I am afraid that I have neither heard nor seen a place that matches your vivid description, my friend. Perhaps Cain the storyteller could be of some help. \ No newline at end of file +I am afraid that I have neither heard nor +seen a place that matches your vivid +description, my friend. Perhaps Cain the +Storyteller could be of some help. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/lachdanan.json b/gamefilesd/texts/griswold/quests/lachdanan.json index b5418612..89afda30 100755 --- a/gamefilesd/texts/griswold/quests/lachdanan.json +++ b/gamefilesd/texts/griswold/quests/lachdanan.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/lachdanan.txt b/gamefilesd/texts/griswold/quests/lachdanan.txt index b90bc8b4..c3055333 100755 --- a/gamefilesd/texts/griswold/quests/lachdanan.txt +++ b/gamefilesd/texts/griswold/quests/lachdanan.txt @@ -1 +1,7 @@ -If it is actually Lachdanan that you have met, then I would advise that you aid him. I dealt with him on several occasions and found him to be honest and loyal in nature. The curse that fell upon the followers of King Leoric would fall especially hard upon him. \ No newline at end of file +If it is actually Lachdanan that you +have met, then I would advise that you +aid him. I dealt with him on several +occasions and found him to be honest and +loyal in nature. The curse that fell upon +the followers of King Leoric would fall +especially hard upon him. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/magicRock.json b/gamefilesd/texts/griswold/quests/magicRock.json index 70edbd50..cf476948 100755 --- a/gamefilesd/texts/griswold/quests/magicRock.json +++ b/gamefilesd/texts/griswold/quests/magicRock.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/quests/magicRock.txt" ], "audio": { "file": "sfx/Towners/bsmith10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/magicRock.txt b/gamefilesd/texts/griswold/quests/magicRock.txt index ba98bb47..bc64c0ae 100755 --- a/gamefilesd/texts/griswold/quests/magicRock.txt +++ b/gamefilesd/texts/griswold/quests/magicRock.txt @@ -1 +1,3 @@ -I am still waiting for you to bring me that Stone from the Heavens. I know that I can make something powerful out of it. \ No newline at end of file +I am still waiting for you to bring me +that stone from the heavens. I know that +I can make something powerful out of it. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/magicRock2.txt b/gamefilesd/texts/griswold/quests/magicRock2.txt index 6f608465..41e3f868 100755 --- a/gamefilesd/texts/griswold/quests/magicRock2.txt +++ b/gamefilesd/texts/griswold/quests/magicRock2.txt @@ -1,3 +1,6 @@ -Let me see that - aye... Aye, it is as I believed. Give me a moment. +Let me see that - aye... aye, it is as I +believed. Give me a moment... -Ah, here, you are. I arranged pieces of the Stone within a silver ring that my father left me. I hope it serves you well. \ No newline at end of file +Ah, Here you are. I arranged pieces of the +stone within a silver ring that my father +left me. I hope it serves you well. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/ogdensSign.json b/gamefilesd/texts/griswold/quests/ogdensSign.json index 7c83c022..1e56a034 100755 --- a/gamefilesd/texts/griswold/quests/ogdensSign.json +++ b/gamefilesd/texts/griswold/quests/ogdensSign.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/quests/ogdensSign.txt" ], "audio": { "file": "sfx/Towners/bsmith02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/ogdensSign.txt b/gamefilesd/texts/griswold/quests/ogdensSign.txt index 49a834b1..36c99507 100755 --- a/gamefilesd/texts/griswold/quests/ogdensSign.txt +++ b/gamefilesd/texts/griswold/quests/ogdensSign.txt @@ -1,3 +1,6 @@ -Demons stole Ogden's Sign, you say? That doesn't sound much like the atrocities I've heard of - or seen. +Demons stole Ogden's sign, you say? That +doesn't sound much like the atrocities +I've heard of - or seen. -Demons are concerned with ripping out your heart, not your signpost. \ No newline at end of file +Demons are concerned with ripping out +your heart, not your signpost. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/poisonedWater.json b/gamefilesd/texts/griswold/quests/poisonedWater.json index 558d1ab5..db8f8b67 100755 --- a/gamefilesd/texts/griswold/quests/poisonedWater.json +++ b/gamefilesd/texts/griswold/quests/poisonedWater.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith04.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/poisonedWater.txt b/gamefilesd/texts/griswold/quests/poisonedWater.txt index 782c0620..d231aa44 100755 --- a/gamefilesd/texts/griswold/quests/poisonedWater.txt +++ b/gamefilesd/texts/griswold/quests/poisonedWater.txt @@ -1 +1,5 @@ -Pepin has told you the truth. We will need fresh water badly, and soon. I have tried to clear one of the smaller wells, but it reeks of stagnant filth. It must be getting clogged at the source. \ No newline at end of file +Pepin has told you the truth. We will +need fresh water badly, and soon. I have +tried to clear one of the smaller wells, +but it reeks of stagnant filth. It must be +getting clogged at the source. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/skeletonKing.json b/gamefilesd/texts/griswold/quests/skeletonKing.json index a13dd94d..0064d7a5 100755 --- a/gamefilesd/texts/griswold/quests/skeletonKing.json +++ b/gamefilesd/texts/griswold/quests/skeletonKing.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/skeletonKing.txt b/gamefilesd/texts/griswold/quests/skeletonKing.txt index d1a5f54b..1bc15815 100755 --- a/gamefilesd/texts/griswold/quests/skeletonKing.txt +++ b/gamefilesd/texts/griswold/quests/skeletonKing.txt @@ -1 +1,8 @@ -I made many of the weapons and most of the armor that King Leoric used to outfit his knights. I even crafted a huge two-handed sword of the finest mithril for him, as well as a field crown to match. I still cannot believe how he died. But it must have been some sinister force that drove him insane! \ No newline at end of file +I made many of the weapons and most of +the armor that King Leoric used to outfit +his knights. I even crafted a huge +two-handed sword of the finest mithril +for him, as well as a field crown to +match. I still cannot believe how he died, +but it must have been some sinister force +that drove him insane! \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/theButcher.json b/gamefilesd/texts/griswold/quests/theButcher.json index 511de93c..653b5be4 100755 --- a/gamefilesd/texts/griswold/quests/theButcher.json +++ b/gamefilesd/texts/griswold/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/theButcher.txt b/gamefilesd/texts/griswold/quests/theButcher.txt index 09759022..f1fd1634 100755 --- a/gamefilesd/texts/griswold/quests/theButcher.txt +++ b/gamefilesd/texts/griswold/quests/theButcher.txt @@ -1 +1,11 @@ -I saw what Farnham calls the Butcher as it swathed a path through the bodies of my friends. He swung a cleaver as large as an axe, hewing limbs and cutting down brave men where they stood. I was separated from the fray by a host of small screeching demons and somehow found the stairway leading out. I never saw that hideous beast again, but his blood-stained visage haunts me to this day. \ No newline at end of file +I saw what Farnham calls the Butcher as +it swathed a path through the bodies of +my friends. He swung a cleaver as large as +an axe, hewing limbs and cutting down +brave men where they stood. I was +separated from the fray by a host of +small screeching demons and somehow +found the stairway leading out. I never +saw that hideous beast again, but his +blood-stained visage haunts me to this +day. \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/warlordOfBlood.json b/gamefilesd/texts/griswold/quests/warlordOfBlood.json index 635d5eb2..3bbd9e78 100755 --- a/gamefilesd/texts/griswold/quests/warlordOfBlood.json +++ b/gamefilesd/texts/griswold/quests/warlordOfBlood.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/griswold/quests/warlordOfBlood.txt" ], "audio": { "file": "sfx/Towners/bsmith17.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/griswold/quests/warlordOfBlood.txt b/gamefilesd/texts/griswold/quests/warlordOfBlood.txt index cbd9d5ca..38bf5268 100755 --- a/gamefilesd/texts/griswold/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/griswold/quests/warlordOfBlood.txt @@ -1 +1,4 @@ -Dark and wicked legends surrounds the one Warlord of Blood. Be well prepared, my friend, for he shows no mercy or quarter. \ No newline at end of file +Dark and wicked legends surrounds the +one Warlord of Blood. Be well prepared, +my friend, for he shows no mercy or +quarter. \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak.json b/gamefilesd/texts/misc/quests/gharbadTheWeak.json index b5abb78b..733a642e 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak.json +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.gharbadTheWeak.state|", + "param": "%currentLevel.quest.gharbadTheWeak.state%", "case": [ { "value": 0, diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak1.json b/gamefilesd/texts/misc/quests/gharbadTheWeak1.json index c20459f4..318750f5 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak1.json +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/garbud01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak1.txt b/gamefilesd/texts/misc/quests/gharbadTheWeak1.txt index 9052dece..47812962 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak1.txt +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak1.txt @@ -1 +1,2 @@ -Pleease, no hurt, no kill. Keep alive and next time good bring to you. \ No newline at end of file +Pleeeease, no hurt. No Kill. Keep alive and +next time good bring to you. \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak2.json b/gamefilesd/texts/misc/quests/gharbadTheWeak2.json index 38451ee5..485c40ff 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak2.json +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/garbud02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak2.txt b/gamefilesd/texts/misc/quests/gharbadTheWeak2.txt index 5df33530..40d1a287 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak2.txt +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak2.txt @@ -1,3 +1,4 @@ -Something for you I am making. Again, not kill Gharbad, live and give good. +Something for you I am making. Again, not +kill Gharbad. Live and give good. You take this as proof I keep word... \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak3.json b/gamefilesd/texts/misc/quests/gharbadTheWeak3.json index 16c6ead7..467a863c 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak3.json +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/garbud03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak4.json b/gamefilesd/texts/misc/quests/gharbadTheWeak4.json index 97ecd420..f89c25c7 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak4.json +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak4.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/garbud04.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/gharbadTheWeak4.txt b/gamefilesd/texts/misc/quests/gharbadTheWeak4.txt index 54619011..842c4850 100755 --- a/gamefilesd/texts/misc/quests/gharbadTheWeak4.txt +++ b/gamefilesd/texts/misc/quests/gharbadTheWeak4.txt @@ -1 +1,2 @@ -This too good for you. Very powerful! You want - you take! \ No newline at end of file +This too good for you. Very Powerful! +You want - you take! \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/lachdanan.json b/gamefilesd/texts/misc/quests/lachdanan.json index 7519613a..c3c1bf36 100755 --- a/gamefilesd/texts/misc/quests/lachdanan.json +++ b/gamefilesd/texts/misc/quests/lachdanan.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.lachdanan.state|", + "param": "%currentLevel.quest.lachdanan.state%", "case": [ { "value": 0, diff --git a/gamefilesd/texts/misc/quests/lachdanan1.json b/gamefilesd/texts/misc/quests/lachdanan1.json index 3893e550..6bd2ae8f 100755 --- a/gamefilesd/texts/misc/quests/lachdanan1.json +++ b/gamefilesd/texts/misc/quests/lachdanan1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/lach01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/lachdanan1.txt b/gamefilesd/texts/misc/quests/lachdanan1.txt index 5b12f54b..5cf1a73e 100755 --- a/gamefilesd/texts/misc/quests/lachdanan1.txt +++ b/gamefilesd/texts/misc/quests/lachdanan1.txt @@ -1,3 +1,18 @@ -Please, don't kill me, just hear me out. I was once Captain of King Leoric's knights, upholding the laws of this land with justice and honor. Then his dark curse fell upon us for the role we played in his tragic death. As my fellow knights succumbed to their twisted fate, I fled from the King's burial chamber, searching for some way to free myself from the curse. I failed... +Please, don't kill me, just hear me out. I +was once Captain of King Leoric's Knights, +upholding the laws of this land with +justice and honor. Then his dark Curse fell +upon us for the role we played in his +tragic death. As my fellow Knights +succumbed to their twisted fate, I fled +from the King's burial chamber, searching +for some way to free myself from the +Curse. I failed... -I have heard of a Golden Elixir that could lift the curse and allow my soul to rest, but I have been unable to find it. My strength now wanes, and with it, the last of my humanity as well. Please aid me and find the Elixir. I will repay your efforts - I swear upon my honor. \ No newline at end of file +I have heard of a Golden Elixir that +could lift the Curse and allow my soul +to rest, but I have been unable to find it. +My strength now wanes, and with it the +last of my humanity as well. Please aid +me and find the Elixir. I will repay your +efforts - I swear upon my honor. \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/lachdanan2.json b/gamefilesd/texts/misc/quests/lachdanan2.json index c94f43c9..9cc38995 100755 --- a/gamefilesd/texts/misc/quests/lachdanan2.json +++ b/gamefilesd/texts/misc/quests/lachdanan2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/lach02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/lachdanan2.txt b/gamefilesd/texts/misc/quests/lachdanan2.txt index 630a1d7f..3ac3cae9 100755 --- a/gamefilesd/texts/misc/quests/lachdanan2.txt +++ b/gamefilesd/texts/misc/quests/lachdanan2.txt @@ -1 +1,3 @@ -You have not found the Golden Elixir. I fear that I am doomed for eternity. Please, keep trying... \ No newline at end of file +You have not found the Golden Elixir. I +fear that I am doomed for eternity. +Please, keep trying... \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/lachdanan3.json b/gamefilesd/texts/misc/quests/lachdanan3.json index 405904c2..8c2961cc 100755 --- a/gamefilesd/texts/misc/quests/lachdanan3.json +++ b/gamefilesd/texts/misc/quests/lachdanan3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/lach03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/lachdanan3.txt b/gamefilesd/texts/misc/quests/lachdanan3.txt index d3acbb8d..a8ffe2ec 100755 --- a/gamefilesd/texts/misc/quests/lachdanan3.txt +++ b/gamefilesd/texts/misc/quests/lachdanan3.txt @@ -1 +1,9 @@ -You have saved my soul from Damnation, and for that I am in your debt. If there is ever a way that I can repay you from beyond the grave I will find it, but for now - take my Helm. On the journey I am about to take, I will have little use for it. May it protect you against the dark powers below. Go with the Light, my friend... \ No newline at end of file +You have saved my soul from damnation, +and for that I am in your debt. If there is +ever a way that I can repay you from +beyond the grave I will find it, but for +now - take my helm. On the journey I am +about to take I will have little use for +it. May it protect you against the dark +powers below. Go with the Light, my +friend... \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/snotspill.json b/gamefilesd/texts/misc/quests/snotspill.json index b73126ed..d26d09b8 100755 --- a/gamefilesd/texts/misc/quests/snotspill.json +++ b/gamefilesd/texts/misc/quests/snotspill.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.snotspill.state|", + "param": "%currentLevel.quest.snotspill.state%", "case": [ { "value": 0, diff --git a/gamefilesd/texts/misc/quests/snotspill1.json b/gamefilesd/texts/misc/quests/snotspill1.json index 9bc97122..cae386b1 100755 --- a/gamefilesd/texts/misc/quests/snotspill1.json +++ b/gamefilesd/texts/misc/quests/snotspill1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/snot01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/snotspill1.txt b/gamefilesd/texts/misc/quests/snotspill1.txt index cbd062d2..f98f9e3e 100755 --- a/gamefilesd/texts/misc/quests/snotspill1.txt +++ b/gamefilesd/texts/misc/quests/snotspill1.txt @@ -1 +1,5 @@ -Hey - you that one that kill all! You get me magic banner or we attack! You no leave with Life! You kill big uglies and give back magic. Go past corner and door. Find uglies. You give, you go! \ No newline at end of file +Hey - You that one that kill all! You get +me Magic Banner or we attack! You no +leave with life! You kill big uglies and +give back Magic. Go past corner and door, +find uglies. You give, you go! \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/snotspill2.json b/gamefilesd/texts/misc/quests/snotspill2.json index 134ab415..8970c56f 100755 --- a/gamefilesd/texts/misc/quests/snotspill2.json +++ b/gamefilesd/texts/misc/quests/snotspill2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/snot02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/snotspill2.txt b/gamefilesd/texts/misc/quests/snotspill2.txt index 04f7e0da..f00d63d6 100755 --- a/gamefilesd/texts/misc/quests/snotspill2.txt +++ b/gamefilesd/texts/misc/quests/snotspill2.txt @@ -1 +1,2 @@ -You kill uglies, get banner. You bring to me, or else... \ No newline at end of file +You kill uglies, get banner. You bring to +me, or else... \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/snotspill3.json b/gamefilesd/texts/misc/quests/snotspill3.json index 692f09f4..95cc1782 100755 --- a/gamefilesd/texts/misc/quests/snotspill3.json +++ b/gamefilesd/texts/misc/quests/snotspill3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/snot03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/snotspill3.txt b/gamefilesd/texts/misc/quests/snotspill3.txt index 6ab1fba7..838e3472 100755 --- a/gamefilesd/texts/misc/quests/snotspill3.txt +++ b/gamefilesd/texts/misc/quests/snotspill3.txt @@ -1 +1,2 @@ -You give! Yes, good! Go now, we strong! We kill all with big magic! \ No newline at end of file +You give! Yes, good! Go now, we strong. +We kill all with big Magic! \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/zharTheMad.json b/gamefilesd/texts/misc/quests/zharTheMad.json index 3cc48d20..eac5636b 100755 --- a/gamefilesd/texts/misc/quests/zharTheMad.json +++ b/gamefilesd/texts/misc/quests/zharTheMad.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.zharTheMad.state|", + "param": "%currentLevel.quest.zharTheMad.state%", "case": [ { "value": 0, diff --git a/gamefilesd/texts/misc/quests/zharTheMad1.json b/gamefilesd/texts/misc/quests/zharTheMad1.json index 7f3c565f..e38e7591 100755 --- a/gamefilesd/texts/misc/quests/zharTheMad1.json +++ b/gamefilesd/texts/misc/quests/zharTheMad1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/zhar01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/zharTheMad1.txt b/gamefilesd/texts/misc/quests/zharTheMad1.txt index 6fc403f7..a6566bb6 100755 --- a/gamefilesd/texts/misc/quests/zharTheMad1.txt +++ b/gamefilesd/texts/misc/quests/zharTheMad1.txt @@ -1 +1,4 @@ -What?! Why are you here? All these interruptions are enough to make one insane. Here, take this and leave me to my work. Trouble me no more! \ No newline at end of file +What?! Why are you here? All these +interruptions are enough to make one +insane. Here, take this and leave me to my +work. Trouble me no more! \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/zharTheMad2.json b/gamefilesd/texts/misc/quests/zharTheMad2.json index f05b25e0..24290c27 100755 --- a/gamefilesd/texts/misc/quests/zharTheMad2.json +++ b/gamefilesd/texts/misc/quests/zharTheMad2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/monsters/zhar02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/misc/quests/zharTheMad2.txt b/gamefilesd/texts/misc/quests/zharTheMad2.txt index 98407a34..de5499dd 100755 --- a/gamefilesd/texts/misc/quests/zharTheMad2.txt +++ b/gamefilesd/texts/misc/quests/zharTheMad2.txt @@ -1 +1,2 @@ -Arrrrgh! Your curiosity will be the death of you!!! \ No newline at end of file +Arrrrgh! Your curiosity will be the death +of you!!! \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip1.json b/gamefilesd/texts/ogden/gossip/gossip1.json index d08ab261..a412b695 100755 --- a/gamefilesd/texts/ogden/gossip/gossip1.json +++ b/gamefilesd/texts/ogden/gossip/gossip1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown37.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip1.txt b/gamefilesd/texts/ogden/gossip/gossip1.txt index 484d79c2..5fe064da 100755 --- a/gamefilesd/texts/ogden/gossip/gossip1.txt +++ b/gamefilesd/texts/ogden/gossip/gossip1.txt @@ -1 +1,7 @@ -Many adventurers have graced the tables of my tavern, and ten times as many stories have been told over as much ale. The only thing that I ever heard any of them agree on was this old axiom. Perhaps it will help you. You can cut the flesh, but you must crush the bone. \ No newline at end of file +Many adventurers have graced the tables +of my tavern, and ten times as many +stories have been told over as much ale. +The only thing that I ever heard any of +them agree on was this old axiom. Perhaps +it will help you. You can cut the flesh, +but you must crush the bone. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip2.json b/gamefilesd/texts/ogden/gossip/gossip2.json index b963e08d..4b220fe5 100755 --- a/gamefilesd/texts/ogden/gossip/gossip2.json +++ b/gamefilesd/texts/ogden/gossip/gossip2.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/gossip/gossip2.txt" ], "audio": { "file": "sfx/Towners/tavown38.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip2.txt b/gamefilesd/texts/ogden/gossip/gossip2.txt index 7a439878..2400a331 100755 --- a/gamefilesd/texts/ogden/gossip/gossip2.txt +++ b/gamefilesd/texts/ogden/gossip/gossip2.txt @@ -1 +1,4 @@ -Griswold the blacksmith is extremely knowledgeable about weapons and armor. If you ever need work done on your gear, he is definitely the man to see. \ No newline at end of file +Griswold the blacksmith is extremely +knowledgeable about weapons and +armor. If you ever need work done on +your gear, he is definitely the man to see. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip3.json b/gamefilesd/texts/ogden/gossip/gossip3.json index 2f5fdb74..657f3352 100755 --- a/gamefilesd/texts/ogden/gossip/gossip3.json +++ b/gamefilesd/texts/ogden/gossip/gossip3.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/gossip/gossip3.txt" ], "audio": { "file": "sfx/Towners/tavown39.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip3.txt b/gamefilesd/texts/ogden/gossip/gossip3.txt index 84a47bbb..dee66d31 100755 --- a/gamefilesd/texts/ogden/gossip/gossip3.txt +++ b/gamefilesd/texts/ogden/gossip/gossip3.txt @@ -1 +1,4 @@ -Farnham spends far too much time here, drowning his sorrows in cheap ale. I would make him leave, but he did suffer so during his time in the Labyrinth. \ No newline at end of file +Farnham spends far too much time here, +drowning his sorrows in cheap ale. I +would make him leave, but he did suffer so +during his time in the Labyrinth. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip4.json b/gamefilesd/texts/ogden/gossip/gossip4.json index f60f5f45..3a5845fa 100755 --- a/gamefilesd/texts/ogden/gossip/gossip4.json +++ b/gamefilesd/texts/ogden/gossip/gossip4.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/gossip/gossip4.txt" ], "audio": { "file": "sfx/Towners/tavown40.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip4.txt b/gamefilesd/texts/ogden/gossip/gossip4.txt index 383e11dc..24b3d6f4 100755 --- a/gamefilesd/texts/ogden/gossip/gossip4.txt +++ b/gamefilesd/texts/ogden/gossip/gossip4.txt @@ -1 +1,7 @@ -Adria is wise beyond her years, but I must admit - she frightens me a little. Well, no matter. If you ever have need to trade in items of sorcery, she maintains a strangely well-stocked hut just across the river. \ No newline at end of file +Adria is wise beyond her years, but I must +admit - she frightens me a little. + +Well, no matter. If you ever have need to +trade in items of sorcery, she maintains a +strangely well-stocked hut just across +the river. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip5.json b/gamefilesd/texts/ogden/gossip/gossip5.json index c78f9da1..2417f839 100755 --- a/gamefilesd/texts/ogden/gossip/gossip5.json +++ b/gamefilesd/texts/ogden/gossip/gossip5.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/gossip/gossip5.txt" ], "audio": { "file": "sfx/Towners/tavown41.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip5.txt b/gamefilesd/texts/ogden/gossip/gossip5.txt index ad4eaee7..91892d55 100755 --- a/gamefilesd/texts/ogden/gossip/gossip5.txt +++ b/gamefilesd/texts/ogden/gossip/gossip5.txt @@ -1 +1,3 @@ -If you want to know more about the history of our village, the storyteller Cain knows quite a bit about the past. \ No newline at end of file +If you want to know more about the +history of our village, the storyteller +Cain knows quite a bit about the past. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip6.json b/gamefilesd/texts/ogden/gossip/gossip6.json index bc48d6a9..7f99bdf8 100755 --- a/gamefilesd/texts/ogden/gossip/gossip6.json +++ b/gamefilesd/texts/ogden/gossip/gossip6.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/gossip/gossip6.txt" ], "audio": { "file": "sfx/Towners/tavown43.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip6.txt b/gamefilesd/texts/ogden/gossip/gossip6.txt index 5857e302..d4cf8a38 100755 --- a/gamefilesd/texts/ogden/gossip/gossip6.txt +++ b/gamefilesd/texts/ogden/gossip/gossip6.txt @@ -1 +1,9 @@ -Wirt is a rapscallion and a little scoundrel. He was always getting into trouble, and it's no surprise what happened to him. He probably went fooling about someplace that he shouldn't have been. I feel sorry for the boy, but I don't abide the company that he keeps. \ No newline at end of file +Wirt is a rapscallion and a little +scoundrel. He was always getting into +trouble, and it's no surprise what +happened to him. + +He probably went fooling about +someplace that he shouldn't have been. I +feel sorry for the boy, but I don't abide +the company that he keeps. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip7.json b/gamefilesd/texts/ogden/gossip/gossip7.json index 9ecf8c97..2e0ee9e2 100755 --- a/gamefilesd/texts/ogden/gossip/gossip7.json +++ b/gamefilesd/texts/ogden/gossip/gossip7.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/gossip/gossip7.txt" ], "audio": { "file": "sfx/Towners/tavown44.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip7.txt b/gamefilesd/texts/ogden/gossip/gossip7.txt index e91a620f..513a04a5 100755 --- a/gamefilesd/texts/ogden/gossip/gossip7.txt +++ b/gamefilesd/texts/ogden/gossip/gossip7.txt @@ -1 +1,5 @@ -Pepin is a good man - and certainly the most generous in the village. He is always attending to the needs of others, but trouble of some sort or another does seem to follow him wherever he goes... \ No newline at end of file +Pepin is a good man - and certainly the +most generous in the village. He is always +attending to the needs of others, but +trouble of some sort or another does +seem to follow him wherever he goes... \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip8.json b/gamefilesd/texts/ogden/gossip/gossip8.json index dd606c74..95e99a13 100755 --- a/gamefilesd/texts/ogden/gossip/gossip8.json +++ b/gamefilesd/texts/ogden/gossip/gossip8.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/gossip/gossip8.txt" ], "audio": { "file": "sfx/Towners/tavown45.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/gossip/gossip8.txt b/gamefilesd/texts/ogden/gossip/gossip8.txt index 32e9f557..42f3719a 100755 --- a/gamefilesd/texts/ogden/gossip/gossip8.txt +++ b/gamefilesd/texts/ogden/gossip/gossip8.txt @@ -1 +1,8 @@ -Gillian, my Barmaid? If it were not for her sense of duty to her grand-dam, she would have fled from here long ago. Goodness knows I begged her to leave, telling her that I would watch after the old woman, but she is too sweet and caring to have done so. \ No newline at end of file +Gillian, my Barmaid? If it were not for her +sense of duty to her grand-dam, she +would have fled from here long ago. + +Goodness knows I begged her to leave, +telling her that I would watch after the +old woman, but she is too sweet and +caring to have done so. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/anvilOfFury.json b/gamefilesd/texts/ogden/quests/anvilOfFury.json index 4e841734..f219c8eb 100755 --- a/gamefilesd/texts/ogden/quests/anvilOfFury.json +++ b/gamefilesd/texts/ogden/quests/anvilOfFury.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "16", "texts/ogden/quests/anvilOfFury.txt" ], "audio": { "file": "sfx/Towners/tavown12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/anvilOfFury.txt b/gamefilesd/texts/ogden/quests/anvilOfFury.txt index 03aca63c..8eba8e71 100755 --- a/gamefilesd/texts/ogden/quests/anvilOfFury.txt +++ b/gamefilesd/texts/ogden/quests/anvilOfFury.txt @@ -1 +1,3 @@ -Don't you think that Griswold would be a better person to ask about this? He's quite handy, you know. \ No newline at end of file +Don't you think that Griswold would be +a better person to ask about this? He's +quite handy, you know. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/archbishopLazarus.json b/gamefilesd/texts/ogden/quests/archbishopLazarus.json index 89ac22d1..247ae6fd 100755 --- a/gamefilesd/texts/ogden/quests/archbishopLazarus.json +++ b/gamefilesd/texts/ogden/quests/archbishopLazarus.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/archbishopLazarus.txt b/gamefilesd/texts/ogden/quests/archbishopLazarus.txt index 27f36d3a..920f26c5 100755 --- a/gamefilesd/texts/ogden/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/ogden/quests/archbishopLazarus.txt @@ -1 +1,8 @@ -Lazarus was the Archbishop who led many of the townspeople into the Labyrinth. I lost many good friends that day, and Lazarus never returned. I suppose he was killed along with most of the others. If you would do me a favor, Good Master, please do not talk to Farnham about that day. \ No newline at end of file +Lazarus was the Archbishop who led many +of the townspeople into the labyrinth. I +lost many good friends that day, and +Lazarus never returned. I suppose he was +killed along with most of the others. If +you would do me a favor, good master - +please do not talk to Farnham about +that day. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/arkainesValor.json b/gamefilesd/texts/ogden/quests/arkainesValor.json index f6b8cb7f..1006e287 100755 --- a/gamefilesd/texts/ogden/quests/arkainesValor.json +++ b/gamefilesd/texts/ogden/quests/arkainesValor.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/arkainesValor.txt" ], "audio": { "file": "sfx/Towners/tavown13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/arkainesValor.txt b/gamefilesd/texts/ogden/quests/arkainesValor.txt index 69ccd14b..9b3b9f6e 100755 --- a/gamefilesd/texts/ogden/quests/arkainesValor.txt +++ b/gamefilesd/texts/ogden/quests/arkainesValor.txt @@ -1 +1,6 @@ -Every child hears the story of the warrior Arkaine and his mystic armor known as Valor. If you could find its resting place, you would be well protected against the evil in the Labyrinth. \ No newline at end of file +Every child hears the story of the +warrior Arkaine and his mystic armor +known as Valor. If you could find its +resting place, you would be well +protected against the evil in the +Labyrinth. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/blackMushroom.json b/gamefilesd/texts/ogden/quests/blackMushroom.json index 2305bf8a..02db2253 100755 --- a/gamefilesd/texts/ogden/quests/blackMushroom.json +++ b/gamefilesd/texts/ogden/quests/blackMushroom.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown19.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/blackMushroom.txt b/gamefilesd/texts/ogden/quests/blackMushroom.txt index 121ca221..aed5f35e 100755 --- a/gamefilesd/texts/ogden/quests/blackMushroom.txt +++ b/gamefilesd/texts/ogden/quests/blackMushroom.txt @@ -1 +1,6 @@ -Let me just say this. Both Garda and I would never, EVER serve black mushrooms to our honored guests. If Adria wants some mushrooms in her stew, then that is her business, but I can't help you find any. Black mushrooms... disgusting! \ No newline at end of file +Let me just say this. Both Garda and I +would never, EVER serve black mushrooms +to our honored guests. If Adria wants +some mushrooms in her stew, then that is +her business, but I can't help you find any. +Black mushrooms... disgusting! \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/chamberOfBone.json b/gamefilesd/texts/ogden/quests/chamberOfBone.json index 97699c95..b01232f0 100755 --- a/gamefilesd/texts/ogden/quests/chamberOfBone.json +++ b/gamefilesd/texts/ogden/quests/chamberOfBone.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/chamberOfBone.txt" ], "audio": { "file": "sfx/Towners/tavown05.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/chamberOfBone.txt b/gamefilesd/texts/ogden/quests/chamberOfBone.txt index cd66d43c..4baa366e 100755 --- a/gamefilesd/texts/ogden/quests/chamberOfBone.txt +++ b/gamefilesd/texts/ogden/quests/chamberOfBone.txt @@ -1 +1,3 @@ -I am afraid that I don't know anything about that, Good Master. Cain has many books that may be of some help. \ No newline at end of file +I am afraid that I don't know anything +about that, good master. Cain has many +books that may be of some help. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/hallsOfTheBlind.json b/gamefilesd/texts/ogden/quests/hallsOfTheBlind.json index bcf6f668..14d00d37 100755 --- a/gamefilesd/texts/ogden/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/ogden/quests/hallsOfTheBlind.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/hallsOfTheBlind.txt" ], "audio": { "file": "sfx/Towners/tavown10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/hallsOfTheBlind.txt b/gamefilesd/texts/ogden/quests/hallsOfTheBlind.txt index bf13e036..c7512c81 100755 --- a/gamefilesd/texts/ogden/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/ogden/quests/hallsOfTheBlind.txt @@ -1,3 +1,8 @@ -I never much cared for poetry. Occasionally, I had cause to hire minstrels when the Inn was doing well, but that seems like such a long time ago now. +I never much cared for poetry. +Occasionally, I had cause to hire +minstrels when the inn was doing well, +but that seems like such a long time ago +now. -What? Oh, yes... uh, well, I suppose you could see what someone else knows. \ No newline at end of file +What? Oh, yes... uh, well, I suppose you +could see what someone else knows. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/lachdanan.json b/gamefilesd/texts/ogden/quests/lachdanan.json index 105284d3..6c21859c 100755 --- a/gamefilesd/texts/ogden/quests/lachdanan.json +++ b/gamefilesd/texts/ogden/quests/lachdanan.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/lachdanan.txt" ], "audio": { "file": "sfx/Towners/tavown11.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/lachdanan.txt b/gamefilesd/texts/ogden/quests/lachdanan.txt index d5cdeafe..cfe42ea3 100755 --- a/gamefilesd/texts/ogden/quests/lachdanan.txt +++ b/gamefilesd/texts/ogden/quests/lachdanan.txt @@ -1 +1,4 @@ -You speak of a brave warrior long dead! I'll have no such talk of speaking with departed souls in my inn yard, thank you very much. \ No newline at end of file +You speak of a brave warrior long dead! +I'll have no such talk of speaking with +departed souls in my inn yard, thank you +very much. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/magicRock.json b/gamefilesd/texts/ogden/quests/magicRock.json index e73b94f6..368cbc3f 100755 --- a/gamefilesd/texts/ogden/quests/magicRock.json +++ b/gamefilesd/texts/ogden/quests/magicRock.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/magicRock.txt" ], "audio": { "file": "sfx/Towners/tavown18.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/magicRock.txt b/gamefilesd/texts/ogden/quests/magicRock.txt index 4e0272d8..29280e0d 100755 --- a/gamefilesd/texts/ogden/quests/magicRock.txt +++ b/gamefilesd/texts/ogden/quests/magicRock.txt @@ -1 +1,6 @@ -The caravan stopped here to take on some supplies for their journey to the East. I sold them quite an array of fresh fruits and some excellent sweetbreads that Garda has just finished baking. Shame what happened to them... \ No newline at end of file +The caravan stopped here to take on some +supplies for their journey to the east. I +sold them quite an array of fresh fruits +and some excellent sweetbreads that +Garda has just finished baking. Shame what +happened to them... \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/ogdenInit.json b/gamefilesd/texts/ogden/quests/ogdenInit.json new file mode 100755 index 00000000..e768cb8e --- /dev/null +++ b/gamefilesd/texts/ogden/quests/ogdenInit.json @@ -0,0 +1,13 @@ +{ + "load": [ + "ui/level/showText.json", + "questText", + "50", + "texts/ogden/quests/ogdenInit.txt" + ], + "audio": { + "file": "sfx/Towners/Tavown00.wav", + "play": true, + "volume": "%game.soundVolume%" + } +} \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/ogdenInit.txt b/gamefilesd/texts/ogden/quests/ogdenInit.txt new file mode 100755 index 00000000..d14fcf97 --- /dev/null +++ b/gamefilesd/texts/ogden/quests/ogdenInit.txt @@ -0,0 +1,18 @@ +Thank goodness you've returned! +Much has changed since you lived here, my +friend. All was peaceful until the dark +riders came and destroyed our village. +Many were cut down where they stood, +and those who took up arms were slain +or dragged away to become slaves - or +worse. The church at the edge of town +has been desecrated and is being used for +dark rituals. The screams that echo in +the night are inhuman, but some of our +townsfolk may yet survive. Follow the +path that lies between my tavern and the +blacksmith shop to find the church and +save who you can. + +Perhaps I can tell you more if we speak +again. Good luck. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/ogdensSign.json b/gamefilesd/texts/ogden/quests/ogdensSign.json index 483a9ec6..d5e9c4b3 100755 --- a/gamefilesd/texts/ogden/quests/ogdensSign.json +++ b/gamefilesd/texts/ogden/quests/ogdensSign.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.ogdensSign.state|", + "param": "%currentLevel.quest.ogdensSign.state%", "case": [ { "value": 0, @@ -9,6 +9,10 @@ }, { "value": 1, + "action": 0 + }, + { + "value": -1, "action": { "name": "load", "file": "texts/ogden/quests/ogdensSign2.json" } } ] diff --git a/gamefilesd/texts/ogden/quests/ogdensSign1.json b/gamefilesd/texts/ogden/quests/ogdensSign1.json index 3941124b..5645c3a5 100755 --- a/gamefilesd/texts/ogden/quests/ogdensSign1.json +++ b/gamefilesd/texts/ogden/quests/ogdensSign1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown24.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/ogdensSign1.txt b/gamefilesd/texts/ogden/quests/ogdensSign1.txt index 34304de5..ff4eb906 100755 --- a/gamefilesd/texts/ogden/quests/ogdensSign1.txt +++ b/gamefilesd/texts/ogden/quests/ogdensSign1.txt @@ -1 +1,15 @@ -Master, I have a strange experience to relate. I know that you have a great knowledge of those monstrosities that inhabit the Labyrinth, and this is something that I cannot understand for the very life of me... I was awakened during the night by a scraping sound just outside of my Tavern. When I looked out from my bedroom, I saw the shapes of small Demon-like creatures in the inn yard. After a short time, they ran off, but not before stealing the sign to my Inn. I don't know why the demons would steal my sign but leave my family in peace... 'Tis strange, no? \ No newline at end of file +Master, I have a strange experience to +relate. I know that you have a great +knowledge of those monstrosities that +inhabit the labyrinth, and this is something +that I cannot understand for the very +life of me... I was awakened during the +night by a scraping sound just outside of +my tavern. When I looked out from my +bedroom, I saw the shapes of small +demon-like creatures in the inn yard. +After a short time, they ran off, but not +before stealing the sign to my inn. I don't +know why the demons would steal my +sign but leave my family in peace... 'tis +strange, no? \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/ogdensSign2.json b/gamefilesd/texts/ogden/quests/ogdensSign2.json index 3222b612..fe5691a2 100755 --- a/gamefilesd/texts/ogden/quests/ogdensSign2.json +++ b/gamefilesd/texts/ogden/quests/ogdensSign2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown25.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/ogdensSign2.txt b/gamefilesd/texts/ogden/quests/ogdensSign2.txt index 0f1be27f..9b0fe5ca 100755 --- a/gamefilesd/texts/ogden/quests/ogdensSign2.txt +++ b/gamefilesd/texts/ogden/quests/ogdensSign2.txt @@ -1 +1,9 @@ -Oh, you didn't have to bring back my sign, but I suppose that it does save me the expense of having another one made. Well, let me see. What could I give you as a fee for finding it? Hmmm. What have we here... Ah, yes! This cap was left in one of the rooms by a magician who stayed here some time ago. Perhaps it may be of some value to you. \ No newline at end of file +Oh, you didn't have to bring back my sign, +but I suppose that it does save me the +expense of having another one made. Well, +let me see, what could I give you as a fee +for finding it? Hmmm, what have we here... +ah, yes! This cap was left in one of the +rooms by a magician who stayed here +some time ago. Perhaps it may be of some +value to you. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/poisonedWater.json b/gamefilesd/texts/ogden/quests/poisonedWater.json index d8dcd39a..4082f2db 100755 --- a/gamefilesd/texts/ogden/quests/poisonedWater.json +++ b/gamefilesd/texts/ogden/quests/poisonedWater.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/poisonedWater.txt" ], "audio": { "file": "sfx/Towners/tavown02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/poisonedWater.txt b/gamefilesd/texts/ogden/quests/poisonedWater.txt index eea35dee..a4a4e8de 100755 --- a/gamefilesd/texts/ogden/quests/poisonedWater.txt +++ b/gamefilesd/texts/ogden/quests/poisonedWater.txt @@ -1,3 +1,8 @@ -I have always tried to keep a large supply of foodstuffs and drink in our storage cellar, but with the entire town having no source of fresh water, even our stores will soon run dry. +I have always tried to keep a large +supply of foodstuffs and drink in our +storage cellar, but with the entire town +having no source of fresh water, even +our stores will soon run dry. -Please, do what you can or I don't know what we will do. \ No newline at end of file +Please, do what you can or I don't know +what we will do. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/skeletonKing.json b/gamefilesd/texts/ogden/quests/skeletonKing.json index a7ec2286..c063a38b 100755 --- a/gamefilesd/texts/ogden/quests/skeletonKing.json +++ b/gamefilesd/texts/ogden/quests/skeletonKing.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.skeletonKing.state|", + "param": "%currentLevel.quest.skeletonKing.state%", "case": [ { "value": 0, diff --git a/gamefilesd/texts/ogden/quests/skeletonKing1.json b/gamefilesd/texts/ogden/quests/skeletonKing1.json index e06300ad..1b717304 100755 --- a/gamefilesd/texts/ogden/quests/skeletonKing1.json +++ b/gamefilesd/texts/ogden/quests/skeletonKing1.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/skeletonKing1.txt" ], "audio": { "file": "sfx/Towners/tavown22.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/skeletonKing1.txt b/gamefilesd/texts/ogden/quests/skeletonKing1.txt index 8675fce7..1056fd72 100755 --- a/gamefilesd/texts/ogden/quests/skeletonKing1.txt +++ b/gamefilesd/texts/ogden/quests/skeletonKing1.txt @@ -1 +1,4 @@ -As I told you, Good Master, the King was entombed three levels below. He's down there, waiting in the putrid darkness for his chance to destroy this land... \ No newline at end of file +As I told you, good master, the King was +entombed three levels below. He's down +there, waiting in the putrid darkness for +his chance to destroy this land... \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/skeletonKing2.json b/gamefilesd/texts/ogden/quests/skeletonKing2.json index 16c242eb..d7bdf9b9 100755 --- a/gamefilesd/texts/ogden/quests/skeletonKing2.json +++ b/gamefilesd/texts/ogden/quests/skeletonKing2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown23.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/skeletonKing2.txt b/gamefilesd/texts/ogden/quests/skeletonKing2.txt index 753fe47b..f13acc12 100755 --- a/gamefilesd/texts/ogden/quests/skeletonKing2.txt +++ b/gamefilesd/texts/ogden/quests/skeletonKing2.txt @@ -1 +1,7 @@ -The curse of our King has passed, but I fear that it was only part of a greater Evil at work. However, we may yet be saved from the Darkness that consumes our land, for your victory is a good omen. May Light guide you on your way, Good Master. \ No newline at end of file +The curse of our King has passed, but I +fear that it was only part of a greater +evil at work. However, we may yet be +saved from the darkness that consumes +our land, for your victory is a good +omen. May Light guide you on your way, +good master. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/theButcher.json b/gamefilesd/texts/ogden/quests/theButcher.json index f1ad66d2..c048f50b 100755 --- a/gamefilesd/texts/ogden/quests/theButcher.json +++ b/gamefilesd/texts/ogden/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown08.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/theButcher.txt b/gamefilesd/texts/ogden/quests/theButcher.txt index 962e5319..7cabc30b 100755 --- a/gamefilesd/texts/ogden/quests/theButcher.txt +++ b/gamefilesd/texts/ogden/quests/theButcher.txt @@ -1 +1,4 @@ -Yes, Farnham has mumbled something about a hulking brute who wielded a fierce weapon. I believe he called him a butcher. \ No newline at end of file +Yes, Farnham has mumbled something +about a hulking brute who wielded a +fierce weapon. I believe he called him a +butcher. \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/warlordOfBlood.json b/gamefilesd/texts/ogden/quests/warlordOfBlood.json index 81ac8b6c..2999a39e 100755 --- a/gamefilesd/texts/ogden/quests/warlordOfBlood.json +++ b/gamefilesd/texts/ogden/quests/warlordOfBlood.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/ogden/quests/warlordOfBlood.txt" ], "audio": { "file": "sfx/Towners/tavown16.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/ogden/quests/warlordOfBlood.txt b/gamefilesd/texts/ogden/quests/warlordOfBlood.txt index a529e17e..ceff1083 100755 --- a/gamefilesd/texts/ogden/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/ogden/quests/warlordOfBlood.txt @@ -1 +1,5 @@ -I am afraid that I haven't heard anything about such a vicious warrior, Good Master. I hope that you do not have to fight him, for he sounds extremely dangerous. \ No newline at end of file +I am afraid that I haven't heard anything +about such a vicious warrior, good +master. I hope that you do not have to +fight him, for he sounds extremely +dangerous. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip1.json b/gamefilesd/texts/pepin/gossip/gossip1.json index 5ad12357..c8e7b9ae 100755 --- a/gamefilesd/texts/pepin/gossip/gossip1.json +++ b/gamefilesd/texts/pepin/gossip/gossip1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer38.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip1.txt b/gamefilesd/texts/pepin/gossip/gossip1.txt index 9b9ac2a5..732f34f7 100755 --- a/gamefilesd/texts/pepin/gossip/gossip1.txt +++ b/gamefilesd/texts/pepin/gossip/gossip1.txt @@ -1 +1,6 @@ -I have made a very interesting discovery. Unlike us, the creatures in the Labyrinth can heal themselves without the aid of potions or magic. If you hurt one of the monsters, make sure it is dead or it very well may regenerate itself. \ No newline at end of file +I have made a very interesting discovery. +Unlike us, the creatures in the Labyrinth +can heal themselves without the aid of +potions or magic. If you hurt one of the +monsters, make sure it is dead or it very +well may regenerate itself. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip2.json b/gamefilesd/texts/pepin/gossip/gossip2.json index 0fdb750a..ab87f2b8 100755 --- a/gamefilesd/texts/pepin/gossip/gossip2.json +++ b/gamefilesd/texts/pepin/gossip/gossip2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer39.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip2.txt b/gamefilesd/texts/pepin/gossip/gossip2.txt index 671734a4..74a68bfe 100755 --- a/gamefilesd/texts/pepin/gossip/gossip2.txt +++ b/gamefilesd/texts/pepin/gossip/gossip2.txt @@ -1 +1,7 @@ -Before it was taken over by, well, whatever lurks below, the Cathedral was a place of great learning. There are many books to be found there. If you find any, you should read them all, for some may hold secrets to the workings of the Labyrinth. \ No newline at end of file +Before it was taken over by, well, +whatever lurks below, the Cathedral +was a place of great learning. There are +many books to be found there. If you find +any, you should read them all, for some +may hold secrets to the workings of the +Labyrinth. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip3.json b/gamefilesd/texts/pepin/gossip/gossip3.json index 75b0ef1d..ed67e8d2 100755 --- a/gamefilesd/texts/pepin/gossip/gossip3.json +++ b/gamefilesd/texts/pepin/gossip/gossip3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer40.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip3.txt b/gamefilesd/texts/pepin/gossip/gossip3.txt index e61e2727..48d618a6 100755 --- a/gamefilesd/texts/pepin/gossip/gossip3.txt +++ b/gamefilesd/texts/pepin/gossip/gossip3.txt @@ -1 +1,5 @@ -Griswold knows as much about the art of war as I do about the art of healing. He is a shrewd merchant, but his work is second to none. Oh, I suppose that may be because he is the only blacksmith left here. \ No newline at end of file +Griswold knows as much about the art of +war as I do about the art of healing. He is +a shrewd merchant, but his work is second +to none. Oh, I suppose that may be because +he is the only blacksmith left here. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip4.json b/gamefilesd/texts/pepin/gossip/gossip4.json index b711af2f..f6bafcb7 100755 --- a/gamefilesd/texts/pepin/gossip/gossip4.json +++ b/gamefilesd/texts/pepin/gossip/gossip4.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer41.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip4.txt b/gamefilesd/texts/pepin/gossip/gossip4.txt index aa8a3e0e..3ba48804 100755 --- a/gamefilesd/texts/pepin/gossip/gossip4.txt +++ b/gamefilesd/texts/pepin/gossip/gossip4.txt @@ -1 +1,5 @@ -Cain is a true friend and a wise sage. He maintains a vast library and has an innate ability to discern the true nature of many things. If you ever have any questions, he is the person to go to. \ No newline at end of file +Cain is a true friend and a wise sage. He +maintains a vast library and has an +innate ability to discern the true nature +of many things. If you ever have any +questions, he is the person to go to. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip5.json b/gamefilesd/texts/pepin/gossip/gossip5.json index 2fa3ba70..910b55a3 100755 --- a/gamefilesd/texts/pepin/gossip/gossip5.json +++ b/gamefilesd/texts/pepin/gossip/gossip5.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer42.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip5.txt b/gamefilesd/texts/pepin/gossip/gossip5.txt index 0d7a82bc..bb241f1f 100755 --- a/gamefilesd/texts/pepin/gossip/gossip5.txt +++ b/gamefilesd/texts/pepin/gossip/gossip5.txt @@ -1 +1,4 @@ -Even my skills have been unable to fully heal Farnham. Oh, I have been able to mend his body, but his mind and spirit are beyond anything I can do. \ No newline at end of file +Even my skills have been unable to fully +heal Farnham. Oh, I have been able to mend +his body, but his mind and spirit are +beyond anything I can do. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip6.json b/gamefilesd/texts/pepin/gossip/gossip6.json index dd0c0271..2288b426 100755 --- a/gamefilesd/texts/pepin/gossip/gossip6.json +++ b/gamefilesd/texts/pepin/gossip/gossip6.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer43.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip6.txt b/gamefilesd/texts/pepin/gossip/gossip6.txt index 8a9acf26..249efcc3 100755 --- a/gamefilesd/texts/pepin/gossip/gossip6.txt +++ b/gamefilesd/texts/pepin/gossip/gossip6.txt @@ -1 +1,8 @@ -While I use some limited forms of magic to create the potions and elixirs I store here, Adria is a true sorceress. She never seems to sleep, and she always has access to many mystic tomes and artifacts. I believe her hut may be much more than the hovel it appears to be, but I can never seem to get inside the place. \ No newline at end of file +While I use some limited forms of magic to +create the potions and elixirs I store here, +Adria is a true sorceress. She never seems +to sleep, and she always has access to +many mystic tomes and artifacts. I +believe her hut may be much more than the +hovel it appears to be, but I can never +seem to get inside the place. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip7.json b/gamefilesd/texts/pepin/gossip/gossip7.json index aecbff99..fa6ae6a9 100755 --- a/gamefilesd/texts/pepin/gossip/gossip7.json +++ b/gamefilesd/texts/pepin/gossip/gossip7.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer45.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip7.txt b/gamefilesd/texts/pepin/gossip/gossip7.txt index d629bb8e..341e4e12 100755 --- a/gamefilesd/texts/pepin/gossip/gossip7.txt +++ b/gamefilesd/texts/pepin/gossip/gossip7.txt @@ -1 +1,6 @@ -Poor Wirt. I did all that was possible for the child, but I know he despises that wooden peg that I was forced to attach to his leg. His wounds were hideous. No one - and especially such a young child - should have to suffer the way he did. \ No newline at end of file +Poor Wirt. I did all that was possible for +the child, but I know he despises that +wooden peg that I was forced to attach +to his leg. His wounds were hideous. No +one - and especially such a young child - +should have to suffer the way he did. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip8.json b/gamefilesd/texts/pepin/gossip/gossip8.json index 4ee23ecd..e1a314bd 100755 --- a/gamefilesd/texts/pepin/gossip/gossip8.json +++ b/gamefilesd/texts/pepin/gossip/gossip8.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer46.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip8.txt b/gamefilesd/texts/pepin/gossip/gossip8.txt index 5ab6ca97..007a5e3c 100755 --- a/gamefilesd/texts/pepin/gossip/gossip8.txt +++ b/gamefilesd/texts/pepin/gossip/gossip8.txt @@ -1 +1,10 @@ -I really don't understand why Ogden stays here in Tristram. He suffers from a slight nervous condition, but he is an intelligent and industrious man who would do very well wherever he went. I suppose it may be the fear of the many murders that happen in the surrounding countryside, or perhaps the wishes of his wife that keep him and his family where they are. \ No newline at end of file +I really don't understand why Ogden +stays here in Tristram. He suffers from a +slight nervous condition, but he is an +intelligent and industrious man who +would do very well wherever he went. I +suppose it may be the fear of the many +murders that happen in the surrounding +countryside, or perhaps the wishes of his +wife that keep him and his family where +they are. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip9.json b/gamefilesd/texts/pepin/gossip/gossip9.json index 928ebc90..7c3916d0 100755 --- a/gamefilesd/texts/pepin/gossip/gossip9.json +++ b/gamefilesd/texts/pepin/gossip/gossip9.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/pepin/gossip/gossip9.txt" ], "audio": { "file": "sfx/Towners/healer47.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/gossip/gossip9.txt b/gamefilesd/texts/pepin/gossip/gossip9.txt index 897e0309..9df5f103 100755 --- a/gamefilesd/texts/pepin/gossip/gossip9.txt +++ b/gamefilesd/texts/pepin/gossip/gossip9.txt @@ -1 +1,7 @@ -Ogden's barmaid is a sweet girl. Her grandmother is quite ill, and suffers from delusions. She claims that they are visions, but I have no proof of that one way or the other. \ No newline at end of file +Ogden's barmaid is a sweet girl. Her +grandmother is quite ill, and suffers from +delusions. + +She claims that they are visions, but I +have no proof of that one way or the +other. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/anvilOfFury.json b/gamefilesd/texts/pepin/quests/anvilOfFury.json index 938f6d33..f75f5f22 100755 --- a/gamefilesd/texts/pepin/quests/anvilOfFury.json +++ b/gamefilesd/texts/pepin/quests/anvilOfFury.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/pepin/quests/anvilOfFury.txt" ], "audio": { "file": "sfx/Towners/healer12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/anvilOfFury.txt b/gamefilesd/texts/pepin/quests/anvilOfFury.txt index c0baa8fc..92bba4e4 100755 --- a/gamefilesd/texts/pepin/quests/anvilOfFury.txt +++ b/gamefilesd/texts/pepin/quests/anvilOfFury.txt @@ -1 +1,6 @@ -If you had been looking for information on the Pestle of Curing or the Silver Chalice of Purification, I could have assisted you, my friend. However, in this matter, you would be better served to speak to either Griswold or Cain. \ No newline at end of file +If you had been looking for information +on the Pestle of Curing or the Silver +Chalice of Purification, I could have +assisted you, my friend. However, in this +matter, you would be better served to +speak to either Griswold or Cain. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/archbishopLazarus.json b/gamefilesd/texts/pepin/quests/archbishopLazarus.json index ba33b36b..b0aaaa0d 100755 --- a/gamefilesd/texts/pepin/quests/archbishopLazarus.json +++ b/gamefilesd/texts/pepin/quests/archbishopLazarus.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/archbishopLazarus.txt b/gamefilesd/texts/pepin/quests/archbishopLazarus.txt index cb3502a5..085d1a11 100755 --- a/gamefilesd/texts/pepin/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/pepin/quests/archbishopLazarus.txt @@ -1 +1,8 @@ -I was shocked when I heard of what the townspeople were planning to do that night. I thought that of all people, Lazarus would have had more sense than that. He was an Archbishop, and always seemed to care so much for the townsfolk of Tristram. So many were injured, I could not save them all... \ No newline at end of file +I was shocked when I heard of what the +townspeople were planning to do that +night. I thought that of all people, +Lazarus would have had more sense than +that. He was an Archbishop, and always +seemed to care so much for the townsfolk +of Tristram. So many were injured, I +could not save them all... \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/arkainesValor.json b/gamefilesd/texts/pepin/quests/arkainesValor.json index 86fccf0e..c46f3fe2 100755 --- a/gamefilesd/texts/pepin/quests/arkainesValor.json +++ b/gamefilesd/texts/pepin/quests/arkainesValor.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/pepin/quests/arkainesValor.txt" ], "audio": { "file": "sfx/Towners/healer13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/arkainesValor.txt b/gamefilesd/texts/pepin/quests/arkainesValor.txt index b5aee9f3..313f36c6 100755 --- a/gamefilesd/texts/pepin/quests/arkainesValor.txt +++ b/gamefilesd/texts/pepin/quests/arkainesValor.txt @@ -1 +1,4 @@ -Hmm... It sounds like something I should remember, but I've been so busy learning new cures and creating better elixirs that I must have forgotten. Sorry... \ No newline at end of file +Hmm... it sounds like something I should +remember, but I've been so busy learning +new cures and creating better elixirs +that I must have forgotten. Sorry... \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/blackMushroom.json b/gamefilesd/texts/pepin/quests/blackMushroom.json index 450ddb4a..300caa3a 100755 --- a/gamefilesd/texts/pepin/quests/blackMushroom.json +++ b/gamefilesd/texts/pepin/quests/blackMushroom.json @@ -1,7 +1,7 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.blackMushroom.state|", + "param": "%currentLevel.quest.blackMushroom.state%", "case": [ { "value": 0, diff --git a/gamefilesd/texts/pepin/quests/blackMushroom1.json b/gamefilesd/texts/pepin/quests/blackMushroom1.json index 9bb5a17b..5520f8f4 100755 --- a/gamefilesd/texts/pepin/quests/blackMushroom1.json +++ b/gamefilesd/texts/pepin/quests/blackMushroom1.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer26.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/blackMushroom1.txt b/gamefilesd/texts/pepin/quests/blackMushroom1.txt index f5ed4264..09bcad22 100755 --- a/gamefilesd/texts/pepin/quests/blackMushroom1.txt +++ b/gamefilesd/texts/pepin/quests/blackMushroom1.txt @@ -1 +1,9 @@ -The Witch told me that you were searching for the Brain of a Demon to assist me in creating my elixir. It should be of great value to the many who are injured by those foul beasts, if I can just unlock the secrets I suspect that its alchemy holds. If you can remove the Brain of a Demon when you kill it, I would be grateful if you could bring it to me. \ No newline at end of file +The witch told me that you were +searching for the brain of a demon to +assist me in creating my elixir. It should +be of great value to the many who are +injured by those foul beasts, if I can just +unlock the secrets I suspect that its +alchemy holds. If you can remove the +brain of a demon when you kill it, I would +be grateful if you could bring it to me. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/blackMushroom2.json b/gamefilesd/texts/pepin/quests/blackMushroom2.json index f0f48994..f6013f15 100755 --- a/gamefilesd/texts/pepin/quests/blackMushroom2.json +++ b/gamefilesd/texts/pepin/quests/blackMushroom2.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer27.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/blackMushroom2.txt b/gamefilesd/texts/pepin/quests/blackMushroom2.txt index 8115b54e..438e04a2 100755 --- a/gamefilesd/texts/pepin/quests/blackMushroom2.txt +++ b/gamefilesd/texts/pepin/quests/blackMushroom2.txt @@ -1 +1,5 @@ -Excellent, this is just what I had in mind. I was able to finish the elixir without this, but it can't hurt to have this to study. Would you please carry this to the Witch? I believe that she is expecting it. \ No newline at end of file +Excellent, this is just what I had in mind. I +was able to finish the elixir without this, +but it can't hurt to have this to study. +Would you please carry this to the +witch? I believe that she is expecting it. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/chamberOfBone.json b/gamefilesd/texts/pepin/quests/chamberOfBone.json index a74203cf..c4911af4 100755 --- a/gamefilesd/texts/pepin/quests/chamberOfBone.json +++ b/gamefilesd/texts/pepin/quests/chamberOfBone.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/pepin/quests/chamberOfBone.txt" ], "audio": { "file": "sfx/Towners/healer05.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/chamberOfBone.txt b/gamefilesd/texts/pepin/quests/chamberOfBone.txt index 419916a2..c8b5734f 100755 --- a/gamefilesd/texts/pepin/quests/chamberOfBone.txt +++ b/gamefilesd/texts/pepin/quests/chamberOfBone.txt @@ -1 +1,3 @@ -This sounds like a very dangerous place. If you venture there, please take great care. \ No newline at end of file +This sounds like a very dangerous place. +If you venture there, please take great +care. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/hallsOfTheBlind.json b/gamefilesd/texts/pepin/quests/hallsOfTheBlind.json index b160c777..80b0fdb4 100755 --- a/gamefilesd/texts/pepin/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/pepin/quests/hallsOfTheBlind.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/hallsOfTheBlind.txt b/gamefilesd/texts/pepin/quests/hallsOfTheBlind.txt index e31d283a..c0ab2d91 100755 --- a/gamefilesd/texts/pepin/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/pepin/quests/hallsOfTheBlind.txt @@ -1 +1,6 @@ -This does seem familiar, somehow. I seem to recall reading something very much like that poem while researching the history of demonic afflictions. It spoke of a place of great Evil that... Wait - you're not going there, are you? \ No newline at end of file +This does seem familiar, somehow. I seem to +recall reading something very much like +that poem while researching the history +of demonic afflictions. It spoke of a place +of great evil that... wait - you're not +going there are you? \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/lachdanan.json b/gamefilesd/texts/pepin/quests/lachdanan.json index 06eaa8b6..63e32def 100755 --- a/gamefilesd/texts/pepin/quests/lachdanan.json +++ b/gamefilesd/texts/pepin/quests/lachdanan.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer11.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/lachdanan.txt b/gamefilesd/texts/pepin/quests/lachdanan.txt index 227ee1dd..4102bf8a 100755 --- a/gamefilesd/texts/pepin/quests/lachdanan.txt +++ b/gamefilesd/texts/pepin/quests/lachdanan.txt @@ -1 +1,7 @@ -A Golden Elixir, you say. I have never concocted a potion of that color before, so I can't tell you how it would effect you if you were to try to drink it. As your healer, I strongly advise that should you find such an Elixir, do as Lachdanan asks and do not try to use it. \ No newline at end of file +A golden elixir, you say. I have never +concocted a potion of that color before, +so I can't tell you how it would effect +you if you were to try to drink it. As +your healer, I strongly advise that +should you find such an elixir, do as +Lachdanan asks and DO NOT try to use it. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/magicRock.json b/gamefilesd/texts/pepin/quests/magicRock.json index e7710285..ee8f580f 100755 --- a/gamefilesd/texts/pepin/quests/magicRock.json +++ b/gamefilesd/texts/pepin/quests/magicRock.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/pepin/quests/magicRock.txt" ], "audio": { "file": "sfx/Towners/healer18.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/magicRock.txt b/gamefilesd/texts/pepin/quests/magicRock.txt index 96e0e79d..7ffe1a4b 100755 --- a/gamefilesd/texts/pepin/quests/magicRock.txt +++ b/gamefilesd/texts/pepin/quests/magicRock.txt @@ -1 +1,4 @@ -I don't know what it is that they thought they could see with that rock, but I will say this. If rocks are falling from the Sky, you had better be careful! \ No newline at end of file +I don't know what it is that they +thought they could see with that rock, +but I will say this. If rocks are falling +from the sky, you had better be careful! \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/ogdensSign.json b/gamefilesd/texts/pepin/quests/ogdensSign.json index 815eea8a..a38e89e1 100755 --- a/gamefilesd/texts/pepin/quests/ogdensSign.json +++ b/gamefilesd/texts/pepin/quests/ogdensSign.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/ogdensSign.txt b/gamefilesd/texts/pepin/quests/ogdensSign.txt index b4acdbab..0a834ae1 100755 --- a/gamefilesd/texts/pepin/quests/ogdensSign.txt +++ b/gamefilesd/texts/pepin/quests/ogdensSign.txt @@ -1 +1,5 @@ -My goodness, Demons running about the village at night, pillaging our homes - is nothing sacred? I hope that Ogden and Garda are all right. I suppose that they would come to see me if they were hurt... \ No newline at end of file +My goodness, demons running about the +village at night, pillaging our homes - is +nothing sacred? I hope that Ogden and +Garda are all right. I suppose that they +would come to see me if they were hurt... \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/poisonedWater.json b/gamefilesd/texts/pepin/quests/poisonedWater.json index cb9e3ace..d78eefcd 100755 --- a/gamefilesd/texts/pepin/quests/poisonedWater.json +++ b/gamefilesd/texts/pepin/quests/poisonedWater.json @@ -1,15 +1,25 @@ { "action": { "name": "switch", - "param": "|currentLevel|quest.poisonedWater.state|", + "param": "%currentLevel.quest.poisonedWater.state%", "case": [ { "value": 0, - "action": { "name": "load", "file": "texts/pepin/quests/poisonedWater1.json" } + "action": [ + { "name": "load", "file": "texts/pepin/quests/poisonedWater1.json" }, + { "name": "quest.setState", "quest": "poisonedWater", "state": 1 } + ] }, { "value": 1, "action": { "name": "load", "file": "texts/pepin/quests/poisonedWater2.json" } + }, + { + "value": -1, + "action": [ + { "name": "load", "file": "texts/pepin/quests/poisonedWater3.json" }, + { "name": "quest.delete", "quest": "poisonedWater" } + ] } ] } diff --git a/gamefilesd/texts/pepin/quests/poisonedWater1.json b/gamefilesd/texts/pepin/quests/poisonedWater1.json index 7d1e0fe6..c8b75c0d 100755 --- a/gamefilesd/texts/pepin/quests/poisonedWater1.json +++ b/gamefilesd/texts/pepin/quests/poisonedWater1.json @@ -6,8 +6,8 @@ "texts/pepin/quests/poisonedWater1.txt" ], "audio": { - "file": "sfx/Towners/healer21.wav", + "file": "sfx/Towners/healer20.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/poisonedWater1.txt b/gamefilesd/texts/pepin/quests/poisonedWater1.txt index b9102330..ccec378b 100755 --- a/gamefilesd/texts/pepin/quests/poisonedWater1.txt +++ b/gamefilesd/texts/pepin/quests/poisonedWater1.txt @@ -1,3 +1,9 @@ -Please, you must hurry. Every hour that passes brings us closer to having no water to drink. - -We cannot survive for long without your help. \ No newline at end of file +I'm glad I caught up to you in time! Our +wells have become brackish and stagnant +and some of the townspeople have become +ill drinking from them. Our reserves of +fresh water are quickly running dry. I +believe that there is a passage that leads +to the springs that serve our town. +Please find what has caused this +calamity, or we all will surely perish. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/poisonedWater2.json b/gamefilesd/texts/pepin/quests/poisonedWater2.json index 6d637578..a968a9f6 100755 --- a/gamefilesd/texts/pepin/quests/poisonedWater2.json +++ b/gamefilesd/texts/pepin/quests/poisonedWater2.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/pepin/quests/poisonedWater2.txt" ], "audio": { - "file": "sfx/Towners/healer22.wav", + "file": "sfx/Towners/healer21.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/poisonedWater2.txt b/gamefilesd/texts/pepin/quests/poisonedWater2.txt index dfdaa269..5bdc47b0 100755 --- a/gamefilesd/texts/pepin/quests/poisonedWater2.txt +++ b/gamefilesd/texts/pepin/quests/poisonedWater2.txt @@ -1 +1,6 @@ -What's that you say - the mere presence of the Demons had caused the water to become tainted? Oh, truly a great Evil lurks beneath our town, but your perseverance and courage gives us hope. Please take this ring - perhaps it will aid you in the destruction of such vile creatures. \ No newline at end of file +Please, you must hurry. Every hour that +passes brings us closer to having no +water to drink. + +We cannot survive for long without +your help. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/poisonedWater3.json b/gamefilesd/texts/pepin/quests/poisonedWater3.json new file mode 100755 index 00000000..9de0dccb --- /dev/null +++ b/gamefilesd/texts/pepin/quests/poisonedWater3.json @@ -0,0 +1,13 @@ +{ + "load": [ + "ui/level/showText.json", + "questText", + "50", + "texts/pepin/quests/poisonedWater3.txt" + ], + "audio": { + "file": "sfx/Towners/healer22.wav", + "play": true, + "volume": "%game.soundVolume%" + } +} \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/poisonedWater3.txt b/gamefilesd/texts/pepin/quests/poisonedWater3.txt new file mode 100755 index 00000000..17ee077a --- /dev/null +++ b/gamefilesd/texts/pepin/quests/poisonedWater3.txt @@ -0,0 +1,8 @@ +What's that you say - the mere presence +of the demons had caused the water to +become tainted? Oh, truly a great evil +lurks beneath our town, but your +perseverance and courage gives us hope. +Please take this ring - perhaps it will aid +you in the destruction of such vile +creatures. \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/skeletonKing.json b/gamefilesd/texts/pepin/quests/skeletonKing.json index 4bb94d87..fdf2cfa2 100755 --- a/gamefilesd/texts/pepin/quests/skeletonKing.json +++ b/gamefilesd/texts/pepin/quests/skeletonKing.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/skeletonKing.txt b/gamefilesd/texts/pepin/quests/skeletonKing.txt index e50eb61c..09b291d8 100755 --- a/gamefilesd/texts/pepin/quests/skeletonKing.txt +++ b/gamefilesd/texts/pepin/quests/skeletonKing.txt @@ -1 +1,8 @@ -The loss of his son was too much for King Leoric. I did what I could to ease his madness, but in the end it overcame him. A black curse has hung over this kingdom from that day forward, but perhaps if you were to free his spirit from his Earthly prison, the curse would be lifted... \ No newline at end of file +The loss of his son was too much for King +Leoric. I did what I could to ease his +madness, but in the end it overcame him. A +black curse has hung over this kingdom +from that day forward, but perhaps if +you were to free his spirit from his +earthly prison, the curse would be +lifted... \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/theButcher.json b/gamefilesd/texts/pepin/quests/theButcher.json index bfc3e02c..daa826dd 100755 --- a/gamefilesd/texts/pepin/quests/theButcher.json +++ b/gamefilesd/texts/pepin/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/healer08.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/theButcher.txt b/gamefilesd/texts/pepin/quests/theButcher.txt index 28905a3c..da2d6509 100755 --- a/gamefilesd/texts/pepin/quests/theButcher.txt +++ b/gamefilesd/texts/pepin/quests/theButcher.txt @@ -1 +1,11 @@ -By the Light, I know of this vile demon. There were many that bore the scars of his wrath upon their bodies when the few survivors of the charge led by Lazarus crawled from the Cathedral. I don't know what he used to slice open his victims, but it could not have been of this world. It left wounds festering with disease and even I found them almost impossible to treat. Beware if you plan to battle this fiend... \ No newline at end of file +By the Light, I know of this vile demon. +There were many that bore the scars of +his wrath upon their bodies when the few +survivors of the charge led by Lazarus +crawled from the Cathedral. I don't +know what he used to slice open his +victims, but it could not have been of +this world. It left wounds festering with +disease and even I found them almost +impossible to treat. Beware if you plan to +battle this fiend... \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/warlordOfBlood.json b/gamefilesd/texts/pepin/quests/warlordOfBlood.json index 5bae0df1..00315801 100755 --- a/gamefilesd/texts/pepin/quests/warlordOfBlood.json +++ b/gamefilesd/texts/pepin/quests/warlordOfBlood.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "16", "texts/pepin/quests/warlordOfBlood.txt" ], "audio": { "file": "sfx/Towners/healer16.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/pepin/quests/warlordOfBlood.txt b/gamefilesd/texts/pepin/quests/warlordOfBlood.txt index 58ba46c9..6fca4431 100755 --- a/gamefilesd/texts/pepin/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/pepin/quests/warlordOfBlood.txt @@ -1 +1,3 @@ -Cain would be able to tell you much more about something like this than I would ever wish to know. \ No newline at end of file +Cain would be able to tell you much +more about something like this than I +would ever wish to know. \ No newline at end of file diff --git a/gamefilesd/texts/quests/anvilOfFury.json b/gamefilesd/texts/quests/anvilOfFury.json index a64c3779..30ace0d4 100755 --- a/gamefilesd/texts/quests/anvilOfFury.json +++ b/gamefilesd/texts/quests/anvilOfFury.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith21.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/quests/anvilOfFury.txt b/gamefilesd/texts/quests/anvilOfFury.txt index 5665beb6..0acd0b91 100755 --- a/gamefilesd/texts/quests/anvilOfFury.txt +++ b/gamefilesd/texts/quests/anvilOfFury.txt @@ -1,5 +1,27 @@ -Greetings! It's always a pleasure to see one of my best customers! I know that you have been venturing deeper into the Labyrinth, and there is a story I was told that you may find worth the time to listen to... +Greetings! It's always a pleasure to see +one of my best customers! I know that +you have been venturing deeper into the +Labyrinth, and there is a story I was told +that you may find worth the time to +listen to... -One of the men who returned from the Labyrinth told me about a mystic anvil that he came across during his escape. His description reminded me of legends I had heard in my youth about the Burning Hellforge where powerful weapons of magic are crafted. The legend had it that deep within the Hellforge rested the Anvil of Fury! This anvil contained within it the very essence of the demonic underworld... +One of the men who returned from the +Labyrinth told me about a mystic anvil +that he came across during his escape. His +description reminded me of legends I had +heard in my youth about the burning +Hellforge where powerful weapons of +magic are crafted. The legend had it that +deep within the Hellforge rested the Anvil +of Fury! This Anvil contained within it the +very essence of the demonic underworld... -It is said that any weapon crafted upon the burning Anvil is imbued with great power. If this anvil is indeed the Anvil of Fury, I may be able to make you a weapon capable of defeating even the darkest Lord of Hell! Find the Anvil for me, and I'll get to work! \ No newline at end of file +It is said that any weapon crafted upon +the burning Anvil is imbued with great +power. If this anvil is indeed the Anvil of +Fury, I may be able to make you a weapon +capable of defeating even the darkest +lord of Hell! + +Find the Anvil for me, and I'll get to +work! \ No newline at end of file diff --git a/gamefilesd/texts/quests/archbishopLazarus.json b/gamefilesd/texts/quests/archbishopLazarus.json index e7f2d5a1..122e82e3 100755 --- a/gamefilesd/texts/quests/archbishopLazarus.json +++ b/gamefilesd/texts/quests/archbishopLazarus.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "58", "texts/quests/archbishopLazarus.txt" ], "audio": { "file": "sfx/Towners/storyt36.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/quests/archbishopLazarus.txt b/gamefilesd/texts/quests/archbishopLazarus.txt index a906fe2e..1bb7fc31 100755 --- a/gamefilesd/texts/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/quests/archbishopLazarus.txt @@ -1,9 +1,37 @@ -This does not bode well, for it confirms my darkest fears. While I did not allow myself to believe the Ancient Legends, I cannot deny them now. Perhaps the time has come to reveal who I am. +This does not bode well, for it confirms +my darkest fears. While I did not allow +myself to believe the ancient legends, I +cannot deny them now. Perhaps the time +has come to reveal who I am. -My true name is Deckard Cain the Elder, and I am the last descendant of an Ancient Brotherhood that was dedicated to safeguarding the secrets of a timeless Evil. An Evil that quite obviously has now been released. +My true name is Deckard Cain the Elder, +and I am the last descendant of an +ancient Brotherhood that was dedicated +to safeguarding the secrets of a timeless +evil. An evil that quite obviously has +now been released. -The Archbishop Lazarus, once King Leoric's most trusted advisor, led a party of simple townsfolk into the Labyrinth to find the King's missing son, Albrecht. Quite some time passed before they returned, and only a few of them escaped with their lives. +The Archbishop Lazarus, once King Leoric's +most trusted advisor, led a party of +simple townsfolk into the Labyrinth to +find the King's missing son, Albrecht. Quite +some time passed before they returned, +and only a few of them escaped with their +lives. -Curse me for a fool! I should have suspected his veiled treachery then. It must have been Lazarus himself who kidnapped Albrecht and has since hidden him within the Labyrinth. I do not understand why the Archbishop turned to the Darkness, or what his interest is in the child. Unless he means to sacrifice him to his Dark Masters! +Curse me for a fool! I should have +suspected his veiled treachery then. It +must have been Lazarus himself who +kidnapped Albrecht and has since hidden him +within the Labyrinth. I do not understand +why the Archbishop turned to the +darkness, or what his interest is in the +child. unless he means to sacrifice him to +his dark masters! -That must be what he has planned! The survivors of his 'rescue party' say that Lazarus was last seen running into the deepest bowels of the Labyrinth. You must hurry and save the Prince from the Sacrificial Blade of this demented fiend! \ No newline at end of file +That must be what he has planned! The +survivors of his 'rescue party' say that +Lazarus was last seen running into the +deepest bowels of the labyrinth. You +must hurry and save the prince from the +sacrificial blade of this demented fiend! \ No newline at end of file diff --git a/gamefilesd/texts/quests/arkainesValor.json b/gamefilesd/texts/quests/arkainesValor.json index e3a346f2..a40271a4 100755 --- a/gamefilesd/texts/quests/arkainesValor.json +++ b/gamefilesd/texts/quests/arkainesValor.json @@ -5,10 +5,5 @@ "50", "texts/quests/arkainesValor.txt" ], - "load": [ - "res/player/sound/load.json", - "|currentLevel|currentPlayer.class|", - 10, - "playAudio" - ] + "load": ["res/player/sound/load.json", 10, "", "playAudio", ""] } \ No newline at end of file diff --git a/gamefilesd/texts/quests/arkainesValor.txt b/gamefilesd/texts/quests/arkainesValor.txt index a3b6a6f4..fd55d865 100755 --- a/gamefilesd/texts/quests/arkainesValor.txt +++ b/gamefilesd/texts/quests/arkainesValor.txt @@ -1 +1,3 @@ -...and so, locked beyond the Gateway of Blood and past the Hall of Fire, Valor awaits for the Hero of Light to awaken... \ No newline at end of file +...and so, locked beyond the Gateway of +Blood and past the Hall of Fire, Valor +awaits for the Hero of Light to awaken... \ No newline at end of file diff --git a/gamefilesd/texts/quests/blackMushroom.json b/gamefilesd/texts/quests/blackMushroom.json index 2de61452..7cd4648f 100755 --- a/gamefilesd/texts/quests/blackMushroom.json +++ b/gamefilesd/texts/quests/blackMushroom.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/witch22.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/quests/blackMushroom.txt b/gamefilesd/texts/quests/blackMushroom.txt index 28667e83..f7f86849 100755 --- a/gamefilesd/texts/quests/blackMushroom.txt +++ b/gamefilesd/texts/quests/blackMushroom.txt @@ -1 +1,5 @@ -What do we have here? Interesting. It looks like a Book of Reagents. Keep your eyes open for a Black Mushroom. It should be fairly large and easy to identify. If you find it, bring it to me, won't you? \ No newline at end of file +What do we have here? Interesting, it +looks like a book of reagents. Keep your +eyes open for a black mushroom. It should +be fairly large and easy to identify. If +you find it, bring it to me, won't you? \ No newline at end of file diff --git a/gamefilesd/texts/quests/chamberOfBone.json b/gamefilesd/texts/quests/chamberOfBone.json index 2d6a28d9..1356c106 100755 --- a/gamefilesd/texts/quests/chamberOfBone.json +++ b/gamefilesd/texts/quests/chamberOfBone.json @@ -5,10 +5,5 @@ "50", "texts/quests/chamberOfBone.txt" ], - "load": [ - "res/player/sound/load.json", - "|currentLevel|currentPlayer.class|", - 1, - "playAudio" - ] + "load": ["res/player/sound/load.json", 1, "", "playAudio", ""] } \ No newline at end of file diff --git a/gamefilesd/texts/quests/chamberOfBone.txt b/gamefilesd/texts/quests/chamberOfBone.txt index a66aaa56..97a8021e 100755 --- a/gamefilesd/texts/quests/chamberOfBone.txt +++ b/gamefilesd/texts/quests/chamberOfBone.txt @@ -1 +1,5 @@ -Beyond the Hall of Heroes lies the Chamber of Bone. Eternal death awaits any who would seek to steal the treasures secured within this room. So speaks the Lord of Terror, and so it is written. \ No newline at end of file +Beyond the Hall of Heroes lies the Chamber +of Bone. Eternal death awaits any who +would seek to steal the treasures +secured within this room. So speaks the +Lord of Terror, and so it is written. \ No newline at end of file diff --git a/gamefilesd/texts/quests/hallsOfTheBlind.json b/gamefilesd/texts/quests/hallsOfTheBlind.json index 8b4b93bd..e76729b7 100755 --- a/gamefilesd/texts/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/quests/hallsOfTheBlind.json @@ -5,10 +5,5 @@ "50", "texts/quests/hallsOfTheBlind.txt" ], - "load": [ - "res/player/sound/load.json", - "|currentLevel|currentPlayer.class|", - 11, - "playAudio" - ] + "load": ["res/player/sound/load.json", 11, "", "playAudio", ""] } \ No newline at end of file diff --git a/gamefilesd/texts/quests/magicRock.json b/gamefilesd/texts/quests/magicRock.json index 4cb85c2d..0f271f23 100755 --- a/gamefilesd/texts/quests/magicRock.json +++ b/gamefilesd/texts/quests/magicRock.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/bsmith24.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/quests/magicRock.txt b/gamefilesd/texts/quests/magicRock.txt index 5bd2b0e8..f4754dee 100755 --- a/gamefilesd/texts/quests/magicRock.txt +++ b/gamefilesd/texts/quests/magicRock.txt @@ -1 +1,12 @@ -Stay for a moment - I have a story you might find interesting. A caravan that was bound for the the Eastern Kingdoms passed through here some time ago. It was supposedly carrying a piece of the Heavens that had fallen to Earth! The caravan was ambushed by cloaked riders just north of here along the roadway. I searched the wreckage for this Sky Rock, but it was nowhere to be found. If you should find it, I believe that I can fashion something useful from it. \ No newline at end of file +Stay for a moment - I have a story you +might find interesting. A caravan that +was bound for the eastern kingdoms +passed through here some time ago. It was +supposedly carrying a piece of the +heavens that had fallen to earth! The +caravan was ambushed by cloaked riders +just north of here along the roadway. I +searched the wreckage for this sky rock, +but it was nowhere to be found. If you +should find it, I believe that I can fashion +something useful from it. \ No newline at end of file diff --git a/gamefilesd/texts/quests/ogdensSign.json b/gamefilesd/texts/quests/ogdensSign.json index 69b059e4..0d101c25 100755 --- a/gamefilesd/texts/quests/ogdensSign.json +++ b/gamefilesd/texts/quests/ogdensSign.json @@ -1,3 +1,3 @@ { - "load": "texts/ogden/quests/ogdensSign.json" + "load": "texts/ogden/quests/ogdensSign1.json" } \ No newline at end of file diff --git a/gamefilesd/texts/quests/poisonedWater.json b/gamefilesd/texts/quests/poisonedWater.json index 012e89ce..2c0e1d9d 100755 --- a/gamefilesd/texts/quests/poisonedWater.json +++ b/gamefilesd/texts/quests/poisonedWater.json @@ -1,13 +1,3 @@ { - "load": [ - "ui/level/showText.json", - "questText", - "50", - "texts/quests/poisonedWater.txt" - ], - "audio": { - "file": "sfx/Towners/healer20.wav", - "play": true, - "volume": "|game|soundVolume|" - } + "load": "texts/pepin/quests/poisonedWater1.json" } \ No newline at end of file diff --git a/gamefilesd/texts/quests/poisonedWater.txt b/gamefilesd/texts/quests/poisonedWater.txt deleted file mode 100755 index 3966f51a..00000000 --- a/gamefilesd/texts/quests/poisonedWater.txt +++ /dev/null @@ -1 +0,0 @@ -I'm glad I caught up to you in time! Our wells have become brackish and stagnant and some of the townspeople have become ill from drinking them. Our reserves of fresh water are quickly running dry. I believe that there is a passage that leads to the springs that serve our town. Please find what has caused this calamity, or we all will surely perish. \ No newline at end of file diff --git a/gamefilesd/texts/quests/skeletonKing.json b/gamefilesd/texts/quests/skeletonKing.json index 305ce185..6eb33b96 100755 --- a/gamefilesd/texts/quests/skeletonKing.json +++ b/gamefilesd/texts/quests/skeletonKing.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/tavown21.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/quests/skeletonKing.txt b/gamefilesd/texts/quests/skeletonKing.txt index 61bd2d29..0479ece7 100755 --- a/gamefilesd/texts/quests/skeletonKing.txt +++ b/gamefilesd/texts/quests/skeletonKing.txt @@ -1,5 +1,28 @@ -The village needs your help, Good Master! Some months ago King Leoric's son, Prince Albrecht, was kidnapped. The King went into a rage and scoured the village for his missing child. With each passing day, Leoric seemed to slip deeper into madness. He sought to blame innocent townsfolk for the boy's disappearance and had them brutally executed. Less than half of us survived his insanity... +The village needs your help, good master! +Some months ago King Leoric's son, Prince +Albrecht, was kidnapped. The King went +into a rage and scoured the village for +his missing child. With each passing day, +Leoric seemed to slip deeper into madness. +He sought to blame innocent townsfolk +for the boy's disappearance and had them +brutally executed. Less than half of us +survived his insanity... -The King's knights and priests tried to placate him, but he turned against them and sadly, they were forced to kill him. With his dying breath the King called down a terrible curse upon his former followers. He vowed that they would serve him in darkness forever... +The King's Knights and Priests tried to +placate him, but he turned against them +and sadly, they were forced to kill him. +With his dying breath the King called +down a terrible curse upon his former +followers. He vowed that they would +serve him in darkness forever... -This is where things take an even darker twist than I thought possible! Our former King has risen from his eternal sleep and now commands a legion of Undead Minions within the labyrinth. His body was buried in a tomb three levels beneath the Cathedral. Please, good Master, put his soul at ease by destroying his now cursed form... \ No newline at end of file +This is where things take an even darker +twist than I thought possible! Our former +King has risen from his eternal sleep and +now commands a legion of undead minions +within the Labyrinth. His body was buried +in a tomb three levels beneath the +Cathedral. Please, good master, put his +soul at ease by destroying his now +cursed form... \ No newline at end of file diff --git a/gamefilesd/texts/quests/theButcher.json b/gamefilesd/texts/quests/theButcher.json index d27314af..c74874d1 100755 --- a/gamefilesd/texts/quests/theButcher.json +++ b/gamefilesd/texts/quests/theButcher.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/wound01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/quests/theButcher.txt b/gamefilesd/texts/quests/theButcher.txt index ee5368e9..96b1a8a4 100755 --- a/gamefilesd/texts/quests/theButcher.txt +++ b/gamefilesd/texts/quests/theButcher.txt @@ -1 +1,7 @@ -Please, listen to me. The Archbishop Lazarus, he led us down here to find the lost prince. The bastard led us into a trap! Now everyone is dead...killed by a demon he called the Butcher. Avenge us! Find this Butcher and slay him so that our souls may finally rest... \ No newline at end of file +Please, listen to me. The Archbishop +Lazarus, he led us down here to find the +lost prince. The bastard led us into a +trap! Now everyone is dead...killed by a +demon he called the Butcher. Avenge us! +Find this Butcher and slay him so that our +souls may finally rest... \ No newline at end of file diff --git a/gamefilesd/texts/quests/warlordOfBlood.json b/gamefilesd/texts/quests/warlordOfBlood.json index 813a3334..0016d993 100755 --- a/gamefilesd/texts/quests/warlordOfBlood.json +++ b/gamefilesd/texts/quests/warlordOfBlood.json @@ -5,10 +5,5 @@ "50", "texts/quests/warlordOfBlood.txt" ], - "load": [ - "res/player/sound/load.json", - "|currentLevel|currentPlayer.class|", - 12, - "playAudio" - ] + "load": ["res/player/sound/load.json", 12, "", "playAudio", ""] } \ No newline at end of file diff --git a/gamefilesd/texts/quests/warlordOfBlood.txt b/gamefilesd/texts/quests/warlordOfBlood.txt index 0faedf19..e855b000 100755 --- a/gamefilesd/texts/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/quests/warlordOfBlood.txt @@ -1 +1,6 @@ -The armories of Hell are home to the Warlord of Blood. In his wake lay the mutilated bodies of thousands. Angels and man alike have been cut down to fulfill his endless sacrifices to the Dark ones who scream for one thing - blood. \ No newline at end of file +The armories of Hell are home to the +Warlord of Blood. In his wake lay the +mutilated bodies of thousands. Angels +and man alike have been cut down to +fulfill his endless sacrifices to the Dark +ones who scream for one thing - blood. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip1.json b/gamefilesd/texts/wirt/gossip/gossip1.json index f592f128..72f16ec9 100755 --- a/gamefilesd/texts/wirt/gossip/gossip1.json +++ b/gamefilesd/texts/wirt/gossip/gossip1.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/gossip/gossip1.txt" ], "audio": { "file": "sfx/Towners/pegboy33.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip1.txt b/gamefilesd/texts/wirt/gossip/gossip1.txt index c2bdff47..aaf653a1 100755 --- a/gamefilesd/texts/wirt/gossip/gossip1.txt +++ b/gamefilesd/texts/wirt/gossip/gossip1.txt @@ -1 +1,7 @@ -Not everyone in Tristram has a use - or a market - for everything you will find in the labyrinth. Not even me, as hard as that is to believe. Sometimes, only you will be able to find a purpose for some things. \ No newline at end of file +Not everyone in Tristram has a use - or a +market - for everything you will find in +the labyrinth. Not even me, as hard as +that is to believe. + +Sometimes, only you will be able to find a +purpose for some things. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip10.json b/gamefilesd/texts/wirt/gossip/gossip10.json index 72353b55..ecba9511 100755 --- a/gamefilesd/texts/wirt/gossip/gossip10.json +++ b/gamefilesd/texts/wirt/gossip/gossip10.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy43.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip10.txt b/gamefilesd/texts/wirt/gossip/gossip10.txt index d4fba14a..2c1110db 100755 --- a/gamefilesd/texts/wirt/gossip/gossip10.txt +++ b/gamefilesd/texts/wirt/gossip/gossip10.txt @@ -1 +1,7 @@ -Ogden is a fool for staying here. I could get him out of town for a very reasonable price, but he insists on trying to make a go of it with that stupid tavern. I guess at the least he gives Gillian a place to work, and his wife Garda does make a superb Shepherd's pie... \ No newline at end of file +Ogden is a fool for staying here. I could +get him out of town for a very +reasonable price, but he insists on trying +to make a go of it with that stupid +tavern. I guess at the least he gives +Gillian a place to work, and his wife +Garda does make a superb Shepherd's pie... \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip2.json b/gamefilesd/texts/wirt/gossip/gossip2.json index ec881d6d..eb5384ec 100755 --- a/gamefilesd/texts/wirt/gossip/gossip2.json +++ b/gamefilesd/texts/wirt/gossip/gossip2.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/gossip/gossip2.txt" ], "audio": { "file": "sfx/Towners/pegboy34.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip2.txt b/gamefilesd/texts/wirt/gossip/gossip2.txt index f11e49fc..fe6fbcb4 100755 --- a/gamefilesd/texts/wirt/gossip/gossip2.txt +++ b/gamefilesd/texts/wirt/gossip/gossip2.txt @@ -1 +1,3 @@ -Don't trust everything the drunk says. Too many ales have fogged his vision and his good sense. \ No newline at end of file +Don't trust everything the drunk says. +Too many ales have fogged his vision and +his good sense. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip3.json b/gamefilesd/texts/wirt/gossip/gossip3.json index 600c77ba..4d8087c4 100755 --- a/gamefilesd/texts/wirt/gossip/gossip3.json +++ b/gamefilesd/texts/wirt/gossip/gossip3.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy35.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip3.txt b/gamefilesd/texts/wirt/gossip/gossip3.txt index e478edb7..9191f0e1 100755 --- a/gamefilesd/texts/wirt/gossip/gossip3.txt +++ b/gamefilesd/texts/wirt/gossip/gossip3.txt @@ -1 +1,7 @@ -In case you haven't noticed, I don't buy anything from Tristram. I am an importer of quality goods. If you want to peddle junk, you'll have to see Griswold, Pepin or that witch, Adria. I'm sure that they will snap up whatever you can bring them... \ No newline at end of file +In case you haven't noticed, I don't buy +anything from Tristram. I am an importer +of quality goods. If you want to peddle +junk, you'll have to see Griswold, Pepin +or that witch, Adria. I'm sure that they +will snap up whatever you can bring +them... \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip4.json b/gamefilesd/texts/wirt/gossip/gossip4.json index bc5bba81..042d1b8a 100755 --- a/gamefilesd/texts/wirt/gossip/gossip4.json +++ b/gamefilesd/texts/wirt/gossip/gossip4.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy36.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip4.txt b/gamefilesd/texts/wirt/gossip/gossip4.txt index 87c044db..d5428614 100755 --- a/gamefilesd/texts/wirt/gossip/gossip4.txt +++ b/gamefilesd/texts/wirt/gossip/gossip4.txt @@ -1 +1,7 @@ -I guess I owe the blacksmith my life - what there is of it. Sure, Griswold offered me an apprenticeship at the smithy, and he is a nice enough guy, but I'll never get enough money to... well, let's just say that I have definite plans that require a large amount of gold. \ No newline at end of file +I guess I owe the blacksmith my life - what +there is of it. Sure, Griswold offered me an +apprenticeship at the smithy, and he is a +nice enough guy, but I'll never get enough +money to... well, let's just say that I +have definite plans that require a large +amount of gold. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip5.json b/gamefilesd/texts/wirt/gossip/gossip5.json index 78f0037a..2551d743 100755 --- a/gamefilesd/texts/wirt/gossip/gossip5.json +++ b/gamefilesd/texts/wirt/gossip/gossip5.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy37.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip5.txt b/gamefilesd/texts/wirt/gossip/gossip5.txt index 9cc5c01b..05821f1a 100755 --- a/gamefilesd/texts/wirt/gossip/gossip5.txt +++ b/gamefilesd/texts/wirt/gossip/gossip5.txt @@ -1 +1,7 @@ -If I were a few years older, I would shower her with whatever riches I could muster, and let me assure you I can get my hands on some very nice stuff. Gillian is a beautiful girl who should get out of Tristram as soon as it is safe. Hmmm... maybe I'll take her with me when I go... \ No newline at end of file +If I were a few years older, I would +shower her with whatever riches I could +muster, and let me assure you I can get +my hands on some very nice stuff. Gillian +is a beautiful girl who should get out of +Tristram as soon as it is safe. Hmmm... +maybe I'll take her with me when I go... \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip6.json b/gamefilesd/texts/wirt/gossip/gossip6.json index 1cf05bfe..ec0d7f76 100755 --- a/gamefilesd/texts/wirt/gossip/gossip6.json +++ b/gamefilesd/texts/wirt/gossip/gossip6.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy38.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip6.txt b/gamefilesd/texts/wirt/gossip/gossip6.txt index 2d5bd355..f73634b7 100755 --- a/gamefilesd/texts/wirt/gossip/gossip6.txt +++ b/gamefilesd/texts/wirt/gossip/gossip6.txt @@ -1 +1,6 @@ -Cain knows too much. He scares the life out of me - even more than that woman across the river. He keeps telling me about how lucky I am to be alive, and how my story is foretold in legend. I think he's off his crock. \ No newline at end of file +Cain knows too much. He scares the life +out of me - even more than that woman +across the river. He keeps telling me about +how lucky I am to be alive, and how my +story is foretold in legend. I think he's off +his crock. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip7.json b/gamefilesd/texts/wirt/gossip/gossip7.json index 0fc7ea04..9e77c6ce 100755 --- a/gamefilesd/texts/wirt/gossip/gossip7.json +++ b/gamefilesd/texts/wirt/gossip/gossip7.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy39.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip7.txt b/gamefilesd/texts/wirt/gossip/gossip7.txt index 3eadb18e..4b83a34b 100755 --- a/gamefilesd/texts/wirt/gossip/gossip7.txt +++ b/gamefilesd/texts/wirt/gossip/gossip7.txt @@ -1 +1,10 @@ -Farnham - now there is a man with serious problems, and I know all about how serious problems can be. He trusted too much in the integrity of one man, and Lazarus led him into the very jaws of death. Oh, I know what it's like down there, so don't even start telling me about your plans to destroy the evil that dwells in that Labyrinth. Just watch your legs... \ No newline at end of file +Farnham - now there is a man with serious +problems, and I know all about how +serious problems can be. He trusted too +much in the integrity of one man, and +Lazarus led him into the very jaws of +death. Oh, I know what it's like down +there, so don't even start telling me +about your plans to destroy the evil +that dwells in that Labyrinth. Just +watch your legs... \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip8.json b/gamefilesd/texts/wirt/gossip/gossip8.json index ee572fa9..a2bba088 100755 --- a/gamefilesd/texts/wirt/gossip/gossip8.json +++ b/gamefilesd/texts/wirt/gossip/gossip8.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/gossip/gossip8.txt" ], "audio": { "file": "sfx/Towners/pegboy40.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip8.txt b/gamefilesd/texts/wirt/gossip/gossip8.txt index 6185bf37..2cfea267 100755 --- a/gamefilesd/texts/wirt/gossip/gossip8.txt +++ b/gamefilesd/texts/wirt/gossip/gossip8.txt @@ -1 +1,6 @@ -As long as you don't need anything reattached, old Pepin is as good as they come. If I'd have had some of those potions he brews, I might still have my leg... \ No newline at end of file +As long as you don't need anything +reattached, old Pepin is as good as they +come. + +If I'd have had some of those potions he +brews, I might still have my leg... \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip9.json b/gamefilesd/texts/wirt/gossip/gossip9.json index 1b0fa241..933b01b2 100755 --- a/gamefilesd/texts/wirt/gossip/gossip9.json +++ b/gamefilesd/texts/wirt/gossip/gossip9.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy42.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/gossip/gossip9.txt b/gamefilesd/texts/wirt/gossip/gossip9.txt index b3948669..2fac2bc3 100755 --- a/gamefilesd/texts/wirt/gossip/gossip9.txt +++ b/gamefilesd/texts/wirt/gossip/gossip9.txt @@ -1 +1,8 @@ -Adria truly bothers me. Sure, Cain is creepy in what he can tell you about the past, but that witch can see into your past. She always has some way to get whatever she needs, too. Adria gets her hands on more merchandise than I've seen pass through the gates of the King's Bazaar during High Festival. \ No newline at end of file +Adria truly bothers me. Sure, Cain is +creepy in what he can tell you about the +past, but that witch can see into your +past. She always has some way to get +whatever she needs, too. Adria gets her +hands on more merchandise than I've seen +pass through the gates of the King's +Bazaar during High Festival. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/anvilOfFury.json b/gamefilesd/texts/wirt/quests/anvilOfFury.json index f5154e11..7470ba3a 100755 --- a/gamefilesd/texts/wirt/quests/anvilOfFury.json +++ b/gamefilesd/texts/wirt/quests/anvilOfFury.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/quests/anvilOfFury.txt" ], "audio": { "file": "sfx/Towners/pegboy13.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/anvilOfFury.txt b/gamefilesd/texts/wirt/quests/anvilOfFury.txt index 81526400..c21a6817 100755 --- a/gamefilesd/texts/wirt/quests/anvilOfFury.txt +++ b/gamefilesd/texts/wirt/quests/anvilOfFury.txt @@ -1 +1,4 @@ -If you were to find this artifact for Griswold, it could put a serious damper on my business here. Awwww, you'll never find it. \ No newline at end of file +If you were to find this artifact for +Griswold, it could put a serious damper +on my business here. Awwww, you'll +never find it. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/archbishopLazarus.json b/gamefilesd/texts/wirt/quests/archbishopLazarus.json index fb0e039c..bfcfa933 100755 --- a/gamefilesd/texts/wirt/quests/archbishopLazarus.json +++ b/gamefilesd/texts/wirt/quests/archbishopLazarus.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy03.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/archbishopLazarus.txt b/gamefilesd/texts/wirt/quests/archbishopLazarus.txt index b1f80771..5acba23d 100755 --- a/gamefilesd/texts/wirt/quests/archbishopLazarus.txt +++ b/gamefilesd/texts/wirt/quests/archbishopLazarus.txt @@ -1 +1,5 @@ -Yes, the righteous Lazarus, who was sooo effective against those monsters down there. Didn't help save my leg, did it? Look, I'll give you a free piece of advice. Ask Farnham, he was there. \ No newline at end of file +Yes, the righteous Lazarus, who was +sooo effective against those monsters +down there. Didn't help save my leg, did +it? Look, I'll give you a free piece of +advice. Ask Farnham, he was there. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/arkainesValor.json b/gamefilesd/texts/wirt/quests/arkainesValor.json index bcc9793f..16d645e8 100755 --- a/gamefilesd/texts/wirt/quests/arkainesValor.json +++ b/gamefilesd/texts/wirt/quests/arkainesValor.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/quests/arkainesValor.txt" ], "audio": { "file": "sfx/Towners/pegboy14.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/arkainesValor.txt b/gamefilesd/texts/wirt/quests/arkainesValor.txt index cc3acc9f..7cef1ca0 100755 --- a/gamefilesd/texts/wirt/quests/arkainesValor.txt +++ b/gamefilesd/texts/wirt/quests/arkainesValor.txt @@ -1,3 +1,7 @@ -You intend to find the armor known as Valor? +You intend to find the armor known as +Valor? -No one has ever figured out where Arkaine stashed the stuff, and if my contacts couldn't find it, I seriously doubt you ever will, either. \ No newline at end of file +No one has ever figured out where +Arkaine stashed the stuff, and if my +contacts couldn't find it, I seriously +doubt you ever will either. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/blackMushroom.json b/gamefilesd/texts/wirt/quests/blackMushroom.json index 354e9b15..c202aae0 100755 --- a/gamefilesd/texts/wirt/quests/blackMushroom.json +++ b/gamefilesd/texts/wirt/quests/blackMushroom.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/quests/blackMushroom.txt" ], "audio": { "file": "sfx/Towners/pegboy19.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/blackMushroom.txt b/gamefilesd/texts/wirt/quests/blackMushroom.txt index 7e087d8d..56240cdb 100755 --- a/gamefilesd/texts/wirt/quests/blackMushroom.txt +++ b/gamefilesd/texts/wirt/quests/blackMushroom.txt @@ -1 +1,3 @@ -I don't have any mushrooms of any size or color for sale. How about something a bit more useful? \ No newline at end of file +I don't have any mushrooms of any size +or color for sale. How about something a +bit more useful? \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/chamberOfBone.json b/gamefilesd/texts/wirt/quests/chamberOfBone.json index a27369ea..d1170970 100755 --- a/gamefilesd/texts/wirt/quests/chamberOfBone.json +++ b/gamefilesd/texts/wirt/quests/chamberOfBone.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy07.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/chamberOfBone.txt b/gamefilesd/texts/wirt/quests/chamberOfBone.txt index 6dfa7902..4f14f767 100755 --- a/gamefilesd/texts/wirt/quests/chamberOfBone.txt +++ b/gamefilesd/texts/wirt/quests/chamberOfBone.txt @@ -1 +1,5 @@ -A vast and mysterious treasure, you say? Maybe I could be interested in picking up a few things from you... Or better yet, don't you need some rare and expensive supplies to get you through this ordeal? \ No newline at end of file +A vast and mysterious treasure, you +say? Maybe I could be interested in picking +up a few things from you... or better yet, +don't you need some rare and expensive +supplies to get you through this ordeal? \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/hallsOfTheBlind.json b/gamefilesd/texts/wirt/quests/hallsOfTheBlind.json index d06a1389..668dacd1 100755 --- a/gamefilesd/texts/wirt/quests/hallsOfTheBlind.json +++ b/gamefilesd/texts/wirt/quests/hallsOfTheBlind.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy11.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/hallsOfTheBlind.txt b/gamefilesd/texts/wirt/quests/hallsOfTheBlind.txt index 44268e95..7bf03426 100755 --- a/gamefilesd/texts/wirt/quests/hallsOfTheBlind.txt +++ b/gamefilesd/texts/wirt/quests/hallsOfTheBlind.txt @@ -1 +1,5 @@ -Let's see, am I selling you something? No. Are you giving me money to tell you about this? No. Are you now leaving and going to talk to the storyteller who lives for this kind of thing? Yes. \ No newline at end of file +Lets see, am I selling you something? No. +Are you giving me money to tell you +about this? No. Are you now leaving and +going to talk to the storyteller who +lives for this kind of thing? Yes. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/lachdanan.json b/gamefilesd/texts/wirt/quests/lachdanan.json index f88be1be..31fbf149 100755 --- a/gamefilesd/texts/wirt/quests/lachdanan.json +++ b/gamefilesd/texts/wirt/quests/lachdanan.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy12.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/lachdanan.txt b/gamefilesd/texts/wirt/quests/lachdanan.txt index 8973abde..4f71e1c6 100755 --- a/gamefilesd/texts/wirt/quests/lachdanan.txt +++ b/gamefilesd/texts/wirt/quests/lachdanan.txt @@ -1 +1,7 @@ -Wait, let me guess. Cain was swallowed up in a gigantic fissure that opened beneath him. He was incinerated in a ball of Hellfire, and can't answer your questions anymore. Oh, that isn't what happened? Then I guess you'll be buying something or you'll be on your way. \ No newline at end of file +Wait, let me guess. Cain was swallowed +up in a gigantic fissure that opened +beneath him. He was incinerated in a ball +of hellfire, and can't answer your +questions anymore. Oh, that isn't what +happened? Then I guess you'll be buying +something or you'll be on your way. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/magicRock.json b/gamefilesd/texts/wirt/quests/magicRock.json index 80358b0a..15865b0d 100755 --- a/gamefilesd/texts/wirt/quests/magicRock.json +++ b/gamefilesd/texts/wirt/quests/magicRock.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/quests/magicRock.txt" ], "audio": { "file": "sfx/Towners/pegboy18.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/magicRock.txt b/gamefilesd/texts/wirt/quests/magicRock.txt index 166e9d95..6ddce137 100755 --- a/gamefilesd/texts/wirt/quests/magicRock.txt +++ b/gamefilesd/texts/wirt/quests/magicRock.txt @@ -1 +1,5 @@ -If anyone can make something out of that rock, Griswold can. He knows what he is doing, and as much as I try to steal his customers, I respect the quality of his work. \ No newline at end of file +If anyone can make something out of that +rock, Griswold can. He knows what he is +doing, and as much as I try to steal his +customers, I respect the quality of his +work. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/ogdensSign.json b/gamefilesd/texts/wirt/quests/ogdensSign.json index 5df40165..d1be7b75 100755 --- a/gamefilesd/texts/wirt/quests/ogdensSign.json +++ b/gamefilesd/texts/wirt/quests/ogdensSign.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/quests/ogdensSign.txt" ], "audio": { "file": "sfx/Towners/pegboy02.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/ogdensSign.txt b/gamefilesd/texts/wirt/quests/ogdensSign.txt index 23c6c265..47d87964 100755 --- a/gamefilesd/texts/wirt/quests/ogdensSign.txt +++ b/gamefilesd/texts/wirt/quests/ogdensSign.txt @@ -1,3 +1,6 @@ -What - is he saying I took that? I suppose that Griswold is on his side, too. +What - is he saying I took that? I suppose +that Griswold is on his side, too. -Look, I got over simple sign stealing months ago. You can't turn a profit on a piece of wood. \ No newline at end of file +Look, I got over simple sign stealing +months ago. You can't turn a profit on a +piece of wood. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/poisonedWater.json b/gamefilesd/texts/wirt/quests/poisonedWater.json index 757b67c5..7b67ef09 100755 --- a/gamefilesd/texts/wirt/quests/poisonedWater.json +++ b/gamefilesd/texts/wirt/quests/poisonedWater.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/quests/poisonedWater.txt" ], "audio": { "file": "sfx/Towners/pegboy04.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/poisonedWater.txt b/gamefilesd/texts/wirt/quests/poisonedWater.txt index 70e25d1d..fe03eea7 100755 --- a/gamefilesd/texts/wirt/quests/poisonedWater.txt +++ b/gamefilesd/texts/wirt/quests/poisonedWater.txt @@ -1 +1,4 @@ -For once, I'm with you. My business runs dry - so to speak - if I have no market to sell to. You better find out what is going on, and soon! \ No newline at end of file +For once, I'm with you. My business runs +dry - so to speak - if I have no market to +sell to. You better find out what is +going on, and soon! \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/skeletonKing.json b/gamefilesd/texts/wirt/quests/skeletonKing.json index e8b8309e..600f1630 100755 --- a/gamefilesd/texts/wirt/quests/skeletonKing.json +++ b/gamefilesd/texts/wirt/quests/skeletonKing.json @@ -8,6 +8,6 @@ "audio": { "file": "sfx/Towners/pegboy01.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/skeletonKing.txt b/gamefilesd/texts/wirt/quests/skeletonKing.txt index 8be9afa8..6d0e7f82 100755 --- a/gamefilesd/texts/wirt/quests/skeletonKing.txt +++ b/gamefilesd/texts/wirt/quests/skeletonKing.txt @@ -1 +1,6 @@ -Look, I'm running a business here. I don't sell information, and I don't care about some King that's been dead longer than I've been alive. If you need something to use against this King of the undead, then I can help you out... \ No newline at end of file +Look, I'm running a business here. I don't +sell information, and I don't care about +some King that's been dead longer than +I've been alive. If you need something to +use against this King of the undead, then I +can help you out... \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/theButcher.json b/gamefilesd/texts/wirt/quests/theButcher.json index a7bf4e71..be683e83 100755 --- a/gamefilesd/texts/wirt/quests/theButcher.json +++ b/gamefilesd/texts/wirt/quests/theButcher.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "30", + "25", "texts/wirt/quests/theButcher.txt" ], "audio": { "file": "sfx/Towners/pegboy10.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/theButcher.txt b/gamefilesd/texts/wirt/quests/theButcher.txt index 95c34556..4bcd646a 100755 --- a/gamefilesd/texts/wirt/quests/theButcher.txt +++ b/gamefilesd/texts/wirt/quests/theButcher.txt @@ -1,3 +1,8 @@ -I know more than you'd think about that grisly fiend. His little friends got a hold of me and managed to get my leg before Griswold pulled me out of that hole. - -I'll put it bluntly - kill him before he kills you and adds your corpse to his collection. \ No newline at end of file +I know more than you'd think about that +grisly fiend. His little friends got a hold +of me and managed to get my leg before +Griswold pulled me out of that hole. + +I'll put it bluntly - kill him before he kills +you and adds your corpse to his +collection. \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/warlordOfBlood.json b/gamefilesd/texts/wirt/quests/warlordOfBlood.json index 8a3a848d..acd0dbbb 100755 --- a/gamefilesd/texts/wirt/quests/warlordOfBlood.json +++ b/gamefilesd/texts/wirt/quests/warlordOfBlood.json @@ -2,12 +2,12 @@ "load": [ "ui/level/showText.json", "questText", - "50", + "25", "texts/wirt/quests/warlordOfBlood.txt" ], "audio": { "file": "sfx/Towners/pegboy17.wav", "play": true, - "volume": "|game|soundVolume|" + "volume": "%game.soundVolume%" } } \ No newline at end of file diff --git a/gamefilesd/texts/wirt/quests/warlordOfBlood.txt b/gamefilesd/texts/wirt/quests/warlordOfBlood.txt index b3fce69a..4ea5ba8e 100755 --- a/gamefilesd/texts/wirt/quests/warlordOfBlood.txt +++ b/gamefilesd/texts/wirt/quests/warlordOfBlood.txt @@ -1 +1,4 @@ -I haven't ever dealt with this Warlord you speak of, but he sounds like he's going through a lot of swords. Wouldn't mind supplying his armies... \ No newline at end of file +I haven't ever dealt with this Warlord +you speak of, but he sounds like he's going +through a lot of swords. Wouldn't mind +supplying his armies... \ No newline at end of file diff --git a/gamefilesd/towners/adria/buy/common.json b/gamefilesd/towners/adria/buy/common.json index 4b33c0a0..3ecf3d32 100755 --- a/gamefilesd/towners/adria/buy/common.json +++ b/gamefilesd/towners/adria/buy/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/adria/buy/confirm.json b/gamefilesd/towners/adria/buy/confirm.json index f98f85d9..8326ae6d 100755 --- a/gamefilesd/towners/adria/buy/confirm.json +++ b/gamefilesd/towners/adria/buy/confirm.json @@ -8,8 +8,8 @@ "param2": true, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", - "param2": "|currentLevel|player.adria.item.{1}.{2}.price|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", + "param2": "%currentLevel.player.adria.item.{1}.{2}.price%", "then": { "name": "load", "file": [ "towners/adria/buy/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/adria/buy/confirm2.json b/gamefilesd/towners/adria/buy/confirm2.json index dc0e3016..7b30fab6 100755 --- a/gamefilesd/towners/adria/buy/confirm2.json +++ b/gamefilesd/towners/adria/buy/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -72,8 +70,9 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "|currentLevel|player.adria.item.{1}.{2}.price|" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.player.adria.item.{1}.{2}.price%" }, { "name": "item.trade", @@ -110,7 +109,7 @@ ], "load": ["towners/common/setItemInfo.json", "adria", "{1}", "{2}"], "load": ["towners/common/setPriceInfo.json", "adria", "{1}", "{2}", - "|currentLevel|player.adria.item.{1}.{2}.price|"], + "%currentLevel.player.adria.item.{1}.{2}.price%"], "action": [ "anchorLeftPentagram", "anchorRightPentagram" diff --git a/gamefilesd/towners/adria/buy/listItems.json b/gamefilesd/towners/adria/buy/listItems.json index 9bafe7ad..99975c49 100755 --- a/gamefilesd/towners/adria/buy/listItems.json +++ b/gamefilesd/towners/adria/buy/listItems.json @@ -26,7 +26,7 @@ "visibleItems": 4, "verticalPad": 38, "items": { - "load": "currentLevel|adria.inventory.0", + "load": "currentLevel.adria.inventory.0", "text": "%price%", "executeAction": { "name": "load", diff --git a/gamefilesd/towners/adria/buy/panel.json b/gamefilesd/towners/adria/buy/panel.json index b99efd02..b552691c 100755 --- a/gamefilesd/towners/adria/buy/panel.json +++ b/gamefilesd/towners/adria/buy/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -69,7 +69,7 @@ "onScrollDown": "focus.moveDown", "onScrollUp": "focus.moveUp", "items": { - "load": "currentLevel|adria.inventory.0", + "load": "currentLevel.adria.inventory.0", "text": "%name%\n", "onClick": { "name": "load", @@ -106,13 +106,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have these items for sale : Your gold : [1]" }, { "name": "load", "file": "towners/adria/buy/listItems.json" } @@ -121,7 +121,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have no more items for sale. Your gold : [1]" }, { "name": "load", "file": "towners/adria/buy/noItems.json" } diff --git a/gamefilesd/towners/adria/panelMain.json b/gamefilesd/towners/adria/panelMain.json index 04b5bfbd..b034ee2f 100755 --- a/gamefilesd/towners/adria/panelMain.json +++ b/gamefilesd/towners/adria/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelText", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 142], "anchor": "none", "horizontalAlign": "center", @@ -46,9 +42,7 @@ "button": [ { "id": "talk", - "font": "smaltext", - "replaceVars": true, - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", diff --git a/gamefilesd/towners/adria/panelTalk.json b/gamefilesd/towners/adria/panelTalk.json index f45b06e3..43d458fb 100755 --- a/gamefilesd/towners/adria/panelTalk.json +++ b/gamefilesd/towners/adria/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -68,11 +66,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["diablo", "gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["diablo", "gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -105,6 +106,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/towners/adria/recharge/common.json b/gamefilesd/towners/adria/recharge/common.json index 29e168f4..b2a8923f 100755 --- a/gamefilesd/towners/adria/recharge/common.json +++ b/gamefilesd/towners/adria/recharge/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/adria/recharge/confirm.json b/gamefilesd/towners/adria/recharge/confirm.json index a02b9436..8b3e1c0b 100755 --- a/gamefilesd/towners/adria/recharge/confirm.json +++ b/gamefilesd/towners/adria/recharge/confirm.json @@ -1,8 +1,8 @@ { "action": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", - "param2": "|currentLevel|currentPlayer.item.{1}.{2}.price|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", + "param2": "%currentLevel.currentPlayer.item.{1}.{2}.price%", "then": { "name": "load", "file": [ "towners/adria/recharge/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/adria/recharge/confirm2.json b/gamefilesd/towners/adria/recharge/confirm2.json index a6a8943a..e405e007 100755 --- a/gamefilesd/towners/adria/recharge/confirm2.json +++ b/gamefilesd/towners/adria/recharge/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -72,15 +70,16 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "|currentLevel|currentPlayer.item.{1}.{2}.price|" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.currentPlayer.item.{1}.{2}.price%" }, { "name": "item.setProperty", "inventory": "{1}", "item": {2}, "property": "charges", - "value": "|currentLevel|currentPlayer.item.{1}.{2}.chargesMax|" + "value": "%currentLevel.currentPlayer.item.{1}.{2}.chargesMax%" }, { "name": "resource.popAll", "id": "userPanelRecharge" }, { "name": "load", "file": "towners/adria/recharge/panel.json" } @@ -125,33 +124,32 @@ "text": "%price%" }, { - "replaceVars": true, "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.{1}.{2}|", + "param1": "%currentLevel.currentPlayer.canUseItem.{1}.{2}%", "param2": false, "then": [ - { "name": "text.setColor", "id": "itemInfo", "color": "%textRed%" }, - { "name": "text.setColor", "id": "itemPrice", "color": "%textRed%" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltextRed" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltextRed" } ], "else": { "name": "if.equal", - "param1": "|currentLevel|player.adria.item.{1}.{2}.unique|", + "param1": "%currentLevel.player.adria.item.{1}.{2}.unique%", "param2": 1, "then": [ - { "name": "text.setColor", "id": "itemInfo", "color": "%textGold%" }, - { "name": "text.setColor", "id": "itemPrice", "color": "%textGold%" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltextGold" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltextGold" } ], "else": { "name": "if.equal", - "param1": "|currentLevel|player.adria.item.{1}.{2}.magical|", + "param1": "%currentLevel.player.adria.item.{1}.{2}.magical%", "param2": 1, "then": [ - { "name": "text.setColor", "id": "itemInfo", "color": "%textBlue%" }, - { "name": "text.setColor", "id": "itemPrice", "color": "%textBlue%" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltextBlue" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltextBlue" } ], "else": [ - { "name": "text.setColor", "id": "itemInfo" }, - { "name": "text.setColor", "id": "itemPrice" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltext" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltext" } ] } } diff --git a/gamefilesd/towners/adria/recharge/listItems.json b/gamefilesd/towners/adria/recharge/listItems.json index 894d307f..76c5a2a6 100755 --- a/gamefilesd/towners/adria/recharge/listItems.json +++ b/gamefilesd/towners/adria/recharge/listItems.json @@ -16,7 +16,6 @@ ], "menu": { "id": "menuPrices", - "replaceVars": true, "font": "smaltext", "sound": "titlslct", "position": [571, 94], @@ -28,7 +27,7 @@ "verticalPad": 38, "items": [ { - "load": "currentLevel|currentPlayer.inventory.body", + "load": "currentLevel.currentPlayer.inventory.body", "exclude": { "property": "needsRecharge", "value": false @@ -36,45 +35,46 @@ "text": "%price%", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "exclude": { "property": "needsRecharge", "value": false @@ -82,45 +82,46 @@ "text": "%price%", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.belt.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.belt.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "exclude": { "property": "needsRecharge", "value": false @@ -128,38 +129,39 @@ "text": "%price%", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.stash.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.stash.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } diff --git a/gamefilesd/towners/adria/recharge/panel.json b/gamefilesd/towners/adria/recharge/panel.json index c753db4d..8562416b 100755 --- a/gamefilesd/towners/adria/recharge/panel.json +++ b/gamefilesd/towners/adria/recharge/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -54,7 +54,6 @@ ], "menu": { "id": "mainMenu", - "replaceVars": true, "font": "smaltext", "sound": "titlslct", "position": [52, 94], @@ -71,7 +70,7 @@ "onScrollUp": "focus.moveUp", "items": [ { - "load": "currentLevel|currentPlayer.inventory.body", + "load": "currentLevel.currentPlayer.inventory.body", "exclude": { "property": "needsRecharge", "value": false @@ -92,45 +91,46 @@ ], "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "exclude": { "property": "needsRecharge", "value": false @@ -151,45 +151,46 @@ ], "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.belt.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.belt.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "exclude": { "property": "needsRecharge", "value": false @@ -210,38 +211,39 @@ ], "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.stash.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.stash.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } @@ -269,13 +271,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "Recharge which item? Your gold : [1]" }, { "name": "load", "file": "towners/adria/recharge/listItems.json" } @@ -284,7 +286,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "You have nothing to recharge. Your gold : [1]" }, { "name": "load", "file": "towners/adria/recharge/noItems.json" } diff --git a/gamefilesd/towners/adria/sell/common.json b/gamefilesd/towners/adria/sell/common.json index 74273fed..9a14f790 100755 --- a/gamefilesd/towners/adria/sell/common.json +++ b/gamefilesd/towners/adria/sell/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/adria/sell/confirm.json b/gamefilesd/towners/adria/sell/confirm.json index 7da6cbc9..370068ff 100755 --- a/gamefilesd/towners/adria/sell/confirm.json +++ b/gamefilesd/towners/adria/sell/confirm.json @@ -1,8 +1,8 @@ { "action": { "name": ">=", - "param1": { "name": "player.getMaxGoldCapacity" }, - "param2": "|currentLevel|currentPlayer.item.{1}.{2}.prices.sell|", + "param1": { "name": "player.getMaxItemCapacity", "itemClass": "gold" }, + "param2": "%currentLevel.currentPlayer.item.{1}.{2}.prices.sell%", "then": { "name": "load", "file": [ "towners/adria/sell/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/adria/sell/confirm2.json b/gamefilesd/towners/adria/sell/confirm2.json index d39516a1..bd5353dd 100755 --- a/gamefilesd/towners/adria/sell/confirm2.json +++ b/gamefilesd/towners/adria/sell/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -71,7 +69,11 @@ "horizontalSpaceOffset": 1, "text": "Yes", "onClick": [ - { "name": "player.addGold", "gold": "|currentLevel|currentPlayer.item.{1}.{2}.prices.sell|" }, + { + "name": "player.addItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.currentPlayer.item.{1}.{2}.prices.sell%" + }, { "name": "item.delete", "inventory": {1}, "item": {2} }, "updateBeltItems", { "name": "resource.popAll", "id": "userPanelSell" }, @@ -102,7 +104,7 @@ ], "load": ["towners/common/setItemInfo.json", "hero", "{1}", "{2}"], "load": ["towners/common/setPriceInfo.json", "hero", "{1}", "{2}", - "|currentLevel|currentPlayer.item.{1}.{2}.prices.sell|"], + "%currentLevel.currentPlayer.item.{1}.{2}.prices.sell%"], "action": [ "anchorLeftPentagram", "anchorRightPentagram" diff --git a/gamefilesd/towners/adria/sell/listItems.json b/gamefilesd/towners/adria/sell/listItems.json index 6463cb34..8a9a4c9f 100755 --- a/gamefilesd/towners/adria/sell/listItems.json +++ b/gamefilesd/towners/adria/sell/listItems.json @@ -27,7 +27,7 @@ "verticalPad": 38, "items": [ { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "include": { "property": "itemType", "value": ["Book", "Potion", "Scroll", "Staff"] @@ -39,7 +39,7 @@ } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "include": { "property": "itemType", "value": ["Book", "Potion", "Scroll", "Staff"] diff --git a/gamefilesd/towners/adria/sell/panel.json b/gamefilesd/towners/adria/sell/panel.json index f6764917..3e14dbca 100755 --- a/gamefilesd/towners/adria/sell/panel.json +++ b/gamefilesd/towners/adria/sell/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -70,7 +70,7 @@ "onScrollUp": "focus.moveUp", "items": [ { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "include": { "property": "itemType", "value": ["Book", "Potion", "Scroll", "Staff"] @@ -91,7 +91,7 @@ } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "include": { "property": "itemType", "value": ["Book", "Potion", "Scroll", "Staff"] @@ -133,13 +133,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "Which item is for sale? Your gold : [1]" }, { "name": "load", "file": "towners/adria/sell/listItems.json" } @@ -148,7 +148,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "You have nothing I want. Your gold : [1]" }, { "name": "load", "file": "towners/adria/sell/noItems.json" } diff --git a/gamefilesd/towners/cain/identify/common.json b/gamefilesd/towners/cain/identify/common.json index e622cb3e..8aa06e4f 100755 --- a/gamefilesd/towners/cain/identify/common.json +++ b/gamefilesd/towners/cain/identify/common.json @@ -34,9 +34,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/cain/identify/confirm.json b/gamefilesd/towners/cain/identify/confirm.json index 1c930c8f..772832f9 100755 --- a/gamefilesd/towners/cain/identify/confirm.json +++ b/gamefilesd/towners/cain/identify/confirm.json @@ -1,7 +1,7 @@ { "action": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", "param2": "%identifyPrice%", "then": { "name": "load", diff --git a/gamefilesd/towners/cain/identify/confirm2.json b/gamefilesd/towners/cain/identify/confirm2.json index 89aaa2c5..de472251 100755 --- a/gamefilesd/towners/cain/identify/confirm2.json +++ b/gamefilesd/towners/cain/identify/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [51, 130], "anchor": "none", @@ -47,7 +46,7 @@ "anchor": "none", "horizontalAlign": "right", "horizontalSpaceOffset": 1, - "text": "%identifyPrice%" + "text": "|identifyPrice|" }, { "id": "confirm", @@ -73,8 +72,9 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "%identifyPrice%" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%identifyPrice%" }, { "name": "item.setProperty", diff --git a/gamefilesd/towners/cain/identify/item.json b/gamefilesd/towners/cain/identify/item.json index 3bd0454e..2d10d7a9 100755 --- a/gamefilesd/towners/cain/identify/item.json +++ b/gamefilesd/towners/cain/identify/item.json @@ -34,7 +34,6 @@ "text": [ { "id": "thisItemIs", - "replaceVars": true, "font": "smaltext", "position": [320, 118], "anchor": "none", @@ -44,7 +43,6 @@ }, { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [51, 166], "anchor": "none", diff --git a/gamefilesd/towners/cain/identify/listItems.json b/gamefilesd/towners/cain/identify/listItems.json index cd8b8c74..1ca4f02a 100755 --- a/gamefilesd/towners/cain/identify/listItems.json +++ b/gamefilesd/towners/cain/identify/listItems.json @@ -28,138 +28,141 @@ "verticalPad": 38, "items": [ { - "load": "currentLevel|currentPlayer.inventory.body", + "load": "currentLevel.currentPlayer.inventory.body", "exclude": { "property": "identified", "value": true }, - "text": "%identifyPrice%", + "text": "|identifyPrice|", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "exclude": { "property": "identified", "value": true }, - "text": "%identifyPrice%", + "text": "|identifyPrice|", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.belt.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.belt.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "exclude": { "property": "identified", "value": true }, - "text": "%identifyPrice%", + "text": "|identifyPrice|", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.stash.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.stash.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } diff --git a/gamefilesd/towners/cain/identify/panel.json b/gamefilesd/towners/cain/identify/panel.json index 0c6cf033..be13d4ec 100755 --- a/gamefilesd/towners/cain/identify/panel.json +++ b/gamefilesd/towners/cain/identify/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -70,7 +70,7 @@ "onScrollUp": "focus.moveUp", "items": [ { - "load": "currentLevel|currentPlayer.inventory.body", + "load": "currentLevel.currentPlayer.inventory.body", "exclude": { "property": "identified", "value": true @@ -91,7 +91,7 @@ } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "exclude": { "property": "identified", "value": true @@ -112,7 +112,7 @@ } }, { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "exclude": { "property": "identified", "value": true @@ -154,13 +154,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "Identify which item? Your gold : [1]" }, { "name": "load", "file": "towners/cain/identify/listItems.json" } @@ -169,7 +169,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "You have nothing to identify. Your gold : [1]" }, { "name": "load", "file": "towners/cain/identify/noItems.json" } diff --git a/gamefilesd/towners/cain/panelMain.json b/gamefilesd/towners/cain/panelMain.json index 8f77535a..21534bf2 100755 --- a/gamefilesd/towners/cain/panelMain.json +++ b/gamefilesd/towners/cain/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelText", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 142], "anchor": "none", "horizontalAlign": "center", @@ -46,9 +42,7 @@ "button": [ { "id": "talk", - "replaceVars": true, - "font": "smaltext", - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", diff --git a/gamefilesd/towners/cain/panelTalk.json b/gamefilesd/towners/cain/panelTalk.json index 78975ad9..c58a6667 100755 --- a/gamefilesd/towners/cain/panelTalk.json +++ b/gamefilesd/towners/cain/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -68,11 +66,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -105,6 +106,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/towners/common/setItemInfo.json b/gamefilesd/towners/common/setItemInfo.json index 0c6a3890..e98ce2bf 100755 --- a/gamefilesd/towners/common/setItemInfo.json +++ b/gamefilesd/towners/common/setItemInfo.json @@ -8,20 +8,20 @@ }, { "name": "if.inList", - "param": "|currentLevel|player.{1}.item.{2}.{3}.itemType|", + "param": "%currentLevel.player.{1}.item.{2}.{3}.itemType%", "list": ["Book", "Potion", "Scroll"], "else": [ { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.identified|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.identified%", "param2": true, "then": { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.1|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.1%", "param2": "", "then": { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.2|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.2%", "param2": "", "then": { "name": "text.appendText", @@ -38,7 +38,7 @@ }, "else": { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.2|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.2%", "param2": "", "then": { "name": "text.appendText", @@ -51,7 +51,7 @@ }, { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.0|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.0%", "param2": "", "then": { "name": "text.appendText", @@ -64,7 +64,7 @@ }, { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.3|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.3%", "param2": "", "then": { "name": "text.appendText", @@ -79,25 +79,24 @@ } }, { - "replaceVars": true, "name": "if.equal", "param1": { "name": "player.canUseItem", "item": { "player": "{1}", "inventory": {2}, "item": {3} } }, "param2": false, - "then": { "name": "text.setColor", "id": "itemInfo", "color": "%textRed%" }, + "then": { "name": "text.setFont", "id": "itemInfo", "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.unique|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.unique%", "param2": 1, - "then": { "name": "text.setColor", "id": "itemInfo", "color": "%textGold%" }, + "then": { "name": "text.setFont", "id": "itemInfo", "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.magical|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.magical%", "param2": 1, - "then": { "name": "text.setColor", "id": "itemInfo", "color": "%textBlue%" }, - "else": { "name": "text.setColor", "id": "itemInfo" } + "then": { "name": "text.setFont", "id": "itemInfo", "font": "smaltextBlue" }, + "else": { "name": "text.setFont", "id": "itemInfo", "font": "smaltext" } } } } diff --git a/gamefilesd/towners/common/setMenuItemText.json b/gamefilesd/towners/common/setMenuItemText.json index 0d19b792..d31f8990 100755 --- a/gamefilesd/towners/common/setMenuItemText.json +++ b/gamefilesd/towners/common/setMenuItemText.json @@ -2,20 +2,20 @@ "action": [ { "name": "if.inList", - "param": "|currentLevel|player.{1}.item.{2}.{3}.itemType|", + "param": "%currentLevel.player.{1}.item.{2}.{3}.itemType%", "list": ["Book", "Potion", "Scroll"], "else": [ { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.identified|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.identified%", "param2": true, "then": { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.1|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.1%", "param2": "", "then": { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.2|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.2%", "param2": "", "then": { "name": "menu.appendText", @@ -34,7 +34,7 @@ }, "else": { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.2|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.2%", "param2": "", "then": { "name": "menu.appendText", @@ -48,7 +48,7 @@ }, { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.0|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.0%", "param2": "", "then": { "name": "menu.appendText", @@ -62,7 +62,7 @@ }, { "name": "if.notEqual", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.d.3|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.d.3%", "param2": "", "then": { "name": "menu.appendText", @@ -80,7 +80,7 @@ }, { "name": "if.lower", - "param1": "|mainMenu|item.{4}.lineCount|", + "param1": "%mainMenu.item.{4}.lineCount%", "param2": 3, "then": { "name": "menu.appendText", @@ -90,7 +90,6 @@ } }, { - "replaceVars": true, "name": "if.equal", "param1": { "name": "player.canUseItem", @@ -98,18 +97,18 @@ }, "param2": false, "then": { - "name": "menu.setColor", "id": "mainMenu", "index": {4}, "color": "%textRed%" }, + "name": "menu.setFont", "id": "mainMenu", "index": {4}, "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.unique|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.unique%", "param2": 1, - "then": { "name": "menu.setColor", "id": "mainMenu", "index": {4}, "color": "%textGold%" }, + "then": { "name": "menu.setFont", "id": "mainMenu", "index": {4}, "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.magical|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.magical%", "param2": 1, - "then": { "name": "menu.setColor", "id": "mainMenu", "index": {4}, "color": "%textBlue%" }, - "else": { "name": "menu.setColor", "id": "mainMenu", "index": {4} } + "then": { "name": "menu.setFont", "id": "mainMenu", "index": {4}, "font": "smaltextBlue" }, + "else": { "name": "menu.setFont", "id": "mainMenu", "index": {4}, "font": "smaltext" } } } } diff --git a/gamefilesd/towners/common/setMenuPriceText.json b/gamefilesd/towners/common/setMenuPriceText.json index 9090cbd6..7a549798 100755 --- a/gamefilesd/towners/common/setMenuPriceText.json +++ b/gamefilesd/towners/common/setMenuPriceText.json @@ -1,6 +1,5 @@ { "action": { - "replaceVars": true, "name": "if.equal", "param1": { "name": "player.canUseItem", @@ -8,35 +7,36 @@ }, "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": {4}, - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.unique|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": {4}, - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.magical|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": {4}, - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": {4} + "index": {4}, + "font": "smaltext" } } } diff --git a/gamefilesd/towners/common/setPriceInfo.json b/gamefilesd/towners/common/setPriceInfo.json index e6df6aac..6ab96350 100755 --- a/gamefilesd/towners/common/setPriceInfo.json +++ b/gamefilesd/towners/common/setPriceInfo.json @@ -2,25 +2,24 @@ "action": [ { "name": "text.setText", "id": "itemPrice", "text": "{4}" }, { - "replaceVars": true, "name": "if.equal", "param1": { "name": "player.canUseItem", "item": { "player": "{1}", "inventory": {2}, "item": {3} } }, "param2": false, - "then": { "name": "text.setColor", "id": "itemPrice", "color": "%textRed%" }, + "then": { "name": "text.setFont", "id": "itemPrice", "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.unique|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.unique%", "param2": 1, - "then": { "name": "text.setColor", "id": "itemPrice", "color": "%textGold%" }, + "then": { "name": "text.setFont", "id": "itemPrice", "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|player.{1}.item.{2}.{3}.magical|", + "param1": "%currentLevel.player.{1}.item.{2}.{3}.magical%", "param2": 1, - "then": { "name": "text.setColor", "id": "itemPrice", "color": "%textBlue%" }, - "else": { "name": "text.setColor", "id": "itemPrice" } + "then": { "name": "text.setFont", "id": "itemPrice", "font": "smaltextBlue" }, + "else": { "name": "text.setFont", "id": "itemPrice", "font": "smaltext" } } } } diff --git a/gamefilesd/towners/deadGuy/load.json b/gamefilesd/towners/deadGuy/load.json new file mode 100755 index 00000000..c5d2da8e --- /dev/null +++ b/gamefilesd/towners/deadGuy/load.json @@ -0,0 +1,33 @@ +{ + "action": { + "name": "switch", + "param": "%currentLevel.quest.theButcher.state%", + "case": [ + { + "value": 0, + "action": [ + { "name": "resource.add", "id": "panelDeadGuy" }, + { + "name": "action.set", + "id": "afterShowText", + "action": { + "name": "player.addToProperty", + "player": "deadGuy" , + "property": "lifeDamage", + "value": 1 + } + }, + { "name": "quest.setState", "quest": "theButcher", "state": 1 }, + { "name": "load", "file": "texts/quests/theButcher.json" } + ] + }, + { + "value": 1, + "action": [ + { "name": "load", "file": ["res/player/sound/load.json", 8, "yourDeathAvenged", "loadAudio", "currentLevel"] }, + { "name": "audio.play", "id": "yourDeathAvenged", "volume": "%game.soundVolume%" } + ] + } + ] + } +} \ No newline at end of file diff --git a/gamefilesd/towners/farnham/panelMain.json b/gamefilesd/towners/farnham/panelMain.json index ef28b340..9eba1f7e 100755 --- a/gamefilesd/towners/farnham/panelMain.json +++ b/gamefilesd/towners/farnham/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelText", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 142], "anchor": "none", "horizontalAlign": "center", @@ -46,9 +42,7 @@ "button": [ { "id": "talk", - "replaceVars": true, - "font": "smaltext", - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", diff --git a/gamefilesd/towners/farnham/panelTalk.json b/gamefilesd/towners/farnham/panelTalk.json index 1dfc4641..7ec93e34 100755 --- a/gamefilesd/towners/farnham/panelTalk.json +++ b/gamefilesd/towners/farnham/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -68,11 +66,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["diablo", "gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["diablo", "gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -105,6 +106,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/towners/gillian/panelMain.json b/gamefilesd/towners/gillian/panelMain.json index 025c418b..6e5f22ef 100755 --- a/gamefilesd/towners/gillian/panelMain.json +++ b/gamefilesd/towners/gillian/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelText", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 142], "anchor": "none", "horizontalAlign": "center", @@ -46,9 +42,7 @@ "button": [ { "id": "talk", - "replaceVars": true, - "font": "smaltext", - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", diff --git a/gamefilesd/towners/gillian/panelTalk.json b/gamefilesd/towners/gillian/panelTalk.json index 143b59fa..c17709a7 100755 --- a/gamefilesd/towners/gillian/panelTalk.json +++ b/gamefilesd/towners/gillian/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -68,11 +66,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["diablo", "gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["diablo", "gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -105,6 +106,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/towners/griswold/buy/common.json b/gamefilesd/towners/griswold/buy/common.json index 4b33c0a0..3ecf3d32 100755 --- a/gamefilesd/towners/griswold/buy/common.json +++ b/gamefilesd/towners/griswold/buy/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/griswold/buy/confirm.json b/gamefilesd/towners/griswold/buy/confirm.json index 44fa63fa..3a782305 100755 --- a/gamefilesd/towners/griswold/buy/confirm.json +++ b/gamefilesd/towners/griswold/buy/confirm.json @@ -8,8 +8,8 @@ "param2": true, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", - "param2": "|currentLevel|player.griswold.item.{1}.{2}.price|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", + "param2": "%currentLevel.player.griswold.item.{1}.{2}.price%", "then": { "name": "load", "file": [ "towners/griswold/buy/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/griswold/buy/confirm2.json b/gamefilesd/towners/griswold/buy/confirm2.json index b98d5502..f468d408 100755 --- a/gamefilesd/towners/griswold/buy/confirm2.json +++ b/gamefilesd/towners/griswold/buy/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -72,8 +70,9 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "|currentLevel|player.griswold.item.{1}.{2}.price|" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.player.griswold.item.{1}.{2}.price%" }, { "name": "item.trade", @@ -110,7 +109,7 @@ ], "load": ["towners/common/setItemInfo.json", "griswold", "{1}", "{2}"], "load": ["towners/common/setPriceInfo.json", "griswold", "{1}", "{2}", - "|currentLevel|player.griswold.item.{1}.{2}.price|"], + "%currentLevel.player.griswold.item.{1}.{2}.price%"], "action": [ "anchorLeftPentagram", "anchorRightPentagram" diff --git a/gamefilesd/towners/griswold/buy/listItems.json b/gamefilesd/towners/griswold/buy/listItems.json index e1701919..51e7ea33 100755 --- a/gamefilesd/towners/griswold/buy/listItems.json +++ b/gamefilesd/towners/griswold/buy/listItems.json @@ -26,7 +26,7 @@ "visibleItems": 4, "verticalPad": 38, "items": { - "load": "currentLevel|griswold.inventory.0", + "load": "currentLevel.griswold.inventory.0", "text": "%price%", "executeAction": { "name": "load", diff --git a/gamefilesd/towners/griswold/buy/panel.json b/gamefilesd/towners/griswold/buy/panel.json index 78cb7844..10ba4a92 100755 --- a/gamefilesd/towners/griswold/buy/panel.json +++ b/gamefilesd/towners/griswold/buy/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -69,7 +69,7 @@ "onScrollDown": "focus.moveDown", "onScrollUp": "focus.moveUp", "items": { - "load": "currentLevel|griswold.inventory.0", + "load": "currentLevel.griswold.inventory.0", "text": "%name%\n", "onClick": { "name": "load", @@ -106,13 +106,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have these items for sale : Your gold : [1]" }, { "name": "load", "file": "towners/griswold/buy/listItems.json" } @@ -121,7 +121,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have no more items for sale. Your gold : [1]" }, { "name": "load", "file": "towners/griswold/buy/noItems.json" } diff --git a/gamefilesd/towners/griswold/buyPremium/common.json b/gamefilesd/towners/griswold/buyPremium/common.json index 4b33c0a0..3ecf3d32 100755 --- a/gamefilesd/towners/griswold/buyPremium/common.json +++ b/gamefilesd/towners/griswold/buyPremium/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/griswold/buyPremium/confirm.json b/gamefilesd/towners/griswold/buyPremium/confirm.json index 05986f88..e0b6e7bf 100755 --- a/gamefilesd/towners/griswold/buyPremium/confirm.json +++ b/gamefilesd/towners/griswold/buyPremium/confirm.json @@ -8,8 +8,8 @@ "param2": true, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", - "param2": "|currentLevel|player.griswold.item.{1}.{2}.price|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", + "param2": "%currentLevel.player.griswold.item.{1}.{2}.price%", "then": { "name": "load", "file": [ "towners/griswold/buyPremium/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/griswold/buyPremium/confirm2.json b/gamefilesd/towners/griswold/buyPremium/confirm2.json index 3a8b6217..1f126f21 100755 --- a/gamefilesd/towners/griswold/buyPremium/confirm2.json +++ b/gamefilesd/towners/griswold/buyPremium/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -72,8 +70,9 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "|currentLevel|player.griswold.item.{1}.{2}.price|" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.player.griswold.item.{1}.{2}.price%" }, { "name": "item.trade", @@ -110,7 +109,7 @@ ], "load": ["towners/common/setItemInfo.json", "griswold", "{1}", "{2}"], "load": ["towners/common/setPriceInfo.json", "griswold", "{1}", "{2}", - "|currentLevel|player.griswold.item.{1}.{2}.price|"], + "%currentLevel.player.griswold.item.{1}.{2}.price%"], "action": [ "anchorLeftPentagram", "anchorRightPentagram" diff --git a/gamefilesd/towners/griswold/buyPremium/listItems.json b/gamefilesd/towners/griswold/buyPremium/listItems.json index cd0640f8..25f3ae29 100755 --- a/gamefilesd/towners/griswold/buyPremium/listItems.json +++ b/gamefilesd/towners/griswold/buyPremium/listItems.json @@ -26,7 +26,7 @@ "visibleItems": 4, "verticalPad": 38, "items": { - "load": "currentLevel|griswold.inventory.1", + "load": "currentLevel.griswold.inventory.1", "text": "%price%", "executeAction": { "name": "load", diff --git a/gamefilesd/towners/griswold/buyPremium/panel.json b/gamefilesd/towners/griswold/buyPremium/panel.json index f7b90942..bb039ed1 100755 --- a/gamefilesd/towners/griswold/buyPremium/panel.json +++ b/gamefilesd/towners/griswold/buyPremium/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -69,7 +69,7 @@ "onScrollDown": "focus.moveDown", "onScrollUp": "focus.moveUp", "items": { - "load": "currentLevel|griswold.inventory.1", + "load": "currentLevel.griswold.inventory.1", "text": "%name%\n", "onClick": { "name": "load", @@ -106,13 +106,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have these premium items for sale : Your gold : [1]" }, { "name": "load", "file": "towners/griswold/buyPremium/listItems.json" } @@ -121,7 +121,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have no more items for sale. Your gold : [1]" }, { "name": "load", "file": "towners/griswold/buyPremium/noItems.json" } diff --git a/gamefilesd/towners/griswold/panelMain.json b/gamefilesd/towners/griswold/panelMain.json index 51334b2f..5845e5a8 100755 --- a/gamefilesd/towners/griswold/panelMain.json +++ b/gamefilesd/towners/griswold/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 46], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelTitle2", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 70], "anchor": "none", "horizontalAlign": "center", @@ -44,9 +40,7 @@ }, { "id": "panelText", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 118], "anchor": "none", "horizontalAlign": "center", @@ -57,9 +51,7 @@ "button": [ { "id": "talk", - "replaceVars": true, - "font": "smaltext", - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", diff --git a/gamefilesd/towners/griswold/panelTalk.json b/gamefilesd/towners/griswold/panelTalk.json index 7ed27d03..d5240614 100755 --- a/gamefilesd/towners/griswold/panelTalk.json +++ b/gamefilesd/towners/griswold/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -68,11 +66,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["diablo", "gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["diablo", "gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -105,6 +106,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/towners/griswold/repair/common.json b/gamefilesd/towners/griswold/repair/common.json index cc178054..07c0ee34 100755 --- a/gamefilesd/towners/griswold/repair/common.json +++ b/gamefilesd/towners/griswold/repair/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/griswold/repair/confirm.json b/gamefilesd/towners/griswold/repair/confirm.json index 17e4999b..181abab7 100755 --- a/gamefilesd/towners/griswold/repair/confirm.json +++ b/gamefilesd/towners/griswold/repair/confirm.json @@ -1,8 +1,8 @@ { "action": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", - "param2": "|currentLevel|currentPlayer.item.{1}.{2}.price|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", + "param2": "%currentLevel.currentPlayer.item.{1}.{2}.price%", "then": { "name": "load", "file": [ "towners/griswold/repair/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/griswold/repair/confirm2.json b/gamefilesd/towners/griswold/repair/confirm2.json index 68517951..050a8070 100755 --- a/gamefilesd/towners/griswold/repair/confirm2.json +++ b/gamefilesd/towners/griswold/repair/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -72,15 +70,16 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "|currentLevel|currentPlayer.item.{1}.{2}.price|" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.currentPlayer.item.{1}.{2}.price%" }, { "name": "item.setProperty", "inventory": "{1}", "item": {2}, "property": "durability", - "value": "|currentLevel|currentPlayer.item.{1}.{2}.durabilityMax|" + "value": "%currentLevel.currentPlayer.item.{1}.{2}.durabilityMax%" }, { "name": "resource.popAll", "id": "userPanelRepair" }, { "name": "load", "file": "towners/griswold/repair/panel.json" } @@ -125,33 +124,32 @@ "text": "%price%" }, { - "replaceVars": true, "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.{1}.{2}|", + "param1": "%currentLevel.currentPlayer.canUseItem.{1}.{2}%", "param2": false, "then": [ - { "name": "text.setColor", "id": "itemInfo", "color": "%textRed%" }, - { "name": "text.setColor", "id": "itemPrice", "color": "%textRed%" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltextRed" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltextRed" } ], "else": { "name": "if.equal", - "param1": "|currentLevel|player.griswold.item.{1}.{2}.unique|", + "param1": "%currentLevel.player.griswold.item.{1}.{2}.unique%", "param2": 1, "then": [ - { "name": "text.setColor", "id": "itemInfo", "color": "%textGold%" }, - { "name": "text.setColor", "id": "itemPrice", "color": "%textGold%" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltextGold" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltextGold" } ], "else": { "name": "if.equal", - "param1": "|currentLevel|player.griswold.item.{1}.{2}.magical|", + "param1": "%currentLevel.player.griswold.item.{1}.{2}.magical%", "param2": 1, "then": [ - { "name": "text.setColor", "id": "itemInfo", "color": "%textBlue%" }, - { "name": "text.setColor", "id": "itemPrice", "color": "%textBlue%" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltextBlue" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltextBlue" } ], "else": [ - { "name": "text.setColor", "id": "itemInfo" }, - { "name": "text.setColor", "id": "itemPrice" } + { "name": "text.setFont", "id": "itemInfo", "font": "smaltext" }, + { "name": "text.setFont", "id": "itemPrice", "font": "smaltext" } ] } } diff --git a/gamefilesd/towners/griswold/repair/listItems.json b/gamefilesd/towners/griswold/repair/listItems.json index c7a1ab41..09f80fda 100755 --- a/gamefilesd/towners/griswold/repair/listItems.json +++ b/gamefilesd/towners/griswold/repair/listItems.json @@ -16,7 +16,6 @@ ], "menu": { "id": "menuPrices", - "replaceVars": true, "font": "smaltext", "sound": "titlslct", "position": [571, 94], @@ -28,7 +27,7 @@ "verticalPad": 38, "items": [ { - "load": "currentLevel|currentPlayer.inventory.body", + "load": "currentLevel.currentPlayer.inventory.body", "exclude": { "property": "needsRepair", "value": false @@ -36,45 +35,46 @@ "text": "%price%", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "exclude": { "property": "needsRepair", "value": false @@ -82,45 +82,46 @@ "text": "%price%", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.belt.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.belt.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "exclude": { "property": "needsRepair", "value": false @@ -128,38 +129,39 @@ "text": "%price%", "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.stash.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.stash.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "menuPrices", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } diff --git a/gamefilesd/towners/griswold/repair/panel.json b/gamefilesd/towners/griswold/repair/panel.json index 7a639e50..1ddb3e31 100755 --- a/gamefilesd/towners/griswold/repair/panel.json +++ b/gamefilesd/towners/griswold/repair/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -54,7 +54,6 @@ ], "menu": { "id": "mainMenu", - "replaceVars": true, "font": "smaltext", "sound": "titlslct", "position": [52, 94], @@ -71,7 +70,7 @@ "onScrollUp": "focus.moveUp", "items": [ { - "load": "currentLevel|currentPlayer.inventory.body", + "load": "currentLevel.currentPlayer.inventory.body", "exclude": { "property": "needsRepair", "value": false @@ -92,45 +91,46 @@ ], "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.body.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.body.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.body.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.body.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.belt", + "load": "currentLevel.currentPlayer.inventory.belt", "exclude": { "property": "needsRepair", "value": false @@ -151,45 +151,46 @@ ], "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.belt.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.belt.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.belt.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.belt.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } } }, { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "exclude": { "property": "needsRepair", "value": false @@ -210,38 +211,39 @@ ], "executeAction": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.canUseItem.stash.%idx%|", + "param1": "%currentLevel.currentPlayer.canUseItem.stash.%idx%%", "param2": false, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textRed%" + "font": "smaltextRed" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.unique|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.unique%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textGold%" + "font": "smaltextGold" }, "else": { "name": "if.equal", - "param1": "|currentLevel|currentPlayer.item.stash.%idx%.magical|", + "param1": "%currentLevel.currentPlayer.item.stash.%idx%.magical%", "param2": 1, "then": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", "index": "%menuIdx%", - "color": "%textBlue%" + "font": "smaltextBlue" }, "else": { - "name": "menu.setColor", + "name": "menu.setFont", "id": "mainMenu", - "index": "%menuIdx%" + "index": "%menuIdx%", + "font": "smaltext" } } } @@ -269,13 +271,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "Repair which item? Your gold : [1]" }, { "name": "load", "file": "towners/griswold/repair/listItems.json" } @@ -284,7 +286,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "You have nothing to repair. Your gold : [1]" }, { "name": "load", "file": "towners/griswold/repair/noItems.json" } diff --git a/gamefilesd/towners/griswold/sell/common.json b/gamefilesd/towners/griswold/sell/common.json index 74273fed..9a14f790 100755 --- a/gamefilesd/towners/griswold/sell/common.json +++ b/gamefilesd/towners/griswold/sell/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/griswold/sell/confirm.json b/gamefilesd/towners/griswold/sell/confirm.json index a322a576..7a84c14c 100755 --- a/gamefilesd/towners/griswold/sell/confirm.json +++ b/gamefilesd/towners/griswold/sell/confirm.json @@ -1,8 +1,8 @@ { "action": { "name": ">=", - "param1": { "name": "player.getMaxGoldCapacity" }, - "param2": "|currentLevel|currentPlayer.item.{1}.{2}.prices.sell|", + "param1": { "name": "player.getMaxItemCapacity", "itemClass": "gold" }, + "param2": "%currentLevel.currentPlayer.item.{1}.{2}.prices.sell%", "then": { "name": "load", "file": [ "towners/griswold/sell/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/griswold/sell/confirm2.json b/gamefilesd/towners/griswold/sell/confirm2.json index feb5fe48..a2812283 100755 --- a/gamefilesd/towners/griswold/sell/confirm2.json +++ b/gamefilesd/towners/griswold/sell/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -71,7 +69,11 @@ "horizontalSpaceOffset": 1, "text": "Yes", "onClick": [ - { "name": "player.addGold", "gold": "|currentLevel|currentPlayer.item.{1}.{2}.prices.sell|" }, + { + "name": "player.addItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.currentPlayer.item.{1}.{2}.prices.sell%" + }, { "name": "item.delete", "inventory": {1}, "item": {2} }, { "name": "resource.popAll", "id": "userPanelSell" }, { "name": "load", "file": "towners/griswold/sell/panel.json" } @@ -101,7 +103,7 @@ ], "load": ["towners/common/setItemInfo.json", "hero", "{1}", "{2}"], "load": ["towners/common/setPriceInfo.json", "hero", "{1}", "{2}", - "|currentLevel|currentPlayer.item.{1}.{2}.prices.sell|"], + "%currentLevel.currentPlayer.item.{1}.{2}.prices.sell%"], "action": [ "anchorLeftPentagram", "anchorRightPentagram" diff --git a/gamefilesd/towners/griswold/sell/listItems.json b/gamefilesd/towners/griswold/sell/listItems.json index 572ad0b9..45ee6bdb 100755 --- a/gamefilesd/towners/griswold/sell/listItems.json +++ b/gamefilesd/towners/griswold/sell/listItems.json @@ -26,7 +26,7 @@ "visibleItems": 4, "verticalPad": 38, "items": { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "include": { "property": "itemType", "value": ["Amulet", "Armor", "Axe", "Bow", "Club", "Helmet", "Ring", "Shield", "Sword"] diff --git a/gamefilesd/towners/griswold/sell/panel.json b/gamefilesd/towners/griswold/sell/panel.json index 294d58a1..8a39df1d 100755 --- a/gamefilesd/towners/griswold/sell/panel.json +++ b/gamefilesd/towners/griswold/sell/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -69,7 +69,7 @@ "onScrollDown": "focus.moveDown", "onScrollUp": "focus.moveUp", "items": { - "load": "currentLevel|currentPlayer.inventory.stash", + "load": "currentLevel.currentPlayer.inventory.stash", "include": { "property": "itemType", "value": ["Amulet", "Armor", "Axe", "Bow", "Club", "Helmet", "Ring", "Shield", "Sword"] @@ -110,13 +110,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "Which item is for sale? Your gold : [1]" }, { "name": "load", "file": "towners/griswold/sell/listItems.json" } @@ -125,7 +125,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "You have nothing I want. Your gold : [1]" }, { "name": "load", "file": "towners/griswold/sell/noItems.json" } diff --git a/gamefilesd/towners/ogden/load.json b/gamefilesd/towners/ogden/load.json new file mode 100755 index 00000000..e3ba0924 --- /dev/null +++ b/gamefilesd/towners/ogden/load.json @@ -0,0 +1,18 @@ +{ + "action": { + "name": "if.equal", + "param1": "%currentLevel.hasQuest.ogdenInit%", + "param2": true, + "then": { "name": "load", "file": "texts/ogden/quests/ogdenInit.json" }, + "else": { + "name": "if.equal", + "param1": "%currentLevel.quest.ogdensSign.state%", + "param2": 0, + "then": [ + { "name": "load", "file": "texts/ogden/quests/ogdensSign.json" }, + { "name": "quest.setState", "quest": "ogdensSign", "state": 1 } + ], + "else": { "name": "load", "file": "towners/ogden/panel.json" } + } + } +} \ No newline at end of file diff --git a/gamefilesd/towners/ogden/panelMain.json b/gamefilesd/towners/ogden/panelMain.json index c31f30af..9e1e2de7 100755 --- a/gamefilesd/towners/ogden/panelMain.json +++ b/gamefilesd/towners/ogden/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 46], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelTitle2", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 70], "anchor": "none", "horizontalAlign": "center", @@ -44,9 +40,7 @@ }, { "id": "panelText", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 142], "anchor": "none", "horizontalAlign": "center", @@ -57,9 +51,7 @@ "button": [ { "id": "talk", - "replaceVars": true, - "font": "smaltext", - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", diff --git a/gamefilesd/towners/ogden/panelTalk.json b/gamefilesd/towners/ogden/panelTalk.json index 841debc9..30e7cf64 100755 --- a/gamefilesd/towners/ogden/panelTalk.json +++ b/gamefilesd/towners/ogden/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -68,11 +66,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["diablo", "gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["diablo", "gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -105,6 +106,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/towners/pepin/buy/common.json b/gamefilesd/towners/pepin/buy/common.json index 4b33c0a0..3ecf3d32 100755 --- a/gamefilesd/towners/pepin/buy/common.json +++ b/gamefilesd/towners/pepin/buy/common.json @@ -49,9 +49,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/pepin/buy/confirm.json b/gamefilesd/towners/pepin/buy/confirm.json index 721f29cd..e0b9fee7 100755 --- a/gamefilesd/towners/pepin/buy/confirm.json +++ b/gamefilesd/towners/pepin/buy/confirm.json @@ -8,8 +8,8 @@ "param2": true, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", - "param2": "|currentLevel|player.pepin.item.{1}.{2}.price|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", + "param2": "%currentLevel.player.pepin.item.{1}.{2}.price%", "then": { "name": "load", "file": [ "towners/pepin/buy/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/pepin/buy/confirm2.json b/gamefilesd/towners/pepin/buy/confirm2.json index 1beaf7c2..c1419ea4 100755 --- a/gamefilesd/towners/pepin/buy/confirm2.json +++ b/gamefilesd/towners/pepin/buy/confirm2.json @@ -32,7 +32,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -41,7 +40,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -72,8 +70,9 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "|currentLevel|player.pepin.item.{1}.{2}.price|" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.player.pepin.item.{1}.{2}.price%" }, { "name": "item.trade", @@ -110,7 +109,7 @@ ], "load": ["towners/common/setItemInfo.json", "pepin", "{1}", "{2}"], "load": ["towners/common/setPriceInfo.json", "pepin", "{1}", "{2}", - "|currentLevel|player.pepin.item.{1}.{2}.price|"], + "%currentLevel.player.pepin.item.{1}.{2}.price%"], "action": [ "anchorLeftPentagram", "anchorRightPentagram" diff --git a/gamefilesd/towners/pepin/buy/listItems.json b/gamefilesd/towners/pepin/buy/listItems.json index 3d8107c8..d09d2ac0 100755 --- a/gamefilesd/towners/pepin/buy/listItems.json +++ b/gamefilesd/towners/pepin/buy/listItems.json @@ -26,7 +26,7 @@ "visibleItems": 4, "verticalPad": 38, "items": { - "load": "currentLevel|pepin.inventory.0", + "load": "currentLevel.pepin.inventory.0", "text": "%price%", "executeAction": { "name": "load", diff --git a/gamefilesd/towners/pepin/buy/panel.json b/gamefilesd/towners/pepin/buy/panel.json index 572cb493..1df315a5 100755 --- a/gamefilesd/towners/pepin/buy/panel.json +++ b/gamefilesd/towners/pepin/buy/panel.json @@ -15,7 +15,7 @@ { "name": "menu.setIndex", "id": "menuPrices", - "index": "|mainMenu|currentIdx|" + "index": "%mainMenu.currentIdx%" } ] }, @@ -69,7 +69,7 @@ "onScrollDown": "focus.moveDown", "onScrollUp": "focus.moveUp", "items": { - "load": "currentLevel|pepin.inventory.0", + "load": "currentLevel.pepin.inventory.0", "text": "%name%\n", "onClick": { "name": "load", @@ -106,13 +106,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have these items for sale : Your gold : [1]" }, { "name": "load", "file": "towners/pepin/buy/listItems.json" } @@ -121,7 +121,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have no more items for sale. Your gold : [1]" }, { "name": "load", "file": "towners/pepin/buy/noItems.json" } diff --git a/gamefilesd/towners/pepin/load.json b/gamefilesd/towners/pepin/load.json new file mode 100755 index 00000000..fa29606f --- /dev/null +++ b/gamefilesd/towners/pepin/load.json @@ -0,0 +1,12 @@ +{ + "action": { + "name": "if", + "params": [ + "%currentLevel.quest.poisonedWater.state%", "==", 0, + "or", + "%currentLevel.quest.poisonedWater.state%", "==", -1 + ], + "then": { "name": "load", "file": "texts/pepin/quests/poisonedWater.json" }, + "else": { "name": "load", "file": "towners/pepin/panel.json" } + } +} \ No newline at end of file diff --git a/gamefilesd/towners/pepin/panelMain.json b/gamefilesd/towners/pepin/panelMain.json index 020d9502..94ec76ab 100755 --- a/gamefilesd/towners/pepin/panelMain.json +++ b/gamefilesd/towners/pepin/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 46], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelTitle2", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 70], "anchor": "none", "horizontalAlign": "center", @@ -44,9 +40,7 @@ }, { "id": "panelText", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 142], "anchor": "none", "horizontalAlign": "center", @@ -57,9 +51,7 @@ "button": [ { "id": "talk", - "replaceVars": true, - "font": "smaltext", - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", @@ -87,7 +79,7 @@ "text": "Receive Healing", "onClick": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.lifeDamage|", + "param1": "%currentLevel.currentPlayer.lifeDamage%", "param2": 0, "then": [ { "name": "sound.loadPlay", "file": "sfx/misc/cast8.wav" }, diff --git a/gamefilesd/towners/pepin/panelTalk.json b/gamefilesd/towners/pepin/panelTalk.json index 0a7f2fa5..91f5ef68 100755 --- a/gamefilesd/towners/pepin/panelTalk.json +++ b/gamefilesd/towners/pepin/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -67,11 +65,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["diablo", "gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["diablo", "gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -104,6 +105,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/towners/wirt/buy/common.json b/gamefilesd/towners/wirt/buy/common.json index ac368c10..488579e0 100755 --- a/gamefilesd/towners/wirt/buy/common.json +++ b/gamefilesd/towners/wirt/buy/common.json @@ -39,9 +39,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 46], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/wirt/buy/confirm.json b/gamefilesd/towners/wirt/buy/confirm.json index 97ef1643..a9ff1b54 100755 --- a/gamefilesd/towners/wirt/buy/confirm.json +++ b/gamefilesd/towners/wirt/buy/confirm.json @@ -8,8 +8,8 @@ "param2": true, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", - "param2": "|currentLevel|player.wirt.item.{1}.{2}.price|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", + "param2": "%currentLevel.player.wirt.item.{1}.{2}.price%", "then": { "name": "load", "file": [ "towners/wirt/buy/confirm2.json", "{1}", "{2}" ] diff --git a/gamefilesd/towners/wirt/buy/confirm2.json b/gamefilesd/towners/wirt/buy/confirm2.json index 669c1c4b..1dfb9dbf 100755 --- a/gamefilesd/towners/wirt/buy/confirm2.json +++ b/gamefilesd/towners/wirt/buy/confirm2.json @@ -22,7 +22,6 @@ "text": [ { "id": "itemInfo", - "replaceVars": true, "font": "smaltext", "position": [52, 130], "anchor": "none", @@ -31,7 +30,6 @@ }, { "id": "itemPrice", - "replaceVars": true, "font": "smaltext", "position": [571, 130], "anchor": "none", @@ -62,8 +60,9 @@ "text": "Yes", "onClick": [ { - "name": "player.removeGold", - "gold": "|currentLevel|player.wirt.item.{1}.{2}.price|" + "name": "player.removeItemQuantity", + "itemClass": "gold", + "value": "%currentLevel.player.wirt.item.{1}.{2}.price%" }, { "name": "item.trade", @@ -99,7 +98,7 @@ ], "load": ["towners/common/setItemInfo.json", "wirt", "{1}", "{2}"], "load": ["towners/common/setPriceInfo.json", "wirt", "{1}", "{2}", - "|currentLevel|player.wirt.item.{1}.{2}.price|"], + "%currentLevel.player.wirt.item.{1}.{2}.price%"], "action": [ "anchorLeftPentagram", "anchorRightPentagram" diff --git a/gamefilesd/towners/wirt/buy/listItems.json b/gamefilesd/towners/wirt/buy/listItems.json index 41ca122c..b86f89b6 100755 --- a/gamefilesd/towners/wirt/buy/listItems.json +++ b/gamefilesd/towners/wirt/buy/listItems.json @@ -38,7 +38,7 @@ "visibleItems": 1, "verticalPad": 38, "items": { - "load": "currentLevel|wirt.inventory.0", + "load": "currentLevel.wirt.inventory.0", "text": "%price%", "executeAction": { "name": "load", diff --git a/gamefilesd/towners/wirt/buy/noGold.json b/gamefilesd/towners/wirt/buy/noGold.json index da219432..7d080e29 100755 --- a/gamefilesd/towners/wirt/buy/noGold.json +++ b/gamefilesd/towners/wirt/buy/noGold.json @@ -13,9 +13,7 @@ ], "text": { "id": "panelTitle", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [320, 58], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/towners/wirt/buy/panel.json b/gamefilesd/towners/wirt/buy/panel.json index fe60f284..b5dc0054 100755 --- a/gamefilesd/towners/wirt/buy/panel.json +++ b/gamefilesd/towners/wirt/buy/panel.json @@ -28,7 +28,7 @@ "size": [518, 186], "verticalPad": 14, "items": { - "load": "currentLevel|wirt.inventory.0", + "load": "currentLevel.wirt.inventory.0", "text": "%name%\n", "onClick": { "name": "load", @@ -62,13 +62,13 @@ }, "action": { "name": "if.notEqual", - "param1": "|mainMenu|itemCount|", + "param1": "%mainMenu.itemCount%", "param2": 0, "then": [ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have this item for sale : Your gold : [1]" }, { "name": "load", "file": "towners/wirt/buy/listItems.json" } @@ -77,7 +77,7 @@ { "name": "text.setText", "id": "panelTitle", - "binding": "|currentLevel|currentPlayer.gold|", + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%", "format": "I have no more items for sale. Your gold : [1]" }, { "name": "load", "file": "towners/wirt/buy/noItems.json" } diff --git a/gamefilesd/towners/wirt/buy/showItem.json b/gamefilesd/towners/wirt/buy/showItem.json index 4e3b346e..b7c8df53 100755 --- a/gamefilesd/towners/wirt/buy/showItem.json +++ b/gamefilesd/towners/wirt/buy/showItem.json @@ -6,14 +6,14 @@ { "name": "load", "file": "ui/level/panel/big.json" }, { "name": "if.equal", - "param1": "|currentLevel|player.wirt.hasItem.0.0|", + "param1": "%currentLevel.player.wirt.hasItem.0.0%", "param2": true, "then": { "name": ">=", - "param1": "|currentLevel|currentPlayer.gold|", + "param1": "%currentLevel.currentPlayer.itemQuantity.gold%", "param2": "%WirtSeePrice%", "then": [ - { "name": "player.removeGold", "gold": "%WirtSeePrice%" }, + { "name": "player.removeItemQuantity", "itemClass": "gold", "value": "%WirtSeePrice%" }, { "name": "load", "file": "towners/wirt/buy/common.json" }, { "name": "load", "file": "towners/wirt/buy/panel.json" } ], diff --git a/gamefilesd/towners/wirt/panelMain.json b/gamefilesd/towners/wirt/panelMain.json index a048a38b..761f6cb9 100755 --- a/gamefilesd/towners/wirt/panelMain.json +++ b/gamefilesd/towners/wirt/panelMain.json @@ -22,9 +22,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -33,9 +31,7 @@ }, { "id": "panelText1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 178], "anchor": "none", "horizontalAlign": "center", @@ -45,19 +41,16 @@ { "id": "panelText2", "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 202], "anchor": "none", "horizontalAlign": "center", "horizontalSpaceOffset": 1, - "text": "but it will cost %WirtSeePrice% gold" + "text": "but it will cost |WirtSeePrice| gold" }, { "id": "panelText3", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [476, 226], "anchor": "none", "horizontalAlign": "center", @@ -68,9 +61,7 @@ "button": [ { "id": "talk", - "replaceVars": true, - "font": "smaltext", - "color": "%textBlue%", + "font": "smaltextBlue", "sound": "titlslct", "focus": true, "focusSound": "titlemov", @@ -123,7 +114,7 @@ "action": [ { "name": "if.equal", - "param1": "|currentLevel|player.wirt.hasItem.0.0|", + "param1": "%currentLevel.player.wirt.hasItem.0.0%", "param2": true, "else": [ { "name": "drawable.visible", "id": "panelText1", "visible": false }, diff --git a/gamefilesd/towners/wirt/panelTalk.json b/gamefilesd/towners/wirt/panelTalk.json index 5b7725b2..65949a2c 100755 --- a/gamefilesd/towners/wirt/panelTalk.json +++ b/gamefilesd/towners/wirt/panelTalk.json @@ -30,9 +30,7 @@ "text": [ { "id": "panelTitle1", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [480, 58], "anchor": "none", "horizontalAlign": "center", @@ -68,11 +66,14 @@ ] }, { - "load": "currentLevel|quests", - "exclude": { - "property": "id", - "value": ["diablo", "gharbadTheWeak", "zharTheMad"] - }, + "load": "currentLevel.quests", + "exclude": [ + { "property": "state", "value": [-1, 0] }, + { + "property": "id", + "value": ["diablo", "gharbadTheWeak", "zharTheMad"] + } + ], "text": "%name%", "onClick": { "name": "load", @@ -105,6 +106,6 @@ "action": [ "anchorLeftPentagram", "anchorRightPentagram", - { "name": "menu.setColor", "id": "panelQuests", "index": 0, "color": "%textBlue%", "replaceVars": true } + { "name": "menu.setFont", "id": "panelQuests", "index": 0, "font": "smaltextBlue" } ] } \ No newline at end of file diff --git a/gamefilesd/ui/charInfo.json b/gamefilesd/ui/charInfo.json index 190ca909..a6834e67 100755 --- a/gamefilesd/ui/charInfo.json +++ b/gamefilesd/ui/charInfo.json @@ -1,6 +1,6 @@ { "action": [ - { "name": "variable.set", "key": "charClass", "val": "{6}" }, + { "name": "variable.set", "key": "charClass", "value": "{6}" }, { "name": "text.setText", "id": "txtLevel", "text": "{1}" }, { "name": "text.setText", "id": "txtStrength", "text": "{2}" }, { "name": "text.setText", "id": "txtMagic", "text": "{3}" }, diff --git a/gamefilesd/ui/charInfoDefault.json b/gamefilesd/ui/charInfoDefault.json index 6d1e64a8..80fde5b2 100755 --- a/gamefilesd/ui/charInfoDefault.json +++ b/gamefilesd/ui/charInfoDefault.json @@ -1,6 +1,6 @@ { "action": [ - { "name": "variable.set", "key": "charClass", "val": null }, + { "name": "variable.set", "key": "charClass", "value": null }, { "name": "text.setText", "id": "txtLevel", "text": "--" }, { "name": "text.setText", "id": "txtStrength", "text": "--" }, { "name": "text.setText", "id": "txtMagic", "text": "--" }, diff --git a/gamefilesd/ui/credits.json b/gamefilesd/ui/credits.json index c47475e9..92145130 100755 --- a/gamefilesd/ui/credits.json +++ b/gamefilesd/ui/credits.json @@ -11,7 +11,7 @@ }, "texture": { "id": "credits", - "file":"ui_art/credits.pcx" + "file": "ui_art/credits.pcx" }, "image": { "id": "credits", diff --git a/gamefilesd/ui/gameInfo.json b/gamefilesd/ui/gameInfo.json index fb08e492..c3dfb0f4 100755 --- a/gamefilesd/ui/gameInfo.json +++ b/gamefilesd/ui/gameInfo.json @@ -64,7 +64,7 @@ { "id": "openGLVersion", "font": "font42g", - "binding": ["|game|openGL.majorVersion|", "|game|openGL.minorVersion|"], + "binding": ["%game.openGL.majorVersion%", "%game.openGL.minorVersion%"], "format": "OpenGL [1].[2]", "position": [319, 192], "anchor": "none", @@ -119,28 +119,28 @@ "action": [ { "name": "if.equal", - "param1": "|game|openGL.hasShaders|", + "param1": "%game.openGL.hasShaders%", "param2": true, "then": { "name": "text.setText", "id": "hasShaders", "text": "Shaders: Yes" }, "else": { "name": "text.setText", "id": "hasShaders", "text": "Shaders: No" } }, { "name": "if.equal", - "param1": "|game|openGL.hasGeometryShaders|", + "param1": "%game.openGL.hasGeometryShaders%", "param2": true, "then": { "name": "text.setText", "id": "hasGeometryShaders", "text": "Geometry Shaders: Yes" }, "else": { "name": "text.setText", "id": "hasGeometryShaders", "text": "Geometry Shaders: No" } }, { "name": "if.equal", - "param1": "|game|supportsPalettes|", + "param1": "%game.supportsPalettes%", "param2": true, "then": { "name": "text.setText", "id": "supportsPalettes", "text": "Supports Palettes: Yes" }, "else": { "name": "text.setText", "id": "supportsPalettes", "text": "Supports Palettes: No" } }, { "name": "if.equal", - "param1": "|game|supportsOutlines|", + "param1": "%game.supportsOutlines%", "param2": true, "then": { "name": "text.setText", "id": "supportsOutlines", "text": "Supports Outlines: Yes" }, "else": { "name": "text.setText", "id": "supportsOutlines", "text": "Supports Outlines: No" } diff --git a/gamefilesd/ui/intro.json b/gamefilesd/ui/intro.json index 3c6fc3b7..967c475a 100755 --- a/gamefilesd/ui/intro.json +++ b/gamefilesd/ui/intro.json @@ -5,7 +5,7 @@ "param2": true, "then": [ { "name": "load", "file": ["ui/playIntro.json", "ui/splashScreen2.json"] }, - { "name": "variable.set", "key": "skipIntro", "val": true }, + { "name": "variable.set", "key": "skipIntro", "value": true }, { "name": "load", "file": "ui/saveSettings.json" } ], "else": { "name": "load", "file": "ui/splashScreen2.json" } diff --git a/gamefilesd/ui/level/char/addGold.json b/gamefilesd/ui/level/char/addGold.json new file mode 100755 index 00000000..3d12915d --- /dev/null +++ b/gamefilesd/ui/level/char/addGold.json @@ -0,0 +1,21 @@ +{ + "item": { + "class": "gold", + "properties": { + "quantity": {2} + } + }, + "action": [ + { + "name": "item.addQuantity", + "inventory": "stash", + "item": [{1}], + "value": {2}, + "remove": true + }, + { "name": "item.addCursor" }, + "updateStashItems", + "updateCharLabels", + "updateSelectedItem" + ] +} \ No newline at end of file diff --git a/gamefilesd/ui/level/char/beltInventory.json b/gamefilesd/ui/level/char/beltInventory.json index 45f7f766..0dc9b950 100755 --- a/gamefilesd/ui/level/char/beltInventory.json +++ b/gamefilesd/ui/level/char/beltInventory.json @@ -95,7 +95,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [205, 357] @@ -105,7 +105,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [234, 357] @@ -115,7 +115,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [263, 357] @@ -125,7 +125,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [292, 357] @@ -135,7 +135,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [321, 357] @@ -145,7 +145,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [350, 357] @@ -155,7 +155,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [379, 357] @@ -165,7 +165,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [408, 357] @@ -235,6 +235,54 @@ "position": [429, 374], "visible": false, "text": "8" + }, + { + "id": "txtQuantBelt1", + "font": "smaltext", + "anchor": "bottom", + "position": [206, 358] + }, + { + "id": "txtQuantBelt2", + "font": "smaltext", + "anchor": "bottom", + "position": [235, 358] + }, + { + "id": "txtQuantBelt3", + "font": "smaltext", + "anchor": "bottom", + "position": [264, 358] + }, + { + "id": "txtQuantBelt4", + "font": "smaltext", + "anchor": "bottom", + "position": [293, 358] + }, + { + "id": "txtQuantBelt5", + "font": "smaltext", + "anchor": "bottom", + "position": [322, 358] + }, + { + "id": "txtQuantBelt6", + "font": "smaltext", + "anchor": "bottom", + "position": [351, 358] + }, + { + "id": "txtQuantBelt7", + "font": "smaltext", + "anchor": "bottom", + "position": [380, 358] + }, + { + "id": "txtQuantBelt8", + "font": "smaltext", + "anchor": "bottom", + "position": [409, 358] } ] } \ No newline at end of file diff --git a/gamefilesd/ui/level/char/closePanels.json b/gamefilesd/ui/level/char/closePanels.json index f8933465..3cb1228e 100755 --- a/gamefilesd/ui/level/char/closePanels.json +++ b/gamefilesd/ui/level/char/closePanels.json @@ -5,6 +5,7 @@ { "name": "resource.pop", "id": "charPanelQuests" }, { "name": "resource.pop", "id": "charPanelInventory" }, { "name": "resource.pop", "id": "charPanelSpells" }, + { "name": "resource.pop", "id": "removeGold" }, { "name": "drawable.visible", "id": "charPanel", "visible": false }, { "name": "drawable.visible", "id": "questPanel", "visible": false }, { "name": "drawable.visible", "id": "invPanel", "visible": false }, diff --git a/gamefilesd/ui/level/char/disableKeys.json b/gamefilesd/ui/level/char/disableKeys.json index 9cb2e0c0..688161bf 100755 --- a/gamefilesd/ui/level/char/disableKeys.json +++ b/gamefilesd/ui/level/char/disableKeys.json @@ -1,8 +1,7 @@ { "keyboard": [ - { "key": "b", "action": null }, - { "key": "c", "action": null }, - { "key": "i", "action": null }, - { "key": "q", "action": null } + { "key": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], "action": null }, + { "key": ["enter", " ", "up", "w", "down", "s", "tab", "left", "a", "right", "d"], "action": null }, + { "key": ["b", "c", "f", "g", "i", "q", "z"], "action": null } ] } \ No newline at end of file diff --git a/gamefilesd/ui/level/char/inventoryItem.json b/gamefilesd/ui/level/char/inventoryItem.json index 3c14694e..dc54953c 100755 --- a/gamefilesd/ui/level/char/inventoryItem.json +++ b/gamefilesd/ui/level/char/inventoryItem.json @@ -5,7 +5,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [28, 28], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "relativeCoords": false, diff --git a/gamefilesd/ui/level/char/panel.json b/gamefilesd/ui/level/char/panel.json index 7634fd0d..fad7879b 100755 --- a/gamefilesd/ui/level/char/panel.json +++ b/gamefilesd/ui/level/char/panel.json @@ -3,7 +3,7 @@ "name": "action.set", "id": "menu.saveAndCloseAction", "action": [ - { "name": "load", "file": "ui/level/saveSettings.json" }, + "saveSettings", { "name": "resource.popAll", "id": "gameMenuCommon" }, { "name": "resource.ignore", "id": "level", "ignore": "none" }, { "name": "level.pause", "pause": false } @@ -63,10 +63,8 @@ "text": [ { "id": "itemInfoTitle", - "replaceVars": true, - "font": "smaltext", + "font": "smaltextGold", "anchor": "right", - "color": "%textGold%", "position": [160, 63], "horizontalAlign": "center", "horizontalSpaceOffset": 1, @@ -88,25 +86,19 @@ }, { "id": "txtMapLabel", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [8, 10], "horizontalSpaceOffset": 1, - "binding": "|currentLevel|name|", - "format": "Level: [1]", "visible": false }, { "id": "txtZoom", - "replaceVars": true, "anchor": "topRight", - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [632, 10], "horizontalAlign": "right", "horizontalSpaceOffset": 1, - "binding": "|currentLevel|zoomPercentage|", + "binding": "%currentLevel.zoomPercentage%", "format": "Zoom: [1]%", "visible": false } @@ -191,6 +183,12 @@ "textureRect": [0, 88, 88, 0], "position": [464, 336], "anchor": "bottom" + }, + { + "id": "spellImg", + "texture": "noSpell", + "position": [565, 416], + "anchor": "bottom" } ], "button": [ @@ -204,13 +202,14 @@ "onClick": [ { "name": "if.equal", - "param1": "|charPanel|visible|", + "param1": "%charPanel.visible%", "param2": false, "then": [ { "name": "resource.pop", "id": "charPanelQuests" }, { "name": "load", "file": "ui/level/char/panelLabels.json" }, { "name": "drawable.visible", "id": "charPanel", "visible": true }, - { "name": "drawable.visible", "id": "questPanel", "visible": false } + { "name": "drawable.visible", "id": "questPanel", "visible": false }, + { "name": "resource.moveToTop", "id": "removeGold" } ], "else": [ { "name": "resource.pop", "id": "charPanelLabels" }, @@ -226,7 +225,7 @@ "onClickOut": { "name": "image.setTexture", "id": "char", "texture": "empty" }, "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Character Information\nHotkey : 'C'" }, @@ -246,13 +245,14 @@ "onClick": [ { "name": "if.equal", - "param1": "|questPanel|visible|", + "param1": "%questPanel.visible%", "param2": false, "then": [ { "name": "resource.pop", "id": "charPanelLabels" }, { "name": "load", "file": "ui/level/char/panelQuests.json" }, { "name": "drawable.visible", "id": "charPanel", "visible": false }, - { "name": "drawable.visible", "id": "questPanel", "visible": true } + { "name": "drawable.visible", "id": "questPanel", "visible": true }, + { "name": "resource.moveToTop", "id": "removeGold" } ], "else": [ { "name": "resource.pop", "id": "charPanelLabels" }, @@ -268,7 +268,7 @@ "onClickOut": { "name": "image.setTexture", "id": "quest", "texture": "empty" }, "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Quests Log\nHotkey : 'Q'" }, @@ -288,7 +288,7 @@ "onClick": [ { "name": "if.equal", - "param1": "|invPanel|visible|", + "param1": "%invPanel.visible%", "param2": false, "then": [ { "name": "resource.pop", "id": "charPanelSpells" }, @@ -297,6 +297,7 @@ { "name": "drawable.visible", "id": "spellPanel", "visible": false } ], "else": [ + { "name": "resource.pop", "id": "removeGold" }, { "name": "resource.pop", "id": "charPanelInventory" }, { "name": "resource.pop", "id": "charPanelSpells" }, { "name": "drawable.visible", "id": "invPanel", "visible": false }, @@ -310,7 +311,7 @@ "onClickOut": { "name": "image.setTexture", "id": "inv", "texture": "empty" }, "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Inventory\nHotkey : 'I'" }, @@ -330,9 +331,10 @@ "onClick": [ { "name": "if.equal", - "param1": "|spellPanel|visible|", + "param1": "%spellPanel.visible%", "param2": false, "then": [ + { "name": "resource.pop", "id": "removeGold" }, { "name": "resource.pop", "id": "charPanelInventory" }, { "name": "load", "file": "ui/level/char/panelSpells.json" }, { "name": "drawable.visible", "id": "invPanel", "visible": false }, @@ -352,7 +354,7 @@ "onClickOut": { "name": "image.setTexture", "id": "spell", "texture": "empty" }, "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Spell Book\nHotkey : 'B'" }, @@ -369,11 +371,12 @@ "position": [9, 427], "textureRect": [0, 38, 71, 19], "clickUp": true, + "onClick": "showMap", "onClickIn": { "name": "image.setTexture", "id": "map", "texture": "panel8bu" }, "onClickOut": { "name": "image.setTexture", "id": "map", "texture": "empty" }, "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Automap\nHotkey : Tab" }, @@ -393,7 +396,7 @@ "clickUp": true, "onClick": { "name": "if.equal", - "param1": "|game|hasResource.gameMenuCommon|", + "param1": "%game.hasResource.gameMenuCommon%", "param2": true, "then": "menu.saveAndCloseAction", "else": [ @@ -405,7 +408,7 @@ "onClickOut": { "name": "image.setTexture", "id": "menu", "texture": "empty" }, "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Main Menu\nHotkey : Esc" }, @@ -426,6 +429,8 @@ "verticalAlign": "center" }, "keyboard": [ + { "key": "+", "action": "automapZoomIn" }, + { "key": "-", "action": "automapZoomOut" }, { "key": "1", "action": "useBelt1Item" }, { "key": "2", "action": "useBelt2Item" }, { "key": "3", "action": "useBelt3Item" }, @@ -439,11 +444,26 @@ { "key": "esc", "action": { "name": "button.click", "id": "menu" } }, { "key": "i", "action": { "name": "button.click", "id": "inv" } }, { "key": "q", "action": { "name": "button.click", "id": "quest" } }, + { "key": "z", "action": "zoomLevel" }, { "key": "tab", "action": { "name": "button.click", "id": "map" } }, + { + "key": "f", + "action": [ + { "name": "game.addToProperty", "property": "gamma", "value": 5 }, + "saveSettings" + ] + }, + { + "key": "g", + "action": [ + { "name": "game.addToProperty", "property": "gamma", "value": -5 }, + "saveSettings" + ] + }, { "key": "f1", "action": [ - { "name": "player.addGold", "gold": -4000 }, + { "name": "player.addItemQuantity", "itemClass": "gold", "value": -4000 }, "updateStashItems", "updateCharLabels" ] @@ -451,7 +471,7 @@ { "key": "f2", "action": [ - { "name": "player.addGold", "gold": 4000 }, + { "name": "player.addItemQuantity", "itemClass": "gold", "value": 4000 }, "updateStashItems", "updateCharLabels" ] @@ -497,6 +517,14 @@ { "name": "player.addToProperty", "property": "experience", "value": 2000 }, "updateAllPlayerStats" ] + }, + { + "key": "l", + "action": { "name": "levelObject.executeAction", "object": "down" } + }, + { + "key": "k", + "action": { "name": "levelObject.executeAction", "object": "up" } } ], "load": "ui/level/char/beltInventory.json" diff --git a/gamefilesd/ui/level/char/panelInventory.json b/gamefilesd/ui/level/char/panelInventory.json index babbf16a..33754b00 100755 --- a/gamefilesd/ui/level/char/panelInventory.json +++ b/gamefilesd/ui/level/char/panelInventory.json @@ -398,7 +398,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [56, 84], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [337, 77] @@ -408,7 +408,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [56, 84], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [569, 77] @@ -418,7 +418,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [56, 84], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [453, 77] @@ -428,7 +428,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [56, 84], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [453, -10] @@ -438,7 +438,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [56, 84], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [511, 5] @@ -448,7 +448,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [56, 84], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [354, 150] @@ -458,7 +458,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [56, 84], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [555, 150] diff --git a/gamefilesd/ui/level/char/panelLabels.json b/gamefilesd/ui/level/char/panelLabels.json index 4afecacb..6b1acdc1 100755 --- a/gamefilesd/ui/level/char/panelLabels.json +++ b/gamefilesd/ui/level/char/panelLabels.json @@ -48,7 +48,7 @@ "anchor": "left", "horizontalAlign": "center", "horizontalSpaceOffset": 1, - "binding": "|currentLevel|currentPlayer.gold|" + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%" }, { "id": "charStr", @@ -124,9 +124,7 @@ }, { "id": "charPoints", - "replaceVars": true, - "font": "smaltext", - "color": "%textRed%", + "font": "smaltextRed", "position": [111, 256], "anchor": "left", "horizontalAlign": "center", diff --git a/gamefilesd/ui/level/char/panelQuests.json b/gamefilesd/ui/level/char/panelQuests.json index f4ced182..2d2d5fc4 100755 --- a/gamefilesd/ui/level/char/panelQuests.json +++ b/gamefilesd/ui/level/char/panelQuests.json @@ -62,7 +62,8 @@ "onScrollDown": "focus.moveDown", "onScrollUp": "focus.moveUp", "items": { - "load": "currentLevel|quests", + "load": "currentLevel.quests", + "exclude": { "property": "state", "value": [-1, 0] }, "text": "%name%", "onClick": [ { @@ -72,7 +73,8 @@ "then": [ { "name": "game.clearPlayingSounds" }, { "name": "button.click", "id": "quest" }, - { "name": "load", "file": "texts/quests/%id%.json" } + { "name": "load", "file": "texts/quests/%id%.json" }, + { "name": "resource.moveToTop", "id": "removeGold" } ] }, { "name": "sound.play", "id": "titlslct" } diff --git a/gamefilesd/ui/level/char/panelSpells.json b/gamefilesd/ui/level/char/panelSpells.json new file mode 100755 index 00000000..ba2cc7e7 --- /dev/null +++ b/gamefilesd/ui/level/char/panelSpells.json @@ -0,0 +1,56 @@ +{ + "action": { "name": "resource.add", "id": "charPanelSpells" }, + "image": [ + { + "id": "spell1", + "anchor": "right", + "texture": "empty", + "position": [331, 18] + }, + { + "id": "spell2", + "anchor": "right", + "texture": "empty", + "position": [331, 61] + }, + { + "id": "spell3", + "anchor": "right", + "texture": "empty", + "position": [331, 104] + }, + { + "id": "spell4", + "anchor": "right", + "texture": "empty", + "position": [331, 147] + }, + { + "id": "spell5", + "anchor": "right", + "texture": "empty", + "position": [331, 190] + }, + { + "id": "spell6", + "anchor": "right", + "texture": "empty", + "position": [331, 233] + }, + { + "id": "spell7", + "anchor": "right", + "texture": "empty", + "position": [331, 276] + } + ], + "action": [ + { "name": "image.setTexture", "id": "spell1", "query": "currentLevel.currentPlayer.spell.itemRepair" }, + { "name": "image.setTexture", "id": "spell2", "query": "currentLevel.currentPlayer.spell.firebolt" }, + { "name": "image.setTexture", "id": "spell3", "query": "currentLevel.currentPlayer.spell.chargedBolt" }, + { "name": "image.setTexture", "id": "spell4", "query": "currentLevel.currentPlayer.spell.holyBolt" }, + { "name": "image.setTexture", "id": "spell5", "query": "currentLevel.currentPlayer.spell.healing" }, + { "name": "image.setTexture", "id": "spell6", "query": "currentLevel.currentPlayer.spell.healOther" }, + { "name": "image.setTexture", "id": "spell7", "query": "currentLevel.currentPlayer.spell.inferno" } + ] +} \ No newline at end of file diff --git a/gamefilesd/ui/level/char/removeGold.json b/gamefilesd/ui/level/char/removeGold.json new file mode 100755 index 00000000..c7e641b9 --- /dev/null +++ b/gamefilesd/ui/level/char/removeGold.json @@ -0,0 +1,108 @@ +{ + "action": [ + "closeRemoveGold", + { "name": "resource.add", "id": "removeGold" } + ], + "load": "ui/level/char/disableKeys.json", + "keyboard": [ + { + "key": "enter", + "action": { "name": "inputText.click", "id": "goldQuantity" } + }, + { + "key": "esc", + "action": "closeRemoveGold" + } + ], + "button": [ + { + "id": "disableInv", + "texture": "empty", + "anchor": "right", + "position": [320, 0], + "textureRect": [320, 350], + "captureInputEvents": ["LeftClick", "MousePress", "MouseRelease"], + "resizable": true + }, + { + "id": "disableBelt", + "texture": "empty", + "anchor": "bottom", + "position": [192, 355], + "textureRect": [258, 36], + "captureInputEvents": ["LeftClick", "MousePress", "MouseRelease"], + "resizable": true + } + ], + "image": { + "id": "golddrop", + "position": [351, 43], + "anchor": "right", + "texture": "golddrop", + "textureRect": [261, 136] + }, + "text": [ + { + "id": "goldInfo1", + "font": "smaltextGold", + "position": [483, 77], + "anchor": "right", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "You have {2} gold" + }, + { + "id": "goldInfo2", + "font": "smaltextGold", + "position": [483, 93], + "anchor": "right", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1 + }, + { + "id": "goldInfo3", + "font": "smaltextGold", + "position": [483, 111], + "anchor": "right", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "you want to remove?" + } + ], + "inputText": { + "id": "goldQuantity", + "font": "smaltext", + "position": [388, 130], + "anchor": "right", + "horizontalSpaceOffset": 1, + "minLength": 1, + "maxLength": 4, + "maxValue": {2}, + "regex": "[1-9]\\d*", + "onClick": [ + { "name": "load", "file": ["ui/level/char/addGold.json", "{1}", "%goldQuantity.text%"] }, + "closeRemoveGold" + ], + "onChange": { + "name": "drawable.anchor", + "anchor": "right", + "offset": [1, 0], + "id": "caret", + "idAnchor": "goldQuantity" + } + }, + "animation": { + "id": "caret", + "texturePack": "pentspn2", + "position": [380, 130], + "anchor": "right", + "refresh": 50 + }, + "action": { + "name": "if.equal", + "param1": "{2}", + "param2": "1", + "then": { "name": "text.setText", "id": "goldInfo2", "text": "piece. How many do" }, + "else": { "name": "text.setText", "id": "goldInfo2", "text": "pieces. How many do" } + } +} \ No newline at end of file diff --git a/gamefilesd/ui/level/char/updateVisiblePanels.json b/gamefilesd/ui/level/char/updateVisiblePanels.json index b99b41ee..3b5c1d18 100755 --- a/gamefilesd/ui/level/char/updateVisiblePanels.json +++ b/gamefilesd/ui/level/char/updateVisiblePanels.json @@ -3,25 +3,25 @@ "updateBeltItems", { "name": "if.equal", - "param1": "|charPanel|visible|", + "param1": "%charPanel.visible%", "param2": true, "then": { "name": "load", "file": "ui/level/char/panelLabels.json" } }, { "name": "if.equal", - "param1": "|invPanel|visible|", + "param1": "%invPanel.visible%", "param2": true, "then": { "name": "load", "file": "ui/level/char/panelInventory.json" } }, { "name": "if.equal", - "param1": "|questPanel|visible|", + "param1": "%questPanel.visible%", "param2": true, "then": { "name": "load", "file": "ui/level/char/panelQuests.json" } }, { "name": "if.equal", - "param1": "|spellPanel|visible|", + "param1": "%spellPanel.visible%", "param2": true, "then": { "name": "load", "file": "ui/level/char/panelSpells.json" } } diff --git a/gamefilesd/ui/level/gameSettings.json b/gamefilesd/ui/level/gameSettings.json index e1583638..9b83eb59 100755 --- a/gamefilesd/ui/level/gameSettings.json +++ b/gamefilesd/ui/level/gameSettings.json @@ -2,6 +2,7 @@ "action": [ { "name": "game.setMusicVolume", "volume": {1} }, { "name": "game.setSoundVolume", "volume": {2} }, - { "name": "variable.set", "key": "colorCycling", "val": {3} } + { "name": "game.setGamma", "gamma": {3} }, + { "name": "variable.set", "key": "colorCycling", "value": {4} } ] } \ No newline at end of file diff --git a/gamefilesd/ui/level/menu/common.json b/gamefilesd/ui/level/menu/common.json index 315d53f6..7a6703c7 100755 --- a/gamefilesd/ui/level/menu/common.json +++ b/gamefilesd/ui/level/menu/common.json @@ -50,7 +50,7 @@ }, "image": { "id": "diabsmal", - "texture":"diabsmal", + "texture": "diabsmal", "position": [172, 3], "anchor": "none" }, diff --git a/gamefilesd/ui/level/menu/game.json b/gamefilesd/ui/level/menu/game.json index 7c9efa24..c05d9758 100755 --- a/gamefilesd/ui/level/menu/game.json +++ b/gamefilesd/ui/level/menu/game.json @@ -18,7 +18,7 @@ "onClick": [ "menu.saveAndCloseAction", { "name": "load", "file": ["ui/level/msgBox/show.json", "saving..."] }, - { "name": "load", "file": ["ui/singlePlayer/save.json", "|currentLevel|currentPlayer.name|"] }, + { "name": "load", "file": "level/saveGame.json" }, { "name": "loadJson", "json": { "action": "closeMsgBox" } } ], "onFocus": [ @@ -76,7 +76,7 @@ "horizontalSpaceOffset": 2, "onClick": [ "menu.saveAndCloseAction", - { "name": "load", "file": ["level/load2.json", "|currentLevel|path|"] } + { "name": "load", "file": "level/loadCurrentSave.json" } ], "onFocus": [ "anchorLeftPentagram", diff --git a/gamefilesd/ui/level/menu/game2.json b/gamefilesd/ui/level/menu/game2.json index 5493ad4e..08415f33 100755 --- a/gamefilesd/ui/level/menu/game2.json +++ b/gamefilesd/ui/level/menu/game2.json @@ -1,16 +1,16 @@ { "action": [ { "name": "resource.add", "id": "gameMenu2" }, - { "name": "variable.setIfNull", "key": "colorCycling", "val": false }, + { "name": "variable.setIfNull", "key": "colorCycling", "value": false }, { "name": "action.set", "id": "updateAudioProgressBar", "action": [ { "name": "drawable.resizeToPositionX", "id": "progressBar1", "idToPosition": "option1", "offset": 14 }, - { "name": "game.setProperty", "property": "musicVolume", "value": "|progressBar1|size.x|", "propRange": [0, 100], "valueRange": [14, 270] }, + { "name": "game.setProperty", "property": "musicVolume", "value": "%progressBar1.size.x%", "propRange": [0, 100], "valueRange": [14, 270] }, { "name": "if.equal", - "param1": "|game|musicVolume|", + "param1": "%game.musicVolume%", "param2": 0, "then": { "name": "audio.stop", "id": "main" }, "else": { "name": "audio.play", "id": "main" } @@ -22,13 +22,16 @@ "id": "updateSoundProgressBar", "action": [ { "name": "drawable.resizeToPositionX", "id": "progressBar2", "idToPosition": "option2", "offset": 14 }, - { "name": "game.setProperty", "property": "soundVolume", "value": "|progressBar2|size.x|", "propRange": [0, 100], "valueRange": [14, 270] } + { "name": "game.setProperty", "property": "soundVolume", "value": "%progressBar2.size.x%", "propRange": [0, 100], "valueRange": [14, 270] } ] }, { "name": "action.set", "id": "updateGammaProgressBar", - "action": { "name": "drawable.resizeToPositionX", "id": "progressBar3", "idToPosition": "option3", "offset": 14 } + "action": [ + { "name": "drawable.resizeToPositionX", "id": "progressBar3", "idToPosition": "option3", "offset": 14 }, + { "name": "game.setProperty", "property": "gamma", "value": "%progressBar3.size.x%", "propRange": [30, 100], "valueRange": [14, 270] } + ] }, { "name": "action.set", @@ -108,7 +111,7 @@ }, { "id": "option", - "file":"data/option.cel", + "file": "data/option.cel", "palette": "town" } ], @@ -140,37 +143,37 @@ "id": "optbar1", "position": [261, 119], "anchor": "none", - "texture":"optbar" + "texture": "optbar" }, { "id": "option1", "position": [263, 121], "anchor": "none", - "texture":"option" + "texture": "option" }, { "id": "optbar2", "position": [261, 164], "anchor": "none", - "texture":"optbar" + "texture": "optbar" }, { "id": "option2", "position": [263, 166], "anchor": "none", - "texture":"option" + "texture": "option" }, { "id": "optbar3", "position": [261, 209], "anchor": "none", - "texture":"optbar" + "texture": "optbar" }, { "id": "option3", "position": [263, 211], "anchor": "none", - "texture":"option" + "texture": "option" } ], "button": [ @@ -321,8 +324,8 @@ "name": "if.equal", "param1": "%colorCycling%", "param2": false, - "then": { "name": "variable.set", "key": "colorCycling", "val": true }, - "else": { "name": "variable.set", "key": "colorCycling", "val": false } + "then": { "name": "variable.set", "key": "colorCycling", "value": true }, + "else": { "name": "variable.set", "key": "colorCycling", "value": false } }, { "name": "load", "file": "res/level/actions/colorCycling.json" }, "updateColorCyclingLabel", @@ -347,7 +350,7 @@ "horizontalSpaceOffset": 2, "onClick": [ { "name": "resource.pop" }, - { "name": "load", "file": "ui/level/saveSettings.json" }, + "saveSettings", { "name": "load", "file": "ui/level/menu/game.json" } ], "onFocus": [ @@ -360,9 +363,11 @@ "anchorLeftPentagram", "updateColorCyclingLabel", { "name": "drawable.anchor", "id": "pent2", "idAnchor": "optbar1", "anchor": "right" }, - { "name": "drawable.moveX", "id": "option1", "idAnchorTo": "progressBar1", "range": 283, "position": "|game|musicVolume|", "max": 100, "steps": 17 }, - { "name": "drawable.moveX", "id": "option2", "idAnchorTo": "progressBar2", "range": 283, "position": "|game|soundVolume|", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option1", "idAnchorTo": "progressBar1", "range": 283, "position": "%game.musicVolume%", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option2", "idAnchorTo": "progressBar2", "range": 283, "position": "%game.soundVolume%", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option3", "idAnchorTo": "progressBar3", "range": 283, "position": "%game.gamma%", "min": 30, "max": 100, "steps": 15 }, { "name": "drawable.anchorSizeX", "id": "progressBar1", "idAnchorTo": "option1", "offset": 14 }, - { "name": "drawable.anchorSizeX", "id": "progressBar2", "idAnchorTo": "option2", "offset": 14 } + { "name": "drawable.anchorSizeX", "id": "progressBar2", "idAnchorTo": "option2", "offset": 14 }, + { "name": "drawable.anchorSizeX", "id": "progressBar3", "idAnchorTo": "option3", "offset": 14 } ] } \ No newline at end of file diff --git a/gamefilesd/ui/level/msgBox/show.json b/gamefilesd/ui/level/msgBox/show.json index c72c90b6..fb91b7fd 100755 --- a/gamefilesd/ui/level/msgBox/show.json +++ b/gamefilesd/ui/level/msgBox/show.json @@ -1,7 +1,7 @@ { "action": { "name": "if.equal", - "param1": "|game|hasResource.msgBox|", + "param1": "%game.hasResource.msgBox%", "param2": true, "then": [ { "name": "event.resetTime", "id": "closeMsgBox" }, diff --git a/gamefilesd/ui/level/msgBox/show2.json b/gamefilesd/ui/level/msgBox/show2.json index 15960e3a..bd78e75f 100755 --- a/gamefilesd/ui/level/msgBox/show2.json +++ b/gamefilesd/ui/level/msgBox/show2.json @@ -39,9 +39,7 @@ ], "text": { "id": "textMsg", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [322, 172], "anchor": "none", "horizontalAlign": "center", diff --git a/gamefilesd/ui/level/newGame.json b/gamefilesd/ui/level/newGame.json index f072147b..c89675ab 100755 --- a/gamefilesd/ui/level/newGame.json +++ b/gamefilesd/ui/level/newGame.json @@ -4,6 +4,7 @@ { "name": "event.delete", "id": "colorCycle" }, { "name": "game.setProperty", "property": "musicVolume", "value": 100 }, { "name": "game.setProperty", "property": "soundVolume", "value": 100 }, + { "name": "game.setProperty", "property": "gamma", "value": 30 }, { "name": "load", "file": "ui/mainMenu.json" }, { "name": "load", "file": "ui/singlePlayer/main.json" } ] diff --git a/gamefilesd/ui/level/noMap.json b/gamefilesd/ui/level/noMap.json index 66a7d5f8..18f5b083 100755 --- a/gamefilesd/ui/level/noMap.json +++ b/gamefilesd/ui/level/noMap.json @@ -1,3 +1,3 @@ { - "load": ["ui/level/msgBox/show.json", "No automap available in town"] + "load": ["ui/level/msgBox/show.json", "No automap available in {1}{2}"] } \ No newline at end of file diff --git a/gamefilesd/ui/level/panel/big/scrollbar.json b/gamefilesd/ui/level/panel/big/scrollbar.json index 7f257efa..1e541d4f 100755 --- a/gamefilesd/ui/level/panel/big/scrollbar.json +++ b/gamefilesd/ui/level/panel/big/scrollbar.json @@ -55,7 +55,7 @@ "id": "sb_thumb", "idAnchorTo": "btnDrag", "range": 180, - "steps": "|mainMenu|itemCount|" + "steps": "%mainMenu.itemCount%" }, { "name": "menu.moveScrollbar", diff --git a/gamefilesd/ui/level/saveSettings.json b/gamefilesd/ui/level/saveSettings.json index 016d234f..c2fc9fbc 100755 --- a/gamefilesd/ui/level/saveSettings.json +++ b/gamefilesd/ui/level/saveSettings.json @@ -2,8 +2,9 @@ "action": { "name": "file.copy", "file": ["ui/level/gameSettings.json", - "|game|musicVolume|", - "|game|soundVolume|", + "%game.musicVolume%", + "%game.soundVolume%", + "%game.gamma%", "%colorCycling%"], "writeFile": "gameSettings.json" } diff --git a/gamefilesd/ui/level/showText.json b/gamefilesd/ui/level/showText.json index c0089162..ddfb1809 100755 --- a/gamefilesd/ui/level/showText.json +++ b/gamefilesd/ui/level/showText.json @@ -42,7 +42,6 @@ "file": "{3}", "horizontalSpaceOffset": 2, "verticalSpaceOffset": 17, - "splitText": 40, "position": [48, 49], "size": [550, 257], "anchor": "none", diff --git a/gamefilesd/ui/level/viewMap.json b/gamefilesd/ui/level/viewMap.json new file mode 100755 index 00000000..1b235d8f --- /dev/null +++ b/gamefilesd/ui/level/viewMap.json @@ -0,0 +1,60 @@ +{ + "action": [ + { "name": "resource.add", "id": "viewMap" }, + { + "name": "if.equal", + "param1": "%game.hasTexture.{1}%", + "param2": false, + "then": { + "name": "loadJson", + "json": { + "texture": { + "id": "{1}", + "resource": "currentLevel", + "file": "{2}", + "palette": "town" + } + } + } + } + ], + "keyboard": { + "key": "any", + "action": { "name": "button.click", "id": "viewMapButton" } + }, + "image": { + "id": "mapImage", + "texture": "{1}", + "anchor": "none" + }, + "button": [ + { + "id": "viewMapButtonLevel", + "anchor": "all", + "textureRect": [640, 352], + "texture": "empty", + "captureInputEvents": true, + "resizable": true, + "onHoverEnter": "clearPanelText", + "onHoverLeave": "clearPanelText" + }, + { + "id": "viewMapButton", + "anchor": "all", + "textureRect": [640, 480], + "texture": "empty", + "captureInputEvents": ["LeftClick", "MousePress", "MouseRelease"], + "resizable": true, + "onHoverEnter": [ + "clearLevelHoverActions", + "clearPanelText" + ], + "onHoverLeave": [ + "setLevelHoverActions", + "clearPanelText" + ], + "onClick": { "name": "resource.pop", "id": "viewMap" }, + "onRightClick": { "name": "resource.pop", "id": "viewMap" } + } + ] +} \ No newline at end of file diff --git a/gamefilesd/ui/loadMain.json b/gamefilesd/ui/loadMain.json index dcad23e1..0fedfaf2 100755 --- a/gamefilesd/ui/loadMain.json +++ b/gamefilesd/ui/loadMain.json @@ -1,6 +1,6 @@ { "icon": { - "file":"res/icon.png" + "file": "res/icon.png" }, "cursor": { "show": false @@ -9,8 +9,9 @@ "name": "if.equal", "param1": { "name": "file.exists", "file": "ui_art/cursor.pcx" }, "param2": true, - "else": { "name": "variable.set", "key": "beta", "val": true } + "else": { "name": "variable.set", "key": "beta", "value": true } }, + "load": "level/setupTempFolder.json", "load": "res/actions.json", "load": "res/fonts.json", "load": "res/music.json", diff --git a/gamefilesd/ui/mainMenu.json b/gamefilesd/ui/mainMenu.json index 970140b4..c3393bab 100755 --- a/gamefilesd/ui/mainMenu.json +++ b/gamefilesd/ui/mainMenu.json @@ -168,16 +168,16 @@ "onHoverLeave": { "name": "text.setText", "id": "versionInfo", - "binding": ["|game|title|", "|game|version|"], + "binding": ["%game.title%", "%game.version%"], "format": "[1] v[2]" } }, "action": [ - { "name": "menu.setFont", "id": "menu", "index": 1, "idFont": "font42y" }, + { "name": "menu.setFont", "id": "menu", "index": 1, "font": "font42y" }, { "name": "text.setText", "id": "versionInfo", - "binding": ["|game|title|", "|game|version|"], + "binding": ["%game.title%", "%game.version%"], "format": "[1] v[2]" } ] diff --git a/gamefilesd/ui/saveSettings.json b/gamefilesd/ui/saveSettings.json index c87b5bc8..1ce26dba 100755 --- a/gamefilesd/ui/saveSettings.json +++ b/gamefilesd/ui/saveSettings.json @@ -3,12 +3,12 @@ "name": "file.copy", "file": [ "ui/settingsFile.json", - "|game|size.x|", - "|game|size.y|", - "|game|keepAR|", - "|game|stretchToFit|", - "|game|smoothScreen|", - "|game|framerate|", + "%game.size.x%", + "%game.size.y%", + "%game.keepAR%", + "%game.stretchToFit%", + "%game.smoothScreen%", + "%game.framerate%", "%skipIntro%" ], "nullText": "null", diff --git a/gamefilesd/ui/settings.json b/gamefilesd/ui/settings.json index 3e3a3993..dc276afd 100755 --- a/gamefilesd/ui/settings.json +++ b/gamefilesd/ui/settings.json @@ -55,14 +55,14 @@ "sound": "titlemov", "focus": true, "focusSound": "titlemov", - "binding": ["|game|size.x|", "|game|size.y|"], + "binding": ["%game.size.x%", "%game.size.y%"], "format": "[1]x[2]", "position": [319, 192], "anchor": "none", "horizontalAlign": "center", "onClick": { "name": "switch", - "param": "|windowSize|text|", + "param": "%windowSize.text%", "case": [ { "value": "640x480", @@ -88,7 +88,7 @@ "horizontalAlign": "center", "onClick": { "name": "if.equal", - "param1": "|game|stretchToFit|", + "param1": "%game.stretchToFit%", "param2": false, "then": [ { "name": "loadJson", "json": { "stretchToFit": true } }, @@ -112,7 +112,7 @@ "horizontalAlign": "center", "onClick": { "name": "if.equal", - "param1": "|game|keepAR|", + "param1": "%game.keepAR%", "param2": false, "then": [ { "name": "loadJson", "json": { "keepAR": true } }, @@ -136,7 +136,7 @@ "horizontalAlign": "center", "onClick": { "name": "if.equal", - "param1": "|game|smoothScreen|", + "param1": "%game.smoothScreen%", "param2": false, "then": [ { "name": "loadJson", "json": { "smoothScreen": true } }, @@ -160,28 +160,28 @@ "horizontalAlign": "center", "onClick": { "name": "switch", - "param": "|game|framerate|", + "param": "%game.framerate%", "case": [ { "value": 0, "action": [ - { "name": "loadJson", "json": { "framerate": 50 } }, + { "name": "loadJson", "json": { "framerate": 30 } }, { "name": "text.setText", "id": "framerate", - "binding": "|game|framerate|", + "binding": "%game.framerate%", "format": "Framerate Limit: [1]" } ] }, { - "value": 50, + "value": 30, "action": [ { "name": "loadJson", "json": { "framerate": 60 } }, { "name": "text.setText", "id": "framerate", - "binding": "|game|framerate|", + "binding": "%game.framerate%", "format": "Framerate Limit: [1]" } ] @@ -226,31 +226,31 @@ "action": [ { "name": "if.equal", - "param1": "|game|stretchToFit|", + "param1": "%game.stretchToFit%", "param2": true, "then": { "name": "text.setText", "id": "stretchToFit", "text": "Stretch to Fit: On" }, "else": { "name": "text.setText", "id": "stretchToFit", "text": "Stretch to Fit: Off" } }, { "name": "if.equal", - "param1": "|game|keepAR|", + "param1": "%game.keepAR%", "param2": true, "then": { "name": "text.setText", "id": "keepAR", "text": "Keep Ratio: On" }, "else": { "name": "text.setText", "id": "keepAR", "text": "Keep Ratio: Off" } }, { "name": "if.equal", - "param1": "|game|smoothScreen|", + "param1": "%game.smoothScreen%", "param2": true, "then": { "name": "text.setText", "id": "smoothScreen", "text": "Smooth Screen: On" }, "else": { "name": "text.setText", "id": "smoothScreen", "text": "Smooth Screen: Off" } }, { "name": "if.equal", - "param1": "|game|framerate|", + "param1": "%game.framerate%", "param2": 0, "then": { "name": "text.setText", "id": "framerate", "text": "Framerate Limit: Off" }, - "else": { "name": "text.setText", "id": "framerate", "binding": "|game|framerate|", "format": "Framerate Limit: [1]" } + "else": { "name": "text.setText", "id": "framerate", "binding": "%game.framerate%", "format": "Framerate Limit: [1]" } }, "anchorPentagrams" ] diff --git a/gamefilesd/ui/singlePlayer/newHero.json b/gamefilesd/ui/singlePlayer/newHero.json index 877e8f5e..93f46f85 100755 --- a/gamefilesd/ui/singlePlayer/newHero.json +++ b/gamefilesd/ui/singlePlayer/newHero.json @@ -8,7 +8,7 @@ { "name": "text.setText", "id": "txtMagic", "text": "10" }, { "name": "text.setText", "id": "txtDexterity", "text": "20" }, { "name": "text.setText", "id": "txtVitality", "text": "25" }, - { "name": "variable.set", "key": "charClass", "val": "Warrior" } + { "name": "variable.set", "key": "charClass", "value": "Warrior" } ], "animation": [ { @@ -35,7 +35,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Warrior" }, + { "name": "variable.set", "key": "charClass", "value": "Warrior" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "30" }, @@ -57,7 +57,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Rogue" }, + { "name": "variable.set", "key": "charClass", "value": "Rogue" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "20" }, @@ -79,7 +79,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Sorceror" }, + { "name": "variable.set", "key": "charClass", "value": "Sorceror" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "15" }, diff --git a/gamefilesd/ui/singlePlayer/newName.json b/gamefilesd/ui/singlePlayer/newName.json index d081da14..b36b689e 100755 --- a/gamefilesd/ui/singlePlayer/newName.json +++ b/gamefilesd/ui/singlePlayer/newName.json @@ -13,17 +13,17 @@ "font": "font24g", "position": [308, 318], "anchor": "none", - "minSize": 1, - "maxSize": 15, + "minLength": 1, + "maxLength": 15, "regex": "[\\w ]*", "onClick": { "name": "if.equal", - "param1": { "name": "file.exists", "file": "|heroName|text|" }, + "param1": { "name": "file.exists", "file": "%heroName.text%" }, "param2": true, - "then": { "name": "load", "file": ["ui/singlePlayer/newNameExists.json", "|heroName|text|"] }, + "then": { "name": "load", "file": ["ui/singlePlayer/newNameExists.json", "%heroName.text%"] }, "else": { "name": "load", "file": "level/newGame.json" } }, - "onMinSize": [ + "onMinLength": [ { "name": "resource.pop" }, { "name": "load", "file": "ui/singlePlayer/newNameTooShort.json" } ], diff --git a/gamefilesd/ui/singlePlayer/save.json b/gamefilesd/ui/singlePlayer/save.json deleted file mode 100755 index bd1955e5..00000000 --- a/gamefilesd/ui/singlePlayer/save.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "action": { - "name": "level.save", - "file": "{1}/save.json", - "skipDefaults": true, - "skipCurrentPlayer": false - } -} \ No newline at end of file diff --git a/gamefilesd/ui/singlePlayer/select.json b/gamefilesd/ui/singlePlayer/select.json index d3f8077e..b79a8d99 100755 --- a/gamefilesd/ui/singlePlayer/select.json +++ b/gamefilesd/ui/singlePlayer/select.json @@ -83,14 +83,14 @@ "onScrollUp": "focus.moveUp", "items": [ { - "load": "game|saves", + "load": "game.saves", "text": "%save%", "onClick": [ - { "name": "load", "file": ["ui/loadCharInfo.json", "|focus|text|"] }, + { "name": "load", "file": ["ui/loadCharInfo.json", "%focus.text%"] }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, "anchorPentagrams", { "name": "button.enable", "id": "delete" }, - { "name": "text.setFont", "id": "delete", "idFont": "font30g" }, + { "name": "text.setFont", "id": "delete", "font": "font30g" }, "saveMenu.moveScrollbar" ], "onDoubleClick": { "name": "button.click", "id": "ok" }, @@ -103,7 +103,7 @@ { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, "anchorPentagrams", { "name": "button.enable", "id": "delete", "enable": false }, - { "name": "text.setFont", "id": "delete", "idFont": "font30s" }, + { "name": "text.setFont", "id": "delete", "font": "font30s" }, "saveMenu.moveScrollbar" ], "onDoubleClick": { "name": "button.click", "id": "ok" }, @@ -119,13 +119,13 @@ "anchor": "none", "onClick": { "name": "if.equal", - "param1": "|focus|text|", + "param1": "%focus.text%", "param2": "New Hero", "then": [ { "name": "resource.pop" }, { "name": "load", "file": "ui/singlePlayer/new.json" } ], - "else": { "name": "load", "file": ["level/loadGame.json", "|focus|text|"] } + "else": { "name": "load", "file": ["level/loadGame.json", "%focus.text%"] } }, "sound": "titlslct", "text": "OK" @@ -136,7 +136,7 @@ "position": [378, 429], "anchor": "none", "onClick": [ - { "name": "load", "file": ["ui/singlePlayer/delete.json", "|focus|text|"] } + { "name": "load", "file": ["ui/singlePlayer/delete.json", "%focus.text%"] } ], "sound": "titlslct", "text": "Delete" @@ -183,7 +183,7 @@ "id": "sb_thumb", "idAnchorTo": "btnDrag", "range": 133, - "steps": "|menuLoadGame|itemCount|" + "steps": "%menuLoadGame.itemCount%" }, { "name": "menu.moveScrollbar", @@ -216,7 +216,7 @@ "focus.clickNoSound", { "name": "if.greater", - "param1": "|menuLoadGame|itemCount|", + "param1": "%menuLoadGame.itemCount%", "param2": 6, "then": [ { "name": "drawable.visible", "id": "sb_bg", "visible": true }, diff --git a/gamefilesd/ui/splashScreen2.json b/gamefilesd/ui/splashScreen2.json index dd9ab770..0e670ec8 100755 --- a/gamefilesd/ui/splashScreen2.json +++ b/gamefilesd/ui/splashScreen2.json @@ -10,7 +10,7 @@ "texture": [ { "id": "title", - "file":"ui_art/title.pcx" + "file": "ui_art/title.pcx" }, { "id": "logo", diff --git a/gamefilesflare/level/automap/automap.json b/gamefilesflare/level/automap/automap.json new file mode 100755 index 00000000..0e71dfb0 --- /dev/null +++ b/gamefilesflare/level/automap/automap.json @@ -0,0 +1,23 @@ +{ + "texturePack": { + "id": "automap", + "texture": "automap", + "rects": [ + { "rect": [0, 0, 1, 1], "offset": [0, 0] }, + { "rect": [0, 115, 1, 1], "offset": [0, 0] }, + { "rect": [280, 268, 3, 3], "offset": [-1, -1] } + ], + "textureIndexes": [ + [1, 1], + [2, 0], + [1024, 2], + [1025, 2], + [1026, 2], + [1027, 2], + [1028, 2], + [1029, 2], + [1030, 2], + [1031, 2] + ] + } +} \ No newline at end of file diff --git a/gamefilesflare/level/automap/load.json b/gamefilesflare/level/automap/load.json new file mode 100755 index 00000000..2a499158 --- /dev/null +++ b/gamefilesflare/level/automap/load.json @@ -0,0 +1,3 @@ +{ + "action": { "name": "level.setAutomap", "automap": "automap", "tileSize": [2, 2] } +} \ No newline at end of file diff --git a/gamefilesflare/level/automap/loadAll.json b/gamefilesflare/level/automap/loadAll.json new file mode 100755 index 00000000..1d519f0f --- /dev/null +++ b/gamefilesflare/level/automap/loadAll.json @@ -0,0 +1,3 @@ +{ + "load": "level/automap/automap.json" +} \ No newline at end of file diff --git a/gamefilesflare/level/item/potions.json b/gamefilesflare/level/item/potions.json new file mode 100755 index 00000000..5d27b2e2 --- /dev/null +++ b/gamefilesflare/level/item/potions.json @@ -0,0 +1,133 @@ +{ + "itemClass": [ + { + "id": "potionOfHealing", + "fromId": "baseItem", + "dropTexturePack": "fbttle", + "inventoryTexturePack": "itemIcons", + "inventoryTextureIndex": 43, + "name": "Potion of Healing", + "shortName": "Potion", + "type": "Potion", + "defaults": { + "price": 50, + "quantity": 1, + "capacity": 50, + "useOn": "lifeDamage", + "useOp": "-" + }, + "formulas": { + "sell": "price * quantity * 0.25", + "value": "$bonusLife * $life * 0.125", + "valueMax": "$bonusLife * 3 * $life * 0.125" + }, + "descriptions": [ + { "index": 0, "name": "potionOfHealing" }, + { "index": 1, "name": "rightClickToUse" } + ], + "actions": { + "levelDrop": { "name": "sound.play", "id": "flippot" }, + "inventoryDrop": { "name": "sound.play", "id": "invpot" }, + "use": "inventoryDrop" + } + }, + { + "id": "potionOfMana", + "fromId": "potionOfHealing", + "inventoryTextureIndex": 50, + "name": "Potion of Mana", + "defaults": { + "price": 50, + "useOn": "manaDamage", + "useOp": "-" + }, + "formulas": { + "value": "$bonusMana * $mana * 0.125", + "valueMax": "$bonusMana * 3 * $mana * 0.125" + }, + "descriptions": { "index": 0, "name": "potionOfMana" } + }, + { + "id": "potionOfFullHealing", + "fromId": "potionOfHealing", + "dropTexturePack": "fbttlebr", + "inventoryTextureIndex": 46, + "name": "Potion of Full Healing", + "defaults": { + "price": 150, + "useOn": "lifeDamage", + "useOp": "=" + }, + "formulas": { + "value": 0, + "valueMax": null + }, + "descriptions": { "index": 0, "name": "potionOfFullHealing" } + }, + { + "id": "potionOfFullMana", + "fromId": "potionOfFullHealing", + "dropTexturePack": "fbttlebb", + "inventoryTextureIndex": 11, + "name": "Potion of Full Mana", + "defaults": { + "price": 150, + "useOn": "manaDamage", + "useOp": "=" + }, + "descriptions": { "index": 0, "name": "potionOfFullMana" } + }, + { + "id": "potionOfRejuvenation", + "fromId": "potionOfHealing", + "dropTexturePack": "fbttleby", + "inventoryTextureIndex": 48, + "name": "Potion of Rejuvenation", + "defaults": { + "price": 120, + "useOn": "lifeAndManaDamage" + }, + "formulas": { + "value": "$bonusLife * $life * 0.125", + "valueMax": "$bonusLife * 3 * $life * 0.125", + "value2": "$bonusMana * $mana * 0.125", + "value2Max": "$bonusMana * 3 * $mana * 0.125" + }, + "descriptions": { "index": 0, "name": "potionOfRejuvenation" } + }, + { + "id": "potionOfFullRejuvenation", + "fromId": "potionOfRejuvenation", + "inventoryTextureIndex": 44, + "name": "Potion of Full Rejuvenation", + "defaults": { + "price": 600, + "useOn": "lifeAndManaDamage" + }, + "formulas": { + "value2": 0 + }, + "descriptions": { "index": 0, "name": "potionOfFullRejuvenation" } + }, + { + "id": "spectralElixir", + "fromId": "potionOfFullHealing", + "dropTexturePack": "fbttledy", + "inventoryTextureIndex": 26, + "name": "Spectral Elixir", + "defaults": { + "price": 10000, + "useOn": "allAttributes", + "useOp": "+" + }, + "formulas": { + "value": 3 + }, + "descriptions": [ + { "index": 0, "name": "" }, + { "index": 1, "name": "" }, + { "index": 3, "name": "" } + ] + } + ] +} \ No newline at end of file diff --git a/gamefilesflare/level/l1/level.json b/gamefilesflare/level/l1/level.json index cfec94af..701d61e8 100755 --- a/gamefilesflare/level/l1/level.json +++ b/gamefilesflare/level/l1/level.json @@ -1,6 +1,6 @@ { "texturePack": { - "id": "levelBack", + "id": "l1Layer1", "texture": [ { "file": "images/tilesets/tileset_cave.png", @@ -71,16 +71,12 @@ }, "level": { "id": "level", - "path": "l1", - "name": "Dungeon", - "texturePackBottom": "levelBack", - "texturePackTop": "levelBack", - "map": { - "file": "level/l1/mineshaft_longsword.json", - "back": "background", - "front": "object", - "sol": "collision" - } + "layers": [ + { "index": 0, "texturePack": "l1Layer1" }, + { "index": 1, "texturePack": "l1Layer1" } + ] }, - "load": "level/l1/levelObjects.json" + "load": "level/automap/load.json", + "load": "level/l1/levelObjects.json", + "load": "level/l1/level2.json" } \ No newline at end of file diff --git a/gamefilesflare/level/l1/level2.json b/gamefilesflare/level/l1/level2.json new file mode 100755 index 00000000..92317b46 --- /dev/null +++ b/gamefilesflare/level/l1/level2.json @@ -0,0 +1,17 @@ +{ + "level": { + "id": "level", + "path": "l1", + "name": "Dungeon", + "map": { + "file": "level/l1/mineshaft_longsword.json", + "layers": [ + { "index": 0, "name": "background" }, + { "index": 1, "name": "object" } + ], + "automap": "collision", + "sol": "collision" + } + }, + "load": "level/l1/levelObjects2.json" +} \ No newline at end of file diff --git a/gamefilesflare/level/l1/levelObjects.json b/gamefilesflare/level/l1/levelObjects.json deleted file mode 100755 index b9f312a3..00000000 --- a/gamefilesflare/level/l1/levelObjects.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "levelObject": { - "id": "town", - "name": "Up to town", - "mapPosition": [43, 63], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/town/load.json", "positionPlayer", "[20, 12]"] } - } -} \ No newline at end of file diff --git a/gamefilesflare/level/l1/levelObjects2.json b/gamefilesflare/level/l1/levelObjects2.json new file mode 100755 index 00000000..4a47a310 --- /dev/null +++ b/gamefilesflare/level/l1/levelObjects2.json @@ -0,0 +1,11 @@ +{ + "levelObject": { + "id": "town", + "class": "levelTown", + "mapPosition": [43, 63], + "properties": { + "x": 20, + "y": 12 + } + } +} \ No newline at end of file diff --git a/gamefilesflare/level/loadBaseLevel.json b/gamefilesflare/level/loadBaseLevel.json new file mode 100755 index 00000000..814f0b21 --- /dev/null +++ b/gamefilesflare/level/loadBaseLevel.json @@ -0,0 +1,72 @@ +{ + "level": { + "id": "level", + "anchor": "all", + "size": [640, 352], + "automapBackground": "0x00000044", + "automapPosition": [80, 0], + "automapSize": [20, 25], + "automapPlayerDirectionIndex": 1024, + "playerClassClearIndex": 1, + "playerClearIndex": 1, + "onHoverEnter": "levelHoverAction", + "onHoverLeave": "clearPanelText", + "onLeftClick": "levelLeftClickAction", + "onRightClick": "levelRightClickAction", + "onScrollDown": "levelScrollDownAction", + "onScrollUp": "levelScrollUpAction", + "experiencePoints": [ + 2000, + 4620, + 8040, + 12489, + 18258, + 25712, + 35309, + 47622, + 63364, + 83419, + 108879, + 141086, + 181683, + 231075, + 313656, + 424067, + 571190, + 766569, + 1025154, + 1366227, + 1814568, + 2401895, + 3168651, + 4166200, + 5459523, + 7130496, + 9281874, + 12042092, + 15571031, + 20066900, + 25774405, + 32994399, + 42095202, + 53525811, + 67831218, + 85670061, + 107834823, + 135274799, + 169122009, + 210720231, + 261657253, + 323800420, + 399335440, + 490808349, + 601170414, + 733825617, + 892680222, + 1082908612, + 1310707109, + 1583495809 + ] + }, + "load": "ui/level/char/panel.json" +} \ No newline at end of file diff --git a/gamefilesflare/level/player/Rogue/class.json b/gamefilesflare/level/player/Rogue/class.json index ec98083d..dc96af82 100755 --- a/gamefilesflare/level/player/Rogue/class.json +++ b/gamefilesflare/level/player/Rogue/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Rogue", "type": "Human", - "description": "Rogue", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -46,14 +45,18 @@ ], "animationSpeeds": [ { "name": "Walk1", "animation": 8, "walk": 25 }, - { "name": "Walk2", "animation": 8, "walk": 25 } + { "name": "Walk2", "animation": 8, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefilesflare/level/player/Rogue/defaults.json b/gamefilesflare/level/player/Rogue/defaults.json index fed06f9e..126f28e5 100755 --- a/gamefilesflare/level/player/Rogue/defaults.json +++ b/gamefilesflare/level/player/Rogue/defaults.json @@ -23,16 +23,13 @@ "index": "Belt", "size": 8, "allowedClassTypes": ["Potion", "Scroll"], - "item": [ - { - "index": 0, - "class": "potionOfHealing" - }, - { - "index": 1, - "class": "potionOfHealing" + "item": { + "index": 0, + "class": "potionOfHealing", + "properties": { + "quantity": 2 } - ] + } }, { "index": "Stash", @@ -42,7 +39,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } } diff --git a/gamefilesflare/level/player/Sorceror/class.json b/gamefilesflare/level/player/Sorceror/class.json index d9b69698..b899aa45 100755 --- a/gamefilesflare/level/player/Sorceror/class.json +++ b/gamefilesflare/level/player/Sorceror/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Sorceror", "type": "Human", - "description": "Sorceror", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -46,14 +45,18 @@ ], "animationSpeeds": [ { "name": "Walk1", "animation": 8, "walk": 25 }, - { "name": "Walk2", "animation": 8, "walk": 25 } + { "name": "Walk2", "animation": 8, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefilesflare/level/player/Sorceror/defaults.json b/gamefilesflare/level/player/Sorceror/defaults.json index 2ed65195..e92bda26 100755 --- a/gamefilesflare/level/player/Sorceror/defaults.json +++ b/gamefilesflare/level/player/Sorceror/defaults.json @@ -23,16 +23,13 @@ "index": "Belt", "size": 8, "allowedClassTypes": ["Potion", "Scroll"], - "item": [ - { - "index": 0, - "class": "potionOfMana" - }, - { - "index": 1, - "class": "potionOfMana" + "item": { + "index": 0, + "class": "potionOfHealing", + "properties": { + "quantity": 2 } - ] + } }, { "index": "Stash", @@ -42,7 +39,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } } diff --git a/gamefilesflare/level/player/Warrior/cel.json b/gamefilesflare/level/player/Warrior/cel.json index 66dcd2ab..fa6c2421 100755 --- a/gamefilesflare/level/player/Warrior/cel.json +++ b/gamefilesflare/level/player/Warrior/cel.json @@ -40,7 +40,6 @@ { "index": 0, "rect": [1259, 69, 81, 55], "offset": [50, 46] }, { "index": 0, "rect": [795, 70, 79, 54], "offset": [49, 44] }, { "index": 0, "rect": [663, 71, 77, 53], "offset": [48, 44] }, - { "index": 0, "rect": [2420, 0, 47, 67], "offset": [18, 54] }, { "index": 0, "rect": [4456, 0, 50, 63], "offset": [22, 53] }, { "index": 0, "rect": [4300, 0, 53, 63], "offset": [25, 52] }, diff --git a/gamefilesflare/level/player/Warrior/class.json b/gamefilesflare/level/player/Warrior/class.json index 935c1a72..9e034773 100755 --- a/gamefilesflare/level/player/Warrior/class.json +++ b/gamefilesflare/level/player/Warrior/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Warrior", "type": "Human", - "description": "Warrior", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -46,14 +45,18 @@ ], "animationSpeeds": [ { "name": "Walk1", "animation": 8, "walk": 25 }, - { "name": "Walk2", "animation": 8, "walk": 25 } + { "name": "Walk2", "animation": 8, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefilesflare/level/player/Warrior/defaults.json b/gamefilesflare/level/player/Warrior/defaults.json index 7592679c..06e408ee 100755 --- a/gamefilesflare/level/player/Warrior/defaults.json +++ b/gamefilesflare/level/player/Warrior/defaults.json @@ -32,16 +32,13 @@ "index": "Belt", "size": 8, "allowedClassTypes": ["Potion", "Scroll"], - "item": [ - { - "index": 0, - "class": "potionOfHealing" - }, - { - "index": 1, - "class": "potionOfHealing" + "item": { + "index": 0, + "class": "potionOfHealing", + "properties": { + "quantity": 2 } - ] + } }, { "index": "Stash", @@ -55,7 +52,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } ] diff --git a/gamefilesflare/level/town/items.json b/gamefilesflare/level/town/items.json index 308f282a..c5647b0e 100755 --- a/gamefilesflare/level/town/items.json +++ b/gamefilesflare/level/town/items.json @@ -114,7 +114,7 @@ "class": "gold", "mapPosition": [46, 45], "properties": { - "gold": 4800 + "quantity": 4800 } } ] diff --git a/gamefilesflare/level/town/level.json b/gamefilesflare/level/town/level.json index 86a8cc9a..c630041d 100755 --- a/gamefilesflare/level/town/level.json +++ b/gamefilesflare/level/town/level.json @@ -1,6 +1,6 @@ { "texturePack": { - "id": "levelBack", + "id": "townLayer1", "texture": [ { "file": "images/tilesets/tileset_grassland.png", @@ -290,17 +290,12 @@ }, "level": { "id": "level", - "path": "town", - "name": "Town Center", - "texturePackBottom": "levelBack", - "texturePackTop": "levelBack", - "map": { - "file": "level/town/frontier_outpost.json", - "back": "background", - "front": "object", - "sol": "collision" - } + "layers": [ + { "index": 0, "texturePack": "townLayer1" }, + { "index": 1, "texturePack": "townLayer1" } + ] }, + "load": "level/automap/load.json", "load": "level/town/levelObjects.json", - "load": "level/town/items.json" + "load": "level/town/level2.json" } \ No newline at end of file diff --git a/gamefilesflare/level/town/level2.json b/gamefilesflare/level/town/level2.json new file mode 100755 index 00000000..e22103c0 --- /dev/null +++ b/gamefilesflare/level/town/level2.json @@ -0,0 +1,19 @@ +{ + "level": { + "id": "level", + "path": "town", + "name": "Town", + "map": { + "file": "level/town/frontier_outpost.json", + "layers": [ + { "index": 0, "name": "background" }, + { "index": 1, "name": "object" } + ], + "automap": "collision", + "sol": "collision" + } + }, + "load": ["level/player/%charClass%/defaults.json", "%charName%"], + "load": "level/town/levelObjects2.json", + "load": "level/town/items.json" +} \ No newline at end of file diff --git a/gamefilesflare/level/town/levelObjects.json b/gamefilesflare/level/town/levelObjects.json deleted file mode 100755 index 56247c23..00000000 --- a/gamefilesflare/level/town/levelObjects.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "levelObject": { - "id": "l1", - "name": "Down to dungeon", - "mapPosition": [19, 11], - "texture": "empty", - "textureRect": [32, 32], - "action": { "name": "load", "file": ["level/l1/load.json", "positionPlayer", "[43, 62]"] } - } -} \ No newline at end of file diff --git a/gamefilesflare/level/town/levelObjects2.json b/gamefilesflare/level/town/levelObjects2.json new file mode 100755 index 00000000..78441cc8 --- /dev/null +++ b/gamefilesflare/level/town/levelObjects2.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "down", + "class": "levelDown", + "mapPosition": [19, 11], + "properties": { + "x": 43, + "y": 62, + "level": 1 + } + } +} \ No newline at end of file diff --git a/gamefilesflare/main.json b/gamefilesflare/main.json index 60c6b919..fb29aeb0 100755 --- a/gamefilesflare/main.json +++ b/gamefilesflare/main.json @@ -5,6 +5,7 @@ "refWindowSize": [640, 480], "minWindowSize": [640, 480], "windowSize": [800, 600], + "framerate": 60, "keepAR": true, "stretchToFit": true, "smoothScreen": true, diff --git a/gamefilesflare/res/level/actions/automapZoom.json b/gamefilesflare/res/level/actions/automapZoom.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/gamefilesflare/res/level/actions/automapZoom.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/gamefilesflare/res/level/actions/playerUpdate.json b/gamefilesflare/res/level/actions/playerUpdate.json index 6facf64d..9ea6e5dc 100755 --- a/gamefilesflare/res/level/actions/playerUpdate.json +++ b/gamefilesflare/res/level/actions/playerUpdate.json @@ -6,7 +6,7 @@ "action": [ { "name": "<=", - "param1": "|currentLevel|currentPlayer.life|", + "param1": "%currentLevel.currentPlayer.life%", "param2": 0, "then": { "name": "drawable.resizeX", @@ -18,14 +18,14 @@ "else": { "name": "drawable.resizeX", "id": "lifeOrbFull", - "size": "|currentLevel|currentPlayer.lifeNow|", - "inputRangeMax": "|currentLevel|currentPlayer.life|", + "size": "%currentLevel.currentPlayer.lifeNow%", + "inputRangeMax": "%currentLevel.currentPlayer.life%", "range": [0, 106] } }, { "name": "<=", - "param1": "|currentLevel|currentPlayer.mana|", + "param1": "%currentLevel.currentPlayer.mana%", "param2": 0, "then": { "name": "drawable.resizeX", @@ -37,8 +37,8 @@ "else": { "name": "drawable.resizeX", "id": "manaOrbFull", - "size": "|currentLevel|currentPlayer.manaNow|", - "inputRangeMax": "|currentLevel|currentPlayer.mana|", + "size": "%currentLevel.currentPlayer.manaNow%", + "inputRangeMax": "%currentLevel.currentPlayer.mana%", "range": [0, 106] } } @@ -52,7 +52,7 @@ "updateBeltItems", { "name": "if.equal", - "param1": "|game|hasResource.charPanelInventory|", + "param1": "%game.hasResource.charPanelInventory%", "param2": true, "then": ["updateStashItems", "updateBodyItems"] }, diff --git a/gamefilesflare/res/level/fonts.json b/gamefilesflare/res/level/fonts.json index 8843a2d4..46474541 100755 --- a/gamefilesflare/res/level/fonts.json +++ b/gamefilesflare/res/level/fonts.json @@ -4,6 +4,18 @@ "id": "smaltext", "fromId": "font16g" }, + { + "id": "smaltextBlue", + "fromId": "font16g" + }, + { + "id": "smaltextGold", + "fromId": "font16g" + }, + { + "id": "smaltextRed", + "fromId": "font16g" + }, { "id": "medtexts", "fromId": "font16g" diff --git a/gamefilesflare/res/level/textures.json b/gamefilesflare/res/level/textures.json index f6867d8c..c0061642 100755 --- a/gamefilesflare/res/level/textures.json +++ b/gamefilesflare/res/level/textures.json @@ -46,9 +46,18 @@ "color": "0x4C4A48", "size": [1, 1] }, + { + "id": "golddrop", + "color": "0x505A58CC", + "size": [1, 1] + }, { "id": "tab_active", "file": "images/menus/tab_active.png" + }, + { + "id": "automap", + "file": "res/level/automap.png" } ], "texturePack": { diff --git a/gamefilesflare/ui/credits.json b/gamefilesflare/ui/credits.json index 37b30593..f1d3c20b 100755 --- a/gamefilesflare/ui/credits.json +++ b/gamefilesflare/ui/credits.json @@ -12,11 +12,11 @@ "texture": [ { "id": "credits1", - "file":"images/menus/credits_alpha_demo.png" + "file": "images/menus/credits_alpha_demo.png" }, { "id": "credits2", - "file":"images/menus/credits_fantasycore.png" + "file": "images/menus/credits_fantasycore.png" } ], "image": [ diff --git a/gamefilesflare/ui/level/char/beltInventory.json b/gamefilesflare/ui/level/char/beltInventory.json index 5af3259f..53eb5ba5 100755 --- a/gamefilesflare/ui/level/char/beltInventory.json +++ b/gamefilesflare/ui/level/char/beltInventory.json @@ -95,7 +95,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [193, 357] @@ -105,7 +105,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [225, 357] @@ -115,7 +115,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [257, 357] @@ -125,7 +125,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [289, 357] @@ -135,7 +135,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [321, 357] @@ -145,7 +145,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [353, 357] @@ -155,7 +155,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [385, 357] @@ -165,7 +165,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "bottom", "position": [417, 357] @@ -235,6 +235,54 @@ "position": [440, 374], "visible": false, "text": "8" + }, + { + "id": "txtQuantBelt1", + "font": "smaltext", + "anchor": "bottom", + "position": [194, 354] + }, + { + "id": "txtQuantBelt2", + "font": "smaltext", + "anchor": "bottom", + "position": [226, 354] + }, + { + "id": "txtQuantBelt3", + "font": "smaltext", + "anchor": "bottom", + "position": [258, 354] + }, + { + "id": "txtQuantBelt4", + "font": "smaltext", + "anchor": "bottom", + "position": [290, 354] + }, + { + "id": "txtQuantBelt5", + "font": "smaltext", + "anchor": "bottom", + "position": [322, 354] + }, + { + "id": "txtQuantBelt6", + "font": "smaltext", + "anchor": "bottom", + "position": [354, 354] + }, + { + "id": "txtQuantBelt7", + "font": "smaltext", + "anchor": "bottom", + "position": [386, 354] + }, + { + "id": "txtQuantBelt8", + "font": "smaltext", + "anchor": "bottom", + "position": [418, 354] } ] } \ No newline at end of file diff --git a/gamefilesflare/ui/level/char/panel.json b/gamefilesflare/ui/level/char/panel.json index fb900815..24af5a49 100755 --- a/gamefilesflare/ui/level/char/panel.json +++ b/gamefilesflare/ui/level/char/panel.json @@ -4,7 +4,7 @@ "name": "action.set", "id": "menu.saveAndCloseAction", "action": [ - { "name": "load", "file": "ui/level/saveSettings.json" }, + "saveSettings", { "name": "resource.popAll", "id": "gameMenuCommon" }, { "name": "resource.ignore", "id": "level", "ignore": "none" }, { "name": "level.pause", "pause": false } @@ -135,10 +135,8 @@ "text": [ { "id": "itemInfoTitle", - "replaceVars": true, - "font": "smaltext", + "font": "smaltextGold", "anchor": "right", - "color": "%textGold%", "position": [160, 63], "horizontalAlign": "center", "horizontalSpaceOffset": 1, @@ -160,25 +158,19 @@ }, { "id": "txtMapLabel", - "replaceVars": true, - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [8, 10], "horizontalSpaceOffset": 1, - "binding": "|currentLevel|name|", - "format": "Level: [1]", "visible": false }, { "id": "txtZoom", - "replaceVars": true, "anchor": "topRight", - "font": "smaltext", - "color": "%textGold%", + "font": "smaltextGold", "position": [632, 10], "horizontalAlign": "right", "horizontalSpaceOffset": 1, - "binding": "|currentLevel|zoomPercentage|", + "binding": "%currentLevel.zoomPercentage%", "format": "Zoom: [1]%", "visible": false } @@ -383,13 +375,14 @@ "onClick": [ { "name": "if.equal", - "param1": "|charPanel|visible|", + "param1": "%charPanel.visible%", "param2": false, "then": [ { "name": "resource.pop", "id": "charPanelQuests" }, { "name": "load", "file": "ui/level/char/panelLabels.json" }, "showCharPanel", - "hideQuestPanel" + "hideQuestPanel", + { "name": "resource.moveToTop", "id": "removeGold" } ], "else": [ { "name": "resource.pop", "id": "charPanelLabels" }, @@ -403,7 +396,7 @@ ], "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Character Information\nHotkey : 'C'" }, @@ -424,13 +417,14 @@ "onClick": [ { "name": "if.equal", - "param1": "|questPanel|visible|", + "param1": "%questPanel.visible%", "param2": false, "then": [ { "name": "resource.pop", "id": "charPanelLabels" }, { "name": "load", "file": "ui/level/char/panelQuests.json" }, "hideCharPanel", - "showQuestPanel" + "showQuestPanel", + { "name": "resource.moveToTop", "id": "removeGold" } ], "else": [ { "name": "resource.pop", "id": "charPanelLabels" }, @@ -444,7 +438,7 @@ ], "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Quests Log\nHotkey : 'Q'" }, @@ -465,7 +459,7 @@ "onClick": [ { "name": "if.equal", - "param1": "|invPanel|visible|", + "param1": "%invPanel.visible%", "param2": false, "then": [ { "name": "resource.pop", "id": "charPanelSpells" }, @@ -474,6 +468,7 @@ "hideSpellPanel" ], "else": [ + { "name": "resource.pop", "id": "removeGold" }, { "name": "resource.pop", "id": "charPanelInventory" }, { "name": "resource.pop", "id": "charPanelSpells" }, "hideInvPanel", @@ -485,7 +480,7 @@ ], "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Inventory\nHotkey : 'I'" }, @@ -506,9 +501,10 @@ "onClick": [ { "name": "if.equal", - "param1": "|spellPanel|visible|", + "param1": "%spellPanel.visible%", "param2": false, "then": [ + { "name": "resource.pop", "id": "removeGold" }, { "name": "resource.pop", "id": "charPanelInventory" }, { "name": "load", "file": "ui/level/char/panelSpells.json" }, "hideInvPanel", @@ -526,7 +522,7 @@ ], "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Spell Book\nHotkey : 'B'" }, @@ -544,9 +540,10 @@ "text": "Map", "verticalAlign": "center", "clickUp": true, + "onClick": "showMap", "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Automap\nHotkey : Tab" }, @@ -567,7 +564,7 @@ "clickUp": true, "onClick": { "name": "if.equal", - "param1": "|game|hasResource.gameMenuCommon|", + "param1": "%game.hasResource.gameMenuCommon%", "param2": true, "then": "menu.saveAndCloseAction", "else": [ @@ -577,7 +574,7 @@ }, "onHoverEnter": { "name": "if.notEqual", - "param1": "|currentLevel|currentPlayer.hasSelectedItem|", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", "param2": true, "then": [ { "name": "text.setText", "id": "txtPanel", "text": "Main Menu\nHotkey : Esc" }, @@ -611,11 +608,26 @@ { "key": "esc", "action": { "name": "button.click", "id": "menu" } }, { "key": "i", "action": { "name": "button.click", "id": "inv" } }, { "key": "q", "action": { "name": "button.click", "id": "quest" } }, + { "key": "z", "action": "zoomLevel" }, { "key": "tab", "action": { "name": "button.click", "id": "map" } }, + { + "key": "f", + "action": [ + { "name": "game.addToProperty", "property": "gamma", "value": 5 }, + "saveSettings" + ] + }, + { + "key": "g", + "action": [ + { "name": "game.addToProperty", "property": "gamma", "value": -5 }, + "saveSettings" + ] + }, { "key": "f1", "action": [ - { "name": "player.addGold", "gold": -4000 }, + { "name": "player.addItemQuantity", "itemClass": "gold", "value": -4000 }, "updateStashItems", "updateCharLabels" ] @@ -623,7 +635,7 @@ { "key": "f2", "action": [ - { "name": "player.addGold", "gold": 4000 }, + { "name": "player.addItemQuantity", "itemClass": "gold", "value": 4000 }, "updateStashItems", "updateCharLabels" ] diff --git a/gamefilesflare/ui/level/char/panelInventory.json b/gamefilesflare/ui/level/char/panelInventory.json index 6cd8b4f2..7e7360e2 100755 --- a/gamefilesflare/ui/level/char/panelInventory.json +++ b/gamefilesflare/ui/level/char/panelInventory.json @@ -334,7 +334,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [337, 77] @@ -344,7 +344,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [569, 77] @@ -354,7 +354,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [453, 77] @@ -364,7 +364,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [453, -10] @@ -374,7 +374,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [511, 5] @@ -384,7 +384,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [354, 150] @@ -394,7 +394,7 @@ "replaceVars": true, "texture": "empty", "textureRect": [32, 32], - "outline": "%outlineItemInv%", + "outline": "|outlineItemInv|", "outlineIgnore": "0x000000", "anchor": "right", "position": [555, 150] diff --git a/gamefilesflare/ui/level/char/panelLabels.json b/gamefilesflare/ui/level/char/panelLabels.json index 2bb5c263..8f40760f 100755 --- a/gamefilesflare/ui/level/char/panelLabels.json +++ b/gamefilesflare/ui/level/char/panelLabels.json @@ -48,7 +48,7 @@ "anchor": "left", "horizontalAlign": "center", "horizontalSpaceOffset": 1, - "binding": "|currentLevel|currentPlayer.gold|" + "binding": "%currentLevel.currentPlayer.itemQuantity.gold%" }, { "id": "charStr", @@ -124,9 +124,7 @@ }, { "id": "charPoints", - "replaceVars": true, - "font": "smaltext", - "color": "%textRed%", + "font": "smaltextRed", "position": [111, 256], "anchor": "left", "horizontalAlign": "center", diff --git a/gamefilesflare/ui/level/menu/game2.json b/gamefilesflare/ui/level/menu/game2.json index a346cc53..4904b0d0 100755 --- a/gamefilesflare/ui/level/menu/game2.json +++ b/gamefilesflare/ui/level/menu/game2.json @@ -1,16 +1,16 @@ { "action": [ { "name": "resource.add", "id": "gameMenu2" }, - { "name": "variable.setIfNull", "key": "colorCycling", "val": false }, + { "name": "variable.setIfNull", "key": "colorCycling", "value": false }, { "name": "action.set", "id": "updateAudioProgressBar", "action": [ { "name": "drawable.resizeToPositionX", "id": "progressBar1", "idToPosition": "option1", "offset": 14 }, - { "name": "game.setProperty", "property": "musicVolume", "value": "|progressBar1|size.x|", "propRange": [0, 100], "valueRange": [14, 270] }, + { "name": "game.setProperty", "property": "musicVolume", "value": "%progressBar1.size.x%", "propRange": [0, 100], "valueRange": [14, 270] }, { "name": "if.equal", - "param1": "|game|musicVolume|", + "param1": "%game.musicVolume%", "param2": 0, "then": { "name": "audio.stop", "id": "main" }, "else": { "name": "audio.play", "id": "main" } @@ -22,13 +22,16 @@ "id": "updateSoundProgressBar", "action": [ { "name": "drawable.resizeToPositionX", "id": "progressBar2", "idToPosition": "option2", "offset": 14 }, - { "name": "game.setProperty", "property": "soundVolume", "value": "|progressBar2|size.x|", "propRange": [0, 100], "valueRange": [14, 270] } + { "name": "game.setProperty", "property": "soundVolume", "value": "%progressBar2.size.x%", "propRange": [0, 100], "valueRange": [14, 270] } ] }, { "name": "action.set", "id": "updateGammaProgressBar", - "action": { "name": "drawable.resizeToPositionX", "id": "progressBar3", "idToPosition": "option3", "offset": 14 } + "action": [ + { "name": "drawable.resizeToPositionX", "id": "progressBar3", "idToPosition": "option3", "offset": 14 }, + { "name": "game.setProperty", "property": "gamma", "value": "%progressBar3.size.x%", "propRange": [30, 100], "valueRange": [14, 270] } + ] }, { "name": "action.set", @@ -138,7 +141,7 @@ "id": "optbar1", "position": [261, 119], "anchor": "none", - "texture":"optbar", + "texture": "optbar", "textureRect": [0, 0, 287, 32] }, { @@ -325,8 +328,8 @@ "name": "if.equal", "param1": "%colorCycling%", "param2": false, - "then": { "name": "variable.set", "key": "colorCycling", "val": true }, - "else": { "name": "variable.set", "key": "colorCycling", "val": false } + "then": { "name": "variable.set", "key": "colorCycling", "value": true }, + "else": { "name": "variable.set", "key": "colorCycling", "value": false } }, "updateColorCyclingLabel", "anchorLeftPentagram", @@ -350,7 +353,7 @@ "horizontalSpaceOffset": 2, "onClick": [ { "name": "resource.pop" }, - { "name": "load", "file": "ui/level/saveSettings.json" }, + "saveSettings", { "name": "load", "file": "ui/level/menu/game.json" } ], "onFocus": [ @@ -363,9 +366,11 @@ "anchorLeftPentagram", "updateColorCyclingLabel", { "name": "drawable.anchor", "id": "pent2", "idAnchor": "optbar1", "anchor": "right" }, - { "name": "drawable.moveX", "id": "option1", "idAnchorTo": "progressBar1", "range": 283, "position": "|game|musicVolume|", "max": 100, "steps": 17 }, - { "name": "drawable.moveX", "id": "option2", "idAnchorTo": "progressBar2", "range": 283, "position": "|game|soundVolume|", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option1", "idAnchorTo": "progressBar1", "range": 283, "position": "%game.musicVolume%", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option2", "idAnchorTo": "progressBar2", "range": 283, "position": "%game.soundVolume%", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option3", "idAnchorTo": "progressBar3", "range": 283, "position": "%game.gamma%", "min": 30, "max": 100, "steps": 15 }, { "name": "drawable.anchorSizeX", "id": "progressBar1", "idAnchorTo": "option1", "offset": 14 }, - { "name": "drawable.anchorSizeX", "id": "progressBar2", "idAnchorTo": "option2", "offset": 14 } + { "name": "drawable.anchorSizeX", "id": "progressBar2", "idAnchorTo": "option2", "offset": 14 }, + { "name": "drawable.anchorSizeX", "id": "progressBar3", "idAnchorTo": "option3", "offset": 14 } ] } \ No newline at end of file diff --git a/gamefilesflare/ui/loadMain.json b/gamefilesflare/ui/loadMain.json index 7fd7e254..b30bcc0d 100755 --- a/gamefilesflare/ui/loadMain.json +++ b/gamefilesflare/ui/loadMain.json @@ -1,7 +1,8 @@ { "icon": { - "file":"images/logo/icon.png" + "file": "images/logo/icon.png" }, + "load": "level/setupTempFolder.json", "load": "res/actions.json", "load": "res/fonts.json", "load": "res/music.json", diff --git a/gamefilesflare/ui/mainMenu.json b/gamefilesflare/ui/mainMenu.json index f7a2c328..6322f7f6 100755 --- a/gamefilesflare/ui/mainMenu.json +++ b/gamefilesflare/ui/mainMenu.json @@ -164,16 +164,16 @@ "onHoverLeave": { "name": "text.setText", "id": "versionInfo", - "binding": ["|game|title|", "|game|version|"], + "binding": ["%game.title%", "%game.version%"], "format": "[1] v[2]" } }, "action": [ - { "name": "menu.setFont", "id": "menu", "index": 1, "idFont": "font42y" }, + { "name": "menu.setFont", "id": "menu", "index": 1, "font": "font42y" }, { "name": "text.setText", "id": "versionInfo", - "binding": ["|game|title|", "|game|version|"], + "binding": ["%game.title%", "%game.version%"], "format": "[1] v[2]" } ] diff --git a/gamefilesflare/ui/singlePlayer/select.json b/gamefilesflare/ui/singlePlayer/select.json index 5b0b6680..90ba4545 100755 --- a/gamefilesflare/ui/singlePlayer/select.json +++ b/gamefilesflare/ui/singlePlayer/select.json @@ -84,14 +84,14 @@ "onScrollUp": "focus.moveUp", "items": [ { - "load": "game|saves", + "load": "game.saves", "text": "%save%", "onClick": [ - { "name": "load", "file": ["ui/loadCharInfo.json", "|focus|text|"] }, + { "name": "load", "file": ["ui/loadCharInfo.json", "%focus.text%"] }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, "anchorPentagrams", { "name": "button.enable", "id": "delete" }, - { "name": "text.setFont", "id": "delete", "idFont": "font30g" }, + { "name": "text.setFont", "id": "delete", "font": "font30g" }, "saveMenu.moveScrollbar" ], "onDoubleClick": { "name": "button.click", "id": "ok" }, @@ -104,7 +104,7 @@ { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, "anchorPentagrams", { "name": "button.enable", "id": "delete", "enable": false }, - { "name": "text.setFont", "id": "delete", "idFont": "font30s" }, + { "name": "text.setFont", "id": "delete", "font": "font30s" }, "saveMenu.moveScrollbar" ], "onDoubleClick": { "name": "button.click", "id": "ok" }, @@ -120,13 +120,13 @@ "anchor": "none", "onClick": { "name": "if.equal", - "param1": "|focus|text|", + "param1": "%focus.text%", "param2": "New Hero", "then": [ { "name": "resource.pop" }, { "name": "load", "file": "ui/singlePlayer/new.json" } ], - "else": { "name": "load", "file": ["level/loadGame.json", "|focus|text|"] } + "else": { "name": "load", "file": ["level/loadGame.json", "%focus.text%"] } }, "sound": "titlslct", "text": "OK" @@ -137,7 +137,7 @@ "position": [378, 429], "anchor": "none", "onClick": [ - { "name": "load", "file": ["ui/singlePlayer/delete.json", "|focus|text|"] } + { "name": "load", "file": ["ui/singlePlayer/delete.json", "%focus.text%"] } ], "sound": "titlslct", "text": "Delete" @@ -184,7 +184,7 @@ "id": "sb_thumb", "idAnchorTo": "btnDrag", "range": 133, - "steps": "|menuLoadGame|itemCount|" + "steps": "%menuLoadGame.itemCount%" }, { "name": "menu.moveScrollbar", @@ -217,7 +217,7 @@ "focus.clickNoSound", { "name": "if.greater", - "param1": "|menuLoadGame|itemCount|", + "param1": "%menuLoadGame.itemCount%", "param2": 6, "then": [ { "name": "drawable.visible", "id": "sb_bg", "visible": true }, diff --git a/gamefileshf/level/afterLevelLoad.json b/gamefileshf/level/afterLevelLoad.json index b23c88da..f263e817 100755 --- a/gamefileshf/level/afterLevelLoad.json +++ b/gamefileshf/level/afterLevelLoad.json @@ -2,22 +2,23 @@ "action": [ { "name": "if.notEqual", - "param1": "{1}", + "param1": "%currentLevel.path%", "param2": "town", "then": { "name": "player.setRestStatus", "status": 1 }, "else": { "name": "player.setRestStatus", "status": 0 } }, "updateLifeManaOrbs", "updatePlayerTexture", + "updateCharPoints", + "updateMap", { "name": "if.equal", - "param1": "{2}", + "param1": "{1}", "param2": "positionPlayer", - "then": { "name": "load", "file": ["level/positionPlayer.json", "{3}"] } + "then": { "name": "load", "file": ["level/positionPlayer.json", "{2}"] } } ], "load": "ui/level/char/updateVisiblePanels.json", "load": "level/playOrStopMusic.json", - "load": ["level/setMapAction.json", "{1}"], "load": "level/player/updateSpeed.json" } \ No newline at end of file diff --git a/gamefileshf/level/automap/l5/automap0.json b/gamefileshf/level/automap/l5/automap0.json new file mode 100755 index 00000000..b76019be --- /dev/null +++ b/gamefileshf/level/automap/l5/automap0.json @@ -0,0 +1,143 @@ +{ + "texturePack": { + "id": "l5Automap0", + "texture": "automap", + "rects": [ + { "rect": [516, 0, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 9, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 18, 17, 9], "offset": [ 0, -3] }, + { "rect": [516, 27, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 36, 17, 9], "offset": [ 0, -7] }, + { "rect": [507, 66, 27, 13], "offset": [ 9, -4] }, + { "rect": [516, 45, 17, 9], "offset": [ 0, -7] }, + { "rect": [520, 0, 9, 9], "offset": [ 8, -5] }, + { "rect": [405, 230, 5, 9], "offset": [ 0, 0] }, + { "rect": [264, 198, 9, 5], "offset": [-4, -2] }, + { "rect": [264, 215, 9, 5], "offset": [-4, -4] }, + { "rect": [264, 232, 9, 5], "offset": [-4, -6] }, + { "rect": [405, 197, 5, 9], "offset": [ 0, -8] }, + { "rect": [264, 249, 9, 5], "offset": [ 4, -6] }, + { "rect": [264, 266, 9, 5], "offset": [ 4, -4] }, + { "rect": [264, 283, 9, 5], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [13, 0], + [14, 1], + [16, 2], + [22, 1], + [25, 0], + [28, 2], + [32, 2], + [35, 2], + [38, 2], + [41, 2], + [48, 2], + [50, 2], + [76, 4], + [63, 6], + [64, 1], + [65, 6], + [67, 0], + [68, 6], + [71, 6], + [79, 3], + [82, 2], + [83, 7], + [88, 1], + [103, 2], + [128, 5], + [149, 1], + [151, 0], + [152, 1], + [154, 0], + [162, 0], + [167, 5], + [173, 1], + [176, 0], + [177, 1], + [180, 0], + [188, 0], + [195, 5], + [236, 6], + [237, 1], + [238, 6], + [240, 0], + [241, 6], + [249, 1], + [253, 1], + [257, 1], + [260, 0], + [264, 0], + [268, 0], + [271, 2], + [275, 2], + [291, 4], + [295, 4], + [321, 1], + [323, 0], + [328, 1], + [330, 2], + [336, 1], + [339, 0], + [342, 2], + [346, 2], + [350, 2], + [352, 1], + [365, 2], + [354, 2], + [356, 2], + [362, 2], + [363, 0], + [376, 1], + [379, 0], + [387, 1], + [388, 2], + [391, 1], + [393, 0], + [401, 2], + [412, 2], + [413, 0], + [416, 2], + [428, 1], + [431, 0], + [439, 0], + [440, 1], + [442, 2], + [447, 1], + [450, 0], + [465, 2], + [477, 2], + [478, 0], + [479, 2], + [529, 1], + [531, 1], + [533, 1], + [536, 1], + [540, 1], + [542, 1], + [544, 0], + [546, 0], + [550, 0], + [555, 0], + [556, 2], + [558, 2], + [560, 2], + [562, 2], + [575, 2], + [604, 1], + [607, 0], + [612, 1], + [615, 0], + [1024, 8], + [1025, 9], + [1026, 10], + [1027, 11], + [1028, 12], + [1029, 13], + [1030, 14], + [1031, 15] + ] + } +} \ No newline at end of file diff --git a/gamefileshf/level/automap/l5/automap30.json b/gamefileshf/level/automap/l5/automap30.json new file mode 100755 index 00000000..38f77979 --- /dev/null +++ b/gamefileshf/level/automap/l5/automap30.json @@ -0,0 +1,143 @@ +{ + "texturePack": { + "id": "l5Automap30", + "texture": "automap", + "rects": [ + { "rect": [ 0, 0, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 33, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 66, 65, 33], "offset": [ 0, -15] }, + { "rect": [ 0, 99, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 132, 65, 33], "offset": [ 0, -31] }, + { "rect": [423, 148, 111, 55], "offset": [ 33, -16] }, + { "rect": [ 0, 165, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 16, 0, 33, 33], "offset": [ 32, -23] }, + { "rect": [273, 230, 17, 33], "offset": [ 0, 0] }, + { "rect": [ 0, 198, 33, 17], "offset": [-16, -8] }, + { "rect": [ 0, 215, 33, 17], "offset": [-16, -16] }, + { "rect": [ 0, 232, 33, 17], "offset": [-16, -24] }, + { "rect": [273, 197, 17, 33], "offset": [ 0, -32] }, + { "rect": [ 0, 249, 33, 17], "offset": [ 16, -24] }, + { "rect": [ 0, 266, 33, 17], "offset": [ 16, -16] }, + { "rect": [ 0, 283, 33, 17], "offset": [ 16, -8] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [13, 0], + [14, 1], + [16, 2], + [22, 1], + [25, 0], + [28, 2], + [32, 2], + [35, 2], + [38, 2], + [41, 2], + [48, 2], + [50, 2], + [76, 4], + [63, 6], + [64, 1], + [65, 6], + [67, 0], + [68, 6], + [71, 6], + [79, 3], + [82, 2], + [83, 7], + [88, 1], + [103, 2], + [128, 5], + [149, 1], + [151, 0], + [152, 1], + [154, 0], + [162, 0], + [167, 5], + [173, 1], + [176, 0], + [177, 1], + [180, 0], + [188, 0], + [195, 5], + [236, 6], + [237, 1], + [238, 6], + [240, 0], + [241, 6], + [249, 1], + [253, 1], + [257, 1], + [260, 0], + [264, 0], + [268, 0], + [271, 2], + [275, 2], + [291, 4], + [295, 4], + [321, 1], + [323, 0], + [328, 1], + [330, 2], + [336, 1], + [339, 0], + [342, 2], + [346, 2], + [350, 2], + [352, 1], + [365, 2], + [354, 2], + [356, 2], + [362, 2], + [363, 0], + [376, 1], + [379, 0], + [387, 1], + [388, 2], + [391, 1], + [393, 0], + [401, 2], + [412, 2], + [413, 0], + [416, 2], + [428, 1], + [431, 0], + [439, 0], + [440, 1], + [442, 2], + [447, 1], + [450, 0], + [465, 2], + [477, 2], + [478, 0], + [479, 2], + [529, 1], + [531, 1], + [533, 1], + [536, 1], + [540, 1], + [542, 1], + [544, 0], + [546, 0], + [550, 0], + [555, 0], + [556, 2], + [558, 2], + [560, 2], + [562, 2], + [575, 2], + [604, 1], + [607, 0], + [612, 1], + [615, 0], + [1024, 8], + [1025, 9], + [1026, 10], + [1027, 11], + [1028, 12], + [1029, 13], + [1030, 14], + [1031, 15] + ] + } +} \ No newline at end of file diff --git a/gamefileshf/level/automap/l5/automap5.json b/gamefileshf/level/automap/l5/automap5.json new file mode 100755 index 00000000..496c816b --- /dev/null +++ b/gamefileshf/level/automap/l5/automap5.json @@ -0,0 +1,143 @@ +{ + "texturePack": { + "id": "l5Automap5", + "texture": "automap", + "rects": [ + { "rect": [470, 0, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 13, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 26, 25, 13], "offset": [ 0, -5] }, + { "rect": [470, 39, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 52, 25, 13], "offset": [ 0, -11] }, + { "rect": [493, 97, 41, 20], "offset": [13, -6] }, + { "rect": [470, 65, 25, 13], "offset": [ 0, -11] }, + { "rect": [476, 0, 13, 13], "offset": [12, -8] }, + { "rect": [393, 230, 7, 13], "offset": [ 0, 0] }, + { "rect": [240, 198, 13, 7], "offset": [-4, -2] }, + { "rect": [240, 215, 13, 7], "offset": [-4, -4] }, + { "rect": [240, 232, 13, 7], "offset": [-4, -6] }, + { "rect": [393, 197, 7, 13], "offset": [ 0, -8] }, + { "rect": [240, 249, 13, 7], "offset": [ 4, -6] }, + { "rect": [240, 266, 13, 7], "offset": [ 4, -4] }, + { "rect": [240, 283, 13, 7], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [2, 1], + [5, 0], + [13, 0], + [14, 1], + [16, 2], + [22, 1], + [25, 0], + [28, 2], + [32, 2], + [35, 2], + [38, 2], + [41, 2], + [48, 2], + [50, 2], + [76, 4], + [63, 6], + [64, 1], + [65, 6], + [67, 0], + [68, 6], + [71, 6], + [79, 3], + [82, 2], + [83, 7], + [88, 1], + [103, 2], + [128, 5], + [149, 1], + [151, 0], + [152, 1], + [154, 0], + [162, 0], + [167, 5], + [173, 1], + [176, 0], + [177, 1], + [180, 0], + [188, 0], + [195, 5], + [236, 6], + [237, 1], + [238, 6], + [240, 0], + [241, 6], + [249, 1], + [253, 1], + [257, 1], + [260, 0], + [264, 0], + [268, 0], + [271, 2], + [275, 2], + [291, 4], + [295, 4], + [321, 1], + [323, 0], + [328, 1], + [330, 2], + [336, 1], + [339, 0], + [342, 2], + [346, 2], + [350, 2], + [352, 1], + [365, 2], + [354, 2], + [356, 2], + [362, 2], + [363, 0], + [376, 1], + [379, 0], + [387, 1], + [388, 2], + [391, 1], + [393, 0], + [401, 2], + [412, 2], + [413, 0], + [416, 2], + [428, 1], + [431, 0], + [439, 0], + [440, 1], + [442, 2], + [447, 1], + [450, 0], + [465, 2], + [477, 2], + [478, 0], + [479, 2], + [529, 1], + [531, 1], + [533, 1], + [536, 1], + [540, 1], + [542, 1], + [544, 0], + [546, 0], + [550, 0], + [555, 0], + [556, 2], + [558, 2], + [560, 2], + [562, 2], + [575, 2], + [604, 1], + [607, 0], + [612, 1], + [615, 0], + [1024, 8], + [1025, 9], + [1026, 10], + [1027, 11], + [1028, 12], + [1029, 13], + [1030, 14], + [1031, 15] + ] + } +} \ No newline at end of file diff --git a/gamefileshf/level/automap/l5/load.json b/gamefileshf/level/automap/l5/load.json new file mode 100755 index 00000000..712500af --- /dev/null +++ b/gamefileshf/level/automap/l5/load.json @@ -0,0 +1,57 @@ +{ + "texturePack": [ + { + "id": "automap0", + "fromId": "l5Automap0" + }, + { + "id": "automap1", + "fromId": "l5Automap3" + }, + { + "id": "automap2", + "fromId": "l5Automap5" + }, + { + "id": "automap3", + "fromId": "l5Automap8" + }, + { + "id": "automap4", + "fromId": "l5Automap10" + }, + { + "id": "automap5", + "fromId": "l5Automap13" + }, + { + "id": "automap6", + "fromId": "l5Automap15" + }, + { + "id": "automap7", + "fromId": "l5Automap18" + }, + { + "id": "automap8", + "fromId": "l5Automap20" + }, + { + "id": "automap9", + "fromId": "l5Automap23" + }, + { + "id": "automap10", + "fromId": "l5Automap25" + }, + { + "id": "automap11", + "fromId": "l5Automap28" + }, + { + "id": "automap12", + "fromId": "l5Automap30" + } + ], + "action": "updateAutomapZoom" +} \ No newline at end of file diff --git a/gamefileshf/level/automap/l6/automap0.json b/gamefileshf/level/automap/l6/automap0.json new file mode 100755 index 00000000..69c1eef4 --- /dev/null +++ b/gamefileshf/level/automap/l6/automap0.json @@ -0,0 +1,120 @@ +{ + "texturePack": { + "id": "l6Automap0", + "texture": "automap", + "rects": [ + { "rect": [516, 0, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 9, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 18, 17, 9], "offset": [ 0, -3] }, + { "rect": [516, 27, 17, 9], "offset": [ 0, -7] }, + { "rect": [516, 36, 17, 9], "offset": [ 0, -7] }, + { "rect": [507, 66, 27, 13], "offset": [ 1, 0] }, + { "rect": [516, 45, 17, 9], "offset": [ 0, -7] }, + { "rect": [524, 0, 9, 9], "offset": [ 7, -7] }, + { "rect": [524, 9, 9, 9], "offset": [ 0, -3] }, + { "rect": [516, 18, 17, 5], "offset": [ 0, -7] }, + { "rect": [507, 66, 27, 13], "offset": [-7, -4] }, + { "rect": [405, 230, 5, 9], "offset": [ 0, 0] }, + { "rect": [264, 198, 9, 5], "offset": [-4, -2] }, + { "rect": [264, 215, 9, 5], "offset": [-4, -4] }, + { "rect": [264, 232, 9, 5], "offset": [-4, -6] }, + { "rect": [405, 197, 5, 9], "offset": [ 0, -8] }, + { "rect": [264, 249, 9, 5], "offset": [ 4, -6] }, + { "rect": [264, 266, 9, 5], "offset": [ 4, -4] }, + { "rect": [264, 283, 9, 5], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [0, 1], + [2, 7], + [3, 7], + [6, 0], + [7, 7], + [8, 0], + [9, 8], + [11, 8], + [13, 1], + [15, 8], + [19, 9], + [21, 1], + [22, 0], + [28, 6], + [29, 6], + [30, 6], + [31, 6], + [32, 1], + [34, 8], + [36, 7], + [37, 7], + [40, 8], + [41, 0], + [42, 8], + [49, 7], + [54, 8], + [58, 1], + [62, 1], + [63, 10], + [65, 0], + [66, 5], + [69, 0], + [73, 6], + [74, 6], + [79, 0], + [80, 5], + [83, 0], + [86, 6], + [87, 6], + [88, 6], + [89, 6], + [90, 6], + [91, 6], + [92, 6], + [93, 6], + [94, 6], + [95, 6], + [96, 6], + [97, 6], + [98, 6], + [99, 6], + [100, 6], + [118, 8], + [120, 8], + [124, 1], + [128, 1], + [132, 1], + [136, 1], + [139, 0], + [140, 1], + [143, 0], + [147, 0], + [151, 0], + [155, 0], + [159, 0], + [163, 0], + [164, 1], + [168, 1], + [172, 1], + [175, 0], + [179, 0], + [183, 0], + [184, 1], + [187, 0], + [188, 1], + [190, 2], + [194, 2], + [198, 2], + [202, 2], + [206, 2], + [210, 2], + [214, 2], + [218, 2], + [1024, 11], + [1025, 12], + [1026, 13], + [1027, 14], + [1028, 15], + [1029, 16], + [1030, 17], + [1031, 18] + ] + } +} \ No newline at end of file diff --git a/gamefileshf/level/automap/l6/automap30.json b/gamefileshf/level/automap/l6/automap30.json new file mode 100755 index 00000000..549f6cf6 --- /dev/null +++ b/gamefileshf/level/automap/l6/automap30.json @@ -0,0 +1,120 @@ +{ + "texturePack": { + "id": "l6Automap30", + "texture": "automap", + "rects": [ + { "rect": [ 0, 0, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 33, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 66, 65, 33], "offset": [ 0, -15] }, + { "rect": [ 0, 99, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 0, 132, 65, 33], "offset": [ 0, -31] }, + { "rect": [423, 148, 111, 55], "offset": [ 1, 0] }, + { "rect": [ 0, 165, 65, 33], "offset": [ 0, -31] }, + { "rect": [ 16, 0, 33, 33], "offset": [ 32, -23] }, + { "rect": [ 16, 33, 33, 33], "offset": [ 0, -23] }, + { "rect": [ 0, 66, 65, 16], "offset": [ 0, -32] }, + { "rect": [423, 148, 111, 55], "offset": [-31, -16] }, + { "rect": [273, 230, 17, 33], "offset": [ 0, 0] }, + { "rect": [ 0, 198, 33, 17], "offset": [-16, -8] }, + { "rect": [ 0, 215, 33, 17], "offset": [-16, -16] }, + { "rect": [ 0, 232, 33, 17], "offset": [-16, -24] }, + { "rect": [273, 197, 17, 33], "offset": [ 0, -32] }, + { "rect": [ 0, 249, 33, 17], "offset": [ 16, -24] }, + { "rect": [ 0, 266, 33, 17], "offset": [ 16, -16] }, + { "rect": [ 0, 283, 33, 17], "offset": [ 16, -8] } + ], + "textureIndexes": [ + [0, 1], + [2, 7], + [3, 7], + [6, 0], + [7, 7], + [8, 0], + [9, 8], + [11, 8], + [13, 1], + [15, 8], + [19, 9], + [21, 1], + [22, 0], + [28, 6], + [29, 6], + [30, 6], + [31, 6], + [32, 1], + [34, 8], + [36, 7], + [37, 7], + [40, 8], + [41, 0], + [42, 8], + [49, 7], + [54, 8], + [58, 1], + [62, 1], + [63, 10], + [65, 0], + [66, 5], + [69, 0], + [73, 6], + [74, 6], + [79, 0], + [80, 5], + [83, 0], + [86, 6], + [87, 6], + [88, 6], + [89, 6], + [90, 6], + [91, 6], + [92, 6], + [93, 6], + [94, 6], + [95, 6], + [96, 6], + [97, 6], + [98, 6], + [99, 6], + [100, 6], + [118, 8], + [120, 8], + [124, 1], + [128, 1], + [132, 1], + [136, 1], + [139, 0], + [140, 1], + [143, 0], + [147, 0], + [151, 0], + [155, 0], + [159, 0], + [163, 0], + [164, 1], + [168, 1], + [172, 1], + [175, 0], + [179, 0], + [183, 0], + [184, 1], + [187, 0], + [188, 1], + [190, 2], + [194, 2], + [198, 2], + [202, 2], + [206, 2], + [210, 2], + [214, 2], + [218, 2], + [1024, 11], + [1025, 12], + [1026, 13], + [1027, 14], + [1028, 15], + [1029, 16], + [1030, 17], + [1031, 18] + ] + } +} \ No newline at end of file diff --git a/gamefileshf/level/automap/l6/automap5.json b/gamefileshf/level/automap/l6/automap5.json new file mode 100755 index 00000000..e43dbbb9 --- /dev/null +++ b/gamefileshf/level/automap/l6/automap5.json @@ -0,0 +1,120 @@ +{ + "texturePack": { + "id": "l6Automap5", + "texture": "automap", + "rects": [ + { "rect": [470, 0, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 13, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 26, 25, 13], "offset": [ 0, -5] }, + { "rect": [470, 39, 25, 13], "offset": [ 0, -11] }, + { "rect": [470, 52, 25, 13], "offset": [ 0, -11] }, + { "rect": [493, 97, 41, 20], "offset": [ 1, 0] }, + { "rect": [470, 65, 25, 13], "offset": [ 0, -11] }, + { "rect": [482, 0, 13, 13], "offset": [ 11, -11] }, + { "rect": [482, 13, 13, 13], "offset": [ 0, -5] }, + { "rect": [470, 26, 25, 6], "offset": [ 0, -12] }, + { "rect": [493, 97, 41, 20], "offset": [-11, -5] }, + { "rect": [393, 230, 7, 13], "offset": [ 0, 0] }, + { "rect": [240, 198, 13, 7], "offset": [ -4, -2] }, + { "rect": [240, 215, 13, 7], "offset": [ -4, -4] }, + { "rect": [240, 232, 13, 7], "offset": [ -4, -6] }, + { "rect": [393, 197, 7, 13], "offset": [ 0, -8] }, + { "rect": [240, 249, 13, 7], "offset": [ 4, -6] }, + { "rect": [240, 266, 13, 7], "offset": [ 4, -4] }, + { "rect": [240, 283, 13, 7], "offset": [ 4, -2] } + ], + "textureIndexes": [ + [0, 1], + [2, 7], + [3, 7], + [6, 0], + [7, 7], + [8, 0], + [9, 8], + [11, 8], + [13, 1], + [15, 8], + [19, 9], + [21, 1], + [22, 0], + [28, 6], + [29, 6], + [30, 6], + [31, 6], + [32, 1], + [34, 8], + [36, 7], + [37, 7], + [40, 8], + [41, 0], + [42, 8], + [49, 7], + [54, 8], + [58, 1], + [62, 1], + [63, 10], + [65, 0], + [66, 5], + [69, 0], + [73, 6], + [74, 6], + [79, 0], + [80, 5], + [83, 0], + [86, 6], + [87, 6], + [88, 6], + [89, 6], + [90, 6], + [91, 6], + [92, 6], + [93, 6], + [94, 6], + [95, 6], + [96, 6], + [97, 6], + [98, 6], + [99, 6], + [100, 6], + [118, 8], + [120, 8], + [124, 1], + [128, 1], + [132, 1], + [136, 1], + [139, 0], + [140, 1], + [143, 0], + [147, 0], + [151, 0], + [155, 0], + [159, 0], + [163, 0], + [164, 1], + [168, 1], + [172, 1], + [175, 0], + [179, 0], + [183, 0], + [184, 1], + [187, 0], + [188, 1], + [190, 2], + [194, 2], + [198, 2], + [202, 2], + [206, 2], + [210, 2], + [214, 2], + [218, 2], + [1024, 11], + [1025, 12], + [1026, 13], + [1027, 14], + [1028, 15], + [1029, 16], + [1030, 17], + [1031, 18] + ] + } +} \ No newline at end of file diff --git a/gamefileshf/level/automap/l6/load.json b/gamefileshf/level/automap/l6/load.json new file mode 100755 index 00000000..27daf477 --- /dev/null +++ b/gamefileshf/level/automap/l6/load.json @@ -0,0 +1,57 @@ +{ + "texturePack": [ + { + "id": "automap0", + "fromId": "l6Automap0" + }, + { + "id": "automap1", + "fromId": "l6Automap3" + }, + { + "id": "automap2", + "fromId": "l6Automap5" + }, + { + "id": "automap3", + "fromId": "l6Automap8" + }, + { + "id": "automap4", + "fromId": "l6Automap10" + }, + { + "id": "automap5", + "fromId": "l6Automap13" + }, + { + "id": "automap6", + "fromId": "l6Automap15" + }, + { + "id": "automap7", + "fromId": "l6Automap18" + }, + { + "id": "automap8", + "fromId": "l6Automap20" + }, + { + "id": "automap9", + "fromId": "l6Automap23" + }, + { + "id": "automap10", + "fromId": "l6Automap25" + }, + { + "id": "automap11", + "fromId": "l6Automap28" + }, + { + "id": "automap12", + "fromId": "l6Automap30" + } + ], + "action": "updateAutomapZoom" +} \ No newline at end of file diff --git a/gamefileshf/level/automap/loadAll.json b/gamefileshf/level/automap/loadAll.json new file mode 100755 index 00000000..d7098f46 --- /dev/null +++ b/gamefileshf/level/automap/loadAll.json @@ -0,0 +1,80 @@ +{ + "load": "level/automap/l1/automap0.json", + "load": "level/automap/l1/automap3.json", + "load": "level/automap/l1/automap5.json", + "load": "level/automap/l1/automap8.json", + "load": "level/automap/l1/automap10.json", + "load": "level/automap/l1/automap13.json", + "load": "level/automap/l1/automap15.json", + "load": "level/automap/l1/automap18.json", + "load": "level/automap/l1/automap20.json", + "load": "level/automap/l1/automap23.json", + "load": "level/automap/l1/automap25.json", + "load": "level/automap/l1/automap28.json", + "load": "level/automap/l1/automap30.json", + "load": "level/automap/l2/automap0.json", + "load": "level/automap/l2/automap3.json", + "load": "level/automap/l2/automap5.json", + "load": "level/automap/l2/automap8.json", + "load": "level/automap/l2/automap10.json", + "load": "level/automap/l2/automap13.json", + "load": "level/automap/l2/automap15.json", + "load": "level/automap/l2/automap18.json", + "load": "level/automap/l2/automap20.json", + "load": "level/automap/l2/automap23.json", + "load": "level/automap/l2/automap25.json", + "load": "level/automap/l2/automap28.json", + "load": "level/automap/l2/automap30.json", + "load": "level/automap/l3/automap0.json", + "load": "level/automap/l3/automap3.json", + "load": "level/automap/l3/automap5.json", + "load": "level/automap/l3/automap8.json", + "load": "level/automap/l3/automap10.json", + "load": "level/automap/l3/automap13.json", + "load": "level/automap/l3/automap15.json", + "load": "level/automap/l3/automap18.json", + "load": "level/automap/l3/automap20.json", + "load": "level/automap/l3/automap23.json", + "load": "level/automap/l3/automap25.json", + "load": "level/automap/l3/automap28.json", + "load": "level/automap/l3/automap30.json", + "load": "level/automap/l4/automap0.json", + "load": "level/automap/l4/automap3.json", + "load": "level/automap/l4/automap5.json", + "load": "level/automap/l4/automap8.json", + "load": "level/automap/l4/automap10.json", + "load": "level/automap/l4/automap13.json", + "load": "level/automap/l4/automap15.json", + "load": "level/automap/l4/automap18.json", + "load": "level/automap/l4/automap20.json", + "load": "level/automap/l4/automap23.json", + "load": "level/automap/l4/automap25.json", + "load": "level/automap/l4/automap28.json", + "load": "level/automap/l4/automap30.json", + "load": "level/automap/l5/automap0.json", + "load": "level/automap/l5/automap3.json", + "load": "level/automap/l5/automap5.json", + "load": "level/automap/l5/automap8.json", + "load": "level/automap/l5/automap10.json", + "load": "level/automap/l5/automap13.json", + "load": "level/automap/l5/automap15.json", + "load": "level/automap/l5/automap18.json", + "load": "level/automap/l5/automap20.json", + "load": "level/automap/l5/automap23.json", + "load": "level/automap/l5/automap25.json", + "load": "level/automap/l5/automap28.json", + "load": "level/automap/l5/automap30.json", + "load": "level/automap/l6/automap0.json", + "load": "level/automap/l6/automap3.json", + "load": "level/automap/l6/automap5.json", + "load": "level/automap/l6/automap8.json", + "load": "level/automap/l6/automap10.json", + "load": "level/automap/l6/automap13.json", + "load": "level/automap/l6/automap15.json", + "load": "level/automap/l6/automap18.json", + "load": "level/automap/l6/automap20.json", + "load": "level/automap/l6/automap23.json", + "load": "level/automap/l6/automap25.json", + "load": "level/automap/l6/automap28.json", + "load": "level/automap/l6/automap30.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt1/crypt1.json b/gamefileshf/level/crypt1/crypt1.json new file mode 100755 index 00000000..8299eb31 --- /dev/null +++ b/gamefileshf/level/crypt1/crypt1.json @@ -0,0 +1,171 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 5, 6, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 607, 608, 5, 6, 328, 14, 268, 269, 264, 265, 260, 261, 323, 324, 13, 14, 323, 324, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 7, 8, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 609, 610, 7, 8, 329, 330, 270, 271, 266, 267, 262, 263, 325, 326, 15, 16, 325, 326, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 409, 410, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 496, 497, 492, 493, 375, 376, 280, 281, 359, 360, 409, 410, 409, 410, 611, 612, 359, 360, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 411, 412, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 498, 499, 494, 495, 377, 378, 166, 282, 361, 362, 411, 412, 411, 412, 613, 614, 361, 362, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 359, 360, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 13, 14, 59, 60, 409, 410, 359, 360, 55, 56, 496, 497, 286, 287, 359, 360, 500, 501, 55, 56, 359, 360, 628, 629, 25, 26, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 361, 362, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 15, 16, 61, 62, 411, 412, 361, 362, 57, 58, 498, 499, 288, 289, 361, 362, 502, 503, 57, 58, 361, 362, 47, 48, 27, 28, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 359, 360, 622, 46, 236, 237, 72, 64, 72, 64, 72, 64, 1, 2, 500, 501, 504, 505, 45, 46, 359, 360, 359, 360, 281, 46, 359, 360, 45, 46, 496, 497, 496, 497, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 361, 362, 623, 624, 238, 239, 69, 66, 69, 66, 69, 66, 3, 4, 502, 503, 506, 507, 47, 48, 361, 362, 361, 362, 285, 48, 361, 362, 47, 48, 498, 499, 498, 499, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 5, 6, 55, 56, 492, 493, 619, 620, 413, 414, 268, 269, 264, 265, 260, 261, 421, 56, 504, 505, 492, 493, 492, 493, 45, 46, 359, 360, 283, 46, 359, 360, 280, 281, 625, 46, 633, 46, 625, 46, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 7, 8, 57, 58, 494, 495, 47, 621, 415, 416, 270, 271, 266, 267, 262, 263, 422, 58, 506, 507, 494, 495, 494, 495, 47, 48, 361, 362, 47, 48, 361, 362, 166, 282, 626, 627, 634, 635, 626, 627, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 45, 46, 496, 497, 45, 46, 619, 620, 272, 273, 359, 360, 359, 360, 280, 281, 45, 46, 409, 410, 281, 592, 166, 284, 13, 14, 268, 269, 264, 265, 260, 261, 79, 80, 351, 352, 276, 277, 357, 358, 244, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 47, 48, 498, 499, 47, 48, 47, 621, 274, 275, 361, 362, 361, 362, 166, 282, 47, 48, 411, 412, 593, 594, 47, 48, 15, 16, 270, 271, 266, 267, 262, 263, 81, 82, 353, 354, 278, 279, 43, 44, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 359, 360, 45, 46, 45, 46, 619, 620, 39, 40, 359, 360, 409, 410, 359, 360, 474, 475, 45, 46, 409, 410, 280, 281, 1, 2, 359, 360, 359, 360, 359, 360, 359, 360, 1, 2, 504, 505, 474, 475, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 361, 362, 47, 48, 47, 48, 47, 621, 31, 41, 361, 362, 411, 412, 361, 362, 476, 477, 47, 48, 411, 412, 166, 282, 3, 4, 361, 362, 361, 362, 361, 362, 361, 362, 3, 4, 506, 507, 476, 477, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 13, 14, 431, 432, 79, 80, 244, 241, 328, 14, 5, 6, 5, 6, 244, 241, 240, 241, 240, 241, 240, 241, 247, 241, 13, 14, 379, 380, 79, 80, 244, 241, 247, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 15, 16, 433, 434, 81, 82, 238, 239, 329, 330, 7, 8, 7, 8, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 15, 16, 381, 382, 81, 82, 238, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 45, 46, 409, 410, 236, 237, 611, 612, 359, 360, 280, 281, 236, 237, 72, 64, 72, 64, 13, 14, 323, 324, 55, 56, 504, 505, 628, 629, 339, 340, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 47, 48, 411, 412, 238, 239, 613, 614, 361, 362, 166, 282, 238, 239, 69, 66, 69, 66, 15, 16, 325, 326, 57, 58, 506, 507, 47, 48, 341, 342, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 323, 324, 323, 324, 246, 237, 427, 428, 492, 493, 630, 46, 236, 237, 1, 2, 500, 501, 359, 360, 236, 237, 72, 64, 72, 64, 321, 2, 359, 360, 500, 501, 359, 360, 492, 493, 45, 46, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 325, 326, 325, 326, 238, 239, 429, 430, 494, 495, 631, 632, 238, 239, 3, 4, 502, 503, 361, 362, 238, 239, 69, 66, 69, 66, 322, 4, 361, 362, 502, 503, 361, 362, 494, 495, 47, 48, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 409, 410, 492, 493, 439, 440, 59, 60, 409, 410, 628, 629, 25, 26, 83, 84, 79, 80, 104, 84, 236, 237, 72, 64, 72, 64, 321, 2, 359, 360, 286, 287, 45, 46, 286, 287, 359, 360, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 615, 616, 5, 6, 5, 6, 607, 608, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 411, 412, 494, 495, 441, 442, 61, 62, 411, 412, 47, 48, 27, 28, 3, 85, 81, 82, 105, 106, 238, 239, 69, 66, 69, 66, 322, 4, 361, 362, 288, 289, 47, 48, 288, 289, 361, 362, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 617, 618, 7, 8, 7, 8, 609, 610, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 59, 60, 492, 493, 359, 360, 370, 371, 280, 281, 409, 410, 496, 497, 359, 360, 55, 56, 45, 46, 628, 629, 25, 26, 246, 237, 72, 64, 603, 604, 492, 493, 45, 46, 500, 501, 409, 410, 280, 281, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 359, 360, 359, 360, 45, 46, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 61, 62, 494, 495, 361, 362, 372, 373, 166, 282, 411, 412, 498, 499, 361, 362, 57, 58, 47, 48, 47, 48, 27, 28, 238, 239, 69, 66, 605, 606, 494, 495, 47, 48, 502, 503, 411, 412, 166, 282, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 361, 362, 361, 362, 47, 48, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 474, 475, 281, 46, 474, 475, 359, 360, 492, 493, 409, 410, 599, 600, 409, 410, 492, 493, 492, 493, 45, 46, 500, 501, 236, 237, 72, 64, 321, 2, 359, 360, 286, 287, 45, 46, 286, 287, 504, 505, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 45, 46, 286, 287, 280, 281, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 476, 477, 285, 48, 476, 477, 361, 362, 494, 495, 411, 412, 601, 602, 411, 412, 494, 495, 494, 495, 47, 48, 502, 503, 238, 239, 69, 66, 322, 4, 361, 362, 288, 289, 47, 48, 288, 289, 506, 507, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 47, 48, 288, 289, 166, 282, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 359, 360, 166, 284, 633, 46, 45, 46, 409, 410, 500, 501, 45, 46, 45, 46, 45, 46, 359, 360, 625, 46, 359, 360, 236, 237, 72, 64, 321, 2, 504, 505, 359, 360, 45, 46, 359, 360, 280, 281, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 45, 46, 45, 46, 45, 46, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 361, 362, 47, 48, 634, 635, 47, 48, 411, 412, 502, 503, 47, 48, 47, 48, 47, 48, 361, 362, 626, 627, 361, 362, 238, 239, 69, 66, 322, 4, 506, 507, 361, 362, 47, 48, 361, 362, 166, 282, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 47, 48, 47, 48, 47, 48, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 328, 14, 615, 616, 276, 277, 21, 22, 359, 360, 359, 360, 359, 360, 496, 497, 83, 84, 104, 84, 42, 406, 244, 241, 13, 14, 615, 616, 55, 56, 359, 360, 45, 46, 599, 600, 409, 410, 286, 287, 628, 629, 25, 26, 379, 380, 246, 237, 72, 64, 72, 64, 13, 14, 323, 324, 323, 324, 370, 371, 359, 360, 45, 46, 286, 287, 628, 629, 25, 26, 5, 6, 323, 324, 73, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 329, 330, 617, 618, 278, 279, 23, 24, 361, 362, 361, 362, 361, 362, 498, 499, 3, 85, 105, 106, 407, 408, 238, 239, 15, 16, 617, 618, 57, 58, 361, 362, 47, 48, 601, 602, 411, 412, 288, 289, 47, 48, 27, 28, 381, 382, 238, 239, 69, 66, 69, 66, 15, 16, 325, 326, 325, 326, 372, 373, 361, 362, 47, 48, 288, 289, 47, 48, 27, 28, 7, 8, 325, 326, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 409, 410, 628, 629, 25, 26, 607, 608, 323, 324, 615, 616, 244, 241, 335, 336, 280, 281, 45, 46, 236, 237, 256, 257, 359, 360, 359, 360, 359, 360, 166, 284, 359, 360, 359, 360, 496, 497, 409, 410, 496, 497, 622, 46, 236, 237, 72, 64, 72, 64, 1, 2, 359, 360, 500, 501, 492, 493, 409, 410, 504, 505, 45, 46, 492, 493, 496, 497, 500, 501, 359, 360, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 411, 412, 47, 48, 27, 28, 609, 610, 325, 326, 617, 618, 238, 239, 337, 338, 166, 282, 47, 48, 238, 239, 258, 259, 361, 362, 361, 362, 361, 362, 47, 48, 361, 362, 361, 362, 498, 499, 411, 412, 498, 499, 623, 624, 238, 239, 69, 66, 69, 66, 3, 4, 361, 362, 502, 503, 494, 495, 411, 412, 506, 507, 47, 48, 494, 495, 498, 499, 502, 503, 361, 362, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 359, 360, 359, 360, 166, 284, 492, 493, 474, 475, 504, 505, 13, 14, 25, 26, 323, 324, 244, 241, 70, 64, 252, 253, 45, 46, 286, 287, 409, 410, 286, 287, 283, 46, 45, 46, 496, 497, 45, 46, 286, 287, 619, 620, 49, 14, 615, 616, 5, 6, 272, 273, 496, 497, 13, 14, 5, 6, 5, 6, 5, 6, 21, 22, 359, 360, 286, 287, 359, 360, 409, 410, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 361, 362, 361, 362, 47, 48, 494, 495, 476, 477, 506, 507, 15, 16, 27, 28, 325, 326, 238, 239, 69, 66, 254, 255, 47, 48, 288, 289, 411, 412, 288, 289, 47, 48, 47, 48, 498, 499, 47, 48, 288, 289, 47, 621, 19, 50, 617, 618, 7, 8, 274, 275, 498, 499, 15, 16, 7, 8, 7, 8, 7, 8, 23, 24, 361, 362, 288, 289, 361, 362, 411, 412, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 630, 46, 45, 46, 45, 46, 474, 475, 286, 287, 45, 46, 321, 2, 359, 360, 630, 46, 236, 237, 72, 64, 248, 249, 409, 410, 409, 410, 630, 46, 283, 46, 504, 505, 630, 46, 359, 360, 492, 493, 45, 46, 619, 620, 272, 273, 633, 46, 619, 620, 402, 403, 166, 284, 1, 2, 317, 318, 525, 526, 45, 46, 1, 2, 500, 501, 45, 46, 496, 497, 492, 493, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 631, 632, 47, 48, 47, 48, 476, 477, 288, 289, 47, 48, 322, 4, 361, 362, 631, 632, 238, 239, 69, 66, 250, 251, 411, 412, 411, 412, 631, 632, 47, 48, 506, 507, 631, 632, 361, 362, 494, 495, 47, 48, 47, 621, 274, 275, 634, 635, 47, 621, 404, 405, 47, 48, 3, 4, 319, 320, 527, 528, 47, 48, 3, 4, 502, 503, 47, 48, 498, 499, 494, 495, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 5, 6, 49, 14, 5, 6, 374, 60, 409, 410, 45, 46, 504, 505, 359, 360, 484, 485, 359, 360, 628, 629, 25, 26, 246, 237, 1, 2, 359, 360, 286, 287, 628, 629, 417, 418, 359, 360, 628, 629, 51, 52, 45, 46, 286, 287, 628, 629, 33, 34, 276, 277, 42, 34, 327, 10, 359, 360, 1, 2, 525, 526, 166, 284, 45, 46, 75, 76, 366, 367, 492, 493, 359, 360, 281, 46, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 7, 8, 19, 50, 7, 8, 61, 62, 411, 412, 47, 48, 506, 507, 361, 362, 486, 487, 361, 362, 47, 48, 27, 28, 238, 239, 3, 4, 361, 362, 288, 289, 47, 48, 419, 420, 361, 362, 47, 48, 53, 54, 47, 48, 288, 289, 47, 48, 27, 35, 278, 279, 43, 44, 11, 12, 361, 362, 3, 4, 527, 528, 47, 48, 47, 48, 77, 78, 368, 369, 494, 495, 361, 362, 285, 48, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 619, 620, 272, 273, 359, 360, 359, 360, 359, 360, 492, 493, 286, 287, 474, 475, 359, 360, 409, 410, 409, 410, 359, 360, 236, 237, 1, 2, 492, 493, 496, 497, 496, 497, 504, 505, 504, 505, 45, 46, 359, 360, 492, 493, 492, 493, 359, 360, 359, 360, 281, 46, 45, 46, 45, 46, 630, 46, 1, 2, 504, 505, 359, 360, 496, 497, 1, 2, 359, 360, 281, 46, 409, 410, 500, 501, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 47, 621, 274, 275, 361, 362, 361, 362, 361, 362, 494, 495, 288, 289, 476, 477, 361, 362, 411, 412, 411, 412, 361, 362, 238, 239, 3, 4, 494, 495, 498, 499, 498, 499, 506, 507, 506, 507, 47, 48, 361, 362, 494, 495, 494, 495, 361, 362, 361, 362, 285, 48, 47, 48, 47, 48, 631, 632, 3, 4, 506, 507, 361, 362, 498, 499, 3, 4, 361, 362, 285, 48, 411, 412, 502, 503, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 619, 620, 402, 403, 359, 360, 500, 501, 359, 360, 492, 493, 45, 46, 359, 360, 45, 46, 359, 360, 283, 46, 45, 46, 236, 237, 603, 604, 280, 281, 286, 287, 630, 46, 45, 46, 492, 493, 630, 46, 359, 360, 492, 493, 286, 287, 622, 46, 625, 46, 633, 46, 625, 46, 359, 360, 628, 629, 25, 26, 5, 6, 5, 6, 5, 6, 9, 10, 45, 46, 504, 505, 286, 287, 45, 46, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 47, 621, 404, 405, 361, 362, 502, 503, 361, 362, 494, 495, 47, 48, 361, 362, 47, 48, 361, 362, 47, 48, 47, 48, 238, 239, 605, 606, 166, 282, 288, 289, 631, 632, 47, 48, 494, 495, 631, 632, 361, 362, 494, 495, 288, 289, 623, 624, 626, 627, 634, 635, 626, 627, 361, 362, 47, 48, 27, 28, 7, 8, 7, 8, 7, 8, 11, 12, 47, 48, 506, 507, 288, 289, 47, 48, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 335, 336, 359, 360, 409, 410, 45, 46, 359, 360, 83, 84, 104, 84, 79, 80, 244, 241, 70, 64, 427, 428, 409, 410, 500, 501, 628, 629, 417, 418, 280, 281, 628, 629, 366, 367, 409, 410, 283, 46, 619, 620, 389, 18, 276, 277, 357, 358, 29, 30, 359, 360, 359, 360, 628, 629, 51, 52, 45, 46, 628, 629, 366, 367, 359, 360, 359, 360, 492, 493, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 337, 338, 361, 362, 411, 412, 47, 48, 361, 362, 3, 85, 105, 106, 81, 82, 238, 239, 69, 66, 429, 430, 411, 412, 502, 503, 47, 48, 419, 420, 166, 282, 47, 48, 368, 369, 411, 412, 47, 48, 47, 621, 390, 20, 278, 279, 43, 44, 31, 32, 361, 362, 361, 362, 47, 48, 53, 54, 47, 48, 47, 48, 368, 369, 361, 362, 361, 362, 494, 495, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 339, 340, 615, 616, 379, 380, 5, 6, 607, 608, 370, 371, 409, 410, 359, 360, 236, 237, 72, 64, 603, 604, 45, 46, 286, 287, 474, 475, 166, 284, 500, 501, 496, 497, 359, 360, 359, 360, 409, 410, 619, 620, 402, 403, 500, 501, 619, 620, 402, 403, 496, 497, 359, 360, 359, 360, 280, 281, 492, 493, 504, 505, 504, 505, 359, 360, 504, 505, 359, 360, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 341, 342, 617, 618, 381, 382, 7, 8, 609, 610, 372, 373, 411, 412, 361, 362, 238, 239, 69, 66, 605, 606, 47, 48, 288, 289, 476, 477, 47, 48, 502, 503, 498, 499, 361, 362, 361, 362, 411, 412, 47, 621, 404, 405, 502, 503, 47, 621, 404, 405, 498, 499, 361, 362, 361, 362, 166, 282, 494, 495, 506, 507, 506, 507, 361, 362, 506, 507, 361, 362, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 359, 360, 359, 360, 359, 360, 409, 410, 281, 46, 496, 497, 492, 493, 474, 475, 236, 237, 72, 64, 375, 376, 45, 46, 496, 497, 359, 360, 286, 287, 166, 284, 474, 475, 409, 410, 504, 505, 286, 287, 496, 497, 244, 241, 240, 241, 240, 241, 335, 336, 496, 497, 504, 505, 286, 287, 496, 497, 286, 287, 359, 360, 359, 360, 286, 287, 359, 360, 409, 410, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 361, 362, 361, 362, 361, 362, 411, 412, 285, 48, 498, 499, 494, 495, 476, 477, 238, 239, 69, 66, 377, 378, 47, 48, 498, 499, 361, 362, 288, 289, 47, 48, 476, 477, 411, 412, 506, 507, 288, 289, 498, 499, 238, 239, 242, 239, 242, 239, 337, 338, 498, 499, 506, 507, 288, 289, 498, 499, 288, 289, 361, 362, 361, 362, 288, 289, 361, 362, 411, 412, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 409, 410, 286, 287, 359, 360, 286, 287, 283, 46, 496, 497, 359, 360, 496, 497, 236, 237, 72, 64, 603, 604, 359, 360, 359, 360, 492, 493, 359, 360, 492, 493, 496, 497, 45, 46, 622, 46, 504, 505, 630, 46, 236, 237, 72, 64, 72, 64, 321, 2, 409, 410, 280, 281, 359, 360, 504, 505, 45, 46, 359, 360, 492, 493, 409, 410, 359, 360, 359, 360, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 411, 412, 288, 289, 361, 362, 288, 289, 47, 48, 498, 499, 361, 362, 498, 499, 238, 239, 69, 66, 605, 606, 361, 362, 361, 362, 494, 495, 361, 362, 494, 495, 498, 499, 47, 48, 623, 624, 506, 507, 631, 632, 238, 239, 69, 66, 69, 66, 322, 4, 411, 412, 166, 282, 361, 362, 506, 507, 47, 48, 361, 362, 494, 495, 411, 412, 361, 362, 361, 362, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 280, 281, 500, 501, 359, 360, 281, 46, 504, 505, 286, 287, 409, 410, 492, 493, 236, 237, 72, 64, 247, 241, 240, 241, 13, 14, 79, 80, 268, 269, 264, 265, 260, 261, 323, 324, 615, 616, 413, 414, 5, 6, 393, 394, 5, 6, 323, 324, 339, 340, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 166, 282, 502, 503, 361, 362, 285, 48, 506, 507, 288, 289, 411, 412, 494, 495, 238, 239, 69, 66, 242, 239, 242, 239, 15, 16, 81, 82, 270, 271, 266, 267, 262, 263, 325, 326, 617, 618, 415, 416, 7, 8, 395, 396, 7, 8, 325, 326, 341, 342, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 427, 428, 359, 360, 504, 505, 45, 46, 359, 360, 359, 360, 281, 46, 504, 505, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 1, 2, 474, 475, 500, 501, 504, 505, 474, 475, 409, 410, 619, 620, 272, 273, 359, 360, 166, 284, 283, 46, 45, 46, 45, 46, 236, 237, 72, 64, 328, 14, 323, 324, 379, 380, 607, 608, 268, 269, 264, 265, 260, 261, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 429, 430, 361, 362, 506, 507, 47, 48, 361, 362, 361, 362, 285, 48, 506, 507, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 3, 4, 476, 477, 502, 503, 506, 507, 476, 477, 411, 412, 47, 621, 274, 275, 361, 362, 47, 48, 47, 48, 47, 48, 47, 48, 238, 239, 69, 66, 329, 330, 325, 326, 381, 382, 609, 610, 270, 271, 266, 267, 262, 263, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 323, 324, 393, 394, 13, 14, 79, 80, 268, 269, 264, 265, 260, 261, 328, 14, 5, 6, 5, 6, 246, 237, 13, 14, 607, 608, 323, 324, 21, 22, 500, 501, 359, 360, 286, 287, 359, 360, 286, 287, 619, 620, 402, 403, 359, 360, 286, 287, 45, 46, 599, 600, 359, 360, 236, 237, 72, 64, 1, 2, 504, 505, 45, 46, 45, 46, 359, 360, 504, 505, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 325, 326, 395, 396, 15, 16, 81, 82, 270, 271, 266, 267, 262, 263, 329, 330, 7, 8, 7, 8, 238, 239, 15, 16, 609, 610, 325, 326, 23, 24, 502, 503, 361, 362, 288, 289, 361, 362, 288, 289, 47, 621, 404, 405, 361, 362, 288, 289, 47, 48, 601, 602, 361, 362, 238, 239, 69, 66, 3, 4, 506, 507, 47, 48, 47, 48, 361, 362, 506, 507, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 359, 360, 45, 46, 375, 376, 409, 410, 359, 360, 45, 46, 492, 493, 1, 2, 492, 493, 630, 46, 236, 237, 321, 2, 500, 501, 359, 360, 256, 257, 500, 501, 359, 360, 409, 410, 359, 360, 166, 284, 619, 620, 272, 273, 359, 360, 359, 360, 45, 46, 359, 360, 500, 501, 236, 237, 72, 64, 611, 612, 504, 505, 286, 287, 474, 475, 359, 360, 286, 287, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 361, 362, 47, 48, 377, 378, 411, 412, 361, 362, 47, 48, 494, 495, 3, 4, 494, 495, 631, 632, 238, 239, 322, 4, 502, 503, 361, 362, 258, 259, 502, 503, 361, 362, 411, 412, 361, 362, 47, 48, 47, 621, 274, 275, 361, 362, 361, 362, 47, 48, 361, 362, 502, 503, 238, 239, 69, 66, 613, 614, 506, 507, 288, 289, 476, 477, 361, 362, 288, 289, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 423, 424, 409, 410, 359, 360, 55, 56, 492, 493, 286, 287, 281, 46, 359, 360, 370, 371, 359, 360, 628, 629, 25, 26, 21, 22, 359, 360, 359, 360, 252, 253, 359, 360, 281, 592, 359, 360, 496, 497, 286, 287, 619, 620, 39, 40, 45, 46, 359, 360, 496, 497, 409, 410, 359, 360, 236, 237, 72, 64, 1, 2, 504, 505, 409, 410, 500, 501, 45, 46, 409, 410, 166, 284, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 425, 426, 411, 412, 361, 362, 57, 58, 494, 495, 288, 289, 285, 48, 361, 362, 372, 373, 361, 362, 47, 48, 27, 28, 23, 24, 361, 362, 361, 362, 254, 255, 361, 362, 593, 594, 361, 362, 498, 499, 288, 289, 47, 621, 31, 41, 47, 48, 361, 362, 498, 499, 411, 412, 361, 362, 238, 239, 69, 66, 3, 4, 506, 507, 411, 412, 502, 503, 47, 48, 411, 412, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 359, 360, 409, 410, 504, 505, 359, 360, 359, 360, 504, 505, 359, 360, 281, 46, 45, 46, 504, 505, 45, 46, 359, 360, 1, 2, 500, 501, 492, 493, 531, 249, 496, 497, 504, 505, 45, 46, 359, 360, 492, 493, 409, 410, 244, 241, 83, 84, 104, 84, 79, 80, 244, 241, 240, 241, 70, 64, 72, 64, 1, 2, 45, 46, 359, 360, 280, 281, 45, 46, 286, 287, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 361, 362, 411, 412, 506, 507, 361, 362, 361, 362, 506, 507, 361, 362, 285, 48, 47, 48, 506, 507, 47, 48, 361, 362, 3, 4, 502, 503, 494, 495, 532, 251, 498, 499, 506, 507, 47, 48, 361, 362, 494, 495, 411, 412, 238, 239, 3, 85, 105, 106, 81, 82, 238, 239, 242, 239, 69, 66, 69, 66, 3, 4, 47, 48, 361, 362, 166, 282, 47, 48, 288, 289, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 359, 360, 45, 46, 359, 360, 283, 46, 500, 501, 286, 287, 409, 410, 409, 410, 474, 475, 166, 284, 500, 501, 45, 46, 603, 604, 409, 410, 633, 46, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 603, 604, 281, 46, 45, 46, 13, 14, 268, 269, 264, 265, 550, 551, 55, 56, 45, 46, 492, 493, 45, 46, 45, 46, 496, 497, 409, 410, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 361, 362, 47, 48, 361, 362, 47, 48, 502, 503, 288, 289, 411, 412, 411, 412, 476, 477, 47, 48, 502, 503, 47, 48, 605, 606, 411, 412, 634, 635, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 605, 606, 285, 48, 47, 48, 15, 16, 270, 271, 266, 267, 266, 267, 57, 58, 47, 48, 494, 495, 148, 48, 47, 48, 498, 499, 411, 412, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 13, 14, 79, 80, 5, 6, 391, 22, 474, 475, 359, 360, 45, 46, 496, 497, 13, 14, 5, 6, 79, 80, 244, 241, 83, 84, 104, 84, 276, 277, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 580, 581, 45, 46, 256, 257, 504, 505, 359, 360, 409, 410, 500, 501, 504, 505, 133, 134, 144, 145, 496, 497, 359, 360, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 15, 16, 81, 82, 7, 8, 392, 24, 476, 477, 361, 362, 47, 48, 498, 499, 15, 16, 7, 8, 81, 82, 238, 239, 3, 85, 105, 106, 278, 279, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 582, 583, 47, 48, 258, 259, 506, 507, 361, 362, 411, 412, 502, 503, 506, 507, 135, 130, 146, 147, 498, 499, 361, 362, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 45, 46, 45, 46, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 21, 22, 359, 360, 409, 410, 439, 440, 59, 60, 45, 46, 628, 629, 450, 451, 5, 6, 5, 6, 246, 237, 72, 64, 176, 177, 246, 237, 72, 64, 1, 2, 409, 410, 359, 360, 252, 253, 359, 360, 286, 287, 166, 284, 45, 46, 409, 410, 129, 130, 140, 141, 359, 360, 359, 360, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 47, 48, 47, 48, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 23, 24, 361, 362, 411, 412, 441, 442, 61, 62, 47, 48, 47, 48, 452, 453, 7, 8, 7, 8, 238, 239, 69, 66, 178, 179, 238, 239, 69, 66, 3, 4, 411, 412, 361, 362, 254, 255, 361, 362, 288, 289, 47, 48, 47, 48, 411, 412, 131, 132, 142, 143, 361, 362, 361, 362, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 446, 447, 45, 46, 409, 410, 359, 360, 359, 360, 492, 493, 45, 46, 236, 237, 72, 64, 172, 173, 236, 237, 72, 64, 1, 2, 359, 360, 492, 493, 248, 249, 359, 360, 409, 410, 283, 46, 492, 493, 46, 123, 125, 126, 136, 137, 474, 475, 359, 360, 474, 475, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 448, 449, 47, 48, 411, 412, 361, 362, 361, 362, 494, 495, 47, 48, 238, 239, 69, 66, 174, 175, 238, 239, 69, 66, 3, 4, 361, 362, 494, 495, 250, 251, 361, 362, 411, 412, 47, 48, 494, 495, 48, 124, 127, 128, 138, 139, 476, 477, 361, 362, 476, 477, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 409, 410, 280, 281, 500, 501, 359, 360, 492, 493, 359, 360, 13, 14, 180, 181, 184, 185, 188, 189, 5, 6, 421, 56, 492, 493, 492, 493, 55, 56, 409, 410, 286, 287, 496, 497, 45, 46, 492, 493, 359, 360, 504, 505, 496, 497, 45, 46, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 411, 412, 166, 282, 502, 503, 361, 362, 494, 495, 361, 362, 15, 16, 182, 183, 186, 187, 190, 191, 7, 8, 422, 58, 494, 495, 494, 495, 57, 58, 411, 412, 288, 289, 498, 499, 47, 48, 494, 495, 361, 362, 506, 507, 498, 499, 47, 48, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 335, 336, 283, 46, 286, 287, 409, 410, 603, 604, 192, 193, 196, 197, 200, 201, 280, 281, 45, 46, 409, 410, 409, 410, 283, 46, 45, 46, 359, 360, 584, 585, 500, 501, 359, 360, 45, 46, 45, 46, 280, 281, 45, 46, 409, 410, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 337, 338, 47, 48, 288, 289, 411, 412, 605, 606, 194, 195, 198, 199, 202, 203, 166, 282, 47, 48, 411, 412, 411, 412, 47, 48, 47, 48, 361, 362, 586, 587, 502, 503, 361, 362, 47, 48, 47, 48, 166, 282, 47, 48, 411, 412, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 281, 46, 45, 46, 359, 360, 75, 76, 504, 505, 492, 493, 280, 281, 496, 497, 409, 410, 45, 46, 474, 475, 359, 360, 409, 410, 45, 46, 359, 360, 359, 360, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 285, 48, 47, 48, 361, 362, 77, 78, 506, 507, 494, 495, 166, 282, 498, 499, 411, 412, 47, 48, 476, 477, 361, 362, 411, 412, 47, 48, 361, 362, 361, 362, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":641, + "image":"11.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"11", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/crypt1/l5s.json b/gamefileshf/level/crypt1/l5s.json new file mode 100755 index 00000000..2a8bc236 --- /dev/null +++ b/gamefileshf/level/crypt1/l5s.json @@ -0,0 +1,11 @@ +{ + "texturePack": { + "id": "l5s", + "file": "Nlevels/L5Data/L5S.CEL", + "imageContainer": "l5s", + "palette": "{1}", + "textureIndexes": [ + [9999, 0], + ] + } +} \ No newline at end of file diff --git a/gamefileshf/level/crypt1/level.json b/gamefileshf/level/crypt1/level.json new file mode 100755 index 00000000..9696e112 --- /dev/null +++ b/gamefileshf/level/crypt1/level.json @@ -0,0 +1,33 @@ +{ + "variable": [ + { "colorCycleSpeed": 120 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 16 } + ], + "palette": [ + { + "id": "l5base", + "file": "Nlevels/L5Data/L5Base.PAL" + }, + { + "id": "colorCycle", + "fromId": "l5base" + } + ], + "load": ["level/crypt1/l5s.json", "l5base"], + "level": { + "id": "level", + "palette": "l5base", + "file": "Nlevels/L5Data/L5.CEL", + "layers": { "index": 2, "texturePack": "l5s" }, + "outOfBoundsTileLayer2": 21, + "til": "Nlevels/L5Data/L5.TIL", + "min": "Nlevels/L5Data/L5.MIN", + "minBlocks": 10, + "sol": "Nlevels/L5Data/L5.SOL" + }, + "load": "level/automap/l5/load.json", + "load": "level/crypt1/levelObjects.json", + "load": "level/crypt1/monsters.json", + "load": "level/crypt1/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt1/level2.json b/gamefileshf/level/crypt1/level2.json new file mode 100755 index 00000000..d87ab0c5 --- /dev/null +++ b/gamefileshf/level/crypt1/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "crypt1", + "name": "Crypt 1", + "map": { "file": "level/crypt1/crypt1.json", "indexOffset": -1 } + }, + "load": "level/crypt1/levelObjects2.json", + "load": "level/crypt1/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt1/levelObjects2.json b/gamefileshf/level/crypt1/levelObjects2.json new file mode 100755 index 00000000..8f6ec4bb --- /dev/null +++ b/gamefileshf/level/crypt1/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDownCrypt", + "mapPosition": [83, 84], + "properties": { + "x": 87, + "y": 52, + "level": 2 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [58, 85], + "properties": { + "x": 36, + "y": 25, + "level": 0 + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/crypt1/music.json b/gamefileshf/level/crypt1/music.json new file mode 100755 index 00000000..d26cdce6 --- /dev/null +++ b/gamefileshf/level/crypt1/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlE.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/crypt1/townToLevel.json b/gamefileshf/level/crypt1/townToLevel.json new file mode 100755 index 00000000..1182d129 --- /dev/null +++ b/gamefileshf/level/crypt1/townToLevel.json @@ -0,0 +1,11 @@ +{ + "levelObject": { + "id": "crypt", + "class": "levelCrypt", + "mapPosition": [37, 23], + "properties": { + "x": 59, + "y": 86 + } + } +} \ No newline at end of file diff --git a/gamefileshf/level/crypt2/crypt2.json b/gamefileshf/level/crypt2/crypt2.json new file mode 100755 index 00000000..18a89dc1 --- /dev/null +++ b/gamefileshf/level/crypt2/crypt2.json @@ -0,0 +1,171 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 268, 269, 264, 265, 544, 545, 5, 6, 268, 269, 264, 265, 260, 261, 5, 6, 328, 14, 323, 324, 323, 324, 607, 608, 268, 269, 264, 265, 546, 547, 615, 616, 615, 616, 323, 324, 379, 380, 328, 14, 431, 432, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 270, 271, 266, 267, 262, 263, 7, 8, 270, 271, 266, 267, 262, 263, 7, 8, 329, 330, 325, 326, 325, 326, 609, 610, 270, 271, 266, 267, 548, 549, 617, 618, 617, 618, 325, 326, 381, 382, 329, 330, 433, 434, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 45, 46, 500, 501, 409, 410, 492, 493, 45, 46, 492, 493, 45, 46, 492, 493, 256, 257, 492, 493, 45, 46, 504, 505, 496, 497, 496, 497, 500, 501, 492, 493, 500, 501, 45, 46, 504, 505, 256, 257, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 47, 48, 502, 503, 411, 412, 494, 495, 47, 48, 494, 495, 47, 48, 494, 495, 258, 259, 494, 495, 47, 48, 506, 507, 498, 499, 498, 499, 502, 503, 494, 495, 502, 503, 47, 48, 506, 507, 258, 259, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 496, 497, 286, 287, 500, 501, 286, 287, 496, 497, 286, 287, 359, 360, 409, 410, 252, 253, 504, 505, 504, 505, 492, 493, 409, 410, 286, 287, 166, 284, 286, 287, 500, 501, 599, 600, 280, 281, 252, 253, 492, 493, 504, 505, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 387, 14, 323, 324, 615, 616, 73, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 498, 499, 288, 289, 502, 503, 288, 289, 498, 499, 288, 289, 361, 362, 411, 412, 254, 255, 506, 507, 506, 507, 494, 495, 411, 412, 288, 289, 47, 48, 288, 289, 502, 503, 601, 602, 166, 282, 254, 255, 494, 495, 506, 507, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 388, 16, 325, 326, 617, 618, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 492, 493, 500, 501, 492, 493, 492, 493, 474, 475, 45, 46, 504, 505, 492, 493, 248, 249, 492, 493, 286, 287, 630, 46, 280, 281, 504, 505, 630, 46, 496, 497, 500, 501, 359, 360, 492, 493, 248, 249, 409, 410, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 474, 475, 504, 505, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 494, 495, 502, 503, 494, 495, 494, 495, 476, 477, 47, 48, 506, 507, 494, 495, 250, 251, 494, 495, 288, 289, 631, 632, 166, 282, 506, 507, 631, 632, 498, 499, 502, 503, 361, 362, 494, 495, 250, 251, 411, 412, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 476, 477, 506, 507, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 584, 585, 500, 501, 166, 284, 359, 360, 492, 493, 359, 360, 286, 287, 584, 585, 370, 371, 492, 493, 474, 475, 628, 629, 51, 52, 45, 46, 628, 629, 576, 577, 45, 46, 573, 574, 496, 497, 421, 56, 496, 497, 628, 629, 25, 26, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 45, 46, 573, 574, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 586, 587, 502, 503, 47, 48, 361, 362, 494, 495, 361, 362, 288, 289, 586, 587, 372, 373, 494, 495, 476, 477, 47, 48, 53, 54, 47, 48, 47, 48, 578, 579, 47, 48, 575, 282, 498, 499, 422, 58, 498, 499, 47, 48, 27, 28, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 47, 48, 575, 282, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 13, 14, 323, 324, 5, 6, 21, 22, 496, 497, 496, 497, 283, 46, 504, 505, 45, 46, 286, 287, 504, 505, 409, 410, 504, 505, 492, 493, 492, 493, 166, 284, 492, 493, 45, 46, 504, 505, 569, 570, 409, 410, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 504, 505, 504, 505, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 15, 16, 325, 326, 7, 8, 23, 24, 498, 499, 498, 499, 47, 48, 506, 507, 47, 48, 288, 289, 506, 507, 411, 412, 506, 507, 494, 495, 494, 495, 47, 48, 494, 495, 47, 48, 506, 507, 571, 572, 411, 412, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 506, 507, 506, 507, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 496, 497, 45, 46, 1, 2, 283, 46, 492, 493, 45, 46, 45, 46, 166, 284, 45, 46, 630, 46, 504, 505, 492, 493, 630, 46, 359, 360, 492, 493, 286, 287, 573, 574, 496, 497, 492, 493, 409, 410, 630, 46, 236, 237, 72, 64, 72, 64, 328, 14, 268, 269, 264, 265, 260, 261, 370, 371, 359, 360, 504, 505, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 498, 499, 47, 48, 3, 4, 47, 48, 494, 495, 47, 48, 47, 48, 47, 48, 47, 48, 631, 632, 506, 507, 494, 495, 631, 632, 361, 362, 494, 495, 288, 289, 575, 282, 498, 499, 494, 495, 411, 412, 631, 632, 238, 239, 69, 66, 69, 66, 329, 330, 270, 271, 266, 267, 262, 263, 372, 373, 361, 362, 506, 507, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 323, 324, 55, 56, 496, 497, 500, 501, 13, 14, 59, 60, 45, 46, 280, 281, 21, 22, 45, 46, 281, 592, 628, 629, 417, 418, 492, 493, 628, 629, 366, 367, 280, 281, 496, 497, 492, 493, 83, 84, 104, 84, 79, 80, 387, 14, 25, 26, 379, 380, 323, 324, 55, 56, 45, 46, 492, 493, 492, 493, 359, 360, 492, 493, 283, 46, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 325, 326, 57, 58, 498, 499, 502, 503, 15, 16, 61, 62, 47, 48, 166, 282, 23, 24, 47, 48, 593, 594, 47, 48, 419, 420, 494, 495, 47, 48, 368, 369, 166, 282, 498, 499, 494, 495, 3, 85, 105, 106, 81, 82, 388, 16, 27, 28, 381, 382, 325, 326, 57, 58, 47, 48, 494, 495, 494, 495, 361, 362, 494, 495, 47, 48, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 409, 410, 281, 46, 492, 493, 45, 46, 375, 376, 359, 360, 409, 410, 359, 360, 1, 2, 281, 46, 45, 46, 45, 46, 504, 505, 496, 497, 500, 501, 280, 281, 492, 493, 286, 287, 166, 284, 321, 2, 166, 284, 496, 497, 1, 2, 45, 46, 359, 360, 500, 501, 45, 46, 45, 46, 492, 493, 496, 497, 286, 287, 281, 46, 492, 493, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 411, 412, 285, 48, 494, 495, 47, 48, 377, 378, 361, 362, 411, 412, 361, 362, 3, 4, 285, 48, 47, 48, 47, 48, 506, 507, 498, 499, 502, 503, 166, 282, 494, 495, 288, 289, 47, 48, 322, 4, 47, 48, 498, 499, 3, 4, 47, 48, 361, 362, 502, 503, 47, 48, 47, 48, 494, 495, 498, 499, 288, 289, 285, 48, 494, 495, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 268, 269, 264, 265, 555, 556, 55, 56, 500, 501, 45, 46, 286, 287, 504, 505, 75, 76, 359, 360, 500, 501, 409, 410, 375, 376, 500, 501, 595, 596, 45, 46, 286, 287, 281, 46, 286, 287, 166, 284, 45, 46, 504, 505, 474, 475, 427, 428, 500, 501, 500, 501, 321, 2, 504, 505, 286, 287, 409, 410, 359, 360, 286, 287, 500, 501, 492, 493, 409, 410, 45, 46, 45, 46, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 270, 271, 266, 267, 270, 271, 57, 58, 502, 503, 47, 48, 288, 289, 506, 507, 77, 78, 361, 362, 502, 503, 411, 412, 377, 378, 502, 503, 597, 598, 47, 48, 288, 289, 285, 48, 288, 289, 47, 48, 47, 48, 506, 507, 476, 477, 429, 430, 502, 503, 502, 503, 322, 4, 506, 507, 288, 289, 411, 412, 361, 362, 288, 289, 502, 503, 494, 495, 411, 412, 47, 48, 47, 48, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 539, 540, 492, 493, 359, 360, 45, 46, 281, 46, 45, 46, 492, 493, 492, 493, 492, 493, 244, 241, 335, 336, 45, 46, 45, 46, 611, 612, 409, 410, 625, 46, 633, 46, 496, 497, 45, 46, 622, 46, 625, 46, 625, 46, 500, 501, 280, 281, 55, 56, 45, 46, 281, 46, 55, 56, 45, 46, 496, 497, 504, 505, 280, 281, 359, 360, 280, 281, 496, 497, 45, 46, 492, 493, 280, 281, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 541, 259, 494, 495, 361, 362, 47, 48, 285, 48, 47, 48, 494, 495, 494, 495, 494, 495, 238, 239, 337, 338, 47, 48, 47, 48, 613, 614, 411, 412, 626, 627, 634, 635, 498, 499, 47, 48, 623, 624, 626, 627, 626, 627, 502, 503, 166, 282, 57, 58, 47, 48, 285, 48, 57, 58, 47, 48, 498, 499, 506, 507, 166, 282, 361, 362, 166, 282, 498, 499, 47, 48, 494, 495, 166, 282, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 496, 497, 500, 501, 599, 600, 500, 501, 599, 600, 281, 46, 45, 46, 166, 284, 236, 237, 247, 241, 240, 241, 240, 241, 247, 241, 240, 241, 351, 352, 276, 277, 343, 344, 500, 501, 619, 620, 17, 18, 357, 358, 244, 241, 446, 447, 492, 493, 496, 497, 409, 410, 504, 505, 45, 46, 409, 410, 500, 501, 500, 501, 244, 241, 240, 241, 240, 241, 13, 14, 615, 616, 79, 80, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 498, 499, 502, 503, 601, 602, 502, 503, 601, 602, 285, 48, 47, 48, 47, 48, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 353, 354, 278, 279, 345, 346, 502, 503, 47, 621, 19, 20, 43, 44, 238, 239, 448, 449, 494, 495, 498, 499, 411, 412, 506, 507, 47, 48, 411, 412, 502, 503, 502, 503, 238, 239, 242, 239, 242, 239, 15, 16, 617, 618, 81, 82, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 45, 46, 504, 505, 359, 360, 504, 505, 45, 46, 496, 497, 244, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 619, 620, 272, 273, 492, 493, 619, 620, 272, 273, 504, 505, 236, 237, 375, 376, 496, 497, 45, 46, 630, 46, 166, 284, 496, 497, 286, 287, 504, 505, 280, 281, 236, 237, 72, 64, 72, 64, 1, 2, 496, 497, 280, 281, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 47, 48, 506, 507, 361, 362, 506, 507, 47, 48, 498, 499, 238, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 47, 621, 274, 275, 494, 495, 47, 621, 274, 275, 506, 507, 238, 239, 377, 378, 498, 499, 47, 48, 631, 632, 47, 48, 498, 499, 288, 289, 506, 507, 166, 282, 238, 239, 69, 66, 69, 66, 3, 4, 498, 499, 166, 282, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 492, 493, 359, 360, 286, 287, 166, 284, 286, 287, 492, 493, 328, 14, 323, 324, 323, 324, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 619, 620, 559, 273, 504, 505, 619, 620, 402, 403, 504, 505, 236, 237, 439, 440, 268, 269, 264, 265, 260, 261, 59, 60, 166, 284, 492, 493, 45, 46, 45, 46, 236, 237, 72, 64, 72, 64, 321, 2, 359, 360, 496, 497, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 494, 495, 361, 362, 288, 289, 47, 48, 288, 289, 494, 495, 329, 330, 325, 326, 325, 326, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 47, 621, 560, 275, 506, 507, 47, 621, 404, 405, 506, 507, 238, 239, 441, 442, 270, 271, 266, 267, 262, 263, 61, 62, 47, 48, 494, 495, 47, 48, 47, 48, 238, 239, 69, 66, 69, 66, 322, 4, 361, 362, 498, 499, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 504, 505, 359, 360, 359, 360, 409, 410, 496, 497, 500, 501, 611, 612, 166, 284, 283, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 619, 620, 272, 273, 496, 497, 619, 620, 39, 40, 280, 281, 236, 237, 375, 376, 359, 360, 504, 505, 492, 493, 281, 46, 359, 360, 595, 596, 409, 410, 359, 360, 236, 237, 72, 64, 72, 64, 611, 612, 280, 281, 496, 497, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 506, 507, 361, 362, 361, 362, 411, 412, 498, 499, 502, 503, 613, 614, 47, 48, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 47, 621, 274, 275, 498, 499, 47, 621, 31, 41, 166, 282, 238, 239, 377, 378, 361, 362, 506, 507, 494, 495, 285, 48, 361, 362, 597, 598, 411, 412, 361, 362, 238, 239, 69, 66, 69, 66, 613, 614, 166, 282, 498, 499, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 409, 410, 283, 46, 45, 46, 625, 46, 45, 46, 496, 497, 321, 2, 492, 493, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 619, 620, 39, 40, 359, 360, 619, 620, 272, 273, 504, 505, 236, 237, 1, 2, 504, 505, 504, 505, 283, 46, 45, 46, 504, 505, 496, 497, 504, 505, 280, 281, 236, 237, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 411, 412, 47, 48, 47, 48, 626, 627, 47, 48, 498, 499, 322, 4, 494, 495, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 47, 621, 31, 41, 361, 362, 47, 621, 274, 275, 506, 507, 238, 239, 3, 4, 506, 507, 506, 507, 47, 48, 47, 48, 506, 507, 498, 499, 506, 507, 166, 282, 238, 239, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 83, 84, 104, 84, 42, 406, 244, 241, 240, 241, 439, 440, 5, 6, 79, 80, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 619, 620, 272, 273, 496, 497, 619, 620, 355, 40, 280, 281, 236, 237, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 151, 152, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 3, 85, 105, 106, 407, 408, 238, 239, 242, 239, 441, 442, 7, 8, 81, 82, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 47, 621, 274, 275, 498, 499, 47, 621, 356, 41, 166, 282, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 153, 130, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 280, 281, 45, 46, 387, 14, 5, 6, 55, 56, 45, 46, 628, 629, 25, 26, 5, 6, 246, 237, 72, 64, 72, 64, 1, 2, 619, 620, 39, 40, 359, 360, 619, 620, 272, 273, 496, 497, 236, 237, 13, 14, 268, 269, 264, 265, 260, 261, 431, 432, 615, 616, 431, 432, 323, 324, 615, 616, 246, 237, 72, 64, 149, 130, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 166, 282, 47, 48, 388, 16, 7, 8, 57, 58, 47, 48, 47, 48, 27, 28, 7, 8, 238, 239, 69, 66, 69, 66, 3, 4, 47, 621, 31, 41, 361, 362, 47, 621, 274, 275, 498, 499, 238, 239, 15, 16, 270, 271, 266, 267, 262, 263, 433, 434, 617, 618, 433, 434, 325, 326, 617, 618, 238, 239, 69, 66, 150, 130, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 500, 501, 500, 501, 611, 612, 359, 360, 45, 46, 45, 46, 496, 497, 45, 46, 622, 46, 236, 237, 72, 64, 72, 64, 256, 257, 619, 620, 272, 273, 409, 410, 619, 620, 559, 273, 280, 281, 236, 237, 1, 2, 359, 360, 492, 493, 45, 46, 492, 493, 496, 497, 280, 281, 409, 410, 504, 505, 328, 14, 154, 155, 158, 159, 162, 163, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 502, 503, 502, 503, 613, 614, 361, 362, 47, 48, 47, 48, 498, 499, 47, 48, 623, 624, 238, 239, 69, 66, 69, 66, 258, 259, 47, 621, 274, 275, 411, 412, 47, 621, 560, 275, 166, 282, 238, 239, 3, 4, 361, 362, 494, 495, 47, 48, 494, 495, 498, 499, 166, 282, 411, 412, 506, 507, 329, 330, 156, 157, 160, 161, 164, 165, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 439, 440, 5, 6, 323, 324, 370, 371, 281, 46, 504, 505, 370, 371, 359, 360, 281, 592, 45, 46, 599, 600, 45, 46, 619, 620, 49, 14, 379, 380, 246, 237, 533, 253, 619, 620, 39, 40, 500, 501, 619, 620, 272, 273, 496, 497, 236, 237, 1, 2, 45, 46, 283, 46, 500, 501, 504, 505, 280, 281, 492, 493, 286, 287, 492, 493, 421, 56, 166, 167, 168, 169, 170, 171, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 441, 442, 7, 8, 325, 326, 372, 373, 285, 48, 506, 507, 372, 373, 361, 362, 593, 594, 47, 48, 601, 602, 47, 48, 47, 621, 19, 50, 381, 382, 238, 239, 534, 255, 47, 621, 31, 41, 502, 503, 47, 621, 274, 275, 498, 499, 238, 239, 3, 4, 47, 48, 47, 48, 502, 503, 506, 507, 166, 282, 494, 495, 288, 289, 494, 495, 422, 58, 47, 48, 47, 48, 47, 48, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 504, 505, 500, 501, 45, 46, 492, 493, 283, 46, 45, 46, 492, 493, 500, 501, 283, 46, 45, 46, 45, 46, 619, 620, 272, 273, 496, 497, 236, 237, 248, 249, 619, 620, 272, 273, 496, 497, 619, 620, 355, 40, 504, 505, 236, 237, 247, 241, 240, 241, 240, 241, 335, 336, 500, 501, 496, 497, 359, 360, 492, 493, 580, 581, 45, 46, 500, 501, 496, 497, 359, 360, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 506, 507, 502, 503, 47, 48, 494, 495, 47, 48, 47, 48, 494, 495, 502, 503, 47, 48, 47, 48, 47, 48, 47, 621, 274, 275, 498, 499, 238, 239, 250, 251, 47, 621, 274, 275, 498, 499, 47, 621, 356, 41, 506, 507, 238, 239, 242, 239, 242, 239, 242, 239, 337, 338, 502, 503, 498, 499, 361, 362, 494, 495, 582, 583, 47, 48, 502, 503, 498, 499, 361, 362, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 359, 360, 492, 493, 45, 46, 504, 505, 359, 360, 496, 497, 500, 501, 280, 281, 409, 410, 625, 46, 633, 46, 619, 620, 402, 403, 45, 46, 236, 237, 321, 2, 619, 620, 39, 40, 496, 497, 619, 620, 272, 273, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 1, 2, 283, 46, 492, 493, 45, 46, 500, 501, 359, 360, 580, 581, 492, 493, 281, 592, 565, 566, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 361, 362, 494, 495, 47, 48, 506, 507, 361, 362, 498, 499, 502, 503, 166, 282, 411, 412, 626, 627, 634, 635, 47, 621, 404, 405, 47, 48, 238, 239, 322, 4, 47, 621, 31, 41, 498, 499, 47, 621, 274, 275, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 3, 4, 47, 48, 494, 495, 47, 48, 502, 503, 361, 362, 582, 583, 494, 495, 593, 594, 567, 568, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 387, 14, 79, 80, 5, 6, 244, 241, 36, 37, 276, 277, 42, 406, 244, 241, 240, 241, 70, 64, 611, 612, 619, 620, 272, 273, 492, 493, 619, 620, 355, 40, 409, 410, 236, 237, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 13, 14, 323, 324, 379, 380, 21, 22, 359, 360, 45, 46, 625, 46, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 388, 16, 81, 82, 7, 8, 238, 239, 15, 38, 278, 279, 407, 408, 238, 239, 242, 239, 69, 66, 613, 614, 47, 621, 274, 275, 494, 495, 47, 621, 356, 41, 411, 412, 238, 239, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 15, 16, 325, 326, 381, 382, 23, 24, 361, 362, 47, 48, 626, 627, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 59, 60, 45, 46, 628, 629, 25, 26, 446, 447, 45, 46, 492, 493, 236, 237, 72, 64, 72, 64, 321, 2, 619, 620, 355, 40, 409, 410, 619, 620, 272, 273, 409, 410, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 359, 360, 630, 46, 244, 241, 328, 14, 323, 324, 42, 406, 244, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 61, 62, 47, 48, 47, 48, 27, 28, 448, 449, 47, 48, 494, 495, 238, 239, 69, 66, 69, 66, 322, 4, 47, 621, 356, 41, 411, 412, 47, 621, 274, 275, 411, 412, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 361, 362, 631, 632, 238, 239, 329, 330, 325, 326, 407, 408, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 496, 497, 45, 46, 359, 360, 45, 46, 244, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 256, 257, 619, 620, 272, 273, 492, 493, 619, 620, 355, 40, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 565, 566, 628, 629, 339, 340, 55, 56, 283, 46, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 498, 499, 47, 48, 361, 362, 47, 48, 238, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 258, 259, 47, 621, 274, 275, 494, 495, 47, 621, 356, 41, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 567, 568, 47, 48, 341, 342, 57, 58, 47, 48, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 500, 501, 286, 287, 492, 493, 565, 566, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 533, 253, 619, 620, 559, 273, 45, 46, 619, 620, 272, 273, 409, 410, 236, 237, 72, 64, 72, 64, 13, 14, 379, 380, 5, 6, 246, 237, 1, 2, 504, 505, 492, 493, 45, 46, 500, 501, 45, 46, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 502, 503, 288, 289, 494, 495, 567, 568, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 534, 255, 47, 621, 560, 275, 47, 48, 47, 621, 274, 275, 411, 412, 238, 239, 69, 66, 69, 66, 15, 16, 381, 382, 7, 8, 238, 239, 3, 4, 506, 507, 494, 495, 148, 48, 502, 503, 47, 48, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 45, 46, 500, 501, 500, 501, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 619, 620, 272, 273, 474, 475, 619, 620, 39, 40, 496, 497, 236, 237, 72, 64, 72, 64, 611, 612, 166, 284, 619, 620, 49, 14, 370, 371, 359, 360, 133, 134, 144, 145, 500, 501, 286, 287, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 47, 48, 502, 503, 502, 503, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 47, 621, 274, 275, 476, 477, 47, 621, 31, 41, 498, 499, 238, 239, 69, 66, 69, 66, 613, 614, 47, 48, 47, 621, 19, 50, 372, 373, 361, 362, 135, 130, 146, 147, 502, 503, 288, 289, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 504, 505, 492, 493, 595, 596, 283, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 619, 620, 39, 40, 359, 360, 619, 620, 272, 273, 633, 46, 236, 237, 72, 64, 72, 64, 1, 2, 45, 46, 619, 620, 272, 273, 45, 46, 492, 493, 129, 130, 140, 141, 496, 497, 492, 493, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 506, 507, 494, 495, 597, 598, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 47, 621, 31, 41, 361, 362, 47, 621, 274, 275, 634, 635, 238, 239, 69, 66, 69, 66, 3, 4, 47, 48, 47, 621, 274, 275, 47, 48, 494, 495, 131, 132, 142, 143, 498, 499, 494, 495, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 500, 501, 359, 360, 496, 497, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 13, 14, 323, 324, 276, 277, 42, 34, 327, 10, 496, 497, 628, 629, 33, 34, 276, 277, 25, 26, 323, 324, 246, 237, 321, 2, 409, 410, 619, 620, 355, 40, 496, 497, 46, 123, 125, 126, 136, 137, 630, 46, 496, 497, 281, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 502, 503, 361, 362, 498, 499, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 15, 16, 325, 326, 278, 279, 43, 44, 11, 12, 498, 499, 47, 48, 27, 35, 278, 279, 27, 28, 325, 326, 238, 239, 322, 4, 411, 412, 47, 621, 356, 41, 498, 499, 48, 124, 127, 128, 138, 139, 631, 632, 498, 499, 285, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 387, 14, 374, 60, 359, 360, 599, 600, 280, 281, 409, 410, 328, 14, 5, 6, 615, 616, 246, 237, 603, 604, 280, 281, 500, 501, 580, 581, 500, 501, 280, 281, 45, 46, 504, 505, 500, 501, 496, 497, 500, 501, 236, 237, 375, 376, 492, 493, 619, 620, 272, 273, 496, 497, 500, 501, 496, 497, 45, 46, 628, 629, 25, 26, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 388, 16, 61, 62, 361, 362, 601, 602, 166, 282, 411, 412, 329, 330, 7, 8, 617, 618, 238, 239, 605, 606, 166, 282, 502, 503, 582, 583, 502, 503, 166, 282, 47, 48, 506, 507, 502, 503, 498, 499, 502, 503, 238, 239, 377, 378, 494, 495, 47, 621, 274, 275, 498, 499, 502, 503, 498, 499, 47, 48, 47, 48, 27, 28, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 504, 505, 283, 46, 45, 46, 500, 501, 492, 493, 321, 2, 280, 281, 492, 493, 236, 237, 603, 604, 45, 46, 496, 497, 492, 493, 286, 287, 283, 46, 286, 287, 359, 360, 500, 501, 281, 592, 166, 284, 236, 237, 611, 612, 283, 46, 619, 620, 557, 273, 283, 46, 45, 46, 500, 501, 492, 493, 492, 493, 166, 284, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 506, 507, 47, 48, 47, 48, 502, 503, 494, 495, 322, 4, 166, 282, 494, 495, 238, 239, 605, 606, 47, 48, 498, 499, 494, 495, 288, 289, 47, 48, 288, 289, 361, 362, 502, 503, 593, 594, 47, 48, 238, 239, 613, 614, 47, 48, 47, 621, 558, 275, 47, 48, 47, 48, 502, 503, 494, 495, 494, 495, 47, 48, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 500, 501, 409, 410, 280, 281, 496, 497, 45, 46, 603, 604, 45, 46, 281, 46, 13, 14, 370, 371, 500, 501, 286, 287, 630, 46, 281, 46, 45, 46, 630, 46, 504, 505, 359, 360, 496, 497, 504, 505, 328, 14, 484, 485, 496, 497, 619, 620, 363, 364, 323, 324, 244, 241, 83, 84, 104, 84, 104, 84, 104, 84, 79, 80, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 502, 503, 411, 412, 166, 282, 498, 499, 47, 48, 605, 606, 47, 48, 285, 48, 15, 16, 372, 373, 502, 503, 288, 289, 631, 632, 285, 48, 47, 48, 631, 632, 506, 507, 361, 362, 498, 499, 506, 507, 329, 330, 486, 487, 498, 499, 47, 621, 365, 50, 325, 326, 238, 239, 3, 85, 105, 106, 105, 106, 105, 106, 81, 82, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 21, 22, 281, 46, 1, 2, 45, 46, 504, 505, 75, 76, 280, 281, 492, 493, 500, 501, 628, 629, 417, 418, 504, 505, 628, 629, 51, 52, 500, 501, 45, 46, 504, 505, 1, 2, 280, 281, 409, 410, 619, 620, 272, 273, 45, 46, 236, 237, 611, 612, 630, 46, 45, 46, 359, 360, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 23, 24, 285, 48, 3, 4, 47, 48, 506, 507, 77, 78, 166, 282, 494, 495, 502, 503, 47, 48, 419, 420, 506, 507, 47, 48, 53, 54, 502, 503, 47, 48, 506, 507, 3, 4, 166, 282, 411, 412, 47, 621, 274, 275, 47, 48, 238, 239, 613, 614, 631, 632, 47, 48, 361, 362, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 496, 497, 1, 2, 45, 46, 359, 360, 256, 257, 409, 410, 281, 592, 359, 360, 500, 501, 496, 497, 281, 46, 45, 46, 45, 46, 474, 475, 281, 592, 280, 281, 75, 76, 45, 46, 359, 360, 619, 620, 355, 40, 569, 570, 236, 237, 247, 241, 328, 14, 59, 60, 45, 46, 628, 629, 450, 451, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 498, 499, 3, 4, 47, 48, 361, 362, 258, 259, 411, 412, 593, 594, 361, 362, 502, 503, 498, 499, 285, 48, 47, 48, 47, 48, 476, 477, 593, 594, 166, 282, 77, 78, 47, 48, 361, 362, 47, 621, 356, 41, 571, 572, 238, 239, 242, 239, 329, 330, 61, 62, 47, 48, 47, 48, 452, 453, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 359, 360, 1, 2, 280, 281, 45, 46, 252, 253, 359, 360, 45, 46, 409, 410, 630, 46, 588, 589, 496, 497, 630, 46, 281, 46, 280, 281, 492, 493, 492, 493, 603, 604, 280, 281, 286, 287, 619, 620, 272, 273, 45, 46, 236, 237, 72, 64, 256, 257, 500, 501, 166, 284, 492, 493, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 361, 362, 3, 4, 166, 282, 47, 48, 254, 255, 361, 362, 47, 48, 411, 412, 631, 632, 590, 591, 498, 499, 631, 632, 285, 48, 166, 282, 494, 495, 494, 495, 605, 606, 166, 282, 288, 289, 47, 621, 274, 275, 47, 48, 238, 239, 69, 66, 258, 259, 502, 503, 47, 48, 494, 495, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 531, 249, 496, 497, 75, 76, 492, 493, 492, 493, 248, 249, 496, 497, 45, 46, 409, 410, 628, 629, 417, 418, 359, 360, 628, 629, 480, 481, 359, 360, 286, 287, 492, 493, 611, 612, 496, 497, 496, 497, 619, 620, 39, 40, 166, 284, 236, 237, 72, 64, 533, 253, 492, 493, 500, 501, 286, 287, 283, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 532, 251, 498, 499, 77, 78, 494, 495, 494, 495, 250, 251, 498, 499, 47, 48, 411, 412, 47, 48, 419, 420, 361, 362, 47, 48, 482, 483, 361, 362, 288, 289, 494, 495, 613, 614, 498, 499, 498, 499, 47, 621, 31, 41, 47, 48, 238, 239, 69, 66, 534, 255, 494, 495, 502, 503, 288, 289, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 328, 14, 323, 324, 79, 80, 244, 241, 21, 22, 500, 501, 286, 287, 492, 493, 500, 501, 359, 360, 496, 497, 45, 46, 496, 497, 500, 501, 45, 46, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 248, 249, 496, 497, 280, 281, 496, 497, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 329, 330, 325, 326, 81, 82, 238, 239, 23, 24, 502, 503, 288, 289, 494, 495, 502, 503, 361, 362, 498, 499, 47, 48, 498, 499, 502, 503, 47, 48, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 250, 251, 498, 499, 166, 282, 498, 499, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 500, 501, 409, 410, 236, 237, 1, 2, 580, 581, 45, 46, 492, 493, 286, 287, 166, 284, 286, 287, 496, 497, 286, 287, 496, 497, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 281, 46, 359, 360, 45, 46, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 502, 503, 411, 412, 238, 239, 3, 4, 582, 583, 47, 48, 494, 495, 288, 289, 47, 48, 288, 289, 498, 499, 288, 289, 498, 499, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 285, 48, 361, 362, 47, 48, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 70, 64, 1, 2, 409, 410, 496, 497, 492, 493, 492, 493, 573, 574, 359, 360, 281, 46, 45, 46, 281, 46, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 69, 66, 3, 4, 411, 412, 498, 499, 494, 495, 494, 495, 575, 282, 361, 362, 285, 48, 47, 48, 285, 48, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 74, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":641, + "image":"11.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"11", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/crypt2/level.json b/gamefileshf/level/crypt2/level.json new file mode 100755 index 00000000..0fa4d04d --- /dev/null +++ b/gamefileshf/level/crypt2/level.json @@ -0,0 +1,33 @@ +{ + "variable": [ + { "colorCycleSpeed": 120 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 16 } + ], + "palette": [ + { + "id": "l5base", + "file": "Nlevels/L5Data/L5Base.PAL" + }, + { + "id": "colorCycle", + "fromId": "l5base" + } + ], + "load": ["level/crypt1/l5s.json", "l5base"], + "level": { + "id": "level", + "palette": "l5base", + "file": "Nlevels/L5Data/L5.CEL", + "layers": { "index": 2, "texturePack": "l5s" }, + "outOfBoundsTileLayer2": 21, + "til": "Nlevels/L5Data/L5.TIL", + "min": "Nlevels/L5Data/L5.MIN", + "minBlocks": 10, + "sol": "Nlevels/L5Data/L5.SOL" + }, + "load": "level/automap/l5/load.json", + "load": "level/crypt2/levelObjects.json", + "load": "level/crypt2/monsters.json", + "load": "level/crypt2/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt2/level2.json b/gamefileshf/level/crypt2/level2.json new file mode 100755 index 00000000..9a2fdf49 --- /dev/null +++ b/gamefileshf/level/crypt2/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "crypt2", + "name": "Crypt 2", + "map": { "file": "level/crypt2/crypt2.json", "indexOffset": -1 } + }, + "load": "level/crypt2/levelObjects2.json", + "load": "level/crypt2/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt2/levelObjects2.json b/gamefileshf/level/crypt2/levelObjects2.json new file mode 100755 index 00000000..239d0272 --- /dev/null +++ b/gamefileshf/level/crypt2/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDownCrypt", + "mapPosition": [81, 72], + "properties": { + "x": 77, + "y": 72, + "level": 3 + } + }, + { + "id": "up", + "class": "levelUpCrypt", + "mapPosition": [86, 51], + "properties": { + "x": 83, + "y": 85, + "level": 1 + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/crypt2/music.json b/gamefileshf/level/crypt2/music.json new file mode 100755 index 00000000..d26cdce6 --- /dev/null +++ b/gamefileshf/level/crypt2/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlE.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/crypt3/crypt3.json b/gamefileshf/level/crypt3/crypt3.json new file mode 100755 index 00000000..ffff17f4 --- /dev/null +++ b/gamefileshf/level/crypt3/crypt3.json @@ -0,0 +1,171 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 268, 269, 264, 265, 260, 261, 323, 324, 268, 269, 264, 265, 544, 545, 431, 432, 379, 380, 379, 380, 13, 14, 379, 380, 5, 6, 615, 616, 615, 616, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 270, 271, 266, 267, 262, 263, 325, 326, 270, 271, 266, 267, 262, 263, 433, 434, 381, 382, 381, 382, 15, 16, 381, 382, 7, 8, 617, 618, 617, 618, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 496, 497, 409, 410, 359, 360, 496, 497, 492, 493, 492, 493, 496, 497, 504, 505, 492, 493, 492, 493, 256, 257, 500, 501, 492, 493, 500, 501, 496, 497, 328, 14, 607, 608, 268, 269, 264, 265, 550, 551, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 498, 499, 411, 412, 361, 362, 498, 499, 494, 495, 494, 495, 498, 499, 506, 507, 494, 495, 494, 495, 258, 259, 502, 503, 494, 495, 502, 503, 498, 499, 329, 330, 609, 610, 270, 271, 266, 267, 266, 267, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 5, 6, 615, 616, 268, 269, 264, 265, 544, 545, 323, 324, 5, 6, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 584, 585, 286, 287, 281, 46, 283, 46, 359, 360, 286, 287, 45, 46, 492, 493, 500, 501, 359, 360, 252, 253, 409, 410, 595, 596, 166, 284, 496, 497, 75, 76, 45, 46, 45, 46, 409, 410, 500, 501, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 7, 8, 617, 618, 270, 271, 266, 267, 262, 263, 325, 326, 7, 8, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 586, 587, 288, 289, 285, 48, 47, 48, 361, 362, 288, 289, 47, 48, 494, 495, 502, 503, 361, 362, 254, 255, 411, 412, 597, 598, 47, 48, 498, 499, 77, 78, 47, 48, 47, 48, 411, 412, 502, 503, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 492, 493, 492, 493, 504, 505, 492, 493, 492, 493, 496, 497, 496, 497, 622, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 500, 501, 45, 46, 630, 46, 492, 493, 474, 475, 630, 46, 359, 360, 280, 281, 496, 497, 492, 493, 529, 249, 45, 46, 504, 505, 504, 505, 630, 46, 321, 2, 492, 493, 283, 46, 496, 497, 492, 493, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 494, 495, 494, 495, 506, 507, 494, 495, 494, 495, 498, 499, 498, 499, 623, 624, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 502, 503, 47, 48, 631, 632, 494, 495, 476, 477, 631, 632, 361, 362, 166, 282, 498, 499, 494, 495, 530, 251, 47, 48, 506, 507, 506, 507, 631, 632, 322, 4, 494, 495, 47, 48, 498, 499, 494, 495, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 492, 493, 283, 46, 45, 46, 45, 46, 492, 493, 492, 493, 286, 287, 619, 620, 363, 364, 5, 6, 431, 432, 607, 608, 323, 324, 484, 485, 280, 281, 500, 501, 628, 629, 417, 418, 504, 505, 628, 629, 51, 52, 45, 46, 281, 592, 492, 493, 55, 56, 409, 410, 359, 360, 286, 287, 628, 629, 339, 340, 387, 14, 323, 324, 5, 6, 79, 80, 5, 6, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 494, 495, 47, 48, 47, 48, 47, 48, 494, 495, 494, 495, 288, 289, 47, 621, 365, 50, 7, 8, 433, 434, 609, 610, 325, 326, 486, 487, 166, 282, 502, 503, 47, 48, 419, 420, 506, 507, 47, 48, 53, 54, 47, 48, 593, 594, 494, 495, 57, 58, 411, 412, 361, 362, 288, 289, 47, 48, 341, 342, 388, 16, 325, 326, 7, 8, 81, 82, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 335, 336, 492, 493, 492, 493, 496, 497, 619, 620, 272, 273, 500, 501, 492, 493, 45, 46, 283, 46, 504, 505, 359, 360, 286, 287, 492, 493, 496, 497, 584, 585, 492, 493, 573, 574, 504, 505, 500, 501, 496, 497, 492, 493, 45, 46, 500, 501, 45, 46, 496, 497, 496, 497, 375, 376, 280, 281, 474, 475, 573, 574, 504, 505, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 337, 338, 494, 495, 494, 495, 498, 499, 47, 621, 274, 275, 502, 503, 494, 495, 47, 48, 47, 48, 506, 507, 361, 362, 288, 289, 494, 495, 498, 499, 586, 587, 494, 495, 575, 282, 506, 507, 502, 503, 498, 499, 494, 495, 47, 48, 502, 503, 47, 48, 498, 499, 498, 499, 377, 378, 166, 282, 476, 477, 575, 282, 506, 507, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 439, 440, 268, 269, 264, 265, 260, 261, 484, 485, 492, 493, 281, 592, 496, 497, 619, 620, 402, 403, 492, 493, 280, 281, 492, 493, 500, 501, 496, 497, 283, 46, 496, 497, 630, 46, 45, 46, 492, 493, 630, 46, 588, 589, 492, 493, 359, 360, 500, 501, 625, 46, 633, 46, 625, 46, 633, 46, 625, 46, 359, 360, 321, 2, 492, 493, 286, 287, 283, 46, 474, 475, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 441, 442, 270, 271, 266, 267, 262, 263, 486, 487, 494, 495, 593, 594, 498, 499, 47, 621, 404, 405, 494, 495, 166, 282, 494, 495, 502, 503, 498, 499, 47, 48, 498, 499, 631, 632, 47, 48, 494, 495, 631, 632, 590, 591, 494, 495, 361, 362, 502, 503, 626, 627, 634, 635, 626, 627, 634, 635, 626, 627, 361, 362, 322, 4, 494, 495, 288, 289, 47, 48, 476, 477, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 492, 493, 500, 501, 492, 493, 280, 281, 492, 493, 504, 505, 504, 505, 504, 505, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 21, 22, 504, 505, 500, 501, 628, 629, 51, 52, 492, 493, 628, 629, 417, 418, 504, 505, 286, 287, 359, 360, 36, 37, 276, 277, 563, 564, 276, 277, 42, 34, 244, 241, 391, 22, 500, 501, 492, 493, 280, 281, 504, 505, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 494, 495, 502, 503, 494, 495, 166, 282, 494, 495, 506, 507, 506, 507, 506, 507, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 23, 24, 506, 507, 502, 503, 47, 48, 53, 54, 494, 495, 47, 48, 419, 420, 506, 507, 288, 289, 361, 362, 15, 38, 278, 279, 278, 279, 278, 279, 43, 44, 238, 239, 392, 24, 502, 503, 494, 495, 166, 282, 506, 507, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 500, 501, 504, 505, 492, 493, 492, 493, 45, 46, 492, 493, 280, 281, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 504, 505, 286, 287, 496, 497, 500, 501, 492, 493, 492, 493, 280, 281, 496, 497, 492, 493, 492, 493, 256, 257, 492, 493, 492, 493, 474, 475, 504, 505, 236, 237, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 502, 503, 506, 507, 494, 495, 494, 495, 47, 48, 494, 495, 166, 282, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 506, 507, 288, 289, 498, 499, 502, 503, 494, 495, 494, 495, 166, 282, 498, 499, 494, 495, 494, 495, 258, 259, 494, 495, 494, 495, 476, 477, 506, 507, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 615, 616, 268, 269, 264, 265, 260, 261, 244, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 13, 14, 323, 324, 615, 616, 391, 22, 281, 46, 500, 501, 359, 360, 286, 287, 496, 497, 286, 287, 280, 281, 500, 501, 496, 497, 496, 497, 535, 536, 45, 46, 286, 287, 492, 493, 359, 360, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 617, 618, 270, 271, 266, 267, 262, 263, 238, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 15, 16, 325, 326, 617, 618, 392, 24, 285, 48, 502, 503, 361, 362, 288, 289, 498, 499, 288, 289, 166, 282, 502, 503, 498, 499, 498, 499, 537, 538, 47, 48, 288, 289, 494, 495, 361, 362, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 492, 493, 492, 493, 496, 497, 504, 505, 236, 237, 72, 64, 72, 64, 13, 14, 5, 6, 5, 6, 335, 336, 500, 501, 630, 46, 1, 2, 492, 493, 625, 46, 633, 46, 496, 497, 496, 497, 622, 46, 625, 46, 625, 46, 409, 410, 492, 493, 248, 249, 492, 493, 500, 501, 496, 497, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 494, 495, 494, 495, 498, 499, 506, 507, 238, 239, 69, 66, 69, 66, 15, 16, 7, 8, 7, 8, 337, 338, 502, 503, 631, 632, 3, 4, 494, 495, 626, 627, 634, 635, 498, 499, 498, 499, 623, 624, 626, 627, 626, 627, 411, 412, 494, 495, 250, 251, 494, 495, 502, 503, 498, 499, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 496, 497, 286, 287, 500, 501, 492, 493, 13, 14, 615, 616, 431, 432, 55, 56, 492, 493, 504, 505, 484, 485, 504, 505, 628, 629, 393, 394, 244, 241, 351, 352, 276, 277, 29, 30, 359, 360, 619, 620, 443, 444, 357, 358, 244, 241, 240, 241, 247, 241, 240, 241, 240, 241, 240, 241, 439, 440, 393, 394, 5, 6, 13, 14, 5, 6, 607, 608, 13, 14, 607, 608, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 498, 499, 288, 289, 502, 503, 494, 495, 15, 16, 617, 618, 433, 434, 57, 58, 494, 495, 506, 507, 486, 487, 506, 507, 47, 48, 395, 396, 238, 239, 353, 354, 278, 279, 31, 32, 361, 362, 47, 621, 445, 422, 43, 44, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 441, 442, 395, 396, 7, 8, 15, 16, 7, 8, 609, 610, 15, 16, 609, 610, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 492, 493, 504, 505, 496, 497, 622, 46, 321, 2, 492, 493, 500, 501, 496, 497, 565, 566, 496, 497, 573, 574, 492, 493, 492, 493, 492, 493, 236, 237, 611, 612, 619, 620, 272, 273, 504, 505, 619, 620, 272, 273, 492, 493, 236, 237, 72, 64, 328, 14, 5, 6, 5, 6, 246, 237, 1, 2, 500, 501, 496, 497, 603, 604, 280, 281, 504, 505, 375, 376, 504, 505, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 494, 495, 506, 507, 498, 499, 623, 624, 322, 4, 494, 495, 502, 503, 498, 499, 567, 568, 498, 499, 575, 282, 494, 495, 494, 495, 494, 495, 238, 239, 613, 614, 47, 621, 274, 275, 506, 507, 47, 621, 274, 275, 494, 495, 238, 239, 69, 66, 329, 330, 7, 8, 7, 8, 238, 239, 3, 4, 502, 503, 498, 499, 605, 606, 166, 282, 506, 507, 377, 378, 506, 507, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 500, 501, 492, 493, 286, 287, 619, 620, 39, 40, 496, 497, 630, 46, 492, 493, 45, 46, 630, 46, 359, 360, 492, 493, 496, 497, 630, 46, 236, 237, 611, 612, 619, 620, 466, 467, 500, 501, 619, 620, 39, 40, 633, 46, 236, 237, 72, 64, 603, 604, 280, 281, 504, 505, 328, 14, 59, 60, 45, 46, 45, 46, 370, 371, 496, 497, 496, 497, 421, 56, 500, 501, 628, 629, 339, 340, 73, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 502, 503, 494, 495, 288, 289, 47, 621, 31, 41, 498, 499, 631, 632, 494, 495, 47, 48, 631, 632, 361, 362, 494, 495, 498, 499, 631, 632, 238, 239, 613, 614, 47, 621, 468, 469, 502, 503, 47, 621, 31, 41, 634, 635, 238, 239, 69, 66, 605, 606, 166, 282, 506, 507, 329, 330, 61, 62, 47, 48, 47, 48, 372, 373, 498, 499, 498, 499, 422, 58, 502, 503, 47, 48, 341, 342, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 492, 493, 492, 493, 492, 493, 45, 46, 244, 241, 240, 241, 13, 14, 374, 60, 45, 46, 628, 629, 450, 451, 244, 241, 240, 241, 439, 440, 339, 340, 561, 562, 276, 277, 327, 10, 500, 501, 628, 629, 347, 348, 276, 277, 25, 26, 431, 432, 21, 22, 496, 497, 492, 493, 375, 376, 409, 410, 492, 493, 492, 493, 45, 46, 500, 501, 492, 493, 283, 46, 409, 410, 496, 497, 496, 497, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 494, 495, 494, 495, 494, 495, 47, 48, 238, 239, 242, 239, 15, 16, 61, 62, 47, 48, 47, 48, 452, 453, 238, 239, 242, 239, 441, 442, 341, 342, 278, 279, 278, 279, 11, 12, 502, 503, 47, 48, 349, 350, 278, 279, 27, 28, 433, 434, 23, 24, 498, 499, 494, 495, 377, 378, 411, 412, 494, 495, 494, 495, 47, 48, 502, 503, 494, 495, 47, 48, 411, 412, 498, 499, 498, 499, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 280, 281, 45, 46, 281, 46, 492, 493, 236, 237, 72, 64, 539, 540, 496, 497, 496, 497, 500, 501, 504, 505, 236, 237, 72, 64, 321, 2, 496, 497, 492, 493, 496, 497, 500, 501, 280, 281, 500, 501, 500, 501, 500, 501, 166, 284, 500, 501, 256, 257, 496, 497, 496, 497, 1, 2, 625, 46, 633, 46, 625, 46, 625, 46, 633, 46, 625, 46, 492, 493, 166, 284, 504, 505, 492, 493, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 166, 282, 47, 48, 285, 48, 494, 495, 238, 239, 69, 66, 541, 259, 498, 499, 498, 499, 502, 503, 506, 507, 238, 239, 69, 66, 322, 4, 498, 499, 494, 495, 498, 499, 502, 503, 166, 282, 502, 503, 502, 503, 502, 503, 47, 48, 502, 503, 258, 259, 498, 499, 498, 499, 3, 4, 626, 627, 634, 635, 626, 627, 626, 627, 634, 635, 626, 627, 494, 495, 47, 48, 506, 507, 494, 495, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 252, 253, 500, 501, 281, 592, 359, 360, 359, 360, 13, 14, 323, 324, 21, 22, 496, 497, 286, 287, 359, 360, 281, 592, 569, 570, 281, 592, 500, 501, 281, 592, 492, 493, 492, 493, 252, 253, 492, 493, 359, 360, 244, 241, 351, 352, 276, 277, 42, 34, 36, 37, 276, 277, 357, 358, 83, 84, 79, 80, 104, 84, 244, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 254, 255, 502, 503, 593, 594, 361, 362, 361, 362, 15, 16, 325, 326, 23, 24, 498, 499, 288, 289, 361, 362, 593, 594, 571, 572, 593, 594, 502, 503, 593, 594, 494, 495, 494, 495, 254, 255, 494, 495, 361, 362, 238, 239, 353, 354, 278, 279, 43, 44, 15, 38, 278, 279, 43, 44, 3, 85, 81, 82, 105, 106, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 531, 249, 492, 493, 496, 497, 496, 497, 166, 284, 75, 76, 496, 497, 321, 2, 166, 284, 496, 497, 630, 46, 492, 493, 500, 501, 630, 46, 565, 566, 409, 410, 496, 497, 504, 505, 248, 249, 492, 493, 630, 46, 236, 237, 375, 376, 504, 505, 359, 360, 1, 2, 492, 493, 496, 497, 427, 428, 45, 46, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 532, 251, 494, 495, 498, 499, 498, 499, 47, 48, 77, 78, 498, 499, 322, 4, 47, 48, 498, 499, 631, 632, 494, 495, 502, 503, 631, 632, 567, 568, 411, 412, 498, 499, 506, 507, 250, 251, 494, 495, 631, 632, 238, 239, 377, 378, 506, 507, 361, 362, 3, 4, 494, 495, 498, 499, 429, 430, 47, 48, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 268, 269, 264, 265, 552, 265, 323, 324, 246, 237, 375, 376, 283, 46, 492, 493, 496, 497, 492, 493, 611, 612, 166, 284, 484, 485, 45, 46, 492, 493, 628, 629, 51, 52, 492, 493, 628, 629, 51, 52, 496, 497, 595, 596, 504, 505, 55, 56, 492, 493, 628, 629, 393, 394, 244, 241, 240, 241, 240, 241, 83, 84, 79, 80, 104, 84, 244, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 270, 271, 266, 267, 266, 267, 325, 326, 238, 239, 377, 378, 47, 48, 494, 495, 498, 499, 494, 495, 613, 614, 47, 48, 486, 487, 47, 48, 494, 495, 47, 48, 53, 54, 494, 495, 47, 48, 53, 54, 498, 499, 597, 598, 506, 507, 57, 58, 494, 495, 47, 48, 395, 396, 238, 239, 242, 239, 242, 239, 3, 85, 81, 82, 105, 106, 238, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 492, 493, 500, 501, 504, 505, 496, 497, 236, 237, 247, 241, 240, 241, 240, 241, 391, 22, 492, 493, 321, 2, 492, 493, 492, 493, 496, 497, 286, 287, 474, 475, 500, 501, 500, 501, 492, 493, 45, 46, 283, 46, 496, 497, 500, 501, 496, 497, 588, 589, 359, 360, 281, 46, 236, 237, 72, 64, 72, 64, 375, 376, 359, 360, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 494, 495, 502, 503, 506, 507, 498, 499, 238, 239, 242, 239, 242, 239, 242, 239, 392, 24, 494, 495, 322, 4, 494, 495, 494, 495, 498, 499, 288, 289, 476, 477, 502, 503, 502, 503, 494, 495, 47, 48, 47, 48, 498, 499, 502, 503, 498, 499, 590, 591, 361, 362, 285, 48, 238, 239, 69, 66, 69, 66, 377, 378, 361, 362, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 533, 253, 492, 493, 359, 360, 286, 287, 280, 281, 107, 6, 5, 6, 5, 6, 5, 6, 55, 56, 280, 281, 375, 376, 280, 281, 500, 501, 409, 410, 504, 505, 630, 46, 504, 505, 45, 46, 630, 46, 573, 574, 492, 493, 496, 497, 492, 493, 500, 501, 492, 493, 283, 46, 492, 493, 236, 237, 72, 64, 72, 64, 611, 612, 496, 497, 500, 501, 387, 14, 379, 380, 615, 616, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 534, 255, 494, 495, 361, 362, 288, 289, 166, 282, 89, 108, 7, 8, 7, 8, 7, 8, 57, 58, 166, 282, 377, 378, 166, 282, 502, 503, 411, 412, 506, 507, 631, 632, 506, 507, 47, 48, 631, 632, 575, 282, 494, 495, 498, 499, 494, 495, 502, 503, 494, 495, 47, 48, 494, 495, 238, 239, 69, 66, 69, 66, 613, 614, 498, 499, 502, 503, 388, 16, 381, 382, 617, 618, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 496, 497, 496, 497, 359, 360, 492, 493, 101, 102, 492, 493, 492, 493, 280, 281, 492, 493, 496, 497, 603, 604, 588, 589, 21, 22, 492, 493, 281, 592, 628, 629, 51, 52, 500, 501, 628, 629, 366, 367, 409, 410, 281, 592, 496, 497, 83, 84, 79, 80, 104, 84, 244, 241, 70, 64, 72, 64, 13, 14, 374, 60, 409, 410, 492, 493, 421, 56, 283, 46, 409, 410, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 498, 499, 498, 499, 361, 362, 494, 495, 89, 103, 494, 495, 494, 495, 166, 282, 494, 495, 498, 499, 605, 606, 590, 591, 23, 24, 494, 495, 593, 594, 47, 48, 53, 54, 502, 503, 47, 48, 368, 369, 411, 412, 593, 594, 498, 499, 3, 85, 81, 82, 105, 106, 238, 239, 69, 66, 69, 66, 15, 16, 61, 62, 411, 412, 494, 495, 422, 58, 47, 48, 411, 412, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 492, 493, 286, 287, 280, 281, 500, 501, 75, 76, 496, 497, 504, 505, 496, 497, 496, 497, 496, 497, 603, 604, 45, 46, 321, 2, 500, 501, 45, 46, 496, 497, 45, 46, 166, 284, 45, 46, 496, 497, 474, 475, 504, 505, 496, 497, 542, 257, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 1, 2, 504, 505, 496, 497, 504, 505, 492, 493, 492, 493, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 494, 495, 288, 289, 166, 282, 502, 503, 77, 78, 498, 499, 506, 507, 498, 499, 498, 499, 498, 499, 605, 606, 47, 48, 322, 4, 502, 503, 47, 48, 498, 499, 47, 48, 47, 48, 47, 48, 498, 499, 476, 477, 506, 507, 498, 499, 543, 259, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 3, 4, 506, 507, 498, 499, 506, 507, 494, 495, 494, 495, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 504, 505, 492, 493, 492, 493, 630, 46, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 446, 447, 500, 501, 286, 287, 359, 360, 286, 287, 166, 284, 286, 287, 283, 46, 496, 497, 283, 46, 504, 505, 252, 253, 409, 410, 500, 501, 236, 237, 72, 64, 72, 64, 321, 2, 280, 281, 504, 505, 630, 46, 500, 501, 500, 501, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 506, 507, 494, 495, 494, 495, 631, 632, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 448, 449, 502, 503, 288, 289, 361, 362, 288, 289, 47, 48, 288, 289, 47, 48, 498, 499, 47, 48, 506, 507, 254, 255, 411, 412, 502, 503, 238, 239, 69, 66, 69, 66, 322, 4, 166, 282, 506, 507, 631, 632, 502, 503, 502, 503, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 59, 60, 409, 410, 595, 596, 283, 46, 628, 629, 339, 340, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 492, 493, 496, 497, 500, 501, 504, 505, 409, 410, 504, 505, 496, 497, 496, 497, 45, 46, 359, 360, 248, 249, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 13, 14, 374, 60, 492, 493, 628, 629, 25, 26, 73, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 61, 62, 411, 412, 597, 598, 47, 48, 47, 48, 341, 342, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 494, 495, 498, 499, 502, 503, 506, 507, 411, 412, 506, 507, 498, 499, 498, 499, 47, 48, 361, 362, 250, 251, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 15, 16, 61, 62, 494, 495, 47, 48, 27, 28, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 500, 501, 504, 505, 45, 46, 504, 505, 359, 360, 281, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 328, 14, 79, 80, 5, 6, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 504, 505, 45, 46, 496, 497, 504, 505, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 502, 503, 506, 507, 47, 48, 506, 507, 361, 362, 285, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 329, 330, 81, 82, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 506, 507, 47, 48, 498, 499, 506, 507, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 492, 493, 599, 600, 500, 501, 509, 510, 496, 497, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 5, 6, 323, 324, 246, 237, 603, 604, 504, 505, 45, 46, 236, 237, 72, 64, 151, 152, 246, 237, 72, 64, 72, 64, 427, 428, 283, 46, 504, 505, 500, 501, 45, 46, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 494, 495, 601, 602, 502, 503, 511, 512, 498, 499, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 7, 8, 325, 326, 238, 239, 605, 606, 506, 507, 47, 48, 238, 239, 69, 66, 153, 130, 238, 239, 69, 66, 69, 66, 429, 430, 47, 48, 506, 507, 502, 503, 47, 48, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 496, 497, 492, 493, 492, 493, 45, 46, 492, 493, 504, 505, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 45, 46, 45, 46, 236, 237, 321, 2, 492, 493, 622, 46, 236, 237, 72, 64, 149, 130, 236, 237, 72, 64, 13, 14, 25, 26, 59, 60, 492, 493, 492, 493, 244, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 498, 499, 494, 495, 494, 495, 47, 48, 494, 495, 506, 507, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 47, 48, 47, 48, 238, 239, 322, 4, 494, 495, 623, 624, 238, 239, 69, 66, 150, 130, 238, 239, 69, 66, 15, 16, 27, 28, 61, 62, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 283, 46, 496, 497, 492, 493, 359, 360, 504, 505, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 5, 6, 55, 56, 45, 46, 166, 284, 107, 6, 484, 485, 359, 360, 619, 620, 478, 479, 154, 155, 158, 159, 162, 163, 5, 6, 370, 371, 500, 501, 496, 497, 500, 501, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 47, 48, 498, 499, 494, 495, 361, 362, 506, 507, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 7, 8, 57, 58, 47, 48, 47, 48, 89, 108, 486, 487, 361, 362, 47, 621, 19, 50, 156, 157, 160, 161, 164, 165, 7, 8, 372, 373, 502, 503, 498, 499, 502, 503, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 387, 14, 615, 616, 79, 80, 244, 241, 13, 14, 339, 340, 615, 616, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 427, 428, 500, 501, 580, 581, 492, 493, 504, 505, 101, 102, 496, 497, 45, 46, 619, 620, 272, 273, 166, 167, 168, 169, 170, 171, 474, 475, 580, 581, 359, 360, 492, 493, 595, 596, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 388, 16, 617, 618, 81, 82, 238, 239, 15, 16, 341, 342, 617, 618, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 429, 430, 502, 503, 582, 583, 494, 495, 506, 507, 89, 103, 498, 499, 47, 48, 47, 621, 274, 275, 47, 48, 47, 48, 47, 48, 476, 477, 582, 583, 361, 362, 494, 495, 597, 598, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 539, 540, 492, 493, 504, 505, 236, 237, 611, 612, 280, 281, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 439, 440, 379, 380, 5, 6, 607, 608, 55, 56, 280, 281, 500, 501, 286, 287, 281, 46, 75, 76, 625, 46, 633, 46, 619, 620, 402, 403, 45, 46, 500, 501, 492, 493, 630, 46, 492, 493, 492, 493, 283, 46, 496, 497, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 541, 259, 494, 495, 506, 507, 238, 239, 613, 614, 166, 282, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 441, 442, 381, 382, 7, 8, 609, 610, 57, 58, 166, 282, 502, 503, 288, 289, 285, 48, 77, 78, 626, 627, 634, 635, 47, 621, 404, 405, 47, 48, 502, 503, 494, 495, 631, 632, 494, 495, 494, 495, 47, 48, 498, 499, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 533, 253, 492, 493, 492, 493, 387, 14, 374, 60, 504, 505, 628, 629, 25, 26, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 492, 493, 496, 497, 496, 497, 496, 497, 45, 46, 283, 46, 359, 360, 496, 497, 244, 241, 351, 352, 276, 277, 42, 406, 439, 440, 268, 269, 264, 265, 260, 261, 607, 608, 59, 60, 630, 46, 492, 493, 45, 46, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 534, 255, 494, 495, 494, 495, 388, 16, 61, 62, 506, 507, 47, 48, 27, 28, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 494, 495, 498, 499, 498, 499, 498, 499, 47, 48, 47, 48, 361, 362, 498, 499, 238, 239, 353, 354, 278, 279, 407, 408, 441, 442, 270, 271, 266, 267, 262, 263, 609, 610, 61, 62, 631, 632, 494, 495, 47, 48, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 531, 249, 504, 505, 492, 493, 1, 2, 492, 493, 492, 493, 492, 493, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 496, 497, 492, 493, 588, 589, 409, 410, 500, 501, 504, 505, 580, 581, 492, 493, 236, 237, 375, 376, 504, 505, 504, 505, 321, 2, 492, 493, 492, 493, 45, 46, 492, 493, 492, 493, 628, 629, 423, 424, 492, 493, 628, 629, 25, 26, 73, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 532, 251, 506, 507, 494, 495, 3, 4, 494, 495, 494, 495, 494, 495, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 498, 499, 494, 495, 590, 591, 411, 412, 502, 503, 506, 507, 582, 583, 494, 495, 238, 239, 377, 378, 506, 507, 506, 507, 322, 4, 494, 495, 494, 495, 148, 48, 494, 495, 494, 495, 47, 48, 425, 426, 494, 495, 47, 48, 27, 28, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 283, 46, 496, 497, 55, 56, 500, 501, 595, 596, 283, 46, 628, 629, 25, 26, 246, 237, 72, 64, 72, 64, 72, 64, 247, 241, 83, 84, 104, 84, 104, 84, 104, 84, 79, 80, 387, 14, 5, 6, 615, 616, 107, 6, 25, 26, 615, 616, 607, 608, 335, 336, 409, 410, 133, 134, 144, 145, 359, 360, 286, 287, 500, 501, 496, 497, 45, 46, 496, 497, 492, 493, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 47, 48, 498, 499, 57, 58, 502, 503, 597, 598, 47, 48, 47, 48, 27, 28, 238, 239, 69, 66, 69, 66, 69, 66, 242, 239, 3, 85, 105, 106, 105, 106, 105, 106, 81, 82, 388, 16, 7, 8, 617, 618, 89, 108, 27, 28, 617, 618, 609, 610, 337, 338, 411, 412, 135, 130, 146, 147, 361, 362, 288, 289, 502, 503, 498, 499, 47, 48, 498, 499, 494, 495, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 474, 475, 496, 497, 500, 501, 492, 493, 492, 493, 280, 281, 500, 501, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 280, 281, 504, 505, 283, 46, 359, 360, 321, 2, 492, 493, 504, 505, 75, 76, 492, 493, 359, 360, 500, 501, 375, 376, 496, 497, 129, 130, 140, 141, 280, 281, 45, 46, 622, 46, 496, 497, 359, 360, 492, 493, 45, 46, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 476, 477, 498, 499, 502, 503, 494, 495, 494, 495, 166, 282, 502, 503, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 166, 282, 506, 507, 47, 48, 361, 362, 322, 4, 494, 495, 506, 507, 77, 78, 494, 495, 361, 362, 502, 503, 377, 378, 498, 499, 131, 132, 142, 143, 166, 282, 47, 48, 623, 624, 498, 499, 361, 362, 494, 495, 47, 48, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 281, 46, 496, 497, 286, 287, 280, 281, 492, 493, 492, 493, 286, 287, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 21, 22, 492, 493, 496, 497, 101, 102, 500, 501, 286, 287, 492, 493, 370, 371, 46, 123, 125, 126, 136, 137, 492, 493, 286, 287, 619, 620, 363, 364, 268, 269, 264, 265, 550, 551, 73, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 285, 48, 498, 499, 288, 289, 166, 282, 494, 495, 494, 495, 288, 289, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 23, 24, 494, 495, 498, 499, 89, 103, 502, 503, 288, 289, 494, 495, 372, 373, 48, 124, 127, 128, 138, 139, 494, 495, 288, 289, 47, 621, 365, 50, 270, 271, 266, 267, 266, 267, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 569, 570, 496, 497, 496, 497, 492, 493, 504, 505, 474, 475, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 335, 336, 588, 589, 409, 410, 280, 281, 359, 360, 283, 46, 492, 493, 500, 501, 492, 493, 359, 360, 619, 620, 272, 273, 359, 360, 496, 497, 504, 505, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 571, 572, 498, 499, 498, 499, 494, 495, 506, 507, 476, 477, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 337, 338, 590, 591, 411, 412, 166, 282, 361, 362, 47, 48, 494, 495, 502, 503, 494, 495, 361, 362, 47, 621, 274, 275, 361, 362, 498, 499, 506, 507, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 446, 447, 500, 501, 492, 493, 492, 493, 474, 475, 504, 505, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 492, 493, 45, 46, 492, 493, 492, 493, 496, 497, 492, 493, 580, 581, 492, 493, 474, 475, 619, 620, 39, 40, 166, 284, 500, 501, 496, 497, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 448, 449, 502, 503, 494, 495, 494, 495, 476, 477, 506, 507, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 494, 495, 47, 48, 494, 495, 494, 495, 498, 499, 494, 495, 582, 583, 494, 495, 476, 477, 47, 621, 31, 41, 47, 48, 502, 503, 498, 499, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":641, + "image":"11.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"11", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/crypt3/level.json b/gamefileshf/level/crypt3/level.json new file mode 100755 index 00000000..d8d4a00c --- /dev/null +++ b/gamefileshf/level/crypt3/level.json @@ -0,0 +1,33 @@ +{ + "variable": [ + { "colorCycleSpeed": 120 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 16 } + ], + "palette": [ + { + "id": "l5base", + "file": "Nlevels/L5Data/L5Base.PAL" + }, + { + "id": "colorCycle", + "fromId": "l5base" + } + ], + "load": ["level/crypt1/l5s.json", "l5base"], + "level": { + "id": "level", + "palette": "l5base", + "file": "Nlevels/L5Data/L5.CEL", + "layers": { "index": 2, "texturePack": "l5s" }, + "outOfBoundsTileLayer2": 21, + "til": "Nlevels/L5Data/L5.TIL", + "min": "Nlevels/L5Data/L5.MIN", + "minBlocks": 10, + "sol": "Nlevels/L5Data/L5.SOL" + }, + "load": "level/automap/l5/load.json", + "load": "level/crypt3/levelObjects.json", + "load": "level/crypt3/monsters.json", + "load": "level/crypt3/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt3/level2.json b/gamefileshf/level/crypt3/level2.json new file mode 100755 index 00000000..84bc736f --- /dev/null +++ b/gamefileshf/level/crypt3/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "crypt3", + "name": "Crypt 3", + "map": { "file": "level/crypt3/crypt3.json", "indexOffset": -1 } + }, + "load": "level/crypt3/levelObjects2.json", + "load": "level/crypt3/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt3/levelObjects2.json b/gamefileshf/level/crypt3/levelObjects2.json new file mode 100755 index 00000000..0e967807 --- /dev/null +++ b/gamefileshf/level/crypt3/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDownCrypt", + "mapPosition": [77, 86], + "properties": { + "x": 79, + "y": 66, + "level": 4 + } + }, + { + "id": "up", + "class": "levelUpCrypt", + "mapPosition": [76, 71], + "properties": { + "x": 81, + "y": 73, + "level": 2 + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/crypt3/music.json b/gamefileshf/level/crypt3/music.json new file mode 100755 index 00000000..d26cdce6 --- /dev/null +++ b/gamefileshf/level/crypt3/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlE.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/crypt4/crypt4.json b/gamefileshf/level/crypt4/crypt4.json new file mode 100755 index 00000000..45d137b8 --- /dev/null +++ b/gamefileshf/level/crypt4/crypt4.json @@ -0,0 +1,171 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 615, 616, 5, 6, 323, 324, 607, 608, 246, 237, 72, 64, 72, 64, 439, 440, 615, 616, 268, 269, 264, 265, 260, 261, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 431, 432, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 617, 618, 7, 8, 325, 326, 609, 610, 238, 239, 69, 66, 69, 66, 441, 442, 617, 618, 270, 271, 266, 267, 262, 263, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 433, 434, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 13, 14, 323, 324, 323, 324, 246, 237, 72, 64, 72, 64, 72, 64, 387, 14, 268, 269, 264, 265, 260, 261, 421, 56, 496, 497, 45, 46, 281, 46, 496, 497, 13, 14, 5, 6, 379, 380, 370, 371, 496, 497, 492, 493, 496, 497, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 542, 257, 504, 505, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 15, 16, 325, 326, 325, 326, 238, 239, 69, 66, 69, 66, 69, 66, 388, 16, 270, 271, 266, 267, 262, 263, 422, 58, 498, 499, 47, 48, 285, 48, 498, 499, 15, 16, 7, 8, 381, 382, 372, 373, 498, 499, 494, 495, 498, 499, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 543, 259, 506, 507, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 492, 493, 622, 46, 236, 237, 72, 64, 72, 64, 72, 64, 321, 2, 500, 501, 496, 497, 45, 46, 500, 501, 492, 493, 286, 287, 492, 493, 622, 46, 321, 2, 500, 501, 492, 493, 496, 497, 492, 493, 286, 287, 283, 46, 573, 574, 328, 14, 5, 6, 323, 324, 246, 237, 72, 64, 72, 64, 252, 253, 359, 360, 45, 46, 328, 14, 431, 432, 607, 608, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 494, 495, 623, 624, 238, 239, 69, 66, 69, 66, 69, 66, 322, 4, 502, 503, 498, 499, 47, 48, 502, 503, 494, 495, 288, 289, 494, 495, 623, 624, 322, 4, 502, 503, 494, 495, 498, 499, 494, 495, 288, 289, 47, 48, 575, 282, 329, 330, 7, 8, 325, 326, 238, 239, 69, 66, 69, 66, 254, 255, 361, 362, 47, 48, 329, 330, 433, 434, 609, 610, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 504, 505, 619, 620, 49, 14, 5, 6, 246, 237, 72, 64, 1, 2, 474, 475, 45, 46, 630, 46, 573, 574, 45, 46, 492, 493, 496, 497, 619, 620, 272, 273, 492, 493, 492, 493, 359, 360, 45, 46, 45, 46, 45, 46, 492, 493, 1, 2, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 248, 249, 45, 46, 45, 46, 1, 2, 580, 581, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 506, 507, 47, 621, 19, 50, 7, 8, 238, 239, 69, 66, 3, 4, 476, 477, 47, 48, 631, 632, 575, 282, 47, 48, 494, 495, 498, 499, 47, 621, 274, 275, 494, 495, 494, 495, 361, 362, 47, 48, 47, 48, 47, 48, 494, 495, 3, 4, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 250, 251, 47, 48, 47, 48, 3, 4, 582, 583, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 573, 574, 619, 620, 272, 273, 504, 505, 236, 237, 72, 64, 247, 241, 240, 241, 240, 241, 387, 14, 59, 60, 492, 493, 599, 600, 281, 46, 628, 629, 450, 451, 5, 6, 615, 616, 21, 22, 625, 46, 633, 46, 625, 46, 569, 570, 1, 2, 280, 281, 500, 501, 236, 237, 72, 64, 72, 64, 1, 2, 492, 493, 474, 475, 611, 612, 492, 493, 504, 505, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 575, 282, 47, 621, 274, 275, 506, 507, 238, 239, 69, 66, 242, 239, 242, 239, 242, 239, 388, 16, 61, 62, 494, 495, 601, 602, 285, 48, 47, 48, 452, 453, 7, 8, 617, 618, 23, 24, 626, 627, 634, 635, 626, 627, 571, 572, 3, 4, 166, 282, 502, 503, 238, 239, 69, 66, 69, 66, 3, 4, 494, 495, 476, 477, 613, 614, 494, 495, 506, 507, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 500, 501, 619, 620, 402, 403, 500, 501, 328, 14, 607, 608, 246, 237, 72, 64, 72, 64, 539, 540, 500, 501, 166, 284, 500, 501, 492, 493, 492, 493, 584, 585, 492, 493, 45, 46, 244, 241, 36, 37, 276, 277, 561, 562, 244, 241, 13, 14, 79, 80, 5, 6, 236, 237, 72, 64, 72, 64, 321, 2, 409, 410, 504, 505, 1, 2, 474, 475, 565, 566, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 502, 503, 47, 621, 404, 405, 502, 503, 329, 330, 609, 610, 238, 239, 69, 66, 69, 66, 541, 259, 502, 503, 47, 48, 502, 503, 494, 495, 494, 495, 586, 587, 494, 495, 47, 48, 238, 239, 15, 38, 278, 279, 278, 279, 238, 239, 15, 16, 81, 82, 7, 8, 238, 239, 69, 66, 69, 66, 322, 4, 411, 412, 506, 507, 3, 4, 476, 477, 567, 568, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 492, 493, 619, 620, 272, 273, 496, 497, 1, 2, 359, 360, 236, 237, 72, 64, 72, 64, 252, 253, 504, 505, 492, 493, 500, 501, 492, 493, 286, 287, 584, 585, 599, 600, 492, 493, 236, 237, 321, 2, 492, 493, 359, 360, 236, 237, 1, 2, 359, 360, 280, 281, 107, 6, 323, 324, 615, 616, 55, 56, 359, 360, 409, 410, 542, 257, 500, 501, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 494, 495, 47, 621, 274, 275, 498, 499, 3, 4, 361, 362, 238, 239, 69, 66, 69, 66, 254, 255, 506, 507, 494, 495, 502, 503, 494, 495, 288, 289, 586, 587, 601, 602, 494, 495, 238, 239, 322, 4, 494, 495, 361, 362, 238, 239, 3, 4, 361, 362, 166, 282, 89, 108, 325, 326, 617, 618, 57, 58, 361, 362, 411, 412, 543, 259, 502, 503, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 500, 501, 619, 620, 557, 273, 281, 46, 1, 2, 492, 493, 236, 237, 72, 64, 72, 64, 248, 249, 45, 46, 286, 287, 283, 46, 492, 493, 500, 501, 45, 46, 359, 360, 166, 284, 236, 237, 247, 241, 240, 241, 240, 241, 70, 64, 375, 376, 492, 493, 492, 493, 101, 102, 500, 501, 45, 46, 504, 505, 496, 497, 474, 475, 533, 253, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 502, 503, 47, 621, 558, 275, 285, 48, 3, 4, 494, 495, 238, 239, 69, 66, 69, 66, 250, 251, 47, 48, 288, 289, 47, 48, 494, 495, 502, 503, 47, 48, 361, 362, 47, 48, 238, 239, 242, 239, 242, 239, 242, 239, 69, 66, 377, 378, 494, 495, 494, 495, 89, 103, 502, 503, 47, 48, 506, 507, 498, 499, 476, 477, 534, 255, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 492, 493, 619, 620, 272, 273, 504, 505, 75, 76, 280, 281, 236, 237, 72, 64, 72, 64, 375, 376, 283, 46, 496, 497, 573, 574, 492, 493, 492, 493, 496, 497, 599, 600, 492, 493, 328, 14, 5, 6, 5, 6, 615, 616, 5, 6, 370, 371, 573, 574, 500, 501, 75, 76, 45, 46, 492, 493, 286, 287, 584, 585, 500, 501, 248, 249, 504, 505, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 494, 495, 47, 621, 274, 275, 506, 507, 77, 78, 166, 282, 238, 239, 69, 66, 69, 66, 377, 378, 47, 48, 498, 499, 575, 282, 494, 495, 494, 495, 498, 499, 601, 602, 494, 495, 329, 330, 7, 8, 7, 8, 617, 618, 7, 8, 372, 373, 575, 282, 502, 503, 77, 78, 47, 48, 494, 495, 288, 289, 586, 587, 502, 503, 250, 251, 506, 507, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 45, 46, 619, 620, 559, 273, 565, 566, 375, 376, 496, 497, 236, 237, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 21, 22, 492, 493, 496, 497, 45, 46, 611, 612, 283, 46, 280, 281, 496, 497, 45, 46, 492, 493, 500, 501, 492, 493, 101, 102, 492, 493, 280, 281, 496, 497, 500, 501, 409, 410, 1, 2, 492, 493, 630, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 47, 48, 47, 621, 560, 275, 567, 568, 377, 378, 498, 499, 238, 239, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 23, 24, 494, 495, 498, 499, 47, 48, 613, 614, 47, 48, 166, 282, 498, 499, 47, 48, 494, 495, 502, 503, 494, 495, 89, 103, 494, 495, 166, 282, 498, 499, 502, 503, 411, 412, 3, 4, 494, 495, 631, 632, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 542, 257, 359, 360, 619, 620, 355, 40, 492, 493, 244, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 359, 360, 496, 497, 500, 501, 75, 76, 573, 574, 492, 493, 45, 46, 280, 281, 492, 493, 280, 281, 45, 46, 101, 102, 504, 505, 492, 493, 504, 505, 283, 46, 496, 497, 55, 56, 500, 501, 628, 629, 339, 340, 73, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 543, 259, 361, 362, 47, 621, 356, 41, 494, 495, 238, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 361, 362, 498, 499, 502, 503, 77, 78, 575, 282, 494, 495, 47, 48, 166, 282, 494, 495, 166, 282, 47, 48, 89, 103, 506, 507, 494, 495, 506, 507, 47, 48, 498, 499, 57, 58, 502, 503, 47, 48, 341, 342, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 533, 253, 500, 501, 619, 620, 272, 273, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 13, 14, 79, 80, 323, 324, 244, 241, 240, 241, 240, 241, 83, 84, 79, 80, 104, 84, 21, 22, 504, 505, 359, 360, 492, 493, 500, 501, 492, 493, 580, 581, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 534, 255, 502, 503, 47, 621, 274, 275, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 15, 16, 81, 82, 325, 326, 238, 239, 242, 239, 242, 239, 3, 85, 81, 82, 105, 106, 23, 24, 506, 507, 361, 362, 494, 495, 502, 503, 494, 495, 582, 583, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 529, 249, 45, 46, 619, 620, 39, 40, 281, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 573, 574, 45, 46, 107, 6, 5, 6, 5, 6, 484, 485, 492, 493, 500, 501, 256, 257, 496, 497, 281, 592, 492, 493, 281, 592, 492, 493, 492, 493, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 530, 251, 47, 48, 47, 621, 31, 41, 285, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 575, 282, 47, 48, 89, 108, 7, 8, 7, 8, 486, 487, 494, 495, 502, 503, 258, 259, 498, 499, 593, 594, 494, 495, 593, 594, 494, 495, 494, 495, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 492, 493, 619, 620, 557, 273, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 496, 497, 492, 493, 101, 102, 166, 284, 500, 501, 492, 493, 359, 360, 409, 410, 252, 253, 492, 493, 496, 497, 409, 410, 496, 497, 281, 46, 496, 497, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 494, 495, 47, 621, 558, 275, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 498, 499, 494, 495, 89, 103, 47, 48, 502, 503, 494, 495, 361, 362, 411, 412, 254, 255, 494, 495, 498, 499, 411, 412, 498, 499, 285, 48, 498, 499, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 496, 497, 496, 497, 244, 241, 240, 241, 70, 64, 72, 64, 72, 64, 328, 14, 615, 616, 431, 432, 246, 237, 13, 14, 268, 269, 264, 265, 260, 261, 615, 616, 5, 6, 607, 608, 615, 616, 5, 6, 421, 56, 166, 284, 45, 46, 75, 76, 500, 501, 45, 46, 283, 46, 496, 497, 492, 493, 248, 249, 474, 475, 45, 46, 492, 493, 496, 497, 496, 497, 504, 505, 63, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 498, 499, 498, 499, 238, 239, 242, 239, 69, 66, 69, 66, 69, 66, 329, 330, 617, 618, 433, 434, 238, 239, 15, 16, 270, 271, 266, 267, 262, 263, 617, 618, 7, 8, 609, 610, 617, 618, 7, 8, 422, 58, 47, 48, 47, 48, 77, 78, 502, 503, 47, 48, 47, 48, 498, 499, 494, 495, 250, 251, 476, 477, 47, 48, 494, 495, 498, 499, 498, 499, 506, 507, 65, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 492, 493, 504, 505, 107, 6, 268, 269, 264, 265, 544, 545, 607, 608, 421, 56, 504, 505, 500, 501, 236, 237, 603, 604, 45, 46, 496, 497, 474, 475, 492, 493, 496, 497, 500, 501, 504, 505, 280, 281, 500, 501, 496, 497, 45, 46, 387, 14, 431, 432, 79, 80, 439, 440, 5, 6, 79, 80, 244, 241, 240, 241, 240, 241, 328, 14, 323, 324, 79, 80, 244, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 494, 495, 506, 507, 89, 108, 270, 271, 266, 267, 262, 263, 609, 610, 422, 58, 506, 507, 502, 503, 238, 239, 605, 606, 47, 48, 498, 499, 476, 477, 494, 495, 498, 499, 502, 503, 506, 507, 166, 282, 502, 503, 498, 499, 47, 48, 388, 16, 433, 434, 81, 82, 441, 442, 7, 8, 81, 82, 238, 239, 242, 239, 242, 239, 329, 330, 325, 326, 81, 82, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 248, 249, 504, 505, 500, 501, 101, 102, 496, 497, 496, 497, 359, 360, 492, 493, 496, 497, 45, 46, 492, 493, 236, 237, 321, 2, 500, 501, 45, 46, 359, 360, 500, 501, 281, 592, 588, 589, 595, 596, 496, 497, 599, 600, 504, 505, 496, 497, 603, 604, 633, 46, 625, 46, 427, 428, 45, 46, 492, 493, 236, 237, 72, 64, 72, 64, 1, 2, 496, 497, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 250, 251, 506, 507, 502, 503, 89, 103, 498, 499, 498, 499, 361, 362, 494, 495, 498, 499, 47, 48, 494, 495, 238, 239, 322, 4, 502, 503, 47, 48, 361, 362, 502, 503, 593, 594, 590, 591, 597, 598, 498, 499, 601, 602, 506, 507, 498, 499, 605, 606, 634, 635, 626, 627, 429, 430, 47, 48, 494, 495, 238, 239, 69, 66, 69, 66, 3, 4, 498, 499, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 45, 46, 573, 574, 75, 76, 496, 497, 504, 505, 504, 505, 630, 46, 580, 581, 504, 505, 409, 410, 236, 237, 603, 604, 280, 281, 286, 287, 630, 46, 492, 493, 500, 501, 630, 46, 496, 497, 496, 497, 359, 360, 492, 493, 244, 241, 36, 37, 276, 277, 42, 34, 244, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 1, 2, 280, 281, 504, 505, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 47, 48, 575, 282, 77, 78, 498, 499, 506, 507, 506, 507, 631, 632, 582, 583, 506, 507, 411, 412, 238, 239, 605, 606, 166, 282, 288, 289, 631, 632, 494, 495, 502, 503, 631, 632, 498, 499, 498, 499, 361, 362, 494, 495, 238, 239, 15, 38, 278, 279, 43, 44, 238, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 3, 4, 166, 282, 506, 507, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 496, 497, 492, 493, 244, 241, 240, 241, 240, 241, 13, 14, 5, 6, 423, 424, 492, 493, 496, 497, 107, 6, 55, 56, 45, 46, 359, 360, 628, 629, 51, 52, 504, 505, 628, 629, 51, 52, 492, 493, 286, 287, 45, 46, 107, 6, 370, 371, 492, 493, 619, 620, 363, 364, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 603, 604, 283, 46, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 498, 499, 494, 495, 238, 239, 242, 239, 242, 239, 15, 16, 7, 8, 425, 426, 494, 495, 498, 499, 89, 108, 57, 58, 47, 48, 361, 362, 47, 48, 53, 54, 506, 507, 47, 48, 53, 54, 494, 495, 288, 289, 47, 48, 89, 108, 372, 373, 494, 495, 47, 621, 365, 50, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 605, 606, 47, 48, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 533, 253, 45, 46, 622, 46, 236, 237, 72, 64, 72, 64, 321, 2, 492, 493, 283, 46, 496, 497, 504, 505, 75, 76, 565, 566, 492, 493, 599, 600, 283, 46, 359, 360, 496, 497, 474, 475, 569, 570, 504, 505, 492, 493, 492, 493, 101, 102, 492, 493, 359, 360, 619, 620, 272, 273, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 534, 255, 47, 48, 623, 624, 238, 239, 69, 66, 69, 66, 322, 4, 494, 495, 47, 48, 498, 499, 506, 507, 77, 78, 567, 568, 494, 495, 601, 602, 47, 48, 361, 362, 498, 499, 476, 477, 571, 572, 506, 507, 494, 495, 494, 495, 89, 103, 494, 495, 361, 362, 47, 621, 274, 275, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 529, 249, 492, 493, 619, 620, 49, 14, 5, 6, 246, 237, 603, 604, 504, 505, 496, 497, 500, 501, 584, 585, 101, 102, 492, 493, 504, 505, 500, 501, 630, 46, 496, 497, 496, 497, 630, 46, 500, 501, 492, 493, 286, 287, 569, 570, 75, 76, 496, 497, 45, 46, 619, 620, 39, 40, 281, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 530, 251, 494, 495, 47, 621, 19, 50, 7, 8, 238, 239, 605, 606, 506, 507, 498, 499, 502, 503, 586, 587, 89, 103, 494, 495, 506, 507, 502, 503, 631, 632, 498, 499, 498, 499, 631, 632, 502, 503, 494, 495, 288, 289, 571, 572, 77, 78, 498, 499, 47, 48, 47, 621, 31, 41, 285, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 492, 493, 619, 620, 272, 273, 45, 46, 236, 237, 247, 241, 240, 241, 83, 84, 104, 84, 79, 80, 244, 241, 391, 22, 500, 501, 281, 592, 628, 629, 366, 367, 504, 505, 628, 629, 480, 481, 492, 493, 492, 493, 409, 410, 244, 241, 328, 14, 379, 380, 79, 80, 244, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 494, 495, 47, 621, 274, 275, 47, 48, 238, 239, 242, 239, 242, 239, 3, 85, 105, 106, 81, 82, 238, 239, 392, 24, 502, 503, 593, 594, 47, 48, 368, 369, 506, 507, 47, 48, 482, 483, 494, 495, 494, 495, 411, 412, 238, 239, 329, 330, 381, 382, 81, 82, 238, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 45, 46, 619, 620, 559, 273, 492, 493, 236, 237, 72, 64, 72, 64, 1, 2, 281, 46, 492, 493, 236, 237, 256, 257, 496, 497, 500, 501, 492, 493, 492, 493, 492, 493, 496, 497, 569, 570, 504, 505, 595, 596, 409, 410, 236, 237, 1, 2, 45, 46, 500, 501, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 47, 48, 47, 621, 560, 275, 494, 495, 238, 239, 69, 66, 69, 66, 3, 4, 285, 48, 494, 495, 238, 239, 258, 259, 498, 499, 502, 503, 494, 495, 494, 495, 494, 495, 498, 499, 571, 572, 506, 507, 597, 598, 411, 412, 238, 239, 3, 4, 47, 48, 502, 503, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 359, 360, 500, 501, 244, 241, 240, 241, 70, 64, 72, 64, 72, 64, 603, 604, 281, 46, 569, 570, 236, 237, 252, 253, 359, 360, 599, 600, 496, 497, 286, 287, 474, 475, 286, 287, 474, 475, 504, 505, 492, 493, 496, 497, 236, 237, 1, 2, 496, 497, 280, 281, 236, 237, 72, 64, 151, 152, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 361, 362, 502, 503, 238, 239, 242, 239, 69, 66, 69, 66, 69, 66, 605, 606, 285, 48, 571, 572, 238, 239, 254, 255, 361, 362, 601, 602, 498, 499, 288, 289, 476, 477, 288, 289, 476, 477, 506, 507, 494, 495, 498, 499, 238, 239, 3, 4, 498, 499, 166, 282, 238, 239, 69, 66, 153, 130, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 25, 26, 323, 324, 244, 241, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 504, 505, 492, 493, 236, 237, 248, 249, 492, 493, 625, 46, 633, 46, 166, 284, 492, 493, 622, 46, 625, 46, 625, 46, 588, 589, 45, 46, 236, 237, 611, 612, 500, 501, 496, 497, 236, 237, 72, 64, 149, 130, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 27, 28, 325, 326, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 506, 507, 494, 495, 238, 239, 250, 251, 494, 495, 626, 627, 634, 635, 47, 48, 494, 495, 623, 624, 626, 627, 626, 627, 590, 591, 47, 48, 238, 239, 613, 614, 502, 503, 498, 499, 238, 239, 69, 66, 150, 130, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 492, 493, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 70, 64, 247, 241, 240, 241, 36, 37, 276, 277, 29, 30, 492, 493, 619, 620, 331, 332, 42, 34, 244, 241, 240, 241, 70, 64, 247, 241, 240, 241, 240, 241, 13, 14, 154, 155, 158, 159, 162, 163, 5, 6, 615, 616, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 494, 495, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 69, 66, 242, 239, 242, 239, 15, 38, 278, 279, 31, 32, 494, 495, 47, 621, 333, 334, 43, 44, 238, 239, 242, 239, 69, 66, 242, 239, 242, 239, 242, 239, 15, 16, 156, 157, 160, 161, 164, 165, 7, 8, 617, 618, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 474, 475, 622, 46, 13, 14, 268, 269, 264, 265, 544, 545, 615, 616, 607, 608, 379, 380, 615, 616, 615, 616, 607, 608, 246, 237, 72, 64, 321, 2, 619, 620, 272, 273, 492, 493, 619, 620, 272, 273, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 256, 257, 166, 167, 168, 169, 170, 171, 492, 493, 504, 505, 573, 574, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 476, 477, 623, 624, 15, 16, 270, 271, 266, 267, 262, 263, 617, 618, 609, 610, 381, 382, 617, 618, 617, 618, 609, 610, 238, 239, 69, 66, 322, 4, 47, 621, 274, 275, 494, 495, 47, 621, 274, 275, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 258, 259, 47, 48, 47, 48, 47, 48, 494, 495, 506, 507, 575, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 603, 604, 281, 46, 619, 620, 272, 273, 492, 493, 492, 493, 496, 497, 504, 505, 474, 475, 496, 497, 492, 493, 359, 360, 359, 360, 236, 237, 72, 64, 1, 2, 619, 620, 355, 40, 492, 493, 619, 620, 559, 273, 633, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 252, 253, 496, 497, 500, 501, 283, 46, 496, 497, 359, 360, 496, 497, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 605, 606, 285, 48, 47, 621, 274, 275, 494, 495, 494, 495, 498, 499, 506, 507, 476, 477, 498, 499, 494, 495, 361, 362, 361, 362, 238, 239, 69, 66, 3, 4, 47, 621, 356, 41, 494, 495, 47, 621, 560, 275, 634, 635, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 254, 255, 498, 499, 502, 503, 47, 48, 498, 499, 361, 362, 498, 499, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 359, 360, 500, 501, 321, 2, 492, 493, 492, 493, 166, 284, 492, 493, 500, 501, 496, 497, 492, 493, 500, 501, 496, 497, 328, 14, 431, 432, 276, 277, 357, 358, 9, 10, 359, 360, 628, 629, 347, 348, 276, 277, 25, 26, 615, 616, 439, 440, 5, 6, 5, 6, 246, 237, 531, 249, 500, 501, 595, 596, 281, 46, 496, 497, 281, 592, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 361, 362, 502, 503, 322, 4, 494, 495, 494, 495, 47, 48, 494, 495, 502, 503, 498, 499, 494, 495, 502, 503, 498, 499, 329, 330, 433, 434, 278, 279, 43, 44, 11, 12, 361, 362, 47, 48, 349, 350, 278, 279, 27, 28, 617, 618, 441, 442, 7, 8, 7, 8, 238, 239, 532, 251, 502, 503, 597, 598, 285, 48, 498, 499, 593, 594, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 45, 46, 630, 46, 244, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 240, 241, 21, 22, 280, 281, 45, 46, 256, 257, 492, 493, 500, 501, 45, 46, 500, 501, 492, 493, 492, 493, 580, 581, 504, 505, 500, 501, 492, 493, 1, 2, 500, 501, 492, 493, 236, 237, 321, 2, 500, 501, 504, 505, 45, 46, 500, 501, 504, 505, 166, 284, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 47, 48, 631, 632, 238, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 23, 24, 166, 282, 47, 48, 258, 259, 494, 495, 502, 503, 47, 48, 502, 503, 494, 495, 494, 495, 582, 583, 506, 507, 502, 503, 494, 495, 3, 4, 502, 503, 494, 495, 238, 239, 322, 4, 502, 503, 506, 507, 47, 48, 502, 503, 506, 507, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 387, 14, 59, 60, 409, 410, 628, 629, 339, 340, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 492, 493, 492, 493, 252, 253, 492, 493, 328, 14, 379, 380, 21, 22, 45, 46, 504, 505, 45, 46, 595, 596, 573, 574, 359, 360, 427, 428, 359, 360, 492, 493, 236, 237, 1, 2, 474, 475, 500, 501, 595, 596, 280, 281, 496, 497, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 388, 16, 61, 62, 411, 412, 47, 48, 341, 342, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 494, 495, 494, 495, 254, 255, 494, 495, 329, 330, 381, 382, 23, 24, 47, 48, 506, 507, 47, 48, 597, 598, 575, 282, 361, 362, 429, 430, 361, 362, 494, 495, 238, 239, 3, 4, 476, 477, 502, 503, 597, 598, 166, 282, 498, 499, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 492, 493, 492, 493, 474, 475, 45, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 166, 284, 45, 46, 248, 249, 492, 493, 375, 376, 309, 46, 1, 2, 45, 46, 630, 46, 492, 493, 409, 410, 500, 501, 492, 493, 603, 604, 280, 281, 630, 46, 236, 237, 321, 2, 633, 46, 625, 46, 633, 46, 625, 46, 633, 46, 625, 46, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 494, 495, 494, 495, 476, 477, 47, 48, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 47, 48, 47, 48, 250, 251, 494, 495, 377, 378, 310, 311, 3, 4, 47, 48, 631, 632, 494, 495, 411, 412, 502, 503, 494, 495, 605, 606, 166, 282, 631, 632, 238, 239, 322, 4, 634, 635, 626, 627, 634, 635, 626, 627, 634, 635, 626, 627, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 611, 612, 504, 505, 283, 46, 500, 501, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 439, 440, 59, 60, 496, 497, 492, 493, 55, 56, 280, 281, 1, 2, 305, 306, 294, 295, 45, 46, 628, 629, 51, 52, 500, 501, 286, 287, 492, 493, 55, 56, 496, 497, 628, 629, 339, 340, 36, 37, 276, 277, 563, 564, 276, 277, 563, 564, 276, 277, 563, 564, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 613, 614, 506, 507, 47, 48, 502, 503, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 441, 442, 61, 62, 498, 499, 494, 495, 57, 58, 166, 282, 3, 4, 307, 308, 296, 297, 47, 48, 47, 48, 53, 54, 502, 503, 288, 289, 494, 495, 57, 58, 498, 499, 47, 48, 341, 342, 15, 38, 278, 279, 278, 279, 278, 279, 278, 279, 278, 279, 278, 279, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 1, 2, 280, 281, 496, 497, 496, 497, 492, 493, 500, 501, 427, 428, 302, 303, 290, 291, 45, 46, 492, 493, 573, 574, 359, 360, 359, 360, 504, 505, 283, 46, 496, 497, 500, 501, 504, 505, 1, 2, 45, 46, 280, 281, 45, 46, 625, 46, 492, 493, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 3, 4, 166, 282, 498, 499, 498, 499, 494, 495, 502, 503, 429, 430, 47, 304, 292, 293, 47, 48, 494, 495, 575, 282, 361, 362, 361, 362, 506, 507, 47, 48, 498, 499, 502, 503, 506, 507, 3, 4, 47, 48, 166, 282, 47, 48, 626, 627, 494, 495, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 375, 376, 496, 497, 569, 570, 504, 505, 409, 410, 630, 46, 375, 376, 509, 510, 1, 2, 45, 46, 630, 46, 281, 46, 166, 284, 492, 493, 280, 281, 45, 46, 492, 493, 622, 46, 630, 46, 244, 241, 240, 241, 328, 14, 323, 324, 357, 358, 244, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 377, 378, 498, 499, 571, 572, 506, 507, 411, 412, 631, 632, 377, 378, 511, 512, 3, 4, 47, 48, 631, 632, 285, 48, 47, 48, 494, 495, 166, 282, 47, 48, 494, 495, 623, 624, 631, 632, 238, 239, 242, 239, 329, 330, 325, 326, 43, 44, 238, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 328, 14, 379, 380, 5, 6, 107, 6, 374, 60, 492, 493, 280, 281, 21, 22, 628, 629, 25, 26, 5, 6, 9, 10, 45, 46, 628, 629, 576, 577, 359, 360, 599, 600, 496, 497, 83, 84, 79, 80, 104, 84, 49, 14, 25, 26, 5, 6, 370, 371, 492, 493, 281, 46, 328, 14, 5, 6, 246, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 329, 330, 381, 382, 7, 8, 89, 108, 61, 62, 494, 495, 166, 282, 23, 24, 47, 48, 27, 28, 7, 8, 11, 12, 47, 48, 47, 48, 578, 579, 361, 362, 601, 602, 498, 499, 3, 85, 81, 82, 105, 106, 19, 50, 27, 28, 7, 8, 372, 373, 494, 495, 285, 48, 329, 330, 7, 8, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 45, 46, 283, 46, 75, 76, 569, 570, 492, 493, 500, 501, 321, 2, 409, 410, 492, 493, 474, 475, 496, 497, 496, 497, 492, 493, 359, 360, 500, 501, 492, 493, 492, 493, 256, 257, 496, 497, 619, 620, 272, 273, 500, 501, 45, 46, 283, 46, 492, 493, 500, 501, 75, 76, 492, 493, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 47, 48, 47, 48, 77, 78, 571, 572, 494, 495, 502, 503, 322, 4, 411, 412, 494, 495, 476, 477, 498, 499, 498, 499, 494, 495, 361, 362, 502, 503, 494, 495, 494, 495, 258, 259, 498, 499, 47, 621, 274, 275, 502, 503, 47, 48, 47, 48, 494, 495, 502, 503, 77, 78, 494, 495, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 321, 2, 504, 505, 500, 501, 101, 102, 496, 497, 492, 493, 496, 497, 611, 612, 283, 46, 286, 287, 584, 585, 599, 600, 280, 281, 286, 287, 409, 410, 280, 281, 496, 497, 45, 46, 252, 253, 45, 46, 619, 620, 557, 273, 496, 497, 492, 493, 492, 493, 504, 505, 500, 501, 611, 612, 280, 281, 236, 237, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 322, 4, 506, 507, 502, 503, 89, 103, 498, 499, 494, 495, 498, 499, 613, 614, 47, 48, 288, 289, 586, 587, 601, 602, 166, 282, 288, 289, 411, 412, 166, 282, 498, 499, 47, 48, 254, 255, 47, 48, 47, 621, 558, 275, 498, 499, 494, 495, 494, 495, 506, 507, 502, 503, 613, 614, 166, 282, 238, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 247, 241, 240, 241, 240, 241, 240, 241, 335, 336, 492, 493, 166, 284, 375, 376, 496, 497, 492, 493, 280, 281, 496, 497, 496, 497, 504, 505, 283, 46, 492, 493, 359, 360, 496, 497, 248, 249, 45, 46, 45, 46, 244, 241, 240, 241, 240, 241, 391, 22, 504, 505, 504, 505, 244, 241, 240, 241, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 242, 239, 242, 239, 242, 239, 242, 239, 337, 338, 494, 495, 47, 48, 377, 378, 498, 499, 494, 495, 166, 282, 498, 499, 498, 499, 506, 507, 47, 48, 494, 495, 361, 362, 498, 499, 250, 251, 47, 48, 47, 48, 238, 239, 242, 239, 242, 239, 392, 24, 506, 507, 506, 507, 238, 239, 242, 239, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 74, 68, 67, 68, 67, 68, 74, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 74, 68, 67, 68, 67, 68, 70, 64, 72, 64, 72, 64, 74, 68, 67, 68, 67, 68, 70, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 72, 64, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66, 69, 66], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":641, + "image":"11.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"11", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/crypt4/level.json b/gamefileshf/level/crypt4/level.json new file mode 100755 index 00000000..a4c34695 --- /dev/null +++ b/gamefileshf/level/crypt4/level.json @@ -0,0 +1,33 @@ +{ + "variable": [ + { "colorCycleSpeed": 120 }, + { "colorCycleStart": 1 }, + { "colorCycleStop": 16 } + ], + "palette": [ + { + "id": "l5base", + "file": "Nlevels/L5Data/L5Base.PAL" + }, + { + "id": "colorCycle", + "fromId": "l5base" + } + ], + "load": ["level/crypt1/l5s.json", "l5base"], + "level": { + "id": "level", + "palette": "l5base", + "file": "Nlevels/L5Data/L5.CEL", + "layers": { "index": 2, "texturePack": "l5s" }, + "outOfBoundsTileLayer2": 21, + "til": "Nlevels/L5Data/L5.TIL", + "min": "Nlevels/L5Data/L5.MIN", + "minBlocks": 10, + "sol": "Nlevels/L5Data/L5.SOL" + }, + "load": "level/automap/l5/load.json", + "load": "level/crypt4/levelObjects.json", + "load": "level/crypt4/monsters.json", + "load": "level/crypt4/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt4/level2.json b/gamefileshf/level/crypt4/level2.json new file mode 100755 index 00000000..344b5de3 --- /dev/null +++ b/gamefileshf/level/crypt4/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "crypt4", + "name": "Crypt 4", + "map": { "file": "level/crypt4/crypt4.json", "indexOffset": -1 } + }, + "load": "level/crypt4/levelObjects2.json", + "load": "level/crypt4/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/crypt4/levelObjects2.json b/gamefileshf/level/crypt4/levelObjects2.json new file mode 100755 index 00000000..2d6ae276 --- /dev/null +++ b/gamefileshf/level/crypt4/levelObjects2.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "up", + "class": "levelUpCrypt", + "mapPosition": [78, 65], + "properties": { + "x": 77, + "y": 87, + "level": 3 + } + } +} \ No newline at end of file diff --git a/gamefileshf/level/crypt4/music.json b/gamefileshf/level/crypt4/music.json new file mode 100755 index 00000000..d26cdce6 --- /dev/null +++ b/gamefileshf/level/crypt4/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlE.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/item/actions.json b/gamefileshf/level/item/actions.json new file mode 100755 index 00000000..3f3c4498 --- /dev/null +++ b/gamefileshf/level/item/actions.json @@ -0,0 +1,113 @@ +{ + "action": [ + { + "name": "action.set", + "id": "pickItemInInventory", + "action": { "name": "sound.play", "id": "invgrab" } + }, + { + "name": "action.set", + "id": "pickItemInventoryFull", + "action": [ + { + "name": "randomList", + "actions": [ + { "name": "sound.play", "id": "cantCarryAnymore" }, + { "name": "sound.play", "id": "haveNoRoom" }, + { "name": "sound.play", "id": "whereWouldIPutThis" } + ] + }, + { "name": "item.executeAction", "action": "levelDrop" } + ] + }, + { + "name": "action.set", + "id": "pickItemInLevelToBeltOrStash", + "action": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.inventory.belt.isFull%", + "param2": false, + "then": [ + { + "name": "item.loadFromLevel", + "inventory": "belt", + "position": "TopLeft", + "onInventoryFull": "pickItemInventoryFull" + }, + "updateBeltItems" + ], + "else": { + "name": "item.loadFromLevel", + "inventory": "stash", + "position": "BottomLeft", + "onInventoryFull": "pickItemInventoryFull" + } + } + }, + { + "name": "action.set", + "id": "pickItemInLevel", + "action": { + "name": "if.equal", + "param1": "%game.hasResource.charPanelInventory%", + "param2": true, + "then": { + "name": "if.equal", + "param1": "%currentLevel.currentPlayer.hasSelectedItem%", + "param2": false, + "then": { + "name": "if.equal", + "param1": "%currentLevel.clickedObject.itemType%", + "param2": "Gold", + "then": [ + { + "name": "item.loadFromLevel", + "inventory": "stash", + "position": "BottomRight", + "splitIntoMultiple": true, + "onInventoryFull": "pickItemInventoryFull" + }, + "updateStashItems" + ], + "else": [ + { "name": "item.loadFromLevel" }, + "updateSelectedItem" + ] + } + }, + "else": [ + { + "name": "switch", + "param": "%currentLevel.clickedObject.itemType%", + "case": [ + { + "value": "Gold", + "action": { + "name": "item.loadFromLevel", + "inventory": "stash", + "position": "BottomRight", + "splitIntoMultiple": true, + "onInventoryFull": "pickItemInventoryFull" + } + }, + { + "value": "Potion", + "action": "pickItemInLevelToBeltOrStash" + }, + { + "value": "Scroll", + "action": "pickItemInLevelToBeltOrStash" + } + ], + "default": { + "name": "item.loadFromLevel", + "inventory": "stash", + "position": "TopRight", + "onInventoryFull": "pickItemInventoryFull" + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/item/baseItemshf.json b/gamefileshf/level/item/baseItemshf.json new file mode 100755 index 00000000..0fe4ecfb --- /dev/null +++ b/gamefileshf/level/item/baseItemshf.json @@ -0,0 +1,9 @@ +{ + "itemClass": { + "id": "baseItemhf", + "fromId": "baseItem", + "dropTexturePack": "ring", + "inventoryTexturePack": "itemIcons2", + "inventoryTextureIndex": 12 + } +} \ No newline at end of file diff --git a/gamefileshf/level/item/classes.json b/gamefileshf/level/item/classes.json new file mode 100755 index 00000000..9132d3a1 --- /dev/null +++ b/gamefileshf/level/item/classes.json @@ -0,0 +1,4 @@ +{ + "load": "level/item/classesd.json", + "load": "level/item/classeshf.json" +} \ No newline at end of file diff --git a/gamefileshf/level/item/classeshf.json b/gamefileshf/level/item/classeshf.json new file mode 100755 index 00000000..89d51f17 --- /dev/null +++ b/gamefileshf/level/item/classeshf.json @@ -0,0 +1,5 @@ +{ + "load": "level/item/inventoryTextureshf.json", + "load": "level/item/dropTextureshf.json", + "load": "level/item/classeshf2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/item/classeshf2.json b/gamefileshf/level/item/classeshf2.json new file mode 100755 index 00000000..f94ed5c8 --- /dev/null +++ b/gamefileshf/level/item/classeshf2.json @@ -0,0 +1,4 @@ +{ + "load": "level/item/baseItemshf.json", + "load": "level/item/mischf.json" +} \ No newline at end of file diff --git a/gamefileshf/level/item/dropTextureshf.json b/gamefileshf/level/item/dropTextureshf.json new file mode 100755 index 00000000..5514e32c --- /dev/null +++ b/gamefileshf/level/item/dropTextureshf.json @@ -0,0 +1,7 @@ +{ + "load": "level/item/itemCelFileshf.json", + "texturePack": [ + { "id": "bombs1", "imageContainer": "bombs1", "palette": "town" }, + { "id": "teddys1", "imageContainer": "teddys1", "palette": "town" } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/item/inventoryTextureshf.json b/gamefileshf/level/item/inventoryTextureshf.json new file mode 100755 index 00000000..d0baca82 --- /dev/null +++ b/gamefileshf/level/item/inventoryTextureshf.json @@ -0,0 +1,8 @@ +{ + "imageContainer": { "file": "data/Inv/Objcurs2.CEL" }, + "texturePack": { + "id": "itemIcons2", + "imageContainer": "Objcurs2", + "palette": "town" + } +} \ No newline at end of file diff --git a/gamefileshf/level/item/itemCelFileshf.json b/gamefileshf/level/item/itemCelFileshf.json new file mode 100755 index 00000000..01d965e3 --- /dev/null +++ b/gamefileshf/level/item/itemCelFileshf.json @@ -0,0 +1,6 @@ +{ + "imageContainer": [ + { "file": "Items/bombs1.CEL" }, + { "file": "Items/teddys1.CEL" } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/item/mischf.json b/gamefileshf/level/item/mischf.json new file mode 100755 index 00000000..d07f6f00 --- /dev/null +++ b/gamefileshf/level/item/mischf.json @@ -0,0 +1,102 @@ +{ + "itemClass": [ + { + "id": "runeBomb", + "fromId": "baseItemhf", + "dropTexturePack": "bombs1", + "inventoryTextureIndex": 19, + "name": "Rune bomb", + "shortName": "Bomb", + "type": "Bomb", + "formulas": { + "sell": null + }, + "actions": { + "levelDrop": [ + { + "name": "if", + "params": [ + "%currentLevel.path%", "==", "town", + "and", + "%currentLevel.levelObject.79,62.class%", "==", "runeBomb" + ], + "then": [ + { + "name": "loadJson", + "json": { + "audio": { + "file": "Sfx/misc/NestXpld.wav", + "resource": "currentLevel", + "volume": "%game.soundVolume%", + "play": true + } + } + }, + { "name": "load", "file": "level/town/levelNest.json" }, + { "name": "quest.setState", "quest": "farmersOrchard", "state": -1 }, + { "name": "levelObject.deleteByClass", "class": "runeBomb" } + ], + "else": [ + { "name": "sound.play", "id": "fliprock" }, + { "name": "quest.setState", "quest": "farmersOrchard", "state": 2 } + ] + } + ], + "levelPick": [ + { + "name": "if.equal", + "param1": "%currentLevel.quest.farmersOrchard.state%", + "param2": 2, + "then": { "name": "quest.setState", "quest": "farmersOrchard", "state": 3 } + }, + "clearPanelText" + ], + "inventoryDrop": { "name": "sound.play", "id": "invrock" } + } + }, + { + "id": "cathedralMap", + "fromId": "baseItem", + "dropTexturePack": "scroll", + "inventoryTextureIndex": 107, + "name": "Cathedral map", + "shortName": "Map", + "type": "Map", + "defaults": { + "rightClick": true + }, + "descriptions": { "index": 0, "name": "rightClickToView" }, + "inventorySize": [2, 2], + "formulas": { + "sell": null + }, + "actions": { + "levelDrop": [ + { + "name": "if", + "params": [ + "%currentLevel.path%", "==", "town", + "and", + { "name": "levelObject.isInRangeByClass", "class": "cathedralMap", "range": [35, 20, 4, 6] }, + "==", true + ], + "then": [ + { "name": "sound.play", "id": "sarc" }, + { "name": "load", "file": "level/town/levelCrypt.json" }, + { "name": "levelObject.deleteByClass", "class": "cathedralMap" } + ], + "else": [ + { "name": "sound.play", "id": "flipscrl" } + ] + } + ], + "inventoryDrop": { "name": "sound.play", "id": "invscrol" }, + "rightClick": [ + "clearPanelText", + { "name": "load", "file": ["ui/level/viewMap.json", "mapztown", "Items/Map/MapZtown.CEL"] }, + { "name": "sound.play", "id": "invscrol" } + ] + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/levelObject/classes.json b/gamefileshf/level/levelObject/classes.json new file mode 100755 index 00000000..3b141ca7 --- /dev/null +++ b/gamefileshf/level/levelObject/classes.json @@ -0,0 +1,6 @@ +{ + "load": "level/levelObject/classifiers.json", + "load": "level/levelObject/classifiershf.json", + "load": "level/levelObject/classes2.json", + "load": "level/levelObject/classeshf.json" +} \ No newline at end of file diff --git a/gamefileshf/level/levelObject/classeshf.json b/gamefileshf/level/levelObject/classeshf.json new file mode 100755 index 00000000..c8ee1352 --- /dev/null +++ b/gamefileshf/level/levelObject/classeshf.json @@ -0,0 +1,82 @@ +{ + "levelObjectClass": [ + { + "id": "levelDownCrypt", + "fromId": "levelDown", + "nameClassifier": "levelNameDownCrypt", + "text1": "crypt1", + "text2": "cutl5", + "descriptions": [ + { "index": 0, "name": "levelPathCrypt" }, + { "index": 1, "name": "loadingScreenText2" } + ] + }, + { + "id": "levelDownNest", + "fromId": "levelDownCrypt", + "nameClassifier": "levelNameDown", + "text1": "nest1", + "text2": "cutl6", + "descriptions": [ + { "index": 0, "name": "levelPathNest" } + ] + }, + { + "id": "levelUpCrypt", + "fromId": "levelUp", + "nameClassifier": "levelNameUpCrypt", + "text1": "crypt1", + "text2": "cutl5", + "descriptions": [ + { "index": 0, "name": "levelPathCrypt" }, + { "index": 1, "name": "loadingScreenText2" } + ] + }, + { + "id": "levelUpNest", + "fromId": "levelUpCrypt", + "nameClassifier": "levelNameUpNest", + "text1": "nest1", + "text2": "cutl6", + "descriptions": [ + { "index": 0, "name": "levelPathNest" } + ] + }, + { + "id": "levelCrypt", + "fromId": "levelTown", + "name": "Down to crypt", + "text1": "crypt1", + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.crypt.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.crypt.x%, %currentLevel.levelObject.crypt.y%]", + "cutl5" + ] + } + } + }, + { + "id": "levelNest", + "fromId": "levelTown", + "name": "Down to hive", + "text1": "nest1", + "actions": { + "action": { + "name": "load", + "file": [ + "level/load.json", + "%currentLevel.levelObject.nest.d.0%", + "positionPlayer", + "[%currentLevel.levelObject.nest.x%, %currentLevel.levelObject.nest.y%]", + "cutl6" + ] + } + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/levelObject/classifiershf.json b/gamefileshf/level/levelObject/classifiershf.json new file mode 100755 index 00000000..5fecc237 --- /dev/null +++ b/gamefileshf/level/levelObject/classifiershf.json @@ -0,0 +1,62 @@ +{ + "classifier": [ + { + "id": "levelNameDownCrypt", + "values": [ + { + "property": "level", + "value": { "min": "min", "max": "max", "value": "Down to crypt level %level%" } + }, + { "value": { "value": "%simpleName%" } } + ] + }, + { + "id": "levelNameUpCrypt", + "values": [ + { + "property": "level", + "value": { "min": "min", "max": "max", "value": "Up to crypt level %level%" } + }, + { "value": { "value": "%simpleName%" } } + ] + }, + { + "id": "levelNameUpNest", + "values": [ + { + "property": "level", + "value": { "min": "min", "max": "max", "value": "Up to nest level %level%" } + }, + { "value": { "value": "%simpleName%" } } + ] + }, + { + "id": "levelPathCrypt", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": -1, "value": "crypt%level%" }, + { "min": 0, "max": 0, "value": "town" }, + { "min": 1, "max": "max", "value": "crypt%level%" } + ] + }, + { "value": { "value": "%text1%" } } + ] + }, + { + "id": "levelPathNest", + "values": [ + { + "property": "level", + "value": [ + { "min": "min", "max": -1, "value": "nest%level%" }, + { "min": 0, "max": 0, "value": "town" }, + { "min": 1, "max": "max", "value": "nest%level%" } + ] + }, + { "value": { "value": "%text1%" } } + ] + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/nest1/level.json b/gamefileshf/level/nest1/level.json new file mode 100755 index 00000000..6e6bdafa --- /dev/null +++ b/gamefileshf/level/nest1/level.json @@ -0,0 +1,20 @@ +{ + "palette": { + "id": "l6base", + "file": "Nlevels/L6Data/L6Base.PAL" + }, + "level": { + "id": "level", + "palette": "l6base", + "file": "Nlevels/L6Data/L6.CEL", + "outOfBoundsTileLayer2": 7, + "til": "Nlevels/L6Data/L6.TIL", + "min": "Nlevels/L6Data/L6.MIN", + "minBlocks": 10, + "sol": "Nlevels/L6Data/L6.SOL" + }, + "load": "level/automap/l6/load.json", + "load": "level/nest1/levelObjects.json", + "load": "level/nest1/monsters.json", + "load": "level/nest1/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest1/level2.json b/gamefileshf/level/nest1/level2.json new file mode 100755 index 00000000..f181a6ef --- /dev/null +++ b/gamefileshf/level/nest1/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "nest1", + "name": "Nest 1", + "map": { "file": "level/nest1/nest1.json", "indexOffset": -1 } + }, + "load": "level/nest1/levelObjects2.json", + "load": "level/nest1/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest1/levelObjects2.json b/gamefileshf/level/nest1/levelObjects2.json new file mode 100755 index 00000000..1d5628b2 --- /dev/null +++ b/gamefileshf/level/nest1/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDownNest", + "mapPosition": [46, 47], + "properties": { + "x": 67, + "y": 21, + "level": 2 + } + }, + { + "id": "up", + "class": "levelUp", + "mapPosition": [69, 18], + "properties": { + "x": 79, + "y": 62, + "level": 0 + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/nest1/music.json b/gamefileshf/level/nest1/music.json new file mode 100755 index 00000000..1f84b555 --- /dev/null +++ b/gamefileshf/level/nest1/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlF.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/nest1/nest1.json b/gamefileshf/level/nest1/nest1.json new file mode 100755 index 00000000..e9dabc3f --- /dev/null +++ b/gamefileshf/level/nest1/nest1.json @@ -0,0 +1,158 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 94, 95, 94, 95, 91, 92, 29, 30, 94, 95, 97, 98, 29, 30, 91, 92, 91, 92, 97, 98, 100, 101, 100, 101, 91, 92, 100, 101, 91, 92, 97, 98, 91, 92, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 97, 98, 94, 95, 94, 95, 88, 89, 87, 74, 97, 98, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 29, 30, 29, 30, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 96, 32, 96, 32, 93, 32, 31, 32, 96, 32, 99, 32, 31, 32, 93, 32, 93, 32, 99, 32, 102, 32, 102, 32, 93, 32, 102, 32, 93, 32, 99, 32, 93, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 99, 32, 96, 32, 96, 32, 90, 32, 75, 32, 99, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 31, 32, 31, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 94, 95, 91, 92, 29, 30, 29, 30, 100, 101, 94, 95, 29, 30, 91, 92, 94, 95, 29, 30, 91, 92, 94, 95, 97, 98, 94, 95, 29, 30, 29, 30, 94, 95, 139, 140, 143, 144, 9, 10, 41, 42, 79, 80, 83, 84, 9, 10, 187, 188, 147, 148, 9, 10, 97, 98, 29, 30, 94, 95, 29, 30, 94, 95, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 96, 32, 93, 32, 31, 32, 31, 32, 102, 32, 96, 32, 31, 32, 93, 32, 96, 32, 31, 32, 93, 32, 96, 32, 99, 32, 96, 32, 31, 32, 31, 32, 96, 32, 141, 142, 145, 146, 11, 12, 43, 44, 81, 82, 85, 86, 11, 12, 189, 190, 149, 150, 11, 12, 99, 32, 31, 32, 96, 32, 31, 32, 96, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 100, 101, 97, 98, 97, 98, 91, 92, 29, 30, 29, 30, 94, 95, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 91, 92, 100, 101, 29, 30, 1, 2, 53, 54, 49, 50, 45, 46, 25, 26, 103, 104, 49, 50, 45, 46, 103, 104, 13, 14, 94, 95, 29, 30, 29, 30, 100, 101, 100, 101, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 102, 32, 99, 32, 99, 32, 93, 32, 31, 32, 31, 32, 96, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 93, 32, 102, 32, 31, 32, 3, 4, 55, 56, 51, 52, 47, 48, 27, 28, 105, 106, 51, 52, 47, 48, 105, 106, 15, 16, 96, 32, 31, 32, 31, 32, 102, 32, 102, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 97, 98, 97, 98, 91, 92, 91, 92, 29, 30, 91, 92, 94, 95, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 100, 101, 91, 92, 139, 140, 143, 144, 151, 152, 37, 38, 175, 176, 45, 46, 103, 104, 25, 26, 103, 104, 17, 18, 53, 54, 103, 104, 17, 18, 21, 22, 91, 92, 94, 95, 94, 95, 29, 30, 91, 92, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 99, 32, 99, 32, 93, 32, 93, 32, 31, 32, 93, 32, 96, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 102, 32, 93, 32, 141, 142, 145, 146, 153, 154, 39, 40, 177, 178, 47, 48, 105, 106, 27, 28, 105, 106, 19, 20, 55, 56, 105, 106, 19, 20, 23, 24, 93, 32, 96, 32, 96, 32, 31, 32, 93, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 91, 92, 187, 188, 37, 38, 9, 10, 94, 95, 91, 92, 100, 101, 97, 98, 29, 30, 100, 101, 97, 98, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 135, 136, 25, 26, 107, 108, 107, 108, 17, 18, 5, 6, 53, 54, 25, 26, 103, 104, 13, 14, 119, 120, 103, 104, 49, 50, 9, 10, 94, 95, 29, 30, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 93, 32, 189, 190, 39, 40, 11, 12, 96, 32, 93, 32, 102, 32, 99, 32, 31, 32, 102, 32, 99, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 137, 138, 27, 28, 109, 110, 109, 110, 19, 20, 7, 8, 55, 56, 27, 28, 105, 106, 15, 16, 121, 122, 105, 106, 51, 52, 11, 12, 96, 32, 31, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 139, 140, 159, 160, 45, 46, 17, 18, 21, 22, 41, 42, 147, 148, 9, 10, 91, 92, 41, 42, 9, 10, 94, 95, 94, 95, 29, 30, 29, 30, 91, 92, 94, 95, 167, 168, 25, 26, 107, 108, 17, 18, 21, 22, 139, 140, 45, 46, 103, 104, 103, 104, 13, 14, 119, 120, 25, 26, 103, 104, 13, 14, 91, 92, 91, 92, 94, 95, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 141, 142, 161, 162, 47, 48, 19, 20, 23, 24, 43, 44, 149, 150, 11, 12, 93, 32, 43, 44, 11, 12, 96, 32, 96, 32, 31, 32, 31, 32, 93, 32, 96, 32, 169, 170, 27, 28, 109, 110, 19, 20, 23, 24, 141, 142, 47, 48, 105, 106, 105, 106, 15, 16, 121, 122, 27, 28, 105, 106, 15, 16, 93, 32, 93, 32, 96, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 33, 34, 115, 116, 115, 116, 13, 14, 29, 30, 33, 34, 25, 26, 49, 50, 143, 144, 45, 46, 13, 14, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 183, 184, 45, 46, 103, 104, 103, 104, 49, 50, 9, 10, 1, 2, 53, 54, 107, 108, 17, 18, 21, 22, 1, 2, 5, 6, 5, 6, 21, 22, 29, 30, 29, 30, 97, 98, 100, 101, 94, 95, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 35, 36, 117, 118, 117, 118, 15, 16, 31, 32, 35, 36, 27, 28, 51, 52, 145, 146, 47, 48, 15, 16, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 185, 186, 47, 48, 105, 106, 105, 106, 51, 52, 11, 12, 3, 4, 55, 56, 109, 110, 19, 20, 23, 24, 3, 4, 7, 8, 7, 8, 23, 24, 31, 32, 31, 32, 99, 32, 102, 32, 96, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 1, 2, 53, 54, 25, 26, 13, 14, 94, 95, 1, 2, 53, 54, 25, 26, 103, 104, 25, 26, 13, 14, 94, 95, 91, 92, 29, 30, 139, 140, 9, 10, 135, 136, 17, 18, 5, 6, 5, 6, 5, 6, 21, 22, 163, 164, 45, 46, 115, 116, 13, 14, 29, 30, 94, 95, 97, 98, 91, 92, 94, 95, 29, 30, 100, 101, 100, 101, 91, 92, 91, 92, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 3, 4, 55, 56, 27, 28, 15, 16, 96, 32, 3, 4, 55, 56, 27, 28, 105, 106, 27, 28, 15, 16, 96, 32, 93, 32, 31, 32, 141, 142, 11, 12, 137, 138, 19, 20, 7, 8, 7, 8, 7, 8, 23, 24, 165, 166, 47, 48, 117, 118, 15, 16, 31, 32, 96, 32, 99, 32, 93, 32, 96, 32, 31, 32, 102, 32, 102, 32, 93, 32, 93, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 41, 42, 45, 46, 107, 108, 49, 50, 9, 10, 139, 140, 45, 46, 103, 104, 107, 108, 25, 26, 13, 14, 91, 92, 100, 101, 183, 184, 45, 46, 49, 50, 45, 46, 49, 50, 9, 10, 91, 92, 94, 95, 91, 92, 123, 124, 115, 116, 103, 104, 49, 50, 9, 10, 94, 95, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 97, 98, 100, 101, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 43, 44, 47, 48, 109, 110, 51, 52, 11, 12, 141, 142, 47, 48, 105, 106, 109, 110, 27, 28, 15, 16, 93, 32, 102, 32, 185, 186, 47, 48, 51, 52, 47, 48, 51, 52, 11, 12, 93, 32, 96, 32, 93, 32, 125, 126, 117, 118, 105, 106, 51, 52, 11, 12, 96, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 99, 32, 102, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 33, 34, 25, 26, 107, 108, 17, 18, 21, 22, 167, 168, 25, 26, 107, 108, 111, 112, 17, 18, 21, 22, 183, 184, 9, 10, 123, 124, 262, 283, 25, 26, 103, 104, 107, 108, 13, 14, 29, 30, 29, 30, 94, 95, 135, 136, 17, 18, 5, 6, 5, 6, 21, 22, 139, 140, 155, 156, 175, 176, 9, 10, 139, 140, 9, 10, 29, 30, 100, 101, 91, 92, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 35, 36, 27, 28, 109, 110, 19, 20, 23, 24, 169, 170, 27, 28, 109, 110, 113, 114, 19, 20, 23, 24, 185, 186, 11, 12, 125, 126, 284, 285, 27, 28, 105, 106, 109, 110, 15, 16, 31, 32, 31, 32, 96, 32, 137, 138, 19, 20, 7, 8, 7, 8, 23, 24, 141, 142, 157, 158, 177, 178, 11, 12, 141, 142, 11, 12, 31, 32, 102, 32, 93, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 33, 34, 103, 104, 103, 104, 49, 50, 9, 10, 1, 2, 53, 54, 25, 26, 107, 108, 49, 50, 147, 148, 45, 46, 49, 50, 45, 46, 280, 281, 207, 208, 103, 104, 17, 18, 21, 22, 97, 98, 29, 30, 100, 101, 127, 128, 49, 50, 143, 144, 143, 144, 9, 10, 127, 128, 103, 104, 107, 108, 49, 50, 45, 46, 13, 14, 29, 30, 91, 92, 29, 30, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 35, 36, 105, 106, 105, 106, 51, 52, 11, 12, 3, 4, 55, 56, 27, 28, 109, 110, 51, 52, 149, 150, 47, 48, 51, 52, 47, 48, 252, 282, 209, 210, 105, 106, 19, 20, 23, 24, 99, 32, 31, 32, 102, 32, 129, 130, 51, 52, 145, 146, 145, 146, 11, 12, 129, 130, 105, 106, 109, 110, 51, 52, 47, 48, 15, 16, 31, 32, 93, 32, 31, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 25, 26, 115, 116, 13, 14, 91, 92, 127, 128, 103, 104, 25, 26, 115, 116, 17, 18, 53, 54, 107, 108, 115, 116, 103, 104, 25, 26, 107, 108, 49, 50, 9, 10, 41, 42, 37, 38, 143, 144, 45, 46, 25, 26, 103, 104, 107, 108, 13, 14, 1, 2, 53, 54, 25, 26, 115, 116, 107, 108, 13, 14, 94, 95, 97, 98, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 27, 28, 117, 118, 15, 16, 93, 32, 129, 130, 105, 106, 27, 28, 117, 118, 19, 20, 55, 56, 109, 110, 117, 118, 105, 106, 27, 28, 109, 110, 51, 52, 11, 12, 43, 44, 39, 40, 145, 146, 47, 48, 27, 28, 105, 106, 109, 110, 15, 16, 3, 4, 55, 56, 27, 28, 117, 118, 109, 110, 15, 16, 96, 32, 99, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 100, 101, 33, 34, 17, 18, 53, 54, 49, 50, 179, 180, 45, 46, 107, 108, 103, 104, 17, 18, 21, 22, 33, 34, 17, 18, 53, 54, 25, 26, 107, 108, 107, 108, 25, 26, 49, 50, 45, 46, 25, 26, 25, 26, 25, 26, 17, 18, 5, 6, 5, 6, 21, 22, 139, 140, 45, 46, 115, 116, 103, 104, 17, 18, 21, 22, 29, 30, 29, 30, 94, 95, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 102, 32, 35, 36, 19, 20, 55, 56, 51, 52, 181, 182, 47, 48, 109, 110, 105, 106, 19, 20, 23, 24, 35, 36, 19, 20, 55, 56, 27, 28, 109, 110, 109, 110, 27, 28, 51, 52, 47, 48, 27, 28, 27, 28, 27, 28, 19, 20, 7, 8, 7, 8, 23, 24, 141, 142, 47, 48, 117, 118, 105, 106, 19, 20, 23, 24, 31, 32, 31, 32, 96, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 1, 2, 21, 22, 1, 2, 5, 6, 53, 54, 107, 108, 107, 108, 25, 26, 49, 50, 9, 10, 1, 2, 21, 22, 1, 2, 5, 6, 53, 54, 111, 112, 103, 104, 111, 112, 103, 104, 107, 108, 25, 26, 107, 108, 49, 50, 9, 10, 29, 30, 187, 188, 45, 46, 25, 26, 25, 26, 115, 116, 13, 14, 29, 30, 100, 101, 91, 92, 94, 95, 94, 95, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 3, 4, 23, 24, 3, 4, 7, 8, 55, 56, 109, 110, 109, 110, 27, 28, 51, 52, 11, 12, 3, 4, 23, 24, 3, 4, 7, 8, 55, 56, 113, 114, 105, 106, 113, 114, 105, 106, 109, 110, 27, 28, 109, 110, 51, 52, 11, 12, 31, 32, 189, 190, 47, 48, 27, 28, 27, 28, 117, 118, 15, 16, 31, 32, 102, 32, 93, 32, 96, 32, 96, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 41, 42, 9, 10, 41, 42, 45, 46, 107, 108, 276, 277, 103, 104, 111, 112, 49, 50, 9, 10, 100, 101, 94, 95, 41, 42, 45, 46, 111, 112, 107, 108, 402, 403, 453, 454, 434, 435, 276, 277, 107, 108, 25, 26, 49, 50, 9, 10, 1, 2, 53, 54, 262, 263, 25, 26, 115, 116, 49, 50, 9, 10, 29, 30, 91, 92, 94, 95, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 43, 44, 11, 12, 43, 44, 47, 48, 109, 110, 278, 279, 105, 106, 113, 114, 51, 52, 11, 12, 102, 32, 96, 32, 43, 44, 47, 48, 113, 114, 109, 110, 404, 405, 455, 456, 436, 437, 278, 279, 109, 110, 27, 28, 51, 52, 11, 12, 3, 4, 55, 56, 264, 265, 27, 28, 117, 118, 51, 52, 11, 12, 31, 32, 93, 32, 96, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 94, 95, 127, 128, 49, 50, 45, 46, 266, 267, 107, 108, 273, 274, 203, 204, 25, 26, 107, 108, 49, 50, 9, 10, 29, 30, 61, 62, 107, 108, 25, 26, 25, 26, 489, 447, 457, 458, 446, 464, 273, 274, 203, 204, 107, 108, 103, 104, 13, 14, 139, 140, 45, 46, 258, 259, 195, 196, 103, 104, 17, 18, 21, 22, 94, 95, 91, 92, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 96, 32, 129, 130, 51, 52, 47, 48, 268, 269, 109, 110, 252, 275, 205, 206, 27, 28, 109, 110, 51, 52, 11, 12, 31, 32, 63, 64, 109, 110, 27, 28, 27, 28, 490, 491, 459, 460, 465, 466, 252, 275, 205, 206, 109, 110, 105, 106, 15, 16, 141, 142, 47, 48, 260, 261, 197, 198, 105, 106, 19, 20, 23, 24, 96, 32, 93, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 97, 98, 1, 2, 53, 54, 111, 112, 270, 271, 199, 200, 25, 26, 107, 108, 107, 108, 115, 116, 17, 18, 21, 22, 29, 30, 57, 58, 103, 104, 25, 26, 25, 26, 25, 26, 276, 277, 103, 104, 111, 112, 103, 104, 111, 112, 103, 104, 49, 50, 45, 46, 25, 26, 25, 26, 107, 108, 25, 26, 49, 50, 9, 10, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 99, 32, 3, 4, 55, 56, 113, 114, 264, 272, 201, 202, 27, 28, 109, 110, 109, 110, 117, 118, 19, 20, 23, 24, 31, 32, 59, 60, 105, 106, 27, 28, 27, 28, 27, 28, 278, 279, 105, 106, 113, 114, 105, 106, 113, 114, 105, 106, 51, 52, 47, 48, 27, 28, 27, 28, 109, 110, 27, 28, 51, 52, 11, 12, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 139, 140, 45, 46, 107, 108, 25, 26, 107, 108, 103, 104, 25, 26, 17, 18, 53, 54, 49, 50, 159, 160, 143, 144, 45, 46, 25, 26, 25, 26, 402, 403, 434, 435, 273, 274, 203, 204, 111, 112, 17, 18, 5, 6, 5, 6, 53, 54, 17, 18, 53, 54, 17, 18, 5, 6, 5, 6, 53, 54, 13, 14, 91, 92, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 141, 142, 47, 48, 109, 110, 27, 28, 109, 110, 105, 106, 27, 28, 19, 20, 55, 56, 51, 52, 161, 162, 145, 146, 47, 48, 27, 28, 27, 28, 404, 405, 436, 437, 252, 275, 205, 206, 113, 114, 19, 20, 7, 8, 7, 8, 55, 56, 19, 20, 55, 56, 19, 20, 7, 8, 7, 8, 55, 56, 15, 16, 93, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 183, 184, 143, 144, 45, 46, 25, 26, 25, 26, 115, 116, 406, 407, 115, 116, 17, 18, 21, 22, 123, 124, 107, 108, 25, 26, 115, 116, 111, 112, 115, 116, 103, 104, 489, 447, 446, 464, 25, 26, 25, 26, 25, 26, 13, 14, 91, 92, 163, 164, 45, 46, 13, 14, 1, 2, 21, 22, 29, 30, 97, 98, 1, 2, 21, 22, 29, 30, 97, 98, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 185, 186, 145, 146, 47, 48, 27, 28, 27, 28, 117, 118, 408, 409, 117, 118, 19, 20, 23, 24, 125, 126, 109, 110, 27, 28, 117, 118, 113, 114, 117, 118, 105, 106, 490, 491, 465, 466, 27, 28, 27, 28, 27, 28, 15, 16, 93, 32, 165, 166, 47, 48, 15, 16, 3, 4, 23, 24, 31, 32, 99, 32, 3, 4, 23, 24, 31, 32, 99, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 131, 132, 107, 108, 25, 26, 107, 108, 115, 116, 410, 411, 422, 423, 103, 104, 49, 50, 9, 10, 167, 168, 115, 116, 25, 26, 111, 112, 17, 18, 53, 54, 25, 26, 103, 104, 111, 112, 254, 255, 107, 108, 107, 108, 49, 50, 155, 156, 45, 46, 111, 112, 13, 14, 94, 95, 94, 95, 29, 30, 100, 101, 91, 92, 29, 30, 97, 98, 29, 30, 91, 92, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 133, 134, 109, 110, 27, 28, 109, 110, 117, 118, 412, 413, 424, 425, 105, 106, 51, 52, 11, 12, 169, 170, 117, 118, 27, 28, 113, 114, 19, 20, 55, 56, 27, 28, 105, 106, 113, 114, 256, 257, 109, 110, 109, 110, 51, 52, 157, 158, 47, 48, 113, 114, 15, 16, 96, 32, 96, 32, 31, 32, 102, 32, 93, 32, 31, 32, 99, 32, 31, 32, 93, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 123, 124, 107, 108, 103, 104, 25, 26, 103, 104, 25, 26, 115, 116, 111, 112, 115, 116, 13, 14, 1, 2, 53, 54, 107, 108, 25, 26, 13, 14, 1, 2, 5, 6, 5, 6, 53, 54, 250, 251, 191, 192, 25, 26, 25, 26, 17, 18, 5, 6, 5, 6, 21, 22, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 91, 92, 29, 30, 100, 101, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 125, 126, 109, 110, 105, 106, 27, 28, 105, 106, 27, 28, 117, 118, 113, 114, 117, 118, 15, 16, 3, 4, 55, 56, 109, 110, 27, 28, 15, 16, 3, 4, 7, 8, 7, 8, 55, 56, 252, 253, 193, 194, 27, 28, 27, 28, 19, 20, 7, 8, 7, 8, 23, 24, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 93, 32, 31, 32, 102, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 131, 132, 17, 18, 5, 6, 53, 54, 25, 26, 111, 112, 25, 26, 25, 26, 17, 18, 21, 22, 183, 184, 45, 46, 107, 108, 107, 108, 13, 14, 91, 92, 100, 101, 94, 95, 131, 132, 115, 116, 111, 112, 115, 116, 25, 26, 13, 14, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 97, 98, 97, 98, 94, 95, 100, 101, 91, 92, 94, 95, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 133, 134, 19, 20, 7, 8, 55, 56, 27, 28, 113, 114, 27, 28, 27, 28, 19, 20, 23, 24, 185, 186, 47, 48, 109, 110, 109, 110, 15, 16, 93, 32, 102, 32, 96, 32, 133, 134, 117, 118, 113, 114, 117, 118, 27, 28, 15, 16, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 99, 32, 99, 32, 96, 32, 102, 32, 93, 32, 96, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 21, 22, 94, 95, 1, 2, 5, 6, 5, 6, 5, 6, 53, 54, 13, 14, 139, 140, 45, 46, 25, 26, 103, 104, 103, 104, 49, 50, 9, 10, 41, 42, 151, 152, 45, 46, 111, 112, 107, 108, 107, 108, 17, 18, 21, 22, 97, 98, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 91, 92, 29, 30, 94, 95, 91, 92, 29, 30, 100, 101, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 23, 24, 96, 32, 3, 4, 7, 8, 7, 8, 7, 8, 55, 56, 15, 16, 141, 142, 47, 48, 27, 28, 105, 106, 105, 106, 51, 52, 11, 12, 43, 44, 153, 154, 47, 48, 113, 114, 109, 110, 109, 110, 19, 20, 23, 24, 99, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 93, 32, 31, 32, 96, 32, 93, 32, 31, 32, 102, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 41, 42, 147, 148, 9, 10, 163, 164, 9, 10, 91, 92, 94, 95, 187, 188, 45, 46, 13, 14, 131, 132, 289, 290, 25, 26, 115, 116, 107, 108, 107, 108, 49, 50, 45, 46, 107, 108, 25, 26, 25, 26, 107, 108, 17, 18, 21, 22, 91, 92, 100, 101, 94, 95, 29, 30, 100, 101, 100, 101, 29, 30, 91, 92, 29, 30, 94, 95, 100, 101, 29, 30, 29, 30, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 43, 44, 149, 150, 11, 12, 165, 166, 11, 12, 93, 32, 96, 32, 189, 190, 47, 48, 15, 16, 133, 134, 291, 292, 27, 28, 117, 118, 109, 110, 109, 110, 51, 52, 47, 48, 109, 110, 27, 28, 27, 28, 109, 110, 19, 20, 23, 24, 93, 32, 102, 32, 96, 32, 31, 32, 102, 32, 102, 32, 31, 32, 93, 32, 31, 32, 96, 32, 102, 32, 31, 32, 31, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 131, 132, 25, 26, 49, 50, 45, 46, 49, 50, 9, 10, 29, 30, 33, 34, 25, 26, 49, 50, 45, 46, 286, 287, 211, 212, 107, 108, 17, 18, 5, 6, 53, 54, 103, 104, 111, 112, 17, 18, 53, 54, 107, 108, 49, 50, 143, 144, 143, 144, 9, 10, 100, 101, 41, 42, 9, 10, 29, 30, 91, 92, 94, 95, 29, 30, 29, 30, 91, 92, 97, 98, 97, 98, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 133, 134, 27, 28, 51, 52, 47, 48, 51, 52, 11, 12, 31, 32, 35, 36, 27, 28, 51, 52, 47, 48, 252, 288, 213, 214, 109, 110, 19, 20, 7, 8, 55, 56, 105, 106, 113, 114, 19, 20, 55, 56, 109, 110, 51, 52, 145, 146, 145, 146, 11, 12, 102, 32, 43, 44, 11, 12, 31, 32, 93, 32, 96, 32, 31, 32, 31, 32, 93, 32, 99, 32, 99, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 111, 112, 103, 104, 103, 104, 13, 14, 100, 101, 123, 124, 262, 283, 25, 26, 107, 108, 25, 26, 111, 112, 107, 108, 13, 14, 91, 92, 119, 120, 25, 26, 103, 104, 13, 14, 127, 128, 115, 116, 103, 104, 103, 104, 111, 112, 49, 50, 37, 38, 45, 46, 13, 14, 97, 98, 29, 30, 97, 98, 94, 95, 97, 98, 29, 30, 91, 92, 97, 98, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 113, 114, 105, 106, 105, 106, 15, 16, 102, 32, 125, 126, 284, 285, 27, 28, 109, 110, 27, 28, 113, 114, 109, 110, 15, 16, 93, 32, 121, 122, 27, 28, 105, 106, 15, 16, 129, 130, 117, 118, 105, 106, 105, 106, 113, 114, 51, 52, 39, 40, 47, 48, 15, 16, 99, 32, 31, 32, 99, 32, 96, 32, 99, 32, 31, 32, 93, 32, 99, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 41, 42, 45, 46, 111, 112, 17, 18, 53, 54, 49, 50, 37, 38, 45, 46, 280, 281, 207, 208, 111, 112, 402, 403, 434, 435, 107, 108, 49, 50, 147, 148, 45, 46, 17, 18, 5, 6, 21, 22, 1, 2, 53, 54, 107, 108, 107, 108, 25, 26, 107, 108, 107, 108, 17, 18, 21, 22, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 91, 92, 97, 98, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 43, 44, 47, 48, 113, 114, 19, 20, 55, 56, 51, 52, 39, 40, 47, 48, 252, 282, 209, 210, 113, 114, 404, 405, 436, 437, 109, 110, 51, 52, 149, 150, 47, 48, 19, 20, 7, 8, 23, 24, 3, 4, 55, 56, 109, 110, 109, 110, 27, 28, 109, 110, 109, 110, 19, 20, 23, 24, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 93, 32, 99, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 5, 6, 5, 6, 21, 22, 123, 124, 107, 108, 254, 255, 103, 104, 25, 26, 107, 108, 111, 112, 450, 447, 446, 461, 25, 26, 17, 18, 5, 6, 5, 6, 21, 22, 91, 92, 94, 95, 29, 30, 1, 2, 53, 54, 111, 112, 103, 104, 103, 104, 115, 116, 49, 50, 9, 10, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 7, 8, 7, 8, 23, 24, 125, 126, 109, 110, 256, 257, 105, 106, 27, 28, 109, 110, 113, 114, 451, 452, 462, 463, 27, 28, 19, 20, 7, 8, 7, 8, 23, 24, 93, 32, 96, 32, 31, 32, 3, 4, 55, 56, 113, 114, 105, 106, 105, 106, 117, 118, 51, 52, 11, 12, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 91, 92, 33, 34, 115, 116, 250, 251, 191, 192, 266, 267, 103, 104, 111, 112, 489, 447, 446, 464, 107, 108, 49, 50, 9, 10, 29, 30, 29, 30, 91, 92, 91, 92, 41, 42, 9, 10, 33, 34, 17, 18, 53, 54, 103, 104, 17, 18, 5, 6, 21, 22, 29, 30, 97, 98, 97, 98, 29, 30, 91, 92, 100, 101, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 93, 32, 35, 36, 117, 118, 252, 253, 193, 194, 268, 269, 105, 106, 113, 114, 490, 491, 465, 466, 109, 110, 51, 52, 11, 12, 31, 32, 31, 32, 93, 32, 93, 32, 43, 44, 11, 12, 35, 36, 19, 20, 55, 56, 105, 106, 19, 20, 7, 8, 23, 24, 31, 32, 99, 32, 99, 32, 31, 32, 93, 32, 102, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 94, 95, 29, 30, 29, 30, 1, 2, 53, 54, 107, 108, 103, 104, 270, 271, 199, 200, 107, 108, 103, 104, 107, 108, 25, 26, 115, 116, 49, 50, 159, 160, 9, 10, 41, 42, 179, 180, 45, 46, 49, 50, 45, 46, 13, 14, 1, 2, 5, 6, 21, 22, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 29, 30, 94, 95, 29, 30, 97, 98, 94, 95, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 96, 32, 31, 32, 31, 32, 3, 4, 55, 56, 109, 110, 105, 106, 264, 272, 201, 202, 109, 110, 105, 106, 109, 110, 27, 28, 117, 118, 51, 52, 161, 162, 11, 12, 43, 44, 181, 182, 47, 48, 51, 52, 47, 48, 15, 16, 3, 4, 7, 8, 23, 24, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 31, 32, 96, 32, 31, 32, 99, 32, 96, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 94, 95, 29, 30, 139, 140, 45, 46, 17, 18, 53, 54, 111, 112, 107, 108, 103, 104, 103, 104, 103, 104, 111, 112, 107, 108, 115, 116, 103, 104, 13, 14, 127, 128, 115, 116, 103, 104, 107, 108, 103, 104, 13, 14, 94, 95, 91, 92, 29, 30, 94, 95, 29, 30, 29, 30, 100, 101, 29, 30, 100, 101, 91, 92, 100, 101, 29, 30, 100, 101, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 96, 32, 31, 32, 141, 142, 47, 48, 19, 20, 55, 56, 113, 114, 109, 110, 105, 106, 105, 106, 105, 106, 113, 114, 109, 110, 117, 118, 105, 106, 15, 16, 129, 130, 117, 118, 105, 106, 109, 110, 105, 106, 15, 16, 96, 32, 93, 32, 31, 32, 96, 32, 31, 32, 31, 32, 102, 32, 31, 32, 102, 32, 93, 32, 102, 32, 31, 32, 102, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 1, 2, 5, 6, 21, 22, 1, 2, 5, 6, 53, 54, 115, 116, 402, 403, 434, 435, 107, 108, 111, 112, 103, 104, 111, 112, 13, 14, 135, 136, 262, 263, 25, 26, 111, 112, 17, 18, 21, 22, 29, 30, 97, 98, 29, 30, 91, 92, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 3, 4, 7, 8, 23, 24, 3, 4, 7, 8, 55, 56, 117, 118, 404, 405, 436, 437, 109, 110, 113, 114, 105, 106, 113, 114, 15, 16, 137, 138, 264, 265, 27, 28, 113, 114, 19, 20, 23, 24, 31, 32, 99, 32, 31, 32, 93, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 94, 95, 91, 92, 163, 164, 9, 10, 91, 92, 91, 92, 163, 164, 45, 46, 103, 104, 489, 447, 446, 464, 25, 26, 17, 18, 5, 6, 5, 6, 21, 22, 123, 124, 258, 259, 195, 196, 103, 104, 49, 50, 9, 10, 94, 95, 97, 98, 91, 92, 29, 30, 94, 95, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 97, 98, 97, 98, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 96, 32, 93, 32, 165, 166, 11, 12, 93, 32, 93, 32, 165, 166, 47, 48, 105, 106, 490, 491, 465, 466, 27, 28, 19, 20, 7, 8, 7, 8, 23, 24, 125, 126, 260, 261, 197, 198, 105, 106, 51, 52, 11, 12, 96, 32, 99, 32, 93, 32, 31, 32, 96, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 99, 32, 99, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 127, 128, 49, 50, 155, 156, 155, 156, 45, 46, 103, 104, 25, 26, 107, 108, 107, 108, 25, 26, 49, 50, 151, 152, 9, 10, 187, 188, 45, 46, 289, 290, 25, 26, 111, 112, 17, 18, 21, 22, 29, 30, 100, 101, 29, 30, 100, 101, 29, 30, 100, 101, 100, 101, 29, 30, 97, 98, 29, 30, 97, 98, 91, 92, 29, 30, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 129, 130, 51, 52, 157, 158, 157, 158, 47, 48, 105, 106, 27, 28, 109, 110, 109, 110, 27, 28, 51, 52, 153, 154, 11, 12, 189, 190, 47, 48, 291, 292, 27, 28, 113, 114, 19, 20, 23, 24, 31, 32, 102, 32, 31, 32, 102, 32, 31, 32, 102, 32, 102, 32, 31, 32, 99, 32, 31, 32, 99, 32, 93, 32, 31, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 97, 98, 1, 2, 53, 54, 25, 26, 103, 104, 115, 116, 111, 112, 107, 108, 107, 108, 25, 26, 17, 18, 5, 6, 53, 54, 49, 50, 45, 46, 111, 112, 286, 287, 211, 212, 111, 112, 49, 50, 9, 10, 94, 95, 91, 92, 97, 98, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 99, 32, 3, 4, 55, 56, 27, 28, 105, 106, 117, 118, 113, 114, 109, 110, 109, 110, 27, 28, 19, 20, 7, 8, 55, 56, 51, 52, 47, 48, 113, 114, 252, 288, 213, 214, 113, 114, 51, 52, 11, 12, 96, 32, 93, 32, 99, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 163, 164, 45, 46, 103, 104, 25, 26, 103, 104, 25, 26, 103, 104, 17, 18, 53, 54, 13, 14, 41, 42, 45, 46, 111, 112, 25, 26, 25, 26, 25, 26, 25, 26, 103, 104, 115, 116, 13, 14, 94, 95, 29, 30, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 100, 101, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 165, 166, 47, 48, 105, 106, 27, 28, 105, 106, 27, 28, 105, 106, 19, 20, 55, 56, 15, 16, 43, 44, 47, 48, 113, 114, 27, 28, 27, 28, 27, 28, 27, 28, 105, 106, 117, 118, 15, 16, 96, 32, 31, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 102, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 1, 2, 5, 6, 5, 6, 53, 54, 17, 18, 5, 6, 5, 6, 21, 22, 1, 2, 21, 22, 1, 2, 5, 6, 53, 54, 111, 112, 103, 104, 17, 18, 5, 6, 53, 54, 111, 112, 13, 14, 29, 30, 97, 98, 94, 95, 91, 92, 91, 92, 29, 30, 29, 30, 100, 101, 91, 92, 97, 98, 94, 95, 94, 95, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 3, 4, 7, 8, 7, 8, 55, 56, 19, 20, 7, 8, 7, 8, 23, 24, 3, 4, 23, 24, 3, 4, 7, 8, 55, 56, 113, 114, 105, 106, 19, 20, 7, 8, 55, 56, 113, 114, 15, 16, 31, 32, 99, 32, 96, 32, 93, 32, 93, 32, 31, 32, 31, 32, 102, 32, 93, 32, 99, 32, 96, 32, 96, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 97, 98, 94, 95, 91, 92, 29, 30, 97, 98, 94, 95, 1, 2, 21, 22, 91, 92, 97, 98, 91, 92, 94, 95, 100, 101, 94, 95, 29, 30, 1, 2, 5, 6, 5, 6, 21, 22, 29, 30, 1, 2, 5, 6, 21, 22, 29, 30, 94, 95, 29, 30, 29, 30, 100, 101, 100, 101, 29, 30, 100, 101, 100, 101, 100, 101, 94, 95, 100, 101, 91, 92, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 99, 32, 96, 32, 93, 32, 31, 32, 99, 32, 96, 32, 3, 4, 23, 24, 93, 32, 99, 32, 93, 32, 96, 32, 102, 32, 96, 32, 31, 32, 3, 4, 7, 8, 7, 8, 23, 24, 31, 32, 3, 4, 7, 8, 23, 24, 31, 32, 96, 32, 31, 32, 31, 32, 102, 32, 102, 32, 31, 32, 102, 32, 102, 32, 102, 32, 96, 32, 102, 32, 93, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 97, 98, 91, 92, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 97, 98, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 100, 101, 100, 101, 97, 98, 94, 95, 29, 30, 29, 30, 91, 92, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 100, 101, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 99, 32, 93, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 99, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 102, 32, 102, 32, 99, 32, 96, 32, 31, 32, 31, 32, 93, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 102, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/nest1/townToLevel.json b/gamefileshf/level/nest1/townToLevel.json new file mode 100755 index 00000000..66d159c6 --- /dev/null +++ b/gamefileshf/level/nest1/townToLevel.json @@ -0,0 +1,11 @@ +{ + "levelObject": { + "id": "nest", + "class": "levelNest", + "mapPosition": [80, 62], + "properties": { + "x": 69, + "y": 19 + } + } +} \ No newline at end of file diff --git a/gamefileshf/level/nest2/level.json b/gamefileshf/level/nest2/level.json new file mode 100755 index 00000000..5f162fa2 --- /dev/null +++ b/gamefileshf/level/nest2/level.json @@ -0,0 +1,20 @@ +{ + "palette": { + "id": "l6base", + "file": "Nlevels/L6Data/L6Base.PAL" + }, + "level": { + "id": "level", + "palette": "l6base", + "file": "Nlevels/L6Data/L6.CEL", + "outOfBoundsTileLayer2": 7, + "til": "Nlevels/L6Data/L6.TIL", + "min": "Nlevels/L6Data/L6.MIN", + "minBlocks": 10, + "sol": "Nlevels/L6Data/L6.SOL" + }, + "load": "level/automap/l6/load.json", + "load": "level/nest2/levelObjects.json", + "load": "level/nest2/monsters.json", + "load": "level/nest2/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest2/level2.json b/gamefileshf/level/nest2/level2.json new file mode 100755 index 00000000..f4009a61 --- /dev/null +++ b/gamefileshf/level/nest2/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "nest2", + "name": "Nest 2", + "map": { "file": "level/nest2/nest2.json", "indexOffset": -1 } + }, + "load": "level/nest2/levelObjects2.json", + "load": "level/nest2/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest2/levelObjects2.json b/gamefileshf/level/nest2/levelObjects2.json new file mode 100755 index 00000000..1c788471 --- /dev/null +++ b/gamefileshf/level/nest2/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDownNest", + "mapPosition": [42, 31], + "properties": { + "x": 61, + "y": 41, + "level": 3 + } + }, + { + "id": "up", + "class": "levelUpNest", + "mapPosition": [67, 20], + "properties": { + "x": 47, + "y": 47, + "level": 1 + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/nest2/music.json b/gamefileshf/level/nest2/music.json new file mode 100755 index 00000000..1f84b555 --- /dev/null +++ b/gamefileshf/level/nest2/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlF.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/nest2/nest2.json b/gamefileshf/level/nest2/nest2.json new file mode 100755 index 00000000..c57ea1c6 --- /dev/null +++ b/gamefileshf/level/nest2/nest2.json @@ -0,0 +1,158 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 100, 101, 100, 101, 29, 30, 91, 92, 91, 92, 94, 95, 97, 98, 97, 98, 91, 92, 91, 92, 29, 30, 94, 95, 91, 92, 94, 95, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 139, 140, 9, 10, 97, 98, 100, 101, 91, 92, 94, 95, 91, 92, 100, 101, 97, 98, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 102, 32, 102, 32, 31, 32, 93, 32, 93, 32, 96, 32, 99, 32, 99, 32, 93, 32, 93, 32, 31, 32, 96, 32, 93, 32, 96, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 141, 142, 11, 12, 99, 32, 102, 32, 93, 32, 96, 32, 93, 32, 102, 32, 99, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 29, 30, 91, 92, 94, 95, 97, 98, 94, 95, 100, 101, 91, 92, 97, 98, 29, 30, 91, 92, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 94, 95, 183, 184, 147, 148, 151, 152, 9, 10, 76, 77, 73, 74, 183, 184, 45, 46, 49, 50, 143, 144, 9, 10, 183, 184, 9, 10, 97, 98, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 31, 32, 93, 32, 96, 32, 99, 32, 96, 32, 102, 32, 93, 32, 99, 32, 31, 32, 93, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 96, 32, 185, 186, 149, 150, 153, 154, 11, 12, 78, 32, 75, 32, 185, 186, 47, 48, 51, 52, 145, 146, 11, 12, 185, 186, 11, 12, 99, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 100, 101, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 91, 92, 94, 95, 97, 98, 29, 30, 97, 98, 29, 30, 100, 101, 97, 98, 29, 30, 29, 30, 97, 98, 29, 30, 91, 92, 1, 2, 53, 54, 111, 112, 49, 50, 65, 66, 69, 70, 45, 46, 254, 255, 103, 104, 103, 104, 49, 50, 45, 46, 13, 14, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 102, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 93, 32, 96, 32, 99, 32, 31, 32, 99, 32, 31, 32, 102, 32, 99, 32, 31, 32, 31, 32, 99, 32, 31, 32, 93, 32, 3, 4, 55, 56, 113, 114, 51, 52, 67, 68, 71, 72, 47, 48, 256, 257, 105, 106, 105, 106, 51, 52, 47, 48, 15, 16, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 100, 101, 29, 30, 91, 92, 29, 30, 29, 30, 97, 98, 94, 95, 29, 30, 94, 95, 29, 30, 97, 98, 29, 30, 29, 30, 91, 92, 139, 140, 9, 10, 183, 184, 9, 10, 41, 42, 9, 10, 119, 120, 103, 104, 111, 112, 115, 116, 107, 108, 107, 108, 250, 251, 191, 192, 103, 104, 25, 26, 111, 112, 13, 14, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 102, 32, 31, 32, 93, 32, 31, 32, 31, 32, 99, 32, 96, 32, 31, 32, 96, 32, 31, 32, 99, 32, 31, 32, 31, 32, 93, 32, 141, 142, 11, 12, 185, 186, 11, 12, 43, 44, 11, 12, 121, 122, 105, 106, 113, 114, 117, 118, 109, 110, 109, 110, 252, 253, 193, 194, 105, 106, 27, 28, 113, 114, 15, 16, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 97, 98, 100, 101, 100, 101, 29, 30, 94, 95, 91, 92, 29, 30, 91, 92, 94, 95, 29, 30, 139, 140, 45, 46, 49, 50, 45, 46, 49, 50, 45, 46, 49, 50, 45, 46, 107, 108, 17, 18, 5, 6, 53, 54, 115, 116, 111, 112, 107, 108, 107, 108, 25, 26, 17, 18, 21, 22, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 99, 32, 102, 32, 102, 32, 31, 32, 96, 32, 93, 32, 31, 32, 93, 32, 96, 32, 31, 32, 141, 142, 47, 48, 51, 52, 47, 48, 51, 52, 47, 48, 51, 52, 47, 48, 109, 110, 19, 20, 7, 8, 55, 56, 117, 118, 113, 114, 109, 110, 109, 110, 27, 28, 19, 20, 23, 24, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 97, 98, 94, 95, 29, 30, 91, 92, 29, 30, 135, 136, 103, 104, 103, 104, 107, 108, 115, 116, 17, 18, 53, 54, 111, 112, 111, 112, 49, 50, 9, 10, 123, 124, 402, 403, 453, 454, 434, 435, 107, 108, 107, 108, 49, 50, 9, 10, 91, 92, 97, 98, 91, 92, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 99, 32, 96, 32, 31, 32, 93, 32, 31, 32, 137, 138, 105, 106, 105, 106, 109, 110, 117, 118, 19, 20, 55, 56, 113, 114, 113, 114, 51, 52, 11, 12, 125, 126, 404, 405, 455, 456, 436, 437, 109, 110, 109, 110, 51, 52, 11, 12, 93, 32, 99, 32, 93, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 94, 95, 29, 30, 94, 95, 29, 30, 91, 92, 97, 98, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 97, 98, 41, 42, 155, 156, 45, 46, 111, 112, 103, 104, 25, 26, 115, 116, 13, 14, 1, 2, 53, 54, 103, 104, 25, 26, 13, 14, 131, 132, 489, 447, 457, 458, 446, 464, 107, 108, 25, 26, 17, 18, 21, 22, 94, 95, 29, 30, 29, 30, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 96, 32, 31, 32, 96, 32, 31, 32, 93, 32, 99, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 99, 32, 43, 44, 157, 158, 47, 48, 113, 114, 105, 106, 27, 28, 117, 118, 15, 16, 3, 4, 55, 56, 105, 106, 27, 28, 15, 16, 133, 134, 490, 491, 459, 460, 465, 466, 109, 110, 27, 28, 19, 20, 23, 24, 96, 32, 31, 32, 31, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 91, 92, 163, 164, 143, 144, 9, 10, 139, 140, 143, 144, 9, 10, 100, 101, 29, 30, 61, 62, 103, 104, 25, 26, 111, 112, 17, 18, 53, 54, 111, 112, 49, 50, 175, 176, 45, 46, 25, 26, 25, 26, 49, 50, 45, 46, 25, 26, 103, 104, 103, 104, 115, 116, 107, 108, 13, 14, 29, 30, 97, 98, 100, 101, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 93, 32, 165, 166, 145, 146, 11, 12, 141, 142, 145, 146, 11, 12, 102, 32, 31, 32, 63, 64, 105, 106, 27, 28, 113, 114, 19, 20, 55, 56, 113, 114, 51, 52, 177, 178, 47, 48, 27, 28, 27, 28, 51, 52, 47, 48, 27, 28, 105, 106, 105, 106, 117, 118, 109, 110, 15, 16, 31, 32, 99, 32, 102, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 91, 92, 91, 92, 94, 95, 1, 2, 53, 54, 49, 50, 45, 46, 111, 112, 13, 14, 94, 95, 97, 98, 57, 58, 107, 108, 103, 104, 17, 18, 21, 22, 1, 2, 5, 6, 5, 6, 53, 54, 25, 26, 107, 108, 17, 18, 53, 54, 17, 18, 5, 6, 53, 54, 25, 26, 25, 26, 111, 112, 13, 14, 91, 92, 91, 92, 97, 98, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 93, 32, 93, 32, 96, 32, 3, 4, 55, 56, 51, 52, 47, 48, 113, 114, 15, 16, 96, 32, 99, 32, 59, 60, 109, 110, 105, 106, 19, 20, 23, 24, 3, 4, 7, 8, 7, 8, 55, 56, 27, 28, 109, 110, 19, 20, 55, 56, 19, 20, 7, 8, 55, 56, 27, 28, 27, 28, 113, 114, 15, 16, 93, 32, 93, 32, 99, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 91, 92, 163, 164, 45, 46, 103, 104, 115, 116, 17, 18, 21, 22, 29, 30, 94, 95, 1, 2, 5, 6, 53, 54, 13, 14, 29, 30, 91, 92, 100, 101, 100, 101, 1, 2, 5, 6, 5, 6, 21, 22, 1, 2, 21, 22, 29, 30, 1, 2, 5, 6, 5, 6, 53, 54, 49, 50, 9, 10, 100, 101, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 93, 32, 165, 166, 47, 48, 105, 106, 117, 118, 19, 20, 23, 24, 31, 32, 96, 32, 3, 4, 7, 8, 55, 56, 15, 16, 31, 32, 93, 32, 102, 32, 102, 32, 3, 4, 7, 8, 7, 8, 23, 24, 3, 4, 23, 24, 31, 32, 3, 4, 7, 8, 7, 8, 55, 56, 51, 52, 11, 12, 102, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 131, 132, 111, 112, 115, 116, 25, 26, 49, 50, 9, 10, 29, 30, 187, 188, 175, 176, 179, 180, 45, 46, 13, 14, 94, 95, 29, 30, 94, 95, 91, 92, 29, 30, 91, 92, 29, 30, 163, 164, 9, 10, 163, 164, 9, 10, 29, 30, 41, 42, 143, 144, 45, 46, 107, 108, 13, 14, 97, 98, 29, 30, 29, 30, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 133, 134, 113, 114, 117, 118, 27, 28, 51, 52, 11, 12, 31, 32, 189, 190, 177, 178, 181, 182, 47, 48, 15, 16, 96, 32, 31, 32, 96, 32, 93, 32, 31, 32, 93, 32, 31, 32, 165, 166, 11, 12, 165, 166, 11, 12, 31, 32, 43, 44, 145, 146, 47, 48, 109, 110, 15, 16, 99, 32, 31, 32, 31, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 163, 164, 143, 144, 9, 10, 41, 42, 45, 46, 103, 104, 25, 26, 25, 26, 17, 18, 21, 22, 29, 30, 171, 172, 103, 104, 17, 18, 5, 6, 21, 22, 91, 92, 29, 30, 97, 98, 94, 95, 29, 30, 91, 92, 163, 164, 45, 46, 49, 50, 45, 46, 49, 50, 9, 10, 33, 34, 25, 26, 25, 26, 17, 18, 21, 22, 91, 92, 100, 101, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 165, 166, 145, 146, 11, 12, 43, 44, 47, 48, 105, 106, 27, 28, 27, 28, 19, 20, 23, 24, 31, 32, 173, 174, 105, 106, 19, 20, 7, 8, 23, 24, 93, 32, 31, 32, 99, 32, 96, 32, 31, 32, 93, 32, 165, 166, 47, 48, 51, 52, 47, 48, 51, 52, 11, 12, 35, 36, 27, 28, 27, 28, 19, 20, 23, 24, 93, 32, 102, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 49, 50, 45, 46, 103, 104, 107, 108, 107, 108, 17, 18, 21, 22, 29, 30, 91, 92, 119, 120, 17, 18, 21, 22, 94, 95, 29, 30, 139, 140, 9, 10, 41, 42, 155, 156, 9, 10, 163, 164, 45, 46, 111, 112, 25, 26, 25, 26, 107, 108, 13, 14, 33, 34, 25, 26, 25, 26, 49, 50, 9, 10, 91, 92, 29, 30, 29, 30, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 51, 52, 47, 48, 105, 106, 109, 110, 109, 110, 19, 20, 23, 24, 31, 32, 93, 32, 121, 122, 19, 20, 23, 24, 96, 32, 31, 32, 141, 142, 11, 12, 43, 44, 157, 158, 11, 12, 165, 166, 47, 48, 113, 114, 27, 28, 27, 28, 109, 110, 15, 16, 35, 36, 27, 28, 27, 28, 51, 52, 11, 12, 93, 32, 31, 32, 31, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 171, 172, 254, 255, 115, 116, 103, 104, 107, 108, 103, 104, 13, 14, 29, 30, 91, 92, 100, 101, 1, 2, 21, 22, 91, 92, 29, 30, 163, 164, 45, 46, 13, 14, 135, 136, 25, 26, 49, 50, 45, 46, 17, 18, 53, 54, 115, 116, 103, 104, 107, 108, 13, 14, 1, 2, 53, 54, 107, 108, 25, 26, 13, 14, 29, 30, 97, 98, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 173, 174, 256, 257, 117, 118, 105, 106, 109, 110, 105, 106, 15, 16, 31, 32, 93, 32, 102, 32, 3, 4, 23, 24, 93, 32, 31, 32, 165, 166, 47, 48, 15, 16, 137, 138, 27, 28, 51, 52, 47, 48, 19, 20, 55, 56, 117, 118, 105, 106, 109, 110, 15, 16, 3, 4, 55, 56, 109, 110, 27, 28, 15, 16, 31, 32, 99, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 163, 164, 45, 46, 250, 251, 191, 192, 262, 263, 107, 108, 25, 26, 49, 50, 9, 10, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 139, 140, 45, 46, 25, 26, 13, 14, 135, 136, 111, 112, 103, 104, 17, 18, 21, 22, 33, 34, 25, 26, 107, 108, 17, 18, 21, 22, 139, 140, 45, 46, 111, 112, 25, 26, 13, 14, 91, 92, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 165, 166, 47, 48, 252, 253, 193, 194, 264, 265, 109, 110, 27, 28, 51, 52, 11, 12, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 141, 142, 47, 48, 27, 28, 15, 16, 137, 138, 113, 114, 105, 106, 19, 20, 23, 24, 35, 36, 27, 28, 109, 110, 19, 20, 23, 24, 141, 142, 47, 48, 113, 114, 27, 28, 15, 16, 93, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 135, 136, 111, 112, 115, 116, 115, 116, 258, 259, 195, 196, 103, 104, 25, 26, 13, 14, 97, 98, 29, 30, 29, 30, 29, 30, 41, 42, 45, 46, 103, 104, 103, 104, 49, 50, 45, 46, 25, 26, 103, 104, 49, 50, 143, 144, 45, 46, 107, 108, 25, 26, 49, 50, 9, 10, 33, 34, 111, 112, 25, 26, 17, 18, 21, 22, 29, 30, 29, 30, 29, 30, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 137, 138, 113, 114, 117, 118, 117, 118, 260, 261, 197, 198, 105, 106, 27, 28, 15, 16, 99, 32, 31, 32, 31, 32, 31, 32, 43, 44, 47, 48, 105, 106, 105, 106, 51, 52, 47, 48, 27, 28, 105, 106, 51, 52, 145, 146, 47, 48, 109, 110, 27, 28, 51, 52, 11, 12, 35, 36, 113, 114, 27, 28, 19, 20, 23, 24, 31, 32, 31, 32, 31, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 123, 124, 103, 104, 25, 26, 107, 108, 25, 26, 25, 26, 25, 26, 111, 112, 13, 14, 41, 42, 175, 176, 9, 10, 94, 95, 119, 120, 17, 18, 5, 6, 53, 54, 276, 277, 25, 26, 103, 104, 25, 26, 25, 26, 103, 104, 25, 26, 111, 112, 25, 26, 17, 18, 21, 22, 131, 132, 103, 104, 103, 104, 49, 50, 9, 10, 97, 98, 91, 92, 29, 30, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 125, 126, 105, 106, 27, 28, 109, 110, 27, 28, 27, 28, 27, 28, 113, 114, 15, 16, 43, 44, 177, 178, 11, 12, 96, 32, 121, 122, 19, 20, 7, 8, 55, 56, 278, 279, 27, 28, 105, 106, 27, 28, 27, 28, 105, 106, 27, 28, 113, 114, 27, 28, 19, 20, 23, 24, 133, 134, 105, 106, 105, 106, 51, 52, 11, 12, 99, 32, 93, 32, 31, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 25, 26, 17, 18, 53, 54, 107, 108, 25, 26, 115, 116, 13, 14, 127, 128, 25, 26, 49, 50, 175, 176, 45, 46, 13, 14, 187, 188, 45, 46, 273, 274, 203, 204, 25, 26, 107, 108, 107, 108, 406, 407, 103, 104, 107, 108, 107, 108, 13, 14, 41, 42, 45, 46, 107, 108, 107, 108, 111, 112, 13, 14, 91, 92, 91, 92, 91, 92, 94, 95, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 27, 28, 19, 20, 55, 56, 109, 110, 27, 28, 117, 118, 15, 16, 129, 130, 27, 28, 51, 52, 177, 178, 47, 48, 15, 16, 189, 190, 47, 48, 252, 275, 205, 206, 27, 28, 109, 110, 109, 110, 408, 409, 105, 106, 109, 110, 109, 110, 15, 16, 43, 44, 47, 48, 109, 110, 109, 110, 113, 114, 15, 16, 93, 32, 93, 32, 93, 32, 96, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 139, 140, 45, 46, 115, 116, 13, 14, 1, 2, 53, 54, 107, 108, 17, 18, 21, 22, 1, 2, 53, 54, 115, 116, 25, 26, 25, 26, 13, 14, 123, 124, 115, 116, 111, 112, 103, 104, 115, 116, 115, 116, 410, 411, 422, 423, 107, 108, 107, 108, 17, 18, 21, 22, 1, 2, 53, 54, 115, 116, 25, 26, 115, 116, 13, 14, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 141, 142, 47, 48, 117, 118, 15, 16, 3, 4, 55, 56, 109, 110, 19, 20, 23, 24, 3, 4, 55, 56, 117, 118, 27, 28, 27, 28, 15, 16, 125, 126, 117, 118, 113, 114, 105, 106, 117, 118, 117, 118, 412, 413, 424, 425, 109, 110, 109, 110, 19, 20, 23, 24, 3, 4, 55, 56, 117, 118, 27, 28, 117, 118, 15, 16, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 123, 124, 115, 116, 107, 108, 13, 14, 41, 42, 45, 46, 115, 116, 49, 50, 9, 10, 163, 164, 45, 46, 25, 26, 111, 112, 25, 26, 49, 50, 45, 46, 107, 108, 103, 104, 107, 108, 111, 112, 103, 104, 111, 112, 115, 116, 103, 104, 103, 104, 49, 50, 9, 10, 41, 42, 45, 46, 111, 112, 107, 108, 17, 18, 21, 22, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 125, 126, 117, 118, 109, 110, 15, 16, 43, 44, 47, 48, 117, 118, 51, 52, 11, 12, 165, 166, 47, 48, 27, 28, 113, 114, 27, 28, 51, 52, 47, 48, 109, 110, 105, 106, 109, 110, 113, 114, 105, 106, 113, 114, 117, 118, 105, 106, 105, 106, 51, 52, 11, 12, 43, 44, 47, 48, 113, 114, 109, 110, 19, 20, 23, 24, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 171, 172, 103, 104, 25, 26, 49, 50, 45, 46, 266, 267, 25, 26, 25, 26, 13, 14, 1, 2, 5, 6, 53, 54, 25, 26, 17, 18, 5, 6, 53, 54, 103, 104, 402, 403, 434, 435, 254, 255, 103, 104, 107, 108, 111, 112, 17, 18, 5, 6, 53, 54, 13, 14, 119, 120, 262, 283, 103, 104, 111, 112, 49, 50, 9, 10, 94, 95, 91, 92, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 173, 174, 105, 106, 27, 28, 51, 52, 47, 48, 268, 269, 27, 28, 27, 28, 15, 16, 3, 4, 7, 8, 55, 56, 27, 28, 19, 20, 7, 8, 55, 56, 105, 106, 404, 405, 436, 437, 256, 257, 105, 106, 109, 110, 113, 114, 19, 20, 7, 8, 55, 56, 15, 16, 121, 122, 284, 285, 105, 106, 113, 114, 51, 52, 11, 12, 96, 32, 93, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 131, 132, 25, 26, 276, 277, 115, 116, 111, 112, 270, 271, 199, 200, 115, 116, 49, 50, 147, 148, 147, 148, 45, 46, 17, 18, 21, 22, 139, 140, 45, 46, 107, 108, 489, 447, 446, 464, 250, 251, 191, 192, 103, 104, 103, 104, 49, 50, 9, 10, 33, 34, 49, 50, 45, 46, 280, 281, 207, 208, 107, 108, 17, 18, 21, 22, 29, 30, 29, 30, 29, 30, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 133, 134, 27, 28, 278, 279, 117, 118, 113, 114, 264, 272, 201, 202, 117, 118, 51, 52, 149, 150, 149, 150, 47, 48, 19, 20, 23, 24, 141, 142, 47, 48, 109, 110, 490, 491, 465, 466, 252, 253, 193, 194, 105, 106, 105, 106, 51, 52, 11, 12, 35, 36, 51, 52, 47, 48, 252, 282, 209, 210, 109, 110, 19, 20, 23, 24, 31, 32, 31, 32, 31, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 273, 274, 203, 204, 25, 26, 115, 116, 25, 26, 111, 112, 103, 104, 115, 116, 103, 104, 25, 26, 49, 50, 9, 10, 1, 2, 53, 54, 103, 104, 115, 116, 103, 104, 111, 112, 266, 267, 25, 26, 25, 26, 25, 26, 49, 50, 45, 46, 25, 26, 262, 263, 115, 116, 111, 112, 111, 112, 13, 14, 29, 30, 94, 95, 29, 30, 29, 30, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 252, 275, 205, 206, 27, 28, 117, 118, 27, 28, 113, 114, 105, 106, 117, 118, 105, 106, 27, 28, 51, 52, 11, 12, 3, 4, 55, 56, 105, 106, 117, 118, 105, 106, 113, 114, 268, 269, 27, 28, 27, 28, 27, 28, 51, 52, 47, 48, 27, 28, 264, 265, 117, 118, 113, 114, 113, 114, 15, 16, 31, 32, 96, 32, 31, 32, 31, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 183, 184, 45, 46, 115, 116, 103, 104, 103, 104, 103, 104, 17, 18, 5, 6, 53, 54, 107, 108, 111, 112, 107, 108, 103, 104, 13, 14, 139, 140, 45, 46, 17, 18, 53, 54, 103, 104, 103, 104, 270, 271, 199, 200, 103, 104, 103, 104, 25, 26, 115, 116, 103, 104, 258, 259, 195, 196, 111, 112, 17, 18, 21, 22, 97, 98, 29, 30, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 185, 186, 47, 48, 117, 118, 105, 106, 105, 106, 105, 106, 19, 20, 7, 8, 55, 56, 109, 110, 113, 114, 109, 110, 105, 106, 15, 16, 141, 142, 47, 48, 19, 20, 55, 56, 105, 106, 105, 106, 264, 272, 201, 202, 105, 106, 105, 106, 27, 28, 117, 118, 105, 106, 260, 261, 197, 198, 113, 114, 19, 20, 23, 24, 99, 32, 31, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 119, 120, 103, 104, 254, 255, 115, 116, 25, 26, 17, 18, 21, 22, 91, 92, 123, 124, 17, 18, 53, 54, 103, 104, 111, 112, 13, 14, 1, 2, 5, 6, 21, 22, 1, 2, 5, 6, 53, 54, 107, 108, 115, 116, 115, 116, 17, 18, 53, 54, 115, 116, 111, 112, 25, 26, 107, 108, 103, 104, 49, 50, 9, 10, 91, 92, 94, 95, 100, 101, 97, 98, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 121, 122, 105, 106, 256, 257, 117, 118, 27, 28, 19, 20, 23, 24, 93, 32, 125, 126, 19, 20, 55, 56, 105, 106, 113, 114, 15, 16, 3, 4, 7, 8, 23, 24, 3, 4, 7, 8, 55, 56, 109, 110, 117, 118, 117, 118, 19, 20, 55, 56, 117, 118, 113, 114, 27, 28, 109, 110, 105, 106, 51, 52, 11, 12, 93, 32, 96, 32, 102, 32, 99, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 1, 2, 53, 54, 250, 251, 191, 192, 25, 26, 49, 50, 155, 156, 143, 144, 45, 46, 13, 14, 1, 2, 53, 54, 17, 18, 21, 22, 41, 42, 9, 10, 163, 164, 175, 176, 9, 10, 1, 2, 5, 6, 5, 6, 5, 6, 21, 22, 123, 124, 25, 26, 115, 116, 17, 18, 53, 54, 111, 112, 111, 112, 49, 50, 9, 10, 91, 92, 91, 92, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 3, 4, 55, 56, 252, 253, 193, 194, 27, 28, 51, 52, 157, 158, 145, 146, 47, 48, 15, 16, 3, 4, 55, 56, 19, 20, 23, 24, 43, 44, 11, 12, 165, 166, 177, 178, 11, 12, 3, 4, 7, 8, 7, 8, 7, 8, 23, 24, 125, 126, 27, 28, 117, 118, 19, 20, 55, 56, 113, 114, 113, 114, 51, 52, 11, 12, 93, 32, 93, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 139, 140, 45, 46, 25, 26, 103, 104, 103, 104, 107, 108, 25, 26, 107, 108, 103, 104, 13, 14, 187, 188, 45, 46, 49, 50, 151, 152, 45, 46, 49, 50, 45, 46, 103, 104, 13, 14, 91, 92, 91, 92, 29, 30, 100, 101, 29, 30, 33, 34, 17, 18, 5, 6, 21, 22, 123, 124, 103, 104, 25, 26, 107, 108, 13, 14, 29, 30, 100, 101, 100, 101, 94, 95, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 141, 142, 47, 48, 27, 28, 105, 106, 105, 106, 109, 110, 27, 28, 109, 110, 105, 106, 15, 16, 189, 190, 47, 48, 51, 52, 153, 154, 47, 48, 51, 52, 47, 48, 105, 106, 15, 16, 93, 32, 93, 32, 31, 32, 102, 32, 31, 32, 35, 36, 19, 20, 7, 8, 23, 24, 125, 126, 105, 106, 27, 28, 109, 110, 15, 16, 31, 32, 102, 32, 102, 32, 96, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 1, 2, 53, 54, 254, 255, 107, 108, 103, 104, 402, 403, 434, 435, 103, 104, 107, 108, 49, 50, 45, 46, 111, 112, 25, 26, 402, 403, 453, 454, 434, 435, 111, 112, 17, 18, 21, 22, 100, 101, 91, 92, 91, 92, 29, 30, 41, 42, 45, 46, 49, 50, 37, 38, 9, 10, 1, 2, 53, 54, 115, 116, 115, 116, 13, 14, 29, 30, 91, 92, 29, 30, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 3, 4, 55, 56, 256, 257, 109, 110, 105, 106, 404, 405, 436, 437, 105, 106, 109, 110, 51, 52, 47, 48, 113, 114, 27, 28, 404, 405, 455, 456, 436, 437, 113, 114, 19, 20, 23, 24, 102, 32, 93, 32, 93, 32, 31, 32, 43, 44, 47, 48, 51, 52, 39, 40, 11, 12, 3, 4, 55, 56, 117, 118, 117, 118, 15, 16, 31, 32, 93, 32, 31, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 139, 140, 45, 46, 250, 251, 191, 192, 25, 26, 450, 447, 446, 461, 25, 26, 25, 26, 107, 108, 103, 104, 25, 26, 103, 104, 489, 447, 457, 458, 446, 464, 103, 104, 49, 50, 9, 10, 97, 98, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 115, 116, 115, 116, 13, 14, 97, 98, 131, 132, 25, 26, 17, 18, 21, 22, 94, 95, 100, 101, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 141, 142, 47, 48, 252, 253, 193, 194, 27, 28, 451, 452, 462, 463, 27, 28, 27, 28, 109, 110, 105, 106, 27, 28, 105, 106, 490, 491, 459, 460, 465, 466, 105, 106, 51, 52, 11, 12, 99, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 117, 118, 117, 118, 15, 16, 99, 32, 133, 134, 27, 28, 19, 20, 23, 24, 96, 32, 102, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 135, 136, 115, 116, 254, 255, 115, 116, 111, 112, 489, 447, 446, 464, 103, 104, 111, 112, 402, 403, 434, 435, 115, 116, 25, 26, 107, 108, 115, 116, 25, 26, 111, 112, 17, 18, 21, 22, 94, 95, 29, 30, 29, 30, 29, 30, 41, 42, 45, 46, 17, 18, 53, 54, 49, 50, 9, 10, 127, 128, 25, 26, 49, 50, 9, 10, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 137, 138, 117, 118, 256, 257, 117, 118, 113, 114, 490, 491, 465, 466, 105, 106, 113, 114, 404, 405, 436, 437, 117, 118, 27, 28, 109, 110, 117, 118, 27, 28, 113, 114, 19, 20, 23, 24, 96, 32, 31, 32, 31, 32, 31, 32, 43, 44, 47, 48, 19, 20, 55, 56, 51, 52, 11, 12, 129, 130, 27, 28, 51, 52, 11, 12, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 33, 34, 111, 112, 250, 251, 191, 192, 25, 26, 262, 263, 115, 116, 103, 104, 103, 104, 450, 447, 446, 461, 25, 26, 103, 104, 111, 112, 111, 112, 25, 26, 107, 108, 13, 14, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 5, 6, 21, 22, 1, 2, 5, 6, 21, 22, 1, 2, 53, 54, 111, 112, 13, 14, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 35, 36, 113, 114, 252, 253, 193, 194, 27, 28, 264, 265, 117, 118, 105, 106, 105, 106, 451, 452, 462, 463, 27, 28, 105, 106, 113, 114, 113, 114, 27, 28, 109, 110, 15, 16, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 7, 8, 23, 24, 3, 4, 7, 8, 23, 24, 3, 4, 55, 56, 113, 114, 15, 16, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 123, 124, 25, 26, 25, 26, 25, 26, 25, 26, 258, 259, 195, 196, 103, 104, 25, 26, 489, 447, 446, 464, 107, 108, 17, 18, 5, 6, 53, 54, 115, 116, 17, 18, 21, 22, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 94, 95, 94, 95, 94, 95, 94, 95, 29, 30, 97, 98, 94, 95, 1, 2, 5, 6, 21, 22, 29, 30, 91, 92, 94, 95, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 125, 126, 27, 28, 27, 28, 27, 28, 27, 28, 260, 261, 197, 198, 105, 106, 27, 28, 490, 491, 465, 466, 109, 110, 19, 20, 7, 8, 55, 56, 117, 118, 19, 20, 23, 24, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 96, 32, 96, 32, 96, 32, 96, 32, 31, 32, 99, 32, 96, 32, 3, 4, 7, 8, 23, 24, 31, 32, 93, 32, 96, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 131, 132, 17, 18, 5, 6, 53, 54, 115, 116, 107, 108, 25, 26, 25, 26, 107, 108, 103, 104, 103, 104, 111, 112, 49, 50, 9, 10, 33, 34, 25, 26, 49, 50, 9, 10, 29, 30, 91, 92, 97, 98, 97, 98, 97, 98, 100, 101, 94, 95, 29, 30, 97, 98, 29, 30, 97, 98, 29, 30, 29, 30, 97, 98, 29, 30, 91, 92, 100, 101, 29, 30, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 133, 134, 19, 20, 7, 8, 55, 56, 117, 118, 109, 110, 27, 28, 27, 28, 109, 110, 105, 106, 105, 106, 113, 114, 51, 52, 11, 12, 35, 36, 27, 28, 51, 52, 11, 12, 31, 32, 93, 32, 99, 32, 99, 32, 99, 32, 102, 32, 96, 32, 31, 32, 99, 32, 31, 32, 99, 32, 31, 32, 31, 32, 99, 32, 31, 32, 93, 32, 102, 32, 31, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 119, 120, 49, 50, 9, 10, 135, 136, 25, 26, 25, 26, 17, 18, 53, 54, 115, 116, 111, 112, 107, 108, 115, 116, 103, 104, 49, 50, 45, 46, 25, 26, 107, 108, 13, 14, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 97, 98, 97, 98, 94, 95, 91, 92, 91, 92, 91, 92, 94, 95, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 94, 95, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 121, 122, 51, 52, 11, 12, 137, 138, 27, 28, 27, 28, 19, 20, 55, 56, 117, 118, 113, 114, 109, 110, 117, 118, 105, 106, 51, 52, 47, 48, 27, 28, 109, 110, 15, 16, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 99, 32, 99, 32, 96, 32, 93, 32, 93, 32, 93, 32, 96, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 96, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 49, 50, 45, 46, 17, 18, 5, 6, 21, 22, 1, 2, 53, 54, 17, 18, 53, 54, 25, 26, 107, 108, 17, 18, 5, 6, 5, 6, 5, 6, 21, 22, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 91, 92, 91, 92, 100, 101, 94, 95, 29, 30, 100, 101, 29, 30, 94, 95, 94, 95, 29, 30, 100, 101, 97, 98, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 51, 52, 47, 48, 19, 20, 7, 8, 23, 24, 3, 4, 55, 56, 19, 20, 55, 56, 27, 28, 109, 110, 19, 20, 7, 8, 7, 8, 7, 8, 23, 24, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 93, 32, 93, 32, 102, 32, 96, 32, 31, 32, 102, 32, 31, 32, 96, 32, 96, 32, 31, 32, 102, 32, 99, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 119, 120, 111, 112, 111, 112, 13, 14, 29, 30, 29, 30, 29, 30, 1, 2, 21, 22, 1, 2, 5, 6, 5, 6, 21, 22, 29, 30, 91, 92, 97, 98, 94, 95, 97, 98, 29, 30, 100, 101, 97, 98, 29, 30, 29, 30, 94, 95, 97, 98, 29, 30, 97, 98, 29, 30, 29, 30, 91, 92, 29, 30, 94, 95, 91, 92, 29, 30, 100, 101, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 121, 122, 113, 114, 113, 114, 15, 16, 31, 32, 31, 32, 31, 32, 3, 4, 23, 24, 3, 4, 7, 8, 7, 8, 23, 24, 31, 32, 93, 32, 99, 32, 96, 32, 99, 32, 31, 32, 102, 32, 99, 32, 31, 32, 31, 32, 96, 32, 99, 32, 31, 32, 99, 32, 31, 32, 31, 32, 93, 32, 31, 32, 96, 32, 93, 32, 31, 32, 102, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 163, 164, 45, 46, 17, 18, 53, 54, 13, 14, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 94, 95, 97, 98, 97, 98, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 91, 92, 91, 92, 91, 92, 94, 95, 91, 92, 94, 95, 91, 92, 94, 95, 91, 92, 29, 30, 100, 101, 94, 95, 97, 98, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 165, 166, 47, 48, 19, 20, 55, 56, 15, 16, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 96, 32, 99, 32, 99, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 93, 32, 93, 32, 93, 32, 96, 32, 93, 32, 96, 32, 93, 32, 96, 32, 93, 32, 31, 32, 102, 32, 96, 32, 99, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 1, 2, 5, 6, 21, 22, 1, 2, 21, 22, 29, 30, 29, 30, 97, 98, 29, 30, 94, 95, 94, 95, 29, 30, 94, 95, 29, 30, 91, 92, 94, 95, 29, 30, 91, 92, 94, 95, 100, 101, 29, 30, 91, 92, 29, 30, 100, 101, 100, 101, 29, 30, 29, 30, 100, 101, 29, 30, 91, 92, 100, 101, 91, 92, 29, 30, 97, 98, 29, 30, 29, 30, 94, 95, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 3, 4, 7, 8, 23, 24, 3, 4, 23, 24, 31, 32, 31, 32, 99, 32, 31, 32, 96, 32, 96, 32, 31, 32, 96, 32, 31, 32, 93, 32, 96, 32, 31, 32, 93, 32, 96, 32, 102, 32, 31, 32, 93, 32, 31, 32, 102, 32, 102, 32, 31, 32, 31, 32, 102, 32, 31, 32, 93, 32, 102, 32, 93, 32, 31, 32, 99, 32, 31, 32, 31, 32, 96, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 97, 98, 91, 92, 97, 98, 97, 98, 97, 98, 29, 30, 29, 30, 29, 30, 100, 101, 97, 98, 29, 30, 94, 95, 97, 98, 29, 30, 91, 92, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 97, 98, 29, 30, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 94, 95, 29, 30, 29, 30, 97, 98, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 99, 32, 93, 32, 99, 32, 99, 32, 99, 32, 31, 32, 31, 32, 31, 32, 102, 32, 99, 32, 31, 32, 96, 32, 99, 32, 31, 32, 93, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 99, 32, 31, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 96, 32, 31, 32, 31, 32, 99, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/nest3/level.json b/gamefileshf/level/nest3/level.json new file mode 100755 index 00000000..3309c375 --- /dev/null +++ b/gamefileshf/level/nest3/level.json @@ -0,0 +1,20 @@ +{ + "palette": { + "id": "l6base", + "file": "Nlevels/L6Data/L6Base.PAL" + }, + "level": { + "id": "level", + "palette": "l6base", + "file": "Nlevels/L6Data/L6.CEL", + "outOfBoundsTileLayer2": 7, + "til": "Nlevels/L6Data/L6.TIL", + "min": "Nlevels/L6Data/L6.MIN", + "minBlocks": 10, + "sol": "Nlevels/L6Data/L6.SOL" + }, + "load": "level/automap/l6/load.json", + "load": "level/nest3/levelObjects.json", + "load": "level/nest3/monsters.json", + "load": "level/nest3/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest3/level2.json b/gamefileshf/level/nest3/level2.json new file mode 100755 index 00000000..494ca72a --- /dev/null +++ b/gamefileshf/level/nest3/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "nest3", + "name": "Nest 3", + "map": { "file": "level/nest3/nest3.json", "indexOffset": -1 } + }, + "load": "level/nest3/levelObjects2.json", + "load": "level/nest3/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest3/levelObjects2.json b/gamefileshf/level/nest3/levelObjects2.json new file mode 100755 index 00000000..ff32c9cf --- /dev/null +++ b/gamefileshf/level/nest3/levelObjects2.json @@ -0,0 +1,24 @@ +{ + "levelObject": [ + { + "id": "down", + "class": "levelDownNest", + "mapPosition": [60, 55], + "properties": { + "x": 35, + "y": 53, + "level": 4 + } + }, + { + "id": "up", + "class": "levelUpNest", + "mapPosition": [61, 40], + "properties": { + "x": 43, + "y": 31, + "level": 2 + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/nest3/music.json b/gamefileshf/level/nest3/music.json new file mode 100755 index 00000000..1f84b555 --- /dev/null +++ b/gamefileshf/level/nest3/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlF.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/nest3/nest3.json b/gamefileshf/level/nest3/nest3.json new file mode 100755 index 00000000..0d6f476e --- /dev/null +++ b/gamefileshf/level/nest3/nest3.json @@ -0,0 +1,158 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 94, 95, 91, 92, 91, 92, 29, 30, 97, 98, 97, 98, 29, 30, 91, 92, 100, 101, 100, 101, 29, 30, 91, 92, 91, 92, 29, 30, 91, 92, 100, 101, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 97, 98, 29, 30, 97, 98, 100, 101, 91, 92, 91, 92, 29, 30, 94, 95, 100, 101, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 96, 32, 93, 32, 93, 32, 31, 32, 99, 32, 99, 32, 31, 32, 93, 32, 102, 32, 102, 32, 31, 32, 93, 32, 93, 32, 31, 32, 93, 32, 102, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 99, 32, 31, 32, 99, 32, 102, 32, 93, 32, 93, 32, 31, 32, 96, 32, 102, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 100, 101, 97, 98, 29, 30, 29, 30, 29, 30, 94, 95, 41, 42, 151, 152, 9, 10, 100, 101, 187, 188, 9, 10, 91, 92, 100, 101, 94, 95, 91, 92, 41, 42, 143, 144, 9, 10, 187, 188, 9, 10, 29, 30, 91, 92, 183, 184, 37, 38, 9, 10, 41, 42, 147, 148, 143, 144, 147, 148, 155, 156, 9, 10, 29, 30, 29, 30, 91, 92, 100, 101, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 102, 32, 99, 32, 31, 32, 31, 32, 31, 32, 96, 32, 43, 44, 153, 154, 11, 12, 102, 32, 189, 190, 11, 12, 93, 32, 102, 32, 96, 32, 93, 32, 43, 44, 145, 146, 11, 12, 189, 190, 11, 12, 31, 32, 93, 32, 185, 186, 39, 40, 11, 12, 43, 44, 149, 150, 145, 146, 149, 150, 157, 158, 11, 12, 31, 32, 31, 32, 93, 32, 102, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 49, 50, 37, 38, 45, 46, 13, 14, 97, 98, 91, 92, 41, 42, 143, 144, 45, 46, 25, 26, 49, 50, 45, 46, 49, 50, 37, 38, 175, 176, 45, 46, 107, 108, 49, 50, 45, 46, 25, 26, 103, 104, 103, 104, 17, 18, 21, 22, 97, 98, 29, 30, 91, 92, 94, 95, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 51, 52, 39, 40, 47, 48, 15, 16, 99, 32, 93, 32, 43, 44, 145, 146, 47, 48, 27, 28, 51, 52, 47, 48, 51, 52, 39, 40, 177, 178, 47, 48, 109, 110, 51, 52, 47, 48, 27, 28, 105, 106, 105, 106, 19, 20, 23, 24, 99, 32, 31, 32, 93, 32, 96, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 94, 95, 91, 92, 29, 30, 119, 120, 262, 263, 103, 104, 111, 112, 13, 14, 91, 92, 29, 30, 1, 2, 53, 54, 25, 26, 103, 104, 17, 18, 5, 6, 53, 54, 111, 112, 107, 108, 107, 108, 25, 26, 103, 104, 17, 18, 53, 54, 25, 26, 107, 108, 13, 14, 97, 98, 91, 92, 97, 98, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 96, 32, 93, 32, 31, 32, 121, 122, 264, 265, 105, 106, 113, 114, 15, 16, 93, 32, 31, 32, 3, 4, 55, 56, 27, 28, 105, 106, 19, 20, 7, 8, 55, 56, 113, 114, 109, 110, 109, 110, 27, 28, 105, 106, 19, 20, 55, 56, 27, 28, 109, 110, 15, 16, 99, 32, 93, 32, 99, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 97, 98, 163, 164, 9, 10, 183, 184, 9, 10, 163, 164, 143, 144, 45, 46, 258, 259, 195, 196, 111, 112, 13, 14, 94, 95, 94, 95, 139, 140, 45, 46, 107, 108, 107, 108, 49, 50, 9, 10, 33, 34, 254, 255, 103, 104, 25, 26, 17, 18, 5, 6, 21, 22, 119, 120, 103, 104, 103, 104, 49, 50, 9, 10, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 99, 32, 165, 166, 11, 12, 185, 186, 11, 12, 165, 166, 145, 146, 47, 48, 260, 261, 197, 198, 113, 114, 15, 16, 96, 32, 96, 32, 141, 142, 47, 48, 109, 110, 109, 110, 51, 52, 11, 12, 35, 36, 256, 257, 105, 106, 27, 28, 19, 20, 7, 8, 23, 24, 121, 122, 105, 106, 105, 106, 51, 52, 11, 12, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 41, 42, 45, 46, 49, 50, 45, 46, 49, 50, 45, 46, 25, 26, 103, 104, 25, 26, 25, 26, 111, 112, 49, 50, 9, 10, 163, 164, 45, 46, 254, 255, 115, 116, 111, 112, 107, 108, 49, 50, 45, 46, 250, 251, 191, 192, 107, 108, 49, 50, 151, 152, 155, 156, 45, 46, 17, 18, 5, 6, 5, 6, 21, 22, 91, 92, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 43, 44, 47, 48, 51, 52, 47, 48, 51, 52, 47, 48, 27, 28, 105, 106, 27, 28, 27, 28, 113, 114, 51, 52, 11, 12, 165, 166, 47, 48, 256, 257, 117, 118, 113, 114, 109, 110, 51, 52, 47, 48, 252, 253, 193, 194, 109, 110, 51, 52, 153, 154, 157, 158, 47, 48, 19, 20, 7, 8, 7, 8, 23, 24, 93, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 1, 2, 53, 54, 25, 26, 103, 104, 103, 104, 103, 104, 107, 108, 25, 26, 103, 104, 103, 104, 25, 26, 107, 108, 49, 50, 45, 46, 107, 108, 250, 251, 191, 192, 25, 26, 25, 26, 25, 26, 254, 255, 103, 104, 111, 112, 254, 255, 25, 26, 25, 26, 25, 26, 107, 108, 13, 14, 29, 30, 94, 95, 97, 98, 29, 30, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 3, 4, 55, 56, 27, 28, 105, 106, 105, 106, 105, 106, 109, 110, 27, 28, 105, 106, 105, 106, 27, 28, 109, 110, 51, 52, 47, 48, 109, 110, 252, 253, 193, 194, 27, 28, 27, 28, 27, 28, 256, 257, 105, 106, 113, 114, 256, 257, 27, 28, 27, 28, 27, 28, 109, 110, 15, 16, 31, 32, 96, 32, 99, 32, 31, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 187, 188, 45, 46, 115, 116, 107, 108, 402, 403, 434, 435, 254, 255, 25, 26, 111, 112, 402, 403, 453, 454, 434, 435, 25, 26, 17, 18, 53, 54, 115, 116, 25, 26, 25, 26, 107, 108, 103, 104, 250, 251, 191, 192, 107, 108, 250, 251, 191, 192, 115, 116, 111, 112, 17, 18, 21, 22, 29, 30, 94, 95, 29, 30, 100, 101, 97, 98, 97, 98, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 189, 190, 47, 48, 117, 118, 109, 110, 404, 405, 436, 437, 256, 257, 27, 28, 113, 114, 404, 405, 455, 456, 436, 437, 27, 28, 19, 20, 55, 56, 117, 118, 27, 28, 27, 28, 109, 110, 105, 106, 252, 253, 193, 194, 109, 110, 252, 253, 193, 194, 117, 118, 113, 114, 19, 20, 23, 24, 31, 32, 96, 32, 31, 32, 102, 32, 99, 32, 99, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 119, 120, 103, 104, 25, 26, 25, 26, 450, 447, 446, 461, 250, 251, 191, 192, 107, 108, 489, 447, 457, 458, 446, 464, 103, 104, 13, 14, 1, 2, 5, 6, 5, 6, 53, 54, 115, 116, 103, 104, 25, 26, 107, 108, 25, 26, 103, 104, 25, 26, 25, 26, 103, 104, 49, 50, 9, 10, 91, 92, 29, 30, 29, 30, 91, 92, 29, 30, 94, 95, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 121, 122, 105, 106, 27, 28, 27, 28, 451, 452, 462, 463, 252, 253, 193, 194, 109, 110, 490, 491, 459, 460, 465, 466, 105, 106, 15, 16, 3, 4, 7, 8, 7, 8, 55, 56, 117, 118, 105, 106, 27, 28, 109, 110, 27, 28, 105, 106, 27, 28, 27, 28, 105, 106, 51, 52, 11, 12, 93, 32, 31, 32, 31, 32, 93, 32, 31, 32, 96, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 1, 2, 53, 54, 103, 104, 115, 116, 489, 447, 446, 464, 25, 26, 103, 104, 103, 104, 103, 104, 25, 26, 111, 112, 25, 26, 49, 50, 9, 10, 29, 30, 100, 101, 123, 124, 107, 108, 25, 26, 103, 104, 17, 18, 53, 54, 17, 18, 5, 6, 53, 54, 111, 112, 25, 26, 49, 50, 9, 10, 100, 101, 91, 92, 100, 101, 100, 101, 29, 30, 91, 92, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 3, 4, 55, 56, 105, 106, 117, 118, 490, 491, 465, 466, 27, 28, 105, 106, 105, 106, 105, 106, 27, 28, 113, 114, 27, 28, 51, 52, 11, 12, 31, 32, 102, 32, 125, 126, 109, 110, 27, 28, 105, 106, 19, 20, 55, 56, 19, 20, 7, 8, 55, 56, 113, 114, 27, 28, 51, 52, 11, 12, 102, 32, 93, 32, 102, 32, 102, 32, 31, 32, 93, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 103, 104, 107, 108, 111, 112, 25, 26, 107, 108, 262, 263, 111, 112, 25, 26, 25, 26, 17, 18, 5, 6, 21, 22, 139, 140, 143, 144, 45, 46, 17, 18, 5, 6, 5, 6, 21, 22, 1, 2, 21, 22, 91, 92, 131, 132, 107, 108, 111, 112, 17, 18, 21, 22, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 105, 106, 109, 110, 113, 114, 27, 28, 109, 110, 264, 265, 113, 114, 27, 28, 27, 28, 19, 20, 7, 8, 23, 24, 141, 142, 145, 146, 47, 48, 19, 20, 7, 8, 7, 8, 23, 24, 3, 4, 23, 24, 93, 32, 133, 134, 109, 110, 113, 114, 19, 20, 23, 24, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 91, 92, 163, 164, 45, 46, 25, 26, 103, 104, 107, 108, 115, 116, 25, 26, 258, 259, 195, 196, 103, 104, 17, 18, 21, 22, 94, 95, 29, 30, 33, 34, 25, 26, 115, 116, 49, 50, 9, 10, 29, 30, 76, 77, 73, 74, 94, 95, 183, 184, 45, 46, 103, 104, 103, 104, 49, 50, 9, 10, 29, 30, 94, 95, 97, 98, 91, 92, 29, 30, 29, 30, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 93, 32, 165, 166, 47, 48, 27, 28, 105, 106, 109, 110, 117, 118, 27, 28, 260, 261, 197, 198, 105, 106, 19, 20, 23, 24, 96, 32, 31, 32, 35, 36, 27, 28, 117, 118, 51, 52, 11, 12, 31, 32, 78, 32, 75, 32, 96, 32, 185, 186, 47, 48, 105, 106, 105, 106, 51, 52, 11, 12, 31, 32, 96, 32, 99, 32, 93, 32, 31, 32, 31, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 100, 101, 123, 124, 111, 112, 17, 18, 53, 54, 17, 18, 5, 6, 53, 54, 297, 298, 103, 104, 103, 104, 13, 14, 29, 30, 97, 98, 97, 98, 119, 120, 17, 18, 5, 6, 5, 6, 21, 22, 187, 188, 65, 66, 69, 70, 9, 10, 1, 2, 53, 54, 111, 112, 25, 26, 17, 18, 21, 22, 91, 92, 100, 101, 94, 95, 29, 30, 91, 92, 97, 98, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 102, 32, 125, 126, 113, 114, 19, 20, 55, 56, 19, 20, 7, 8, 55, 56, 299, 300, 105, 106, 105, 106, 15, 16, 31, 32, 99, 32, 99, 32, 121, 122, 19, 20, 7, 8, 7, 8, 23, 24, 189, 190, 67, 68, 71, 72, 11, 12, 3, 4, 55, 56, 113, 114, 27, 28, 19, 20, 23, 24, 93, 32, 102, 32, 96, 32, 31, 32, 93, 32, 99, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 94, 95, 1, 2, 5, 6, 21, 22, 1, 2, 21, 22, 139, 140, 45, 46, 293, 294, 215, 216, 25, 26, 49, 50, 9, 10, 91, 92, 41, 42, 45, 46, 13, 14, 41, 42, 151, 152, 175, 176, 45, 46, 103, 104, 25, 26, 49, 50, 9, 10, 127, 128, 25, 26, 107, 108, 13, 14, 41, 42, 9, 10, 29, 30, 91, 92, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 96, 32, 3, 4, 7, 8, 23, 24, 3, 4, 23, 24, 141, 142, 47, 48, 295, 296, 217, 218, 27, 28, 51, 52, 11, 12, 93, 32, 43, 44, 47, 48, 15, 16, 43, 44, 153, 154, 177, 178, 47, 48, 105, 106, 27, 28, 51, 52, 11, 12, 129, 130, 27, 28, 109, 110, 15, 16, 43, 44, 11, 12, 31, 32, 93, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 91, 92, 91, 92, 94, 95, 29, 30, 100, 101, 91, 92, 1, 2, 53, 54, 25, 26, 103, 104, 111, 112, 25, 26, 49, 50, 37, 38, 45, 46, 107, 108, 49, 50, 45, 46, 262, 263, 25, 26, 25, 26, 262, 283, 111, 112, 103, 104, 49, 50, 45, 46, 25, 26, 25, 26, 49, 50, 45, 46, 13, 14, 100, 101, 91, 92, 91, 92, 29, 30, 29, 30, 100, 101, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 93, 32, 93, 32, 96, 32, 31, 32, 102, 32, 93, 32, 3, 4, 55, 56, 27, 28, 105, 106, 113, 114, 27, 28, 51, 52, 39, 40, 47, 48, 109, 110, 51, 52, 47, 48, 264, 265, 27, 28, 27, 28, 284, 285, 113, 114, 105, 106, 51, 52, 47, 48, 27, 28, 27, 28, 51, 52, 47, 48, 15, 16, 102, 32, 93, 32, 93, 32, 31, 32, 31, 32, 102, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 41, 42, 45, 46, 25, 26, 17, 18, 53, 54, 25, 26, 115, 116, 17, 18, 53, 54, 111, 112, 25, 26, 103, 104, 258, 259, 195, 196, 111, 112, 280, 281, 207, 208, 115, 116, 25, 26, 25, 26, 25, 26, 107, 108, 107, 108, 17, 18, 21, 22, 91, 92, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 43, 44, 47, 48, 27, 28, 19, 20, 55, 56, 27, 28, 117, 118, 19, 20, 55, 56, 113, 114, 27, 28, 105, 106, 260, 261, 197, 198, 113, 114, 252, 282, 209, 210, 117, 118, 27, 28, 27, 28, 27, 28, 109, 110, 109, 110, 19, 20, 23, 24, 93, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 91, 92, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 103, 104, 13, 14, 1, 2, 53, 54, 111, 112, 13, 14, 1, 2, 53, 54, 276, 277, 107, 108, 107, 108, 107, 108, 103, 104, 25, 26, 107, 108, 107, 108, 103, 104, 25, 26, 111, 112, 17, 18, 5, 6, 21, 22, 91, 92, 100, 101, 94, 95, 91, 92, 94, 95, 97, 98, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 93, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 105, 106, 15, 16, 3, 4, 55, 56, 113, 114, 15, 16, 3, 4, 55, 56, 278, 279, 109, 110, 109, 110, 109, 110, 105, 106, 27, 28, 109, 110, 109, 110, 105, 106, 27, 28, 113, 114, 19, 20, 7, 8, 23, 24, 93, 32, 102, 32, 96, 32, 93, 32, 96, 32, 99, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 94, 95, 29, 30, 94, 95, 91, 92, 94, 95, 29, 30, 100, 101, 123, 124, 103, 104, 13, 14, 41, 42, 45, 46, 103, 104, 49, 50, 9, 10, 127, 128, 273, 274, 203, 204, 25, 26, 115, 116, 17, 18, 53, 54, 103, 104, 473, 474, 406, 407, 25, 26, 103, 104, 13, 14, 29, 30, 97, 98, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 96, 32, 31, 32, 96, 32, 93, 32, 96, 32, 31, 32, 102, 32, 125, 126, 105, 106, 15, 16, 43, 44, 47, 48, 105, 106, 51, 52, 11, 12, 129, 130, 252, 275, 205, 206, 27, 28, 117, 118, 19, 20, 55, 56, 105, 106, 475, 476, 408, 409, 27, 28, 105, 106, 15, 16, 31, 32, 99, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 183, 184, 159, 160, 9, 10, 183, 184, 9, 10, 41, 42, 45, 46, 111, 112, 49, 50, 45, 46, 111, 112, 107, 108, 103, 104, 49, 50, 45, 46, 25, 26, 111, 112, 103, 104, 17, 18, 21, 22, 33, 34, 25, 26, 103, 104, 442, 443, 25, 26, 17, 18, 21, 22, 97, 98, 41, 42, 9, 10, 97, 98, 100, 101, 29, 30, 94, 95, 91, 92, 97, 98, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 185, 186, 161, 162, 11, 12, 185, 186, 11, 12, 43, 44, 47, 48, 113, 114, 51, 52, 47, 48, 113, 114, 109, 110, 105, 106, 51, 52, 47, 48, 27, 28, 113, 114, 105, 106, 19, 20, 23, 24, 35, 36, 27, 28, 105, 106, 444, 445, 27, 28, 19, 20, 23, 24, 99, 32, 43, 44, 11, 12, 99, 32, 102, 32, 31, 32, 96, 32, 93, 32, 99, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 1, 2, 53, 54, 49, 50, 45, 46, 49, 50, 45, 46, 115, 116, 17, 18, 5, 6, 5, 6, 53, 54, 262, 263, 103, 104, 262, 263, 103, 104, 25, 26, 103, 104, 17, 18, 21, 22, 91, 92, 61, 62, 103, 104, 410, 411, 422, 423, 103, 104, 49, 50, 143, 144, 155, 156, 45, 46, 13, 14, 97, 98, 100, 101, 91, 92, 29, 30, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 3, 4, 55, 56, 51, 52, 47, 48, 51, 52, 47, 48, 117, 118, 19, 20, 7, 8, 7, 8, 55, 56, 264, 265, 105, 106, 264, 265, 105, 106, 27, 28, 105, 106, 19, 20, 23, 24, 93, 32, 63, 64, 105, 106, 412, 413, 424, 425, 105, 106, 51, 52, 145, 146, 157, 158, 47, 48, 15, 16, 99, 32, 102, 32, 93, 32, 31, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 123, 124, 103, 104, 25, 26, 107, 108, 103, 104, 103, 104, 13, 14, 29, 30, 163, 164, 45, 46, 258, 259, 195, 196, 258, 259, 195, 196, 103, 104, 103, 104, 49, 50, 9, 10, 97, 98, 57, 58, 25, 26, 25, 26, 25, 26, 266, 267, 25, 26, 115, 116, 111, 112, 103, 104, 13, 14, 100, 101, 29, 30, 91, 92, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 125, 126, 105, 106, 27, 28, 109, 110, 105, 106, 105, 106, 15, 16, 31, 32, 165, 166, 47, 48, 260, 261, 197, 198, 260, 261, 197, 198, 105, 106, 105, 106, 51, 52, 11, 12, 99, 32, 59, 60, 27, 28, 27, 28, 27, 28, 268, 269, 27, 28, 117, 118, 113, 114, 105, 106, 15, 16, 102, 32, 31, 32, 93, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 100, 101, 41, 42, 45, 46, 111, 112, 402, 403, 434, 435, 103, 104, 17, 18, 21, 22, 91, 92, 119, 120, 107, 108, 115, 116, 107, 108, 25, 26, 115, 116, 103, 104, 111, 112, 25, 26, 13, 14, 94, 95, 1, 2, 53, 54, 107, 108, 103, 104, 270, 271, 199, 200, 107, 108, 103, 104, 107, 108, 13, 14, 29, 30, 29, 30, 29, 30, 94, 95, 100, 101, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 102, 32, 43, 44, 47, 48, 113, 114, 404, 405, 436, 437, 105, 106, 19, 20, 23, 24, 93, 32, 121, 122, 109, 110, 117, 118, 109, 110, 27, 28, 117, 118, 105, 106, 113, 114, 27, 28, 15, 16, 96, 32, 3, 4, 55, 56, 109, 110, 105, 106, 264, 272, 201, 202, 109, 110, 105, 106, 109, 110, 15, 16, 31, 32, 31, 32, 31, 32, 96, 32, 102, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 139, 140, 45, 46, 107, 108, 25, 26, 489, 447, 446, 464, 103, 104, 49, 50, 9, 10, 41, 42, 45, 46, 254, 255, 25, 26, 103, 104, 17, 18, 5, 6, 5, 6, 53, 54, 111, 112, 13, 14, 29, 30, 139, 140, 45, 46, 107, 108, 115, 116, 111, 112, 115, 116, 115, 116, 107, 108, 17, 18, 21, 22, 29, 30, 94, 95, 91, 92, 97, 98, 100, 101, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 141, 142, 47, 48, 109, 110, 27, 28, 490, 491, 465, 466, 105, 106, 51, 52, 11, 12, 43, 44, 47, 48, 256, 257, 27, 28, 105, 106, 19, 20, 7, 8, 7, 8, 55, 56, 113, 114, 15, 16, 31, 32, 141, 142, 47, 48, 109, 110, 117, 118, 113, 114, 117, 118, 117, 118, 109, 110, 19, 20, 23, 24, 31, 32, 96, 32, 93, 32, 99, 32, 102, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 103, 104, 103, 104, 103, 104, 107, 108, 103, 104, 103, 104, 49, 50, 45, 46, 111, 112, 250, 251, 191, 192, 103, 104, 49, 50, 147, 148, 9, 10, 119, 120, 17, 18, 21, 22, 163, 164, 45, 46, 103, 104, 25, 26, 103, 104, 17, 18, 53, 54, 115, 116, 103, 104, 13, 14, 94, 95, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 97, 98, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 105, 106, 105, 106, 105, 106, 109, 110, 105, 106, 105, 106, 51, 52, 47, 48, 113, 114, 252, 253, 193, 194, 105, 106, 51, 52, 149, 150, 11, 12, 121, 122, 19, 20, 23, 24, 165, 166, 47, 48, 105, 106, 27, 28, 105, 106, 19, 20, 55, 56, 117, 118, 105, 106, 15, 16, 96, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 99, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 33, 34, 25, 26, 17, 18, 5, 6, 53, 54, 25, 26, 115, 116, 103, 104, 107, 108, 25, 26, 25, 26, 111, 112, 25, 26, 107, 108, 17, 18, 21, 22, 119, 120, 49, 50, 37, 38, 45, 46, 25, 26, 107, 108, 103, 104, 115, 116, 13, 14, 33, 34, 115, 116, 17, 18, 21, 22, 97, 98, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 94, 95, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 35, 36, 27, 28, 19, 20, 7, 8, 55, 56, 27, 28, 117, 118, 105, 106, 109, 110, 27, 28, 27, 28, 113, 114, 27, 28, 109, 110, 19, 20, 23, 24, 121, 122, 51, 52, 39, 40, 47, 48, 27, 28, 109, 110, 105, 106, 117, 118, 15, 16, 35, 36, 117, 118, 19, 20, 23, 24, 99, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 96, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 123, 124, 103, 104, 13, 14, 187, 188, 45, 46, 103, 104, 103, 104, 17, 18, 53, 54, 115, 116, 103, 104, 25, 26, 115, 116, 103, 104, 49, 50, 9, 10, 33, 34, 103, 104, 103, 104, 103, 104, 276, 277, 25, 26, 25, 26, 17, 18, 21, 22, 123, 124, 115, 116, 49, 50, 9, 10, 29, 30, 29, 30, 97, 98, 29, 30, 97, 98, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 125, 126, 105, 106, 15, 16, 189, 190, 47, 48, 105, 106, 105, 106, 19, 20, 55, 56, 117, 118, 105, 106, 27, 28, 117, 118, 105, 106, 51, 52, 11, 12, 35, 36, 105, 106, 105, 106, 105, 106, 278, 279, 27, 28, 27, 28, 19, 20, 23, 24, 125, 126, 117, 118, 51, 52, 11, 12, 31, 32, 31, 32, 99, 32, 31, 32, 99, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 1, 2, 5, 6, 21, 22, 33, 34, 111, 112, 17, 18, 5, 6, 21, 22, 135, 136, 103, 104, 17, 18, 53, 54, 107, 108, 115, 116, 107, 108, 13, 14, 1, 2, 5, 6, 5, 6, 53, 54, 273, 274, 203, 204, 25, 26, 49, 50, 175, 176, 45, 46, 115, 116, 17, 18, 21, 22, 100, 101, 91, 92, 97, 98, 94, 95, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 3, 4, 7, 8, 23, 24, 35, 36, 113, 114, 19, 20, 7, 8, 23, 24, 137, 138, 105, 106, 19, 20, 55, 56, 109, 110, 117, 118, 109, 110, 15, 16, 3, 4, 7, 8, 7, 8, 55, 56, 252, 275, 205, 206, 27, 28, 51, 52, 177, 178, 47, 48, 117, 118, 19, 20, 23, 24, 102, 32, 93, 32, 99, 32, 96, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 97, 98, 91, 92, 187, 188, 9, 10, 33, 34, 107, 108, 13, 14, 183, 184, 143, 144, 45, 46, 17, 18, 21, 22, 127, 128, 107, 108, 107, 108, 103, 104, 13, 14, 100, 101, 91, 92, 91, 92, 119, 120, 107, 108, 115, 116, 276, 277, 111, 112, 262, 283, 25, 26, 107, 108, 49, 50, 143, 144, 9, 10, 29, 30, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 99, 32, 93, 32, 189, 190, 11, 12, 35, 36, 109, 110, 15, 16, 185, 186, 145, 146, 47, 48, 19, 20, 23, 24, 129, 130, 109, 110, 109, 110, 105, 106, 15, 16, 102, 32, 93, 32, 93, 32, 121, 122, 109, 110, 117, 118, 278, 279, 113, 114, 284, 285, 27, 28, 109, 110, 51, 52, 145, 146, 11, 12, 31, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 100, 101, 131, 132, 49, 50, 45, 46, 115, 116, 13, 14, 1, 2, 53, 54, 103, 104, 49, 50, 143, 144, 45, 46, 107, 108, 107, 108, 17, 18, 21, 22, 91, 92, 29, 30, 29, 30, 119, 120, 111, 112, 107, 108, 273, 274, 203, 204, 280, 281, 207, 208, 115, 116, 107, 108, 17, 18, 21, 22, 29, 30, 91, 92, 91, 92, 100, 101, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 102, 32, 133, 134, 51, 52, 47, 48, 117, 118, 15, 16, 3, 4, 55, 56, 105, 106, 51, 52, 145, 146, 47, 48, 109, 110, 109, 110, 19, 20, 23, 24, 93, 32, 31, 32, 31, 32, 121, 122, 113, 114, 109, 110, 252, 275, 205, 206, 252, 282, 209, 210, 117, 118, 109, 110, 19, 20, 23, 24, 31, 32, 93, 32, 93, 32, 102, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 100, 101, 1, 2, 53, 54, 111, 112, 25, 26, 13, 14, 41, 42, 45, 46, 103, 104, 111, 112, 115, 116, 103, 104, 111, 112, 111, 112, 49, 50, 9, 10, 91, 92, 94, 95, 139, 140, 45, 46, 25, 26, 25, 26, 25, 26, 107, 108, 107, 108, 107, 108, 25, 26, 25, 26, 49, 50, 9, 10, 29, 30, 100, 101, 100, 101, 94, 95, 100, 101, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 102, 32, 3, 4, 55, 56, 113, 114, 27, 28, 15, 16, 43, 44, 47, 48, 105, 106, 113, 114, 117, 118, 105, 106, 113, 114, 113, 114, 51, 52, 11, 12, 93, 32, 96, 32, 141, 142, 47, 48, 27, 28, 27, 28, 27, 28, 109, 110, 109, 110, 109, 110, 27, 28, 27, 28, 51, 52, 11, 12, 31, 32, 102, 32, 102, 32, 96, 32, 102, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 41, 42, 45, 46, 103, 104, 111, 112, 13, 14, 131, 132, 103, 104, 17, 18, 5, 6, 53, 54, 17, 18, 5, 6, 53, 54, 115, 116, 13, 14, 29, 30, 100, 101, 1, 2, 53, 54, 111, 112, 111, 112, 17, 18, 53, 54, 103, 104, 17, 18, 5, 6, 53, 54, 17, 18, 21, 22, 91, 92, 29, 30, 29, 30, 29, 30, 97, 98, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 43, 44, 47, 48, 105, 106, 113, 114, 15, 16, 133, 134, 105, 106, 19, 20, 7, 8, 55, 56, 19, 20, 7, 8, 55, 56, 117, 118, 15, 16, 31, 32, 102, 32, 3, 4, 55, 56, 113, 114, 113, 114, 19, 20, 55, 56, 105, 106, 19, 20, 7, 8, 55, 56, 19, 20, 23, 24, 93, 32, 31, 32, 31, 32, 31, 32, 99, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 119, 120, 115, 116, 115, 116, 17, 18, 21, 22, 1, 2, 5, 6, 21, 22, 29, 30, 1, 2, 21, 22, 139, 140, 45, 46, 25, 26, 13, 14, 163, 164, 9, 10, 29, 30, 1, 2, 53, 54, 17, 18, 21, 22, 1, 2, 5, 6, 21, 22, 97, 98, 1, 2, 21, 22, 91, 92, 97, 98, 29, 30, 91, 92, 94, 95, 97, 98, 94, 95, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 121, 122, 117, 118, 117, 118, 19, 20, 23, 24, 3, 4, 7, 8, 23, 24, 31, 32, 3, 4, 23, 24, 141, 142, 47, 48, 27, 28, 15, 16, 165, 166, 11, 12, 31, 32, 3, 4, 55, 56, 19, 20, 23, 24, 3, 4, 7, 8, 23, 24, 99, 32, 3, 4, 23, 24, 93, 32, 99, 32, 31, 32, 93, 32, 96, 32, 99, 32, 96, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 94, 95, 1, 2, 5, 6, 5, 6, 21, 22, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 187, 188, 45, 46, 107, 108, 111, 112, 49, 50, 45, 46, 49, 50, 151, 152, 151, 152, 45, 46, 13, 14, 94, 95, 97, 98, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 100, 101, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 96, 32, 3, 4, 7, 8, 7, 8, 23, 24, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 189, 190, 47, 48, 109, 110, 113, 114, 51, 52, 47, 48, 51, 52, 153, 154, 153, 154, 47, 48, 15, 16, 96, 32, 99, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 102, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 97, 98, 29, 30, 91, 92, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 97, 98, 97, 98, 97, 98, 1, 2, 53, 54, 107, 108, 107, 108, 25, 26, 25, 26, 103, 104, 111, 112, 103, 104, 103, 104, 13, 14, 29, 30, 29, 30, 41, 42, 9, 10, 139, 140, 151, 152, 9, 10, 41, 42, 9, 10, 94, 95, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 99, 32, 31, 32, 93, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 99, 32, 99, 32, 99, 32, 3, 4, 55, 56, 109, 110, 109, 110, 27, 28, 27, 28, 105, 106, 113, 114, 105, 106, 105, 106, 15, 16, 31, 32, 31, 32, 43, 44, 11, 12, 141, 142, 153, 154, 11, 12, 43, 44, 11, 12, 96, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 91, 92, 91, 92, 29, 30, 97, 98, 94, 95, 29, 30, 97, 98, 29, 30, 29, 30, 94, 95, 97, 98, 131, 132, 17, 18, 53, 54, 107, 108, 107, 108, 115, 116, 115, 116, 103, 104, 115, 116, 49, 50, 151, 152, 175, 176, 45, 46, 49, 50, 45, 46, 107, 108, 49, 50, 45, 46, 13, 14, 97, 98, 29, 30, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 93, 32, 93, 32, 31, 32, 99, 32, 96, 32, 31, 32, 99, 32, 31, 32, 31, 32, 96, 32, 99, 32, 133, 134, 19, 20, 55, 56, 109, 110, 109, 110, 117, 118, 117, 118, 105, 106, 117, 118, 51, 52, 153, 154, 177, 178, 47, 48, 51, 52, 47, 48, 109, 110, 51, 52, 47, 48, 15, 16, 99, 32, 31, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 97, 98, 29, 30, 97, 98, 29, 30, 94, 95, 91, 92, 97, 98, 91, 92, 29, 30, 91, 92, 29, 30, 94, 95, 1, 2, 21, 22, 1, 2, 5, 6, 53, 54, 17, 18, 53, 54, 17, 18, 53, 54, 25, 26, 115, 116, 103, 104, 25, 26, 107, 108, 103, 104, 107, 108, 107, 108, 103, 104, 13, 14, 29, 30, 91, 92, 29, 30, 94, 95, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 99, 32, 31, 32, 99, 32, 31, 32, 96, 32, 93, 32, 99, 32, 93, 32, 31, 32, 93, 32, 31, 32, 96, 32, 3, 4, 23, 24, 3, 4, 7, 8, 55, 56, 19, 20, 55, 56, 19, 20, 55, 56, 27, 28, 117, 118, 105, 106, 27, 28, 109, 110, 105, 106, 109, 110, 109, 110, 105, 106, 15, 16, 31, 32, 93, 32, 31, 32, 96, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 97, 98, 29, 30, 29, 30, 97, 98, 29, 30, 91, 92, 91, 92, 1, 2, 21, 22, 1, 2, 21, 22, 119, 120, 25, 26, 103, 104, 17, 18, 53, 54, 115, 116, 25, 26, 17, 18, 53, 54, 17, 18, 21, 22, 94, 95, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 99, 32, 31, 32, 31, 32, 99, 32, 31, 32, 93, 32, 93, 32, 3, 4, 23, 24, 3, 4, 23, 24, 121, 122, 27, 28, 105, 106, 19, 20, 55, 56, 117, 118, 27, 28, 19, 20, 55, 56, 19, 20, 23, 24, 96, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 91, 92, 29, 30, 97, 98, 91, 92, 97, 98, 91, 92, 29, 30, 94, 95, 94, 95, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 94, 95, 100, 101, 94, 95, 91, 92, 1, 2, 5, 6, 5, 6, 21, 22, 1, 2, 5, 6, 5, 6, 21, 22, 1, 2, 21, 22, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 93, 32, 31, 32, 99, 32, 93, 32, 99, 32, 93, 32, 31, 32, 96, 32, 96, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 96, 32, 102, 32, 96, 32, 93, 32, 3, 4, 7, 8, 7, 8, 23, 24, 3, 4, 7, 8, 7, 8, 23, 24, 3, 4, 23, 24, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 94, 95, 91, 92, 94, 95, 29, 30, 91, 92, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 96, 32, 93, 32, 96, 32, 31, 32, 93, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/nest4/level.json b/gamefileshf/level/nest4/level.json new file mode 100755 index 00000000..9c45ae51 --- /dev/null +++ b/gamefileshf/level/nest4/level.json @@ -0,0 +1,20 @@ +{ + "palette": { + "id": "l6base", + "file": "Nlevels/L6Data/L6Base.PAL" + }, + "level": { + "id": "level", + "palette": "l6base", + "file": "Nlevels/L6Data/L6.CEL", + "outOfBoundsTileLayer2": 7, + "til": "Nlevels/L6Data/L6.TIL", + "min": "Nlevels/L6Data/L6.MIN", + "minBlocks": 10, + "sol": "Nlevels/L6Data/L6.SOL" + }, + "load": "level/automap/l6/load.json", + "load": "level/nest4/levelObjects.json", + "load": "level/nest4/monsters.json", + "load": "level/nest4/level2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest4/level2.json b/gamefileshf/level/nest4/level2.json new file mode 100755 index 00000000..1b83258c --- /dev/null +++ b/gamefileshf/level/nest4/level2.json @@ -0,0 +1,10 @@ +{ + "level": { + "id": "level", + "path": "nest4", + "name": "Nest 4", + "map": { "file": "level/nest4/nest4.json", "indexOffset": -1 } + }, + "load": "level/nest4/levelObjects2.json", + "load": "level/nest4/monsters2.json" +} \ No newline at end of file diff --git a/gamefileshf/level/nest4/levelObjects2.json b/gamefileshf/level/nest4/levelObjects2.json new file mode 100755 index 00000000..ced10b97 --- /dev/null +++ b/gamefileshf/level/nest4/levelObjects2.json @@ -0,0 +1,12 @@ +{ + "levelObject": { + "id": "up", + "class": "levelUpNest", + "mapPosition": [35, 52], + "properties": { + "x": 61, + "y": 55, + "level": 3 + } + } +} \ No newline at end of file diff --git a/gamefileshf/level/nest4/music.json b/gamefileshf/level/nest4/music.json new file mode 100755 index 00000000..1f84b555 --- /dev/null +++ b/gamefileshf/level/nest4/music.json @@ -0,0 +1,8 @@ +{ + "audio": { + "id": "main", + "file": "Music/DLvlF.wav", + "loop": true, + "play": true + } +} \ No newline at end of file diff --git a/gamefileshf/level/nest4/nest4.json b/gamefileshf/level/nest4/nest4.json new file mode 100755 index 00000000..2fd633bb --- /dev/null +++ b/gamefileshf/level/nest4/nest4.json @@ -0,0 +1,158 @@ +{ "backgroundcolor":"#000000", + "height":112, + "infinite":false, + "layers":[ + { + "data":[29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 94, 95, 97, 98, 100, 101, 97, 98, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 94, 95, 94, 95, 94, 95, 94, 95, 29, 30, 97, 98, 187, 188, 9, 10, 163, 164, 9, 10, 29, 30, 29, 30, 29, 30, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 96, 32, 99, 32, 102, 32, 99, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 96, 32, 96, 32, 96, 32, 96, 32, 31, 32, 99, 32, 189, 190, 11, 12, 165, 166, 11, 12, 31, 32, 31, 32, 31, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 163, 164, 147, 148, 143, 144, 9, 10, 41, 42, 9, 10, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 91, 92, 41, 42, 9, 10, 127, 128, 49, 50, 45, 46, 49, 50, 143, 144, 175, 176, 9, 10, 29, 30, 29, 30, 97, 98, 97, 98, 94, 95, 29, 30, 91, 92, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 165, 166, 149, 150, 145, 146, 11, 12, 43, 44, 11, 12, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 93, 32, 43, 44, 11, 12, 129, 130, 51, 52, 47, 48, 51, 52, 145, 146, 177, 178, 11, 12, 31, 32, 31, 32, 99, 32, 99, 32, 96, 32, 31, 32, 93, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 1, 2, 53, 54, 115, 116, 49, 50, 45, 46, 13, 14, 100, 101, 94, 95, 91, 92, 29, 30, 100, 101, 100, 101, 100, 101, 94, 95, 29, 30, 29, 30, 94, 95, 97, 98, 91, 92, 33, 34, 49, 50, 45, 46, 107, 108, 262, 283, 25, 26, 25, 26, 17, 18, 21, 22, 91, 92, 97, 98, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 97, 98, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 3, 4, 55, 56, 117, 118, 51, 52, 47, 48, 15, 16, 102, 32, 96, 32, 93, 32, 31, 32, 102, 32, 102, 32, 102, 32, 96, 32, 31, 32, 31, 32, 96, 32, 99, 32, 93, 32, 35, 36, 51, 52, 47, 48, 109, 110, 284, 285, 27, 28, 27, 28, 19, 20, 23, 24, 93, 32, 99, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 99, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 41, 42, 45, 46, 111, 112, 107, 108, 17, 18, 21, 22, 29, 30, 91, 92, 97, 98, 100, 101, 91, 92, 29, 30, 91, 92, 97, 98, 97, 98, 100, 101, 29, 30, 29, 30, 97, 98, 131, 132, 107, 108, 25, 26, 107, 108, 280, 281, 207, 208, 103, 104, 13, 14, 91, 92, 29, 30, 100, 101, 94, 95, 94, 95, 91, 92, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 43, 44, 47, 48, 113, 114, 109, 110, 19, 20, 23, 24, 31, 32, 93, 32, 99, 32, 102, 32, 93, 32, 31, 32, 93, 32, 99, 32, 99, 32, 102, 32, 31, 32, 31, 32, 99, 32, 133, 134, 109, 110, 27, 28, 109, 110, 252, 282, 209, 210, 105, 106, 15, 16, 93, 32, 31, 32, 102, 32, 96, 32, 96, 32, 93, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 1, 2, 53, 54, 115, 116, 25, 26, 49, 50, 9, 10, 29, 30, 94, 95, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 41, 42, 9, 10, 29, 30, 97, 98, 94, 95, 1, 2, 53, 54, 17, 18, 53, 54, 107, 108, 25, 26, 25, 26, 49, 50, 9, 10, 29, 30, 91, 92, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 3, 4, 55, 56, 117, 118, 27, 28, 51, 52, 11, 12, 31, 32, 96, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 43, 44, 11, 12, 31, 32, 99, 32, 96, 32, 3, 4, 55, 56, 19, 20, 55, 56, 109, 110, 27, 28, 27, 28, 51, 52, 11, 12, 31, 32, 93, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 139, 140, 45, 46, 25, 26, 17, 18, 5, 6, 21, 22, 29, 30, 187, 188, 151, 152, 9, 10, 29, 30, 29, 30, 41, 42, 9, 10, 123, 124, 49, 50, 147, 148, 155, 156, 9, 10, 29, 30, 123, 124, 13, 14, 1, 2, 53, 54, 111, 112, 111, 112, 25, 26, 49, 50, 9, 10, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 91, 92, 94, 95, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 141, 142, 47, 48, 27, 28, 19, 20, 7, 8, 23, 24, 31, 32, 189, 190, 153, 154, 11, 12, 31, 32, 31, 32, 43, 44, 11, 12, 125, 126, 51, 52, 149, 150, 157, 158, 11, 12, 31, 32, 125, 126, 15, 16, 3, 4, 55, 56, 113, 114, 113, 114, 27, 28, 51, 52, 11, 12, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 93, 32, 96, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 33, 34, 111, 112, 103, 104, 49, 50, 9, 10, 97, 98, 29, 30, 1, 2, 53, 54, 49, 50, 155, 156, 9, 10, 123, 124, 49, 50, 45, 46, 107, 108, 25, 26, 25, 26, 49, 50, 147, 148, 45, 46, 13, 14, 97, 98, 1, 2, 53, 54, 107, 108, 103, 104, 25, 26, 13, 14, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 35, 36, 113, 114, 105, 106, 51, 52, 11, 12, 99, 32, 31, 32, 3, 4, 55, 56, 51, 52, 157, 158, 11, 12, 125, 126, 51, 52, 47, 48, 109, 110, 27, 28, 27, 28, 51, 52, 149, 150, 47, 48, 15, 16, 99, 32, 3, 4, 55, 56, 109, 110, 105, 106, 27, 28, 15, 16, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 1, 2, 53, 54, 107, 108, 25, 26, 13, 14, 94, 95, 29, 30, 29, 30, 131, 132, 103, 104, 103, 104, 49, 50, 45, 46, 111, 112, 266, 267, 103, 104, 107, 108, 107, 108, 25, 26, 115, 116, 17, 18, 21, 22, 94, 95, 139, 140, 45, 46, 103, 104, 103, 104, 25, 26, 13, 14, 94, 95, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 3, 4, 55, 56, 109, 110, 27, 28, 15, 16, 96, 32, 31, 32, 31, 32, 133, 134, 105, 106, 105, 106, 51, 52, 47, 48, 113, 114, 268, 269, 105, 106, 109, 110, 109, 110, 27, 28, 117, 118, 19, 20, 23, 24, 96, 32, 141, 142, 47, 48, 105, 106, 105, 106, 27, 28, 15, 16, 96, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 187, 188, 45, 46, 25, 26, 25, 26, 49, 50, 9, 10, 29, 30, 41, 42, 45, 46, 115, 116, 107, 108, 17, 18, 53, 54, 103, 104, 270, 271, 199, 200, 111, 112, 115, 116, 25, 26, 111, 112, 13, 14, 97, 98, 91, 92, 119, 120, 103, 104, 107, 108, 17, 18, 53, 54, 13, 14, 94, 95, 91, 92, 94, 95, 94, 95, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 189, 190, 47, 48, 27, 28, 27, 28, 51, 52, 11, 12, 31, 32, 43, 44, 47, 48, 117, 118, 109, 110, 19, 20, 55, 56, 105, 106, 264, 272, 201, 202, 113, 114, 117, 118, 27, 28, 113, 114, 15, 16, 99, 32, 93, 32, 121, 122, 105, 106, 109, 110, 19, 20, 55, 56, 15, 16, 96, 32, 93, 32, 96, 32, 96, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 135, 136, 17, 18, 5, 6, 5, 6, 53, 54, 13, 14, 94, 95, 1, 2, 53, 54, 107, 108, 103, 104, 13, 14, 119, 120, 107, 108, 107, 108, 25, 26, 115, 116, 17, 18, 53, 54, 107, 108, 49, 50, 9, 10, 94, 95, 1, 2, 5, 6, 5, 6, 21, 22, 1, 2, 21, 22, 100, 101, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 137, 138, 19, 20, 7, 8, 7, 8, 55, 56, 15, 16, 96, 32, 3, 4, 55, 56, 109, 110, 105, 106, 15, 16, 121, 122, 109, 110, 109, 110, 27, 28, 117, 118, 19, 20, 55, 56, 109, 110, 51, 52, 11, 12, 96, 32, 3, 4, 7, 8, 7, 8, 23, 24, 3, 4, 23, 24, 102, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 21, 22, 187, 188, 37, 38, 45, 46, 13, 14, 97, 98, 100, 101, 1, 2, 5, 6, 5, 6, 21, 22, 1, 2, 53, 54, 25, 26, 103, 104, 17, 18, 21, 22, 119, 120, 25, 26, 25, 26, 49, 50, 147, 148, 9, 10, 29, 30, 139, 140, 143, 144, 9, 10, 97, 98, 139, 140, 151, 152, 9, 10, 100, 101, 97, 98, 94, 95, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 23, 24, 189, 190, 39, 40, 47, 48, 15, 16, 99, 32, 102, 32, 3, 4, 7, 8, 7, 8, 23, 24, 3, 4, 55, 56, 27, 28, 105, 106, 19, 20, 23, 24, 121, 122, 27, 28, 27, 28, 51, 52, 149, 150, 11, 12, 31, 32, 141, 142, 145, 146, 11, 12, 99, 32, 141, 142, 153, 154, 11, 12, 102, 32, 99, 32, 96, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 127, 128, 103, 104, 111, 112, 49, 50, 9, 10, 94, 95, 41, 42, 143, 144, 9, 10, 100, 101, 29, 30, 127, 128, 111, 112, 107, 108, 13, 14, 183, 184, 45, 46, 254, 255, 111, 112, 25, 26, 107, 108, 49, 50, 9, 10, 1, 2, 53, 54, 49, 50, 155, 156, 45, 46, 17, 18, 21, 22, 29, 30, 94, 95, 100, 101, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 129, 130, 105, 106, 113, 114, 51, 52, 11, 12, 96, 32, 43, 44, 145, 146, 11, 12, 102, 32, 31, 32, 129, 130, 113, 114, 109, 110, 15, 16, 185, 186, 47, 48, 256, 257, 113, 114, 27, 28, 109, 110, 51, 52, 11, 12, 3, 4, 55, 56, 51, 52, 157, 158, 47, 48, 19, 20, 23, 24, 31, 32, 96, 32, 102, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 91, 92, 94, 95, 1, 2, 53, 54, 107, 108, 17, 18, 21, 22, 29, 30, 1, 2, 53, 54, 49, 50, 9, 10, 91, 92, 1, 2, 53, 54, 17, 18, 21, 22, 131, 132, 103, 104, 250, 251, 191, 192, 107, 108, 111, 112, 103, 104, 49, 50, 155, 156, 45, 46, 103, 104, 111, 112, 25, 26, 13, 14, 91, 92, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 93, 32, 96, 32, 3, 4, 55, 56, 109, 110, 19, 20, 23, 24, 31, 32, 3, 4, 55, 56, 51, 52, 11, 12, 93, 32, 3, 4, 55, 56, 19, 20, 23, 24, 133, 134, 105, 106, 252, 253, 193, 194, 109, 110, 113, 114, 105, 106, 51, 52, 157, 158, 47, 48, 105, 106, 113, 114, 27, 28, 15, 16, 93, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 187, 188, 45, 46, 115, 116, 49, 50, 9, 10, 97, 98, 94, 95, 33, 34, 111, 112, 49, 50, 9, 10, 187, 188, 45, 46, 49, 50, 9, 10, 123, 124, 111, 112, 25, 26, 111, 112, 107, 108, 111, 112, 17, 18, 5, 6, 53, 54, 107, 108, 25, 26, 25, 26, 25, 26, 13, 14, 97, 98, 91, 92, 29, 30, 97, 98, 29, 30, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 189, 190, 47, 48, 117, 118, 51, 52, 11, 12, 99, 32, 96, 32, 35, 36, 113, 114, 51, 52, 11, 12, 189, 190, 47, 48, 51, 52, 11, 12, 125, 126, 113, 114, 27, 28, 113, 114, 109, 110, 113, 114, 19, 20, 7, 8, 55, 56, 109, 110, 27, 28, 27, 28, 27, 28, 15, 16, 99, 32, 93, 32, 31, 32, 99, 32, 31, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 119, 120, 276, 277, 103, 104, 103, 104, 49, 50, 9, 10, 163, 164, 45, 46, 17, 18, 53, 54, 49, 50, 45, 46, 103, 104, 17, 18, 21, 22, 1, 2, 53, 54, 111, 112, 25, 26, 103, 104, 111, 112, 49, 50, 9, 10, 123, 124, 25, 26, 25, 26, 107, 108, 17, 18, 21, 22, 29, 30, 29, 30, 97, 98, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 121, 122, 278, 279, 105, 106, 105, 106, 51, 52, 11, 12, 165, 166, 47, 48, 19, 20, 55, 56, 51, 52, 47, 48, 105, 106, 19, 20, 23, 24, 3, 4, 55, 56, 113, 114, 27, 28, 105, 106, 113, 114, 51, 52, 11, 12, 125, 126, 27, 28, 27, 28, 109, 110, 19, 20, 23, 24, 31, 32, 31, 32, 99, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 119, 120, 273, 274, 203, 204, 107, 108, 17, 18, 21, 22, 1, 2, 5, 6, 21, 22, 1, 2, 53, 54, 25, 26, 25, 26, 49, 50, 9, 10, 187, 188, 45, 46, 107, 108, 111, 112, 406, 407, 25, 26, 17, 18, 21, 22, 119, 120, 107, 108, 103, 104, 17, 18, 21, 22, 100, 101, 29, 30, 29, 30, 29, 30, 97, 98, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 121, 122, 252, 275, 205, 206, 109, 110, 19, 20, 23, 24, 3, 4, 7, 8, 23, 24, 3, 4, 55, 56, 27, 28, 27, 28, 51, 52, 11, 12, 189, 190, 47, 48, 109, 110, 113, 114, 408, 409, 27, 28, 19, 20, 23, 24, 121, 122, 109, 110, 105, 106, 19, 20, 23, 24, 102, 32, 31, 32, 31, 32, 31, 32, 99, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 91, 92, 91, 92, 123, 124, 276, 277, 111, 112, 107, 108, 49, 50, 9, 10, 94, 95, 29, 30, 97, 98, 94, 95, 167, 168, 17, 18, 5, 6, 53, 54, 49, 50, 45, 46, 115, 116, 107, 108, 410, 411, 422, 423, 25, 26, 13, 14, 100, 101, 131, 132, 103, 104, 25, 26, 13, 14, 29, 30, 29, 30, 29, 30, 100, 101, 97, 98, 97, 98, 97, 98, 100, 101, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 93, 32, 93, 32, 125, 126, 278, 279, 113, 114, 109, 110, 51, 52, 11, 12, 96, 32, 31, 32, 99, 32, 96, 32, 169, 170, 19, 20, 7, 8, 55, 56, 51, 52, 47, 48, 117, 118, 109, 110, 412, 413, 424, 425, 27, 28, 15, 16, 102, 32, 133, 134, 105, 106, 27, 28, 15, 16, 31, 32, 31, 32, 31, 32, 102, 32, 99, 32, 99, 32, 99, 32, 102, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 91, 92, 33, 34, 273, 274, 203, 204, 25, 26, 115, 116, 13, 14, 76, 77, 73, 74, 97, 98, 94, 95, 1, 2, 21, 22, 97, 98, 1, 2, 5, 6, 53, 54, 111, 112, 107, 108, 25, 26, 25, 26, 25, 26, 13, 14, 29, 30, 123, 124, 25, 26, 25, 26, 49, 50, 9, 10, 91, 92, 100, 101, 91, 92, 91, 92, 91, 92, 29, 30, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 93, 32, 35, 36, 252, 275, 205, 206, 27, 28, 117, 118, 15, 16, 78, 32, 75, 32, 99, 32, 96, 32, 3, 4, 23, 24, 99, 32, 3, 4, 7, 8, 55, 56, 113, 114, 109, 110, 27, 28, 27, 28, 27, 28, 15, 16, 31, 32, 125, 126, 27, 28, 27, 28, 51, 52, 11, 12, 93, 32, 102, 32, 93, 32, 93, 32, 93, 32, 31, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 97, 98, 91, 92, 33, 34, 25, 26, 305, 306, 103, 104, 115, 116, 49, 50, 65, 66, 69, 70, 9, 10, 41, 42, 9, 10, 29, 30, 94, 95, 29, 30, 100, 101, 1, 2, 53, 54, 111, 112, 107, 108, 115, 116, 25, 26, 49, 50, 9, 10, 119, 120, 17, 18, 53, 54, 107, 108, 13, 14, 100, 101, 29, 30, 29, 30, 94, 95, 100, 101, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 99, 32, 93, 32, 35, 36, 27, 28, 307, 308, 105, 106, 117, 118, 51, 52, 67, 68, 71, 72, 11, 12, 43, 44, 11, 12, 31, 32, 96, 32, 31, 32, 102, 32, 3, 4, 55, 56, 113, 114, 109, 110, 117, 118, 27, 28, 51, 52, 11, 12, 121, 122, 19, 20, 55, 56, 109, 110, 15, 16, 102, 32, 31, 32, 31, 32, 96, 32, 102, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 1, 2, 53, 54, 301, 302, 219, 220, 25, 26, 25, 26, 111, 112, 111, 112, 49, 50, 45, 46, 13, 14, 139, 140, 9, 10, 163, 164, 37, 38, 9, 10, 131, 132, 17, 18, 5, 6, 53, 54, 25, 26, 17, 18, 21, 22, 119, 120, 13, 14, 1, 2, 53, 54, 49, 50, 143, 144, 9, 10, 91, 92, 29, 30, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 3, 4, 55, 56, 303, 304, 221, 222, 27, 28, 27, 28, 113, 114, 113, 114, 51, 52, 47, 48, 15, 16, 141, 142, 11, 12, 165, 166, 39, 40, 11, 12, 133, 134, 19, 20, 7, 8, 55, 56, 27, 28, 19, 20, 23, 24, 121, 122, 15, 16, 3, 4, 55, 56, 51, 52, 145, 146, 11, 12, 93, 32, 31, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 187, 188, 45, 46, 115, 116, 25, 26, 103, 104, 402, 403, 434, 435, 262, 283, 103, 104, 111, 112, 13, 14, 131, 132, 49, 50, 45, 46, 107, 108, 49, 50, 45, 46, 13, 14, 183, 184, 45, 46, 107, 108, 13, 14, 29, 30, 131, 132, 49, 50, 159, 160, 45, 46, 107, 108, 25, 26, 13, 14, 97, 98, 91, 92, 91, 92, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 189, 190, 47, 48, 117, 118, 27, 28, 105, 106, 404, 405, 436, 437, 284, 285, 105, 106, 113, 114, 15, 16, 133, 134, 51, 52, 47, 48, 109, 110, 51, 52, 47, 48, 15, 16, 185, 186, 47, 48, 109, 110, 15, 16, 31, 32, 133, 134, 51, 52, 161, 162, 47, 48, 109, 110, 27, 28, 15, 16, 99, 32, 93, 32, 93, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 53, 54, 262, 263, 115, 116, 103, 104, 450, 447, 446, 461, 280, 281, 207, 208, 25, 26, 49, 50, 45, 46, 111, 112, 103, 104, 25, 26, 103, 104, 25, 26, 49, 50, 45, 46, 17, 18, 5, 6, 21, 22, 29, 30, 119, 120, 115, 116, 25, 26, 107, 108, 25, 26, 107, 108, 13, 14, 91, 92, 91, 92, 97, 98, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 55, 56, 264, 265, 117, 118, 105, 106, 451, 452, 462, 463, 252, 282, 209, 210, 27, 28, 51, 52, 47, 48, 113, 114, 105, 106, 27, 28, 105, 106, 27, 28, 51, 52, 47, 48, 19, 20, 7, 8, 23, 24, 31, 32, 121, 122, 117, 118, 27, 28, 109, 110, 27, 28, 109, 110, 15, 16, 93, 32, 93, 32, 99, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 100, 101, 100, 101, 183, 184, 45, 46, 258, 259, 195, 196, 25, 26, 489, 447, 446, 464, 103, 104, 25, 26, 25, 26, 107, 108, 103, 104, 17, 18, 53, 54, 107, 108, 17, 18, 53, 54, 111, 112, 17, 18, 21, 22, 41, 42, 179, 180, 9, 10, 1, 2, 53, 54, 25, 26, 111, 112, 25, 26, 17, 18, 21, 22, 97, 98, 29, 30, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 102, 32, 102, 32, 185, 186, 47, 48, 260, 261, 197, 198, 27, 28, 490, 491, 465, 466, 105, 106, 27, 28, 27, 28, 109, 110, 105, 106, 19, 20, 55, 56, 109, 110, 19, 20, 55, 56, 113, 114, 19, 20, 23, 24, 43, 44, 181, 182, 11, 12, 3, 4, 55, 56, 27, 28, 113, 114, 27, 28, 19, 20, 23, 24, 99, 32, 31, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 97, 98, 94, 95, 127, 128, 103, 104, 103, 104, 111, 112, 25, 26, 25, 26, 254, 255, 115, 116, 103, 104, 402, 403, 434, 435, 111, 112, 13, 14, 1, 2, 5, 6, 21, 22, 1, 2, 53, 54, 49, 50, 143, 144, 45, 46, 17, 18, 21, 22, 41, 42, 45, 46, 25, 26, 17, 18, 5, 6, 21, 22, 97, 98, 97, 98, 29, 30, 91, 92, 29, 30, 94, 95, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 99, 32, 96, 32, 129, 130, 105, 106, 105, 106, 113, 114, 27, 28, 27, 28, 256, 257, 117, 118, 105, 106, 404, 405, 436, 437, 113, 114, 15, 16, 3, 4, 7, 8, 23, 24, 3, 4, 55, 56, 51, 52, 145, 146, 47, 48, 19, 20, 23, 24, 43, 44, 47, 48, 27, 28, 19, 20, 7, 8, 23, 24, 99, 32, 99, 32, 31, 32, 93, 32, 31, 32, 96, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 97, 98, 94, 95, 171, 172, 25, 26, 25, 26, 107, 108, 115, 116, 103, 104, 250, 251, 191, 192, 107, 108, 489, 447, 446, 464, 25, 26, 49, 50, 9, 10, 29, 30, 29, 30, 91, 92, 123, 124, 266, 267, 25, 26, 111, 112, 49, 50, 155, 156, 45, 46, 17, 18, 5, 6, 21, 22, 94, 95, 94, 95, 29, 30, 91, 92, 29, 30, 94, 95, 94, 95, 94, 95, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 99, 32, 96, 32, 173, 174, 27, 28, 27, 28, 109, 110, 117, 118, 105, 106, 252, 253, 193, 194, 109, 110, 490, 491, 465, 466, 27, 28, 51, 52, 11, 12, 31, 32, 31, 32, 93, 32, 125, 126, 268, 269, 27, 28, 113, 114, 51, 52, 157, 158, 47, 48, 19, 20, 7, 8, 23, 24, 96, 32, 96, 32, 31, 32, 93, 32, 31, 32, 96, 32, 96, 32, 96, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 1, 2, 53, 54, 107, 108, 103, 104, 17, 18, 53, 54, 25, 26, 25, 26, 25, 26, 111, 112, 25, 26, 25, 26, 103, 104, 49, 50, 9, 10, 29, 30, 163, 164, 45, 46, 270, 271, 199, 200, 115, 116, 111, 112, 107, 108, 17, 18, 21, 22, 94, 95, 91, 92, 97, 98, 97, 98, 97, 98, 91, 92, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 3, 4, 55, 56, 109, 110, 105, 106, 19, 20, 55, 56, 27, 28, 27, 28, 27, 28, 113, 114, 27, 28, 27, 28, 105, 106, 51, 52, 11, 12, 31, 32, 165, 166, 47, 48, 264, 272, 201, 202, 117, 118, 113, 114, 109, 110, 19, 20, 23, 24, 96, 32, 93, 32, 99, 32, 99, 32, 99, 32, 93, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 183, 184, 45, 46, 17, 18, 5, 6, 21, 22, 131, 132, 17, 18, 5, 6, 53, 54, 25, 26, 107, 108, 103, 104, 17, 18, 53, 54, 49, 50, 9, 10, 33, 34, 262, 283, 111, 112, 25, 26, 25, 26, 25, 26, 17, 18, 21, 22, 100, 101, 29, 30, 94, 95, 100, 101, 29, 30, 91, 92, 91, 92, 97, 98, 94, 95, 97, 98, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 185, 186, 47, 48, 19, 20, 7, 8, 23, 24, 133, 134, 19, 20, 7, 8, 55, 56, 27, 28, 109, 110, 105, 106, 19, 20, 55, 56, 51, 52, 11, 12, 35, 36, 284, 285, 113, 114, 27, 28, 27, 28, 27, 28, 19, 20, 23, 24, 102, 32, 31, 32, 96, 32, 102, 32, 31, 32, 93, 32, 93, 32, 99, 32, 96, 32, 99, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 91, 92, 29, 30, 1, 2, 53, 54, 49, 50, 155, 156, 159, 160, 45, 46, 49, 50, 9, 10, 1, 2, 53, 54, 103, 104, 103, 104, 13, 14, 1, 2, 53, 54, 49, 50, 45, 46, 280, 281, 207, 208, 107, 108, 25, 26, 115, 116, 49, 50, 175, 176, 143, 144, 37, 38, 9, 10, 29, 30, 97, 98, 100, 101, 97, 98, 100, 101, 94, 95, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 93, 32, 31, 32, 3, 4, 55, 56, 51, 52, 157, 158, 161, 162, 47, 48, 51, 52, 11, 12, 3, 4, 55, 56, 105, 106, 105, 106, 15, 16, 3, 4, 55, 56, 51, 52, 47, 48, 252, 282, 209, 210, 109, 110, 27, 28, 117, 118, 51, 52, 177, 178, 145, 146, 39, 40, 11, 12, 31, 32, 99, 32, 102, 32, 99, 32, 102, 32, 96, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 97, 98, 29, 30, 97, 98, 91, 92, 119, 120, 103, 104, 103, 104, 17, 18, 5, 6, 53, 54, 49, 50, 37, 38, 45, 46, 111, 112, 25, 26, 49, 50, 151, 152, 45, 46, 254, 255, 25, 26, 111, 112, 107, 108, 115, 116, 17, 18, 53, 54, 266, 267, 107, 108, 103, 104, 17, 18, 21, 22, 91, 92, 29, 30, 29, 30, 91, 92, 91, 92, 29, 30, 100, 101, 97, 98, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 99, 32, 31, 32, 99, 32, 93, 32, 121, 122, 105, 106, 105, 106, 19, 20, 7, 8, 55, 56, 51, 52, 39, 40, 47, 48, 113, 114, 27, 28, 51, 52, 153, 154, 47, 48, 256, 257, 27, 28, 113, 114, 109, 110, 117, 118, 19, 20, 55, 56, 268, 269, 109, 110, 105, 106, 19, 20, 23, 24, 93, 32, 31, 32, 31, 32, 93, 32, 93, 32, 31, 32, 102, 32, 99, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 123, 124, 115, 116, 25, 26, 13, 14, 29, 30, 1, 2, 53, 54, 103, 104, 17, 18, 53, 54, 25, 26, 103, 104, 115, 116, 103, 104, 250, 251, 191, 192, 25, 26, 103, 104, 17, 18, 21, 22, 127, 128, 270, 271, 199, 200, 111, 112, 13, 14, 97, 98, 97, 98, 100, 101, 100, 101, 97, 98, 94, 95, 97, 98, 29, 30, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 125, 126, 117, 118, 27, 28, 15, 16, 31, 32, 3, 4, 55, 56, 105, 106, 19, 20, 55, 56, 27, 28, 105, 106, 117, 118, 105, 106, 252, 253, 193, 194, 27, 28, 105, 106, 19, 20, 23, 24, 129, 130, 264, 272, 201, 202, 113, 114, 15, 16, 99, 32, 99, 32, 102, 32, 102, 32, 99, 32, 96, 32, 99, 32, 31, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 97, 98, 187, 188, 45, 46, 17, 18, 53, 54, 13, 14, 91, 92, 41, 42, 45, 46, 17, 18, 21, 22, 123, 124, 17, 18, 5, 6, 53, 54, 103, 104, 103, 104, 107, 108, 25, 26, 25, 26, 49, 50, 143, 144, 45, 46, 25, 26, 25, 26, 25, 26, 13, 14, 91, 92, 29, 30, 100, 101, 97, 98, 94, 95, 100, 101, 29, 30, 29, 30, 100, 101, 100, 101, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 99, 32, 189, 190, 47, 48, 19, 20, 55, 56, 15, 16, 93, 32, 43, 44, 47, 48, 19, 20, 23, 24, 125, 126, 19, 20, 7, 8, 55, 56, 105, 106, 105, 106, 109, 110, 27, 28, 27, 28, 51, 52, 145, 146, 47, 48, 27, 28, 27, 28, 27, 28, 15, 16, 93, 32, 31, 32, 102, 32, 99, 32, 96, 32, 102, 32, 31, 32, 31, 32, 102, 32, 102, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 2, 5, 6, 21, 22, 127, 128, 49, 50, 143, 144, 45, 46, 25, 26, 49, 50, 151, 152, 45, 46, 13, 14, 41, 42, 45, 46, 25, 26, 25, 26, 107, 108, 25, 26, 111, 112, 17, 18, 5, 6, 53, 54, 103, 104, 25, 26, 115, 116, 49, 50, 9, 10, 29, 30, 29, 30, 91, 92, 91, 92, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 3, 4, 7, 8, 23, 24, 129, 130, 51, 52, 145, 146, 47, 48, 27, 28, 51, 52, 153, 154, 47, 48, 15, 16, 43, 44, 47, 48, 27, 28, 27, 28, 109, 110, 27, 28, 113, 114, 19, 20, 7, 8, 55, 56, 105, 106, 27, 28, 117, 118, 51, 52, 11, 12, 31, 32, 31, 32, 93, 32, 93, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 91, 92, 29, 30, 135, 136, 111, 112, 266, 267, 25, 26, 297, 298, 25, 26, 115, 116, 111, 112, 49, 50, 45, 46, 262, 263, 115, 116, 103, 104, 254, 255, 103, 104, 107, 108, 13, 14, 163, 164, 45, 46, 107, 108, 103, 104, 17, 18, 5, 6, 21, 22, 91, 92, 29, 30, 100, 101, 91, 92, 94, 95, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 93, 32, 31, 32, 137, 138, 113, 114, 268, 269, 27, 28, 299, 300, 27, 28, 117, 118, 113, 114, 51, 52, 47, 48, 264, 265, 117, 118, 105, 106, 256, 257, 105, 106, 109, 110, 15, 16, 165, 166, 47, 48, 109, 110, 105, 106, 19, 20, 7, 8, 23, 24, 93, 32, 31, 32, 102, 32, 93, 32, 96, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 94, 95, 91, 92, 91, 92, 97, 98, 29, 30, 127, 128, 25, 26, 270, 271, 199, 200, 293, 294, 215, 216, 103, 104, 262, 263, 107, 108, 103, 104, 258, 259, 195, 196, 25, 26, 250, 251, 191, 192, 111, 112, 13, 14, 127, 128, 115, 116, 111, 112, 17, 18, 21, 22, 94, 95, 97, 98, 29, 30, 100, 101, 91, 92, 97, 98, 29, 30, 29, 30, 91, 92, 97, 98, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 96, 32, 93, 32, 93, 32, 99, 32, 31, 32, 129, 130, 27, 28, 264, 272, 201, 202, 295, 296, 217, 218, 105, 106, 264, 265, 109, 110, 105, 106, 260, 261, 197, 198, 27, 28, 252, 253, 193, 194, 113, 114, 15, 16, 129, 130, 117, 118, 113, 114, 19, 20, 23, 24, 96, 32, 99, 32, 31, 32, 102, 32, 93, 32, 99, 32, 31, 32, 31, 32, 93, 32, 99, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 100, 101, 29, 30, 41, 42, 45, 46, 107, 108, 115, 116, 25, 26, 103, 104, 103, 104, 115, 116, 258, 259, 195, 196, 107, 108, 25, 26, 103, 104, 25, 26, 107, 108, 107, 108, 25, 26, 49, 50, 45, 46, 107, 108, 25, 26, 49, 50, 9, 10, 29, 30, 97, 98, 91, 92, 94, 95, 29, 30, 97, 98, 97, 98, 91, 92, 94, 95, 91, 92, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 102, 32, 31, 32, 43, 44, 47, 48, 109, 110, 117, 118, 27, 28, 105, 106, 105, 106, 117, 118, 260, 261, 197, 198, 109, 110, 27, 28, 105, 106, 27, 28, 109, 110, 109, 110, 27, 28, 51, 52, 47, 48, 109, 110, 27, 28, 51, 52, 11, 12, 31, 32, 99, 32, 93, 32, 96, 32, 31, 32, 99, 32, 99, 32, 93, 32, 96, 32, 93, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 94, 95, 97, 98, 1, 2, 5, 6, 53, 54, 17, 18, 53, 54, 17, 18, 53, 54, 25, 26, 107, 108, 115, 116, 111, 112, 25, 26, 17, 18, 5, 6, 53, 54, 103, 104, 25, 26, 25, 26, 107, 108, 17, 18, 53, 54, 103, 104, 13, 14, 94, 95, 91, 92, 29, 30, 100, 101, 29, 30, 29, 30, 29, 30, 100, 101, 94, 95, 94, 95, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 96, 32, 99, 32, 3, 4, 7, 8, 55, 56, 19, 20, 55, 56, 19, 20, 55, 56, 27, 28, 109, 110, 117, 118, 113, 114, 27, 28, 19, 20, 7, 8, 55, 56, 105, 106, 27, 28, 27, 28, 109, 110, 19, 20, 55, 56, 105, 106, 15, 16, 96, 32, 93, 32, 31, 32, 102, 32, 31, 32, 31, 32, 31, 32, 102, 32, 96, 32, 96, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 91, 92, 100, 101, 29, 30, 100, 101, 1, 2, 21, 22, 1, 2, 21, 22, 1, 2, 5, 6, 53, 54, 103, 104, 25, 26, 17, 18, 21, 22, 163, 164, 45, 46, 17, 18, 5, 6, 53, 54, 17, 18, 21, 22, 1, 2, 5, 6, 21, 22, 91, 92, 94, 95, 100, 101, 29, 30, 29, 30, 29, 30, 91, 92, 29, 30, 100, 101, 91, 92, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 93, 32, 102, 32, 31, 32, 102, 32, 3, 4, 23, 24, 3, 4, 23, 24, 3, 4, 7, 8, 55, 56, 105, 106, 27, 28, 19, 20, 23, 24, 165, 166, 47, 48, 19, 20, 7, 8, 55, 56, 19, 20, 23, 24, 3, 4, 7, 8, 23, 24, 93, 32, 96, 32, 102, 32, 31, 32, 31, 32, 31, 32, 93, 32, 31, 32, 102, 32, 93, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 91, 92, 100, 101, 29, 30, 29, 30, 94, 95, 94, 95, 94, 95, 91, 92, 97, 98, 97, 98, 97, 98, 91, 92, 94, 95, 1, 2, 5, 6, 5, 6, 21, 22, 29, 30, 1, 2, 5, 6, 21, 22, 91, 92, 1, 2, 21, 22, 91, 92, 91, 92, 91, 92, 94, 95, 91, 92, 94, 95, 29, 30, 100, 101, 29, 30, 100, 101, 91, 92, 91, 92, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 93, 32, 102, 32, 31, 32, 31, 32, 96, 32, 96, 32, 96, 32, 93, 32, 99, 32, 99, 32, 99, 32, 93, 32, 96, 32, 3, 4, 7, 8, 7, 8, 23, 24, 31, 32, 3, 4, 7, 8, 23, 24, 93, 32, 3, 4, 23, 24, 93, 32, 93, 32, 93, 32, 96, 32, 93, 32, 96, 32, 31, 32, 102, 32, 31, 32, 102, 32, 93, 32, 93, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 94, 95, 29, 30, 91, 92, 29, 30, 100, 101, 29, 30, 29, 30, 91, 92, 29, 30, 94, 95, 91, 92, 100, 101, 29, 30, 29, 30, 91, 92, 29, 30, 29, 30, 100, 101, 100, 101, 94, 95, 29, 30, 91, 92, 29, 30, 29, 30, 97, 98, 91, 92, 100, 101, 94, 95, 29, 30, 29, 30, 97, 98, 94, 95, 29, 30, 29, 30, 100, 101, 97, 98, 100, 101, 29, 30, 94, 95, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 96, 32, 31, 32, 93, 32, 31, 32, 102, 32, 31, 32, 31, 32, 93, 32, 31, 32, 96, 32, 93, 32, 102, 32, 31, 32, 31, 32, 93, 32, 31, 32, 31, 32, 102, 32, 102, 32, 96, 32, 31, 32, 93, 32, 31, 32, 31, 32, 99, 32, 93, 32, 102, 32, 96, 32, 31, 32, 31, 32, 99, 32, 96, 32, 31, 32, 31, 32, 102, 32, 99, 32, 102, 32, 31, 32, 96, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32], + "height":112, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":112, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":112 +} \ No newline at end of file diff --git a/gamefileshf/level/player/Barbarian/class.json b/gamefileshf/level/player/Barbarian/class.json index afdff703..722c26f5 100755 --- a/gamefileshf/level/player/Barbarian/class.json +++ b/gamefileshf/level/player/Barbarian/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Barbarian", "type": "Human", - "description": "Barbarian", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -78,19 +77,23 @@ { "name": "Defend4", "index": 4 }, { "name": "Hit1", "index": 4 }, { "name": "Hit2", "index": 4 }, - { "name": "Die1", "index": 4 }, - { "name": "Die2", "index": 4 } + { "name": "Die1", "index": 9 }, + { "name": "Die2", "index": 9 } ], "animationSpeeds": [ { "name": "Walk1", "animation": 20, "walk": 25 }, - { "name": "Walk2", "animation": 20, "walk": 25 } + { "name": "Walk2", "animation": 20, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefileshf/level/player/Barbarian/defaults.json b/gamefileshf/level/player/Barbarian/defaults.json index c9ba06f9..9acc6db9 100755 --- a/gamefileshf/level/player/Barbarian/defaults.json +++ b/gamefileshf/level/player/Barbarian/defaults.json @@ -51,7 +51,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } } diff --git a/gamefileshf/level/player/Bard/class.json b/gamefileshf/level/player/Bard/class.json index 1a22d25e..11b465c1 100755 --- a/gamefileshf/level/player/Bard/class.json +++ b/gamefileshf/level/player/Bard/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Bard", "type": "Human", - "description": "Bard", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -75,19 +74,23 @@ { "name": "Defend4", "index": 4 }, { "name": "Hit1", "index": 4 }, { "name": "Hit2", "index": 4 }, - { "name": "Die1", "index": 4 }, - { "name": "Die2", "index": 4 } + { "name": "Die1", "index": 9 }, + { "name": "Die2", "index": 9 } ], "animationSpeeds": [ { "name": "Walk1", "animation": 20, "walk": 25 }, - { "name": "Walk2", "animation": 20, "walk": 25 } + { "name": "Walk2", "animation": 20, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefileshf/level/player/Bard/defaults.json b/gamefileshf/level/player/Bard/defaults.json index 9f4b9a53..980eb8dd 100755 --- a/gamefileshf/level/player/Bard/defaults.json +++ b/gamefileshf/level/player/Bard/defaults.json @@ -46,7 +46,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } } diff --git a/gamefileshf/level/player/Monk/celFiles.json b/gamefileshf/level/player/Monk/celFiles.json index 85d7ad8d..f3a1aed6 100755 --- a/gamefileshf/level/player/Monk/celFiles.json +++ b/gamefileshf/level/player/Monk/celFiles.json @@ -290,6 +290,30 @@ { "id": "mmulm", "file": "plrgfx/monk/mmu/mmulm.cl2" }, { "id": "mmuqm", "file": "plrgfx/monk/mmu/mmuqm.cl2" }, { "id": "mmust", "file": "plrgfx/monk/mmu/mmust.cl2" }, - { "id": "mmuwl", "file": "plrgfx/monk/mmu/mmuwl.cl2" } + { "id": "mmuwl", "file": "plrgfx/monk/mmu/mmuwl.cl2" }, + { "id": "mhadt", "fromId": "mhndt" }, + { "id": "mhbdt", "fromId": "mhndt" }, + { "id": "mhddt", "fromId": "mhndt" }, + { "id": "mhhdt", "fromId": "mhndt" }, + { "id": "mhmdt", "fromId": "mhndt" }, + { "id": "mhsdt", "fromId": "mhndt" }, + { "id": "mhtdt", "fromId": "mhndt" }, + { "id": "mhudt", "fromId": "mhndt" }, + { "id": "mladt", "fromId": "mlndt" }, + { "id": "mlbdt", "fromId": "mlndt" }, + { "id": "mlddt", "fromId": "mlndt" }, + { "id": "mlhdt", "fromId": "mlndt" }, + { "id": "mlmdt", "fromId": "mlndt" }, + { "id": "mlsdt", "fromId": "mlndt" }, + { "id": "mltdt", "fromId": "mlndt" }, + { "id": "mludt", "fromId": "mlndt" }, + { "id": "mmadt", "fromId": "mmndt" }, + { "id": "mmbdt", "fromId": "mmndt" }, + { "id": "mmddt", "fromId": "mmndt" }, + { "id": "mmhdt", "fromId": "mmndt" }, + { "id": "mmmdt", "fromId": "mmndt" }, + { "id": "mmsdt", "fromId": "mmndt" }, + { "id": "mmtdt", "fromId": "mmndt" }, + { "id": "mmudt", "fromId": "mmndt" } ] } \ No newline at end of file diff --git a/gamefileshf/level/player/Monk/class.json b/gamefileshf/level/player/Monk/class.json index d13f93d2..71ed5735 100755 --- a/gamefileshf/level/player/Monk/class.json +++ b/gamefileshf/level/player/Monk/class.json @@ -4,9 +4,8 @@ "replaceVars": true, "name": "Monk", "type": "Human", - "description": "Monk", - "defaultOutline": "%outlineFriend%", - "defaultOutlineIgnore": "0x000000", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", "defaults": { "experience": 0, "points": 0, @@ -75,19 +74,23 @@ { "name": "Defend4", "index": 4 }, { "name": "Hit1", "index": 4 }, { "name": "Hit2", "index": 4 }, - { "name": "Die1", "index": 4 }, - { "name": "Die2", "index": 4 } + { "name": "Die1", "index": 9 }, + { "name": "Die2", "index": 9 } ], "animationSpeeds": [ { "name": "Walk1", "animation": 20, "walk": 25 }, - { "name": "Walk2", "animation": 20, "walk": 25 } + { "name": "Walk2", "animation": 20, "walk": 25 }, + { "name": "Die1", "animation": 20 }, + { "name": "Die2", "animation": 20 } ], "actions": { "levelChange": "updateCharPoints" }, "sounds": [ - { "index": 0, "id": "walk" } + { "index": 0, "id": "walk" }, + { "index": 1, "id": "die" } ], - "defaultWalkSound": 0 + "walkSound": 0, + "dieSound": 1 } } \ No newline at end of file diff --git a/gamefileshf/level/player/Monk/defaults.json b/gamefileshf/level/player/Monk/defaults.json index 17b107cd..6f2002fa 100755 --- a/gamefileshf/level/player/Monk/defaults.json +++ b/gamefileshf/level/player/Monk/defaults.json @@ -42,7 +42,7 @@ "index": [0, 3], "class": "gold", "properties": { - "gold": 100 + "quantity": 100 } } } diff --git a/gamefileshf/level/player/updateSpeed.json b/gamefileshf/level/player/updateSpeed.json index eccd15e5..554082a6 100755 --- a/gamefileshf/level/player/updateSpeed.json +++ b/gamefileshf/level/player/updateSpeed.json @@ -1,8 +1,8 @@ { "action": { "name": "if.equal", - "param1": "|currentLevel|name|", - "param2": "Town Center", + "param1": "%currentLevel.path%", + "param2": "town", "then": { "name": "if.equal", "param1": "%jog%", diff --git a/gamefileshf/level/town/items.json b/gamefileshf/level/town/items.json new file mode 100755 index 00000000..e41e6aa8 --- /dev/null +++ b/gamefileshf/level/town/items.json @@ -0,0 +1,125 @@ +{ + "item": [ + { + "class": "shortSword", + "properties": { + "requiredStrength": 5, + "strength": 5, + "toDamage": 120, + "identified": false, + "magical": true + }, + "mapPosition": [56, 73] + }, + { + "class": "smallShield", + "mapPosition": [57, 73] + }, + { + "class": "ring", + "mapPosition": [58, 73], + "properties": { + "strength": 5 + } + }, + { + "class": "potionOfMana", + "mapPosition": [59, 73] + }, + { + "class": "potionOfRejuvenation", + "mapPosition": [56, 70] + }, + { + "class": "potionOfFullRejuvenation", + "mapPosition": [57, 70] + }, + { + "class": "potionOfMana", + "mapPosition": [58, 70] + }, + { + "class": "spectralElixir", + "mapPosition": [56, 71] + }, + { + "class": "amulet", + "mapPosition": [60, 73], + "properties": { + "resistAll": 10 + } + }, + { + "class": "gothicPlate", + "mapPosition": [61, 73] + }, + { + "class": "cap", + "mapPosition": [62, 73], + "properties": { + "durability": 12 + } + }, + { + "class": "leatherArmor", + "mapPosition": [63, 73] + }, + { + "class": "valorArmor", + "mapPosition": [56, 74] + }, + { + "class": "largeAxe", + "properties": { + "toDamage": 120, + "identified": false, + "magical": true + }, + "mapPosition": [57, 74] + }, + { + "class": "book", + "mapPosition": [58, 74] + }, + { + "class": "club", + "mapPosition": [59, 74] + }, + { + "class": "compositeBow", + "mapPosition": [60, 74] + }, + { + "class": "potionOfFullHealing", + "mapPosition": [61, 74] + }, + { + "class": "potionOfFullMana", + "mapPosition": [62, 74] + }, + { + "class": "scroll", + "mapPosition": [63, 74] + }, + { + "class": "shortStaff", + "mapPosition": [59, 75], + "properties": { + "price": 120, + "charges": 12, + "chargesMax": 35 + } + }, + { + "class": "gold", + "mapPosition": [60, 75], + "properties": { + "quantity": 4800 + } + }, + { + "class": "cathedralMap", + "mapPosition": [61, 75] + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/town/level.json b/gamefileshf/level/town/level.json index 1c46986e..5f858d1b 100755 --- a/gamefileshf/level/town/level.json +++ b/gamefileshf/level/town/level.json @@ -1,23 +1,16 @@ { "level": { "id": "level", - "path": "town", - "name": "Town Center", "palette": "town", "file": "Nlevels/TownData/Town.CEL", "mapSize": [96, 96], - "map": [ - { "file": "levels/towndata/sector1s.dun", "position": [46, 46] }, - { "file": "levels/towndata/sector2s.dun", "position": [46, 0] }, - { "file": "levels/towndata/sector3s.dun", "position": [0, 46] }, - { "file": "levels/towndata/sector4s.dun", "position": [0, 0] } - ], "til": "Nlevels/TownData/Town.TIL", "min": "Nlevels/TownData/Town.MIN", "minBlocks": 16, "sol": "Nlevels/TownData/Town.SOL" }, "load": "level/town/levelObjects.json", - "load": "level/town/items.json", - "load": "level/town/players.json" + "load": "level/town/players.json", + "load": "level/town/level2.json", + "load": "level/town/levelPassages.json" } \ No newline at end of file diff --git a/gamefileshf/level/town/levelCrypt.json b/gamefileshf/level/town/levelCrypt.json new file mode 100755 index 00000000..0629357d --- /dev/null +++ b/gamefileshf/level/town/levelCrypt.json @@ -0,0 +1,8 @@ +{ + "level": { + "id": "level", + "resizeToFit": false, + "map": { "file": "level/town/town_crypt.json", "indexOffset": -1, "position": [36, 21] } + }, + "load": "level/crypt1/townToLevel.json" +} \ No newline at end of file diff --git a/gamefileshf/level/town/levelNest.json b/gamefileshf/level/town/levelNest.json new file mode 100755 index 00000000..b3ce5180 --- /dev/null +++ b/gamefileshf/level/town/levelNest.json @@ -0,0 +1,8 @@ +{ + "level": { + "id": "level", + "resizeToFit": false, + "map": { "file": "level/town/town_nest.json", "indexOffset": -1, "position": [79, 60] } + }, + "load": "level/nest1/townToLevel.json" +} \ No newline at end of file diff --git a/gamefileshf/level/town/playerCelFileshf.json b/gamefileshf/level/town/playerCelFileshf.json new file mode 100755 index 00000000..fa940b34 --- /dev/null +++ b/gamefileshf/level/town/playerCelFileshf.json @@ -0,0 +1,8 @@ +{ + "texturePack": { + "id": "farmrn2", + "imageContainer": "Farmrn2", + "file": "Towners/Farmer/Farmrn2.CEL", + "palette": "town" + } +} \ No newline at end of file diff --git a/gamefileshf/level/town/playerClasseshf.json b/gamefileshf/level/town/playerClasseshf.json new file mode 100755 index 00000000..64d0dc08 --- /dev/null +++ b/gamefileshf/level/town/playerClasseshf.json @@ -0,0 +1,14 @@ +{ + "playerClass": { + "id": "farmer", + "replaceVars": true, + "name": "Lester the farmer", + "type": "Human", + "outline": "|outlineFriend|", + "outlineIgnore": "0x000000", + "texturePacks": "farmrn2", + "actions": { + "action": { "name": "load", "file": "towners/lester/load.json" } + } + } +} \ No newline at end of file diff --git a/gamefileshf/level/town/players.json b/gamefileshf/level/town/players.json new file mode 100755 index 00000000..a868e0ae --- /dev/null +++ b/gamefileshf/level/town/players.json @@ -0,0 +1,6 @@ +{ + "load": "level/town/playerCelFiles.json", + "load": "level/town/playerCelFileshf.json", + "load": "level/town/playerClasses.json", + "load": "level/town/playerClasseshf.json" +} \ No newline at end of file diff --git a/gamefileshf/level/town/players2.json b/gamefileshf/level/town/players2.json new file mode 100755 index 00000000..06f3acef --- /dev/null +++ b/gamefileshf/level/town/players2.json @@ -0,0 +1,4 @@ +{ + "load": "level/town/playersd.json", + "load": "level/town/playershf.json" +} \ No newline at end of file diff --git a/gamefileshf/level/town/playershf.json b/gamefileshf/level/town/playershf.json new file mode 100755 index 00000000..d6504b2b --- /dev/null +++ b/gamefileshf/level/town/playershf.json @@ -0,0 +1,7 @@ +{ + "player": { + "id": "lester", + "class": "farmer", + "mapPosition": [62, 16] + } +} \ No newline at end of file diff --git a/gamefileshf/level/town/quests.json b/gamefileshf/level/town/quests.json new file mode 100755 index 00000000..37190131 --- /dev/null +++ b/gamefileshf/level/town/quests.json @@ -0,0 +1,15 @@ +{ + "quest": [ + { + "id": "ogdenInit" + }, + { + "id": "theButcher", + "name": "The Butcher" + }, + { + "id": "farmersOrchard", + "name": "Farmer's Orchard" + } + ] +} \ No newline at end of file diff --git a/gamefileshf/level/town/town.json b/gamefileshf/level/town/town.json new file mode 100755 index 00000000..d087bc0b --- /dev/null +++ b/gamefileshf/level/town/town.json @@ -0,0 +1,41 @@ +{ "backgroundcolor":"#000000", + "height":96, + "infinite":false, + "layers":[ + { + "data":[218, 26, 282, 283, 290, 291, 17, 18, 21, 22, 17, 18, 25, 26, 172, 173, 180, 181, 114, 26, 109, 18, 25, 26, 21, 22, 105, 106, 111, 112, 172, 173, 180, 181, 1086, 10, 109, 18, 172, 173, 168, 169, 1090, 10, 105, 106, 5, 6, 29, 30, 109, 18, 37, 38, 1128, 1129, 1128, 1129, 1124, 1125, 61, 62, 282, 283, 290, 291, 218, 26, 9, 10, 111, 112, 1105, 1106, 1058, 1059, 1060, 1061, 1062, 1063, 105, 106, 274, 275, 109, 18, 29, 30, 25, 26, 17, 18, 29, 30, 9, 10, 219, 28, 284, 285, 292, 293, 19, 20, 23, 24, 19, 20, 27, 28, 174, 175, 182, 183, 115, 28, 19, 110, 27, 28, 23, 24, 107, 108, 23, 113, 174, 175, 182, 183, 1087, 12, 19, 110, 174, 175, 170, 171, 1091, 12, 107, 108, 7, 8, 31, 32, 19, 110, 39, 40, 1130, 1131, 1130, 1131, 1126, 1127, 63, 64, 284, 285, 292, 293, 219, 28, 11, 12, 23, 113, 11, 12, 11, 12, 11, 12, 11, 12, 107, 108, 276, 277, 19, 110, 31, 32, 27, 28, 19, 20, 31, 32, 11, 12, 29, 30, 278, 279, 286, 287, 172, 173, 168, 169, 140, 141, 136, 137, 160, 161, 17, 18, 25, 26, 105, 106, 124, 125, 128, 129, 29, 30, 21, 22, 224, 26, 227, 228, 1088, 10, 204, 205, 208, 209, 216, 22, 1084, 10, 21, 22, 114, 26, 220, 221, 114, 26, 33, 34, 45, 46, 45, 46, 45, 46, 57, 58, 278, 279, 286, 287, 231, 232, 109, 18, 184, 185, 180, 181, 25, 26, 204, 205, 208, 209, 216, 22, 282, 283, 290, 291, 9, 10, 1, 2, 5, 6, 220, 221, 109, 18, 31, 32, 280, 281, 288, 289, 174, 175, 170, 171, 142, 143, 138, 139, 162, 163, 19, 20, 27, 28, 107, 108, 126, 127, 130, 131, 31, 32, 23, 24, 225, 226, 229, 230, 1089, 12, 206, 207, 210, 211, 217, 24, 1085, 12, 23, 24, 115, 28, 19, 20, 115, 28, 35, 36, 47, 48, 47, 48, 47, 48, 59, 60, 280, 281, 288, 289, 233, 234, 19, 110, 186, 187, 182, 183, 27, 28, 206, 207, 210, 211, 217, 24, 284, 285, 292, 293, 11, 12, 3, 4, 7, 8, 19, 20, 19, 110, 105, 106, 231, 232, 282, 283, 290, 291, 109, 18, 132, 133, 156, 157, 144, 145, 204, 205, 208, 209, 216, 22, 116, 117, 120, 121, 21, 22, 136, 137, 136, 137, 160, 161, 1086, 10, 200, 201, 212, 213, 196, 197, 1072, 10, 109, 18, 17, 18, 21, 22, 109, 18, 140, 141, 136, 137, 160, 161, 105, 106, 21, 22, 114, 26, 274, 275, 9, 10, 114, 26, 176, 177, 29, 30, 109, 18, 200, 201, 212, 213, 196, 197, 278, 279, 286, 287, 114, 26, 140, 141, 136, 137, 160, 161, 25, 26, 107, 108, 233, 234, 284, 285, 292, 293, 19, 110, 134, 135, 158, 159, 146, 147, 206, 207, 210, 211, 217, 24, 118, 119, 122, 123, 23, 24, 138, 139, 138, 139, 162, 163, 1087, 12, 202, 203, 214, 215, 198, 199, 1073, 12, 19, 110, 19, 20, 23, 24, 19, 110, 142, 143, 138, 139, 162, 163, 107, 108, 23, 24, 115, 28, 276, 277, 11, 12, 115, 28, 178, 179, 31, 32, 19, 110, 202, 203, 214, 215, 198, 199, 280, 281, 288, 289, 115, 28, 142, 143, 138, 139, 162, 163, 27, 28, 29, 30, 220, 221, 278, 279, 286, 287, 0, 0, 148, 149, 152, 153, 231, 232, 200, 201, 212, 213, 196, 197, 25, 26, 172, 173, 168, 169, 132, 133, 156, 157, 144, 145, 1084, 10, 188, 189, 192, 193, 109, 18, 1088, 10, 114, 26, 124, 125, 128, 129, 29, 30, 132, 133, 156, 157, 144, 145, 218, 26, 25, 26, 111, 112, 282, 283, 290, 291, 105, 106, 124, 125, 128, 129, 17, 18, 188, 189, 192, 193, 172, 173, 168, 169, 266, 267, 21, 22, 132, 133, 156, 157, 144, 145, 105, 106, 31, 32, 19, 20, 280, 281, 288, 289, 0, 0, 150, 151, 154, 155, 233, 234, 202, 203, 214, 215, 198, 199, 27, 28, 174, 175, 170, 171, 134, 135, 158, 159, 146, 147, 1085, 12, 190, 191, 194, 195, 19, 110, 1089, 12, 115, 28, 126, 127, 130, 131, 31, 32, 134, 135, 158, 159, 146, 147, 219, 28, 27, 28, 23, 113, 284, 285, 292, 293, 107, 108, 126, 127, 130, 131, 19, 20, 190, 191, 194, 195, 174, 175, 170, 171, 268, 269, 23, 24, 134, 135, 158, 159, 146, 147, 107, 108, 111, 112, 9, 10, 298, 299, 306, 307, 0, 0, 0, 0, 847, 2, 222, 22, 188, 189, 192, 193, 21, 22, 21, 22, 164, 165, 21, 22, 148, 149, 152, 153, 105, 106, 1082, 10, 111, 112, 114, 26, 21, 22, 1086, 10, 105, 106, 116, 117, 120, 121, 105, 106, 148, 149, 152, 153, 224, 26, 227, 228, 29, 30, 109, 18, 278, 279, 286, 287, 114, 26, 116, 117, 120, 121, 111, 112, 218, 26, 105, 106, 164, 165, 114, 26, 266, 267, 105, 106, 148, 149, 152, 153, 111, 112, 114, 26, 23, 113, 11, 12, 300, 301, 308, 309, 0, 0, 0, 0, 848, 849, 23, 24, 190, 191, 194, 195, 23, 24, 23, 24, 166, 167, 23, 24, 150, 151, 154, 155, 107, 108, 1083, 12, 23, 113, 115, 28, 23, 24, 1087, 12, 107, 108, 118, 119, 122, 123, 107, 108, 150, 151, 154, 155, 225, 226, 229, 230, 31, 32, 19, 110, 280, 281, 288, 289, 115, 28, 118, 119, 122, 123, 23, 113, 219, 28, 107, 108, 166, 167, 115, 28, 268, 269, 107, 108, 150, 151, 154, 155, 23, 113, 115, 28, 109, 18, 1, 2, 294, 295, 302, 303, 114, 26, 843, 844, 1, 2, 111, 112, 1, 2, 1, 2, 1, 2, 1, 2, 109, 18, 1074, 1075, 1058, 1059, 1054, 1055, 1056, 1057, 1074, 1075, 1077, 1078, 1052, 1053, 1052, 1053, 1058, 1059, 1060, 1061, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 262, 263, 1105, 1106, 1103, 1104, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 350, 351, 354, 355, 13, 14, 17, 18, 109, 18, 29, 30, 19, 110, 3, 4, 296, 297, 304, 305, 115, 28, 845, 846, 3, 4, 23, 113, 3, 4, 3, 4, 3, 4, 3, 4, 19, 110, 1076, 12, 11, 12, 11, 12, 11, 12, 1076, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 264, 265, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 352, 353, 356, 357, 15, 16, 19, 20, 19, 110, 31, 32, 29, 30, 13, 14, 282, 283, 290, 291, 105, 106, 9, 10, 17, 18, 839, 840, 105, 106, 0, 0, 0, 0, 832, 833, 0, 0, 1092, 10, 111, 112, 25, 26, 231, 232, 1111, 1112, 172, 173, 180, 181, 196, 197, 41, 42, 65, 66, 21, 22, 9, 10, 9, 10, 5, 6, 184, 185, 180, 181, 13, 14, 105, 106, 172, 173, 168, 169, 310, 311, 176, 177, 114, 26, 111, 112, 172, 173, 168, 169, 21, 22, 114, 26, 342, 343, 346, 347, 362, 363, 218, 26, 184, 185, 180, 181, 17, 18, 31, 32, 15, 16, 284, 285, 292, 293, 107, 108, 11, 12, 19, 20, 841, 842, 107, 108, 0, 0, 0, 0, 834, 835, 0, 0, 1093, 12, 23, 113, 27, 28, 233, 234, 1113, 1114, 174, 175, 182, 183, 198, 199, 43, 44, 67, 68, 23, 24, 11, 12, 11, 12, 7, 8, 186, 187, 182, 183, 15, 16, 107, 108, 174, 175, 170, 171, 312, 313, 178, 179, 115, 28, 23, 113, 174, 175, 170, 171, 23, 24, 115, 28, 344, 345, 348, 349, 364, 365, 219, 28, 186, 187, 182, 183, 19, 20, 114, 26, 9, 10, 278, 279, 286, 287, 114, 26, 1, 2, 836, 837, 17, 18, 0, 0, 0, 0, 0, 0, 828, 829, 0, 0, 231, 232, 17, 18, 9, 10, 114, 26, 1107, 1108, 176, 177, 21, 22, 1018, 1019, 93, 94, 57, 58, 13, 14, 172, 173, 168, 169, 13, 14, 176, 177, 13, 14, 204, 205, 128, 129, 164, 165, 114, 26, 282, 283, 290, 291, 25, 26, 29, 30, 164, 165, 585, 586, 588, 589, 314, 315, 322, 323, 358, 359, 338, 339, 25, 26, 176, 177, 21, 22, 111, 112, 115, 28, 11, 12, 280, 281, 288, 289, 115, 28, 3, 4, 3, 838, 19, 20, 0, 0, 0, 0, 0, 0, 830, 831, 0, 0, 233, 234, 19, 20, 11, 12, 115, 28, 1109, 1110, 178, 179, 23, 24, 1020, 1021, 95, 96, 59, 60, 15, 16, 174, 175, 170, 171, 15, 16, 178, 179, 15, 16, 206, 207, 130, 131, 166, 167, 115, 28, 284, 285, 292, 293, 27, 28, 31, 32, 166, 167, 11, 587, 590, 591, 316, 317, 324, 325, 360, 361, 340, 341, 27, 28, 178, 179, 23, 24, 23, 113, 111, 112, 172, 173, 180, 181, 282, 283, 290, 291, 204, 205, 208, 209, 216, 22, 0, 0, 0, 0, 0, 0, 824, 825, 0, 0, 0, 0, 813, 814, 801, 802, 1038, 1039, 1105, 1106, 1103, 1104, 1100, 1101, 1098, 10, 1014, 1015, 111, 112, 21, 22, 164, 165, 111, 112, 204, 205, 208, 209, 216, 22, 116, 117, 120, 121, 17, 18, 21, 22, 278, 279, 286, 287, 29, 30, 29, 30, 231, 232, 231, 232, 639, 640, 318, 319, 326, 327, 330, 331, 334, 335, 13, 14, 17, 18, 114, 26, 222, 22, 23, 113, 174, 175, 182, 183, 284, 285, 292, 293, 206, 207, 210, 211, 217, 24, 0, 0, 0, 0, 0, 0, 826, 827, 0, 0, 0, 0, 538, 815, 803, 804, 1040, 1041, 11, 12, 11, 12, 11, 1102, 1099, 12, 1016, 1017, 23, 113, 23, 24, 166, 167, 23, 113, 206, 207, 210, 211, 217, 24, 118, 119, 122, 123, 19, 20, 23, 24, 280, 281, 288, 289, 31, 32, 31, 32, 233, 234, 233, 234, 641, 642, 320, 321, 328, 329, 332, 333, 336, 337, 15, 16, 19, 20, 115, 28, 23, 24, 29, 30, 176, 177, 111, 112, 278, 279, 286, 287, 200, 201, 212, 213, 196, 197, 0, 0, 231, 232, 0, 0, 820, 821, 0, 0, 0, 0, 0, 0, 797, 798, 1022, 1023, 1026, 1027, 1030, 1031, 1034, 1035, 1096, 10, 986, 987, 29, 30, 9, 10, 231, 232, 1183, 1184, 200, 201, 212, 213, 196, 197, 5, 6, 111, 112, 21, 22, 5, 6, 109, 18, 270, 271, 21, 22, 624, 566, 231, 232, 0, 0, 635, 636, 553, 554, 557, 558, 274, 275, 109, 18, 124, 125, 128, 129, 9, 10, 109, 18, 31, 32, 178, 179, 23, 113, 280, 281, 288, 289, 202, 203, 214, 215, 198, 199, 0, 0, 233, 234, 0, 0, 822, 823, 0, 0, 0, 0, 0, 0, 799, 800, 1024, 1025, 1028, 1029, 1032, 1033, 1036, 1037, 1097, 12, 988, 989, 31, 32, 11, 12, 233, 234, 1185, 1186, 202, 203, 214, 215, 198, 199, 7, 8, 23, 113, 23, 24, 7, 8, 19, 110, 272, 273, 23, 24, 625, 626, 233, 234, 0, 0, 637, 638, 555, 556, 559, 560, 276, 277, 19, 110, 126, 127, 130, 131, 11, 12, 19, 110, 29, 30, 204, 205, 208, 209, 216, 22, 262, 263, 188, 189, 192, 193, 114, 26, 17, 18, 231, 232, 816, 817, 0, 0, 0, 0, 0, 0, 0, 0, 793, 794, 1006, 1007, 1010, 1011, 1014, 1015, 1018, 1019, 1094, 10, 172, 173, 168, 169, 1195, 1196, 1171, 1172, 1179, 1180, 188, 189, 192, 193, 29, 30, 114, 26, 13, 14, 5, 6, 17, 18, 13, 14, 266, 267, 105, 106, 620, 621, 627, 628, 631, 632, 616, 617, 561, 562, 569, 570, 282, 283, 290, 291, 116, 117, 120, 121, 223, 26, 29, 30, 31, 32, 206, 207, 210, 211, 217, 24, 264, 265, 190, 191, 194, 195, 115, 28, 19, 20, 233, 234, 818, 819, 0, 0, 0, 0, 0, 0, 0, 0, 795, 796, 1008, 1009, 1340, 1339, 1323, 1324, 1020, 1021, 1095, 12, 174, 175, 170, 171, 1197, 1198, 1173, 1174, 1181, 1182, 190, 191, 194, 195, 31, 32, 115, 28, 15, 16, 7, 8, 19, 20, 15, 16, 268, 269, 107, 108, 622, 623, 629, 630, 633, 634, 618, 619, 563, 564, 571, 572, 284, 285, 292, 293, 118, 119, 122, 123, 27, 28, 31, 32, 105, 106, 200, 201, 212, 213, 196, 197, 262, 263, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 809, 810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 789, 790, 1042, 1043, 994, 995, 1325, 1326, 1002, 1003, 1092, 10, 164, 165, 218, 26, 1187, 1188, 1191, 1192, 21, 22, 17, 18, 5, 6, 21, 22, 220, 221, 218, 26, 21, 22, 13, 14, 105, 106, 274, 275, 109, 18, 600, 601, 604, 605, 608, 609, 612, 613, 565, 566, 573, 574, 278, 279, 286, 287, 105, 106, 1098, 10, 21, 22, 25, 26, 107, 108, 202, 203, 214, 215, 198, 199, 264, 265, 11, 12, 11, 12, 11, 12, 11, 12, 811, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 791, 792, 1044, 1045, 996, 997, 1327, 1328, 1004, 1005, 1093, 12, 166, 167, 219, 28, 1189, 1190, 1193, 1194, 23, 24, 19, 20, 7, 8, 23, 24, 19, 20, 219, 28, 23, 24, 15, 16, 107, 108, 276, 277, 19, 110, 602, 603, 606, 607, 610, 611, 614, 615, 567, 568, 575, 576, 280, 281, 288, 289, 107, 108, 1099, 12, 23, 24, 27, 28, 218, 26, 188, 189, 192, 193, 111, 112, 282, 283, 290, 291, 172, 173, 180, 181, 754, 755, 758, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 785, 786, 777, 778, 982, 983, 1329, 1330, 990, 991, 1090, 10, 224, 26, 227, 228, 140, 141, 136, 137, 160, 161, 21, 22, 172, 173, 168, 169, 13, 14, 109, 18, 13, 14, 5, 6, 9, 10, 350, 351, 354, 355, 218, 26, 592, 593, 596, 597, 1, 2, 21, 22, 9, 10, 231, 232, 270, 271, 9, 10, 1090, 10, 109, 18, 21, 22, 219, 28, 190, 191, 194, 195, 23, 113, 284, 285, 292, 293, 174, 175, 182, 183, 756, 757, 759, 760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 787, 788, 779, 780, 984, 985, 988, 989, 992, 993, 1091, 12, 225, 226, 229, 230, 142, 143, 138, 139, 162, 163, 23, 24, 174, 175, 170, 171, 15, 16, 19, 110, 15, 16, 7, 8, 11, 12, 352, 353, 356, 357, 219, 28, 594, 595, 598, 599, 3, 4, 23, 24, 11, 12, 233, 234, 272, 273, 11, 12, 1091, 12, 19, 110, 23, 24, 223, 26, 224, 26, 227, 228, 114, 26, 278, 279, 286, 287, 176, 177, 735, 736, 739, 740, 743, 744, 747, 538, 0, 0, 0, 0, 0, 0, 805, 806, 781, 782, 773, 774, 970, 971, 974, 975, 978, 979, 1088, 10, 204, 205, 208, 209, 132, 133, 156, 157, 144, 145, 13, 14, 164, 165, 21, 22, 17, 18, 5, 6, 184, 185, 180, 181, 342, 343, 346, 347, 362, 363, 222, 22, 21, 22, 25, 26, 17, 18, 223, 26, 29, 30, 114, 26, 266, 267, 17, 18, 1096, 10, 5, 6, 105, 106, 27, 28, 225, 226, 229, 230, 115, 28, 280, 281, 288, 289, 178, 179, 737, 738, 741, 742, 745, 746, 748, 749, 0, 0, 0, 0, 0, 0, 807, 808, 783, 784, 775, 776, 972, 973, 976, 977, 980, 981, 1089, 12, 206, 207, 210, 211, 134, 135, 158, 159, 146, 147, 15, 16, 166, 167, 23, 24, 19, 20, 7, 8, 186, 187, 182, 183, 344, 345, 348, 349, 364, 365, 23, 24, 23, 24, 27, 28, 19, 20, 27, 28, 31, 32, 115, 28, 268, 269, 19, 20, 1097, 12, 7, 8, 107, 108, 231, 232, 231, 232, 222, 22, 124, 125, 128, 129, 266, 267, 105, 106, 703, 704, 707, 708, 711, 712, 731, 732, 727, 728, 723, 724, 719, 720, 761, 762, 765, 766, 769, 770, 958, 959, 962, 963, 966, 967, 1086, 10, 200, 201, 212, 213, 148, 149, 152, 153, 21, 22, 9, 10, 5, 6, 13, 14, 9, 10, 111, 112, 176, 177, 314, 315, 322, 323, 358, 359, 338, 339, 204, 205, 208, 209, 216, 22, 21, 22, 140, 141, 136, 137, 160, 161, 274, 275, 21, 22, 29, 30, 231, 232, 17, 18, 233, 234, 233, 234, 23, 24, 126, 127, 130, 131, 268, 269, 107, 108, 705, 706, 709, 710, 713, 714, 733, 734, 729, 730, 725, 726, 721, 722, 763, 764, 767, 768, 771, 772, 960, 961, 964, 965, 968, 969, 1087, 12, 202, 203, 214, 215, 150, 151, 154, 155, 23, 24, 11, 12, 7, 8, 15, 16, 11, 12, 23, 113, 178, 179, 316, 317, 324, 325, 360, 361, 340, 341, 206, 207, 210, 211, 217, 24, 23, 24, 142, 143, 138, 139, 162, 163, 276, 277, 23, 24, 31, 32, 233, 234, 19, 20, 222, 22, 223, 26, 109, 18, 116, 117, 120, 121, 270, 271, 109, 18, 29, 30, 17, 18, 25, 26, 109, 18, 683, 684, 715, 716, 687, 688, 691, 692, 695, 696, 699, 700, 114, 26, 1046, 1047, 1030, 1031, 1084, 10, 188, 189, 192, 193, 13, 14, 17, 18, 13, 14, 17, 18, 29, 30, 21, 22, 231, 232, 5, 6, 105, 106, 318, 319, 326, 327, 330, 331, 334, 335, 200, 201, 212, 213, 196, 197, 111, 112, 132, 133, 156, 157, 144, 145, 262, 263, 111, 112, 172, 173, 168, 169, 29, 30, 23, 24, 27, 28, 19, 110, 118, 119, 122, 123, 272, 273, 19, 110, 31, 32, 19, 20, 27, 28, 19, 110, 685, 686, 717, 718, 689, 690, 693, 694, 697, 698, 701, 702, 115, 28, 1048, 1049, 1032, 1033, 1085, 12, 190, 191, 194, 195, 15, 16, 19, 20, 15, 16, 19, 20, 31, 32, 23, 24, 233, 234, 7, 8, 107, 108, 320, 321, 328, 329, 332, 333, 336, 337, 202, 203, 214, 215, 198, 199, 23, 113, 134, 135, 158, 159, 146, 147, 264, 265, 23, 113, 174, 175, 170, 171, 31, 32, 231, 232, 218, 26, 172, 173, 168, 169, 298, 299, 306, 307, 25, 26, 5, 6, 140, 141, 136, 137, 160, 161, 667, 668, 671, 672, 675, 676, 679, 680, 25, 26, 17, 18, 25, 26, 223, 26, 109, 18, 1082, 10, 9, 10, 114, 26, 124, 125, 128, 129, 5, 6, 9, 10, 5, 6, 17, 18, 114, 26, 140, 141, 136, 137, 160, 161, 114, 26, 262, 263, 105, 106, 188, 189, 192, 193, 17, 18, 9, 10, 148, 149, 152, 153, 298, 299, 306, 307, 223, 26, 164, 165, 17, 18, 13, 14, 233, 234, 219, 28, 174, 175, 170, 171, 300, 301, 308, 309, 27, 28, 7, 8, 142, 143, 138, 139, 162, 163, 669, 670, 673, 674, 677, 678, 681, 682, 27, 28, 19, 20, 27, 28, 27, 28, 19, 110, 1083, 12, 11, 12, 115, 28, 126, 127, 130, 131, 7, 8, 11, 12, 7, 8, 19, 20, 115, 28, 142, 143, 138, 139, 162, 163, 115, 28, 264, 265, 107, 108, 190, 191, 194, 195, 19, 20, 11, 12, 150, 151, 154, 155, 300, 301, 308, 309, 27, 28, 166, 167, 19, 20, 15, 16, 220, 221, 231, 232, 164, 165, 109, 18, 294, 295, 302, 303, 17, 18, 222, 22, 132, 133, 156, 157, 144, 145, 651, 652, 655, 656, 659, 660, 663, 664, 124, 125, 128, 129, 1074, 1075, 1077, 1078, 1079, 1080, 1081, 10, 29, 30, 105, 106, 116, 117, 120, 121, 184, 185, 180, 181, 13, 14, 218, 26, 109, 18, 132, 133, 156, 157, 144, 145, 218, 26, 282, 283, 290, 291, 220, 221, 114, 26, 25, 26, 21, 22, 109, 18, 1, 2, 294, 295, 302, 303, 29, 30, 21, 22, 109, 18, 1, 2, 19, 20, 233, 234, 166, 167, 19, 110, 296, 297, 304, 305, 19, 20, 23, 24, 134, 135, 158, 159, 146, 147, 653, 654, 657, 658, 661, 662, 665, 666, 126, 127, 130, 131, 1076, 12, 11, 12, 11, 12, 11, 12, 31, 32, 107, 108, 118, 119, 122, 123, 186, 187, 182, 183, 15, 16, 219, 28, 19, 110, 134, 135, 158, 159, 146, 147, 219, 28, 284, 285, 292, 293, 19, 20, 115, 28, 27, 28, 23, 24, 19, 110, 3, 4, 296, 297, 304, 305, 31, 32, 23, 24, 19, 110, 3, 4, 224, 26, 227, 228, 227, 228, 218, 26, 282, 283, 290, 291, 29, 30, 114, 26, 148, 149, 152, 153, 17, 18, 111, 112, 643, 644, 647, 648, 105, 106, 116, 117, 120, 121, 1072, 10, 140, 141, 136, 137, 160, 161, 25, 26, 21, 22, 21, 22, 5, 6, 176, 177, 21, 22, 105, 106, 224, 26, 227, 228, 148, 149, 152, 153, 124, 125, 128, 129, 278, 279, 286, 287, 109, 18, 21, 22, 1, 2, 9, 10, 224, 26, 227, 228, 282, 283, 290, 291, 184, 185, 180, 181, 105, 106, 17, 18, 225, 226, 229, 230, 229, 230, 219, 28, 284, 285, 292, 293, 31, 32, 115, 28, 150, 151, 154, 155, 19, 20, 23, 113, 645, 646, 649, 650, 107, 108, 118, 119, 122, 123, 1073, 12, 142, 143, 138, 139, 162, 163, 27, 28, 23, 24, 23, 24, 7, 8, 178, 179, 23, 24, 107, 108, 225, 226, 229, 230, 150, 151, 154, 155, 126, 127, 130, 131, 280, 281, 288, 289, 19, 110, 23, 24, 3, 4, 11, 12, 225, 226, 229, 230, 284, 285, 292, 293, 186, 187, 182, 183, 107, 108, 19, 20, 231, 232, 231, 232, 222, 22, 220, 221, 278, 279, 286, 287, 1050, 1051, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1119, 1120, 1122, 14, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 10, 132, 133, 156, 157, 144, 145, 29, 30, 114, 26, 5, 6, 114, 26, 5, 6, 17, 18, 29, 30, 220, 221, 9, 10, 17, 18, 13, 14, 116, 117, 120, 121, 111, 112, 270, 271, 231, 232, 25, 26, 29, 30, 124, 125, 128, 129, 990, 991, 278, 279, 286, 287, 176, 177, 114, 26, 25, 26, 5, 6, 233, 234, 233, 234, 23, 24, 19, 20, 280, 281, 288, 289, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 1121, 84, 1123, 16, 11, 12, 11, 12, 11, 12, 11, 12, 134, 135, 158, 159, 146, 147, 31, 32, 115, 28, 7, 8, 115, 28, 7, 8, 19, 20, 31, 32, 19, 20, 11, 12, 19, 20, 15, 16, 118, 119, 122, 123, 23, 113, 272, 273, 233, 234, 27, 28, 31, 32, 126, 127, 130, 131, 992, 993, 280, 281, 288, 289, 178, 179, 115, 28, 27, 28, 7, 8, 218, 26, 231, 232, 231, 232, 227, 228, 222, 22, 282, 283, 290, 291, 204, 205, 208, 209, 216, 22, 172, 173, 168, 169, 81, 82, 220, 221, 224, 26, 227, 228, 114, 26, 17, 18, 148, 149, 152, 153, 1, 2, 9, 10, 109, 18, 262, 263, 262, 263, 262, 263, 218, 26, 21, 22, 97, 98, 5, 6, 29, 30, 204, 205, 208, 209, 216, 22, 21, 22, 274, 275, 1, 2, 9, 10, 21, 22, 116, 117, 120, 121, 17, 18, 1, 2, 274, 275, 25, 26, 17, 18, 218, 26, 25, 26, 219, 28, 233, 234, 233, 234, 229, 230, 23, 24, 284, 285, 292, 293, 206, 207, 210, 211, 217, 24, 174, 175, 170, 171, 83, 84, 19, 20, 225, 226, 229, 230, 115, 28, 19, 20, 150, 151, 154, 155, 3, 4, 11, 12, 19, 110, 264, 265, 264, 265, 264, 265, 219, 28, 23, 24, 99, 100, 7, 8, 31, 32, 206, 207, 210, 211, 217, 24, 23, 24, 276, 277, 3, 4, 11, 12, 23, 24, 118, 119, 122, 123, 19, 20, 3, 4, 276, 277, 27, 28, 19, 20, 219, 28, 27, 28, 222, 22, 224, 26, 227, 228, 231, 232, 231, 232, 1166, 279, 286, 287, 200, 201, 212, 213, 196, 197, 164, 165, 111, 112, 93, 94, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 89, 90, 9, 10, 1, 2, 477, 478, 0, 0, 477, 478, 274, 275, 485, 486, 81, 82, 5, 6, 21, 22, 200, 201, 212, 213, 196, 197, 109, 18, 282, 283, 290, 291, 172, 173, 168, 169, 41, 42, 53, 54, 65, 66, 298, 299, 306, 307, 204, 205, 208, 209, 216, 22, 29, 30, 23, 24, 225, 226, 229, 230, 233, 234, 233, 234, 1167, 1168, 288, 289, 202, 203, 214, 215, 198, 199, 166, 167, 23, 113, 95, 96, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 91, 92, 11, 12, 3, 4, 479, 480, 0, 0, 479, 480, 276, 277, 487, 488, 83, 84, 7, 8, 23, 24, 202, 203, 214, 215, 198, 199, 19, 110, 284, 285, 292, 293, 174, 175, 170, 171, 43, 44, 55, 56, 67, 68, 300, 301, 308, 309, 206, 207, 210, 211, 217, 24, 31, 32, 231, 232, 218, 26, 224, 26, 227, 228, 227, 228, 231, 232, 282, 283, 290, 291, 192, 193, 29, 30, 21, 22, 114, 26, 5, 6, 184, 185, 180, 181, 29, 30, 17, 18, 5, 6, 111, 112, 218, 26, 81, 82, 462, 463, 466, 26, 0, 0, 0, 0, 0, 0, 0, 0, 481, 482, 81, 82, 21, 22, 13, 14, 188, 189, 192, 193, 5, 6, 21, 22, 278, 279, 286, 287, 176, 177, 25, 26, 33, 34, 45, 46, 57, 58, 294, 295, 302, 303, 200, 201, 212, 213, 196, 197, 5, 6, 233, 234, 219, 28, 225, 226, 229, 230, 229, 230, 233, 234, 284, 285, 292, 293, 194, 195, 31, 32, 23, 24, 115, 28, 7, 8, 186, 187, 182, 183, 31, 32, 19, 20, 7, 8, 23, 113, 219, 28, 83, 84, 464, 465, 467, 468, 0, 0, 0, 0, 0, 0, 0, 0, 483, 484, 83, 84, 23, 24, 15, 16, 190, 191, 194, 195, 7, 8, 23, 24, 280, 281, 288, 289, 178, 179, 27, 28, 35, 36, 47, 48, 59, 60, 296, 297, 304, 305, 202, 203, 214, 215, 198, 199, 7, 8, 231, 232, 231, 232, 224, 26, 227, 228, 231, 232, 5, 6, 278, 279, 286, 287, 13, 14, 29, 30, 124, 125, 128, 129, 17, 18, 29, 30, 29, 30, 29, 30, 114, 26, 140, 141, 136, 137, 160, 161, 81, 82, 1, 2, 458, 459, 469, 470, 473, 474, 469, 470, 473, 474, 454, 455, 81, 82, 9, 10, 17, 18, 25, 26, 29, 30, 204, 205, 208, 209, 216, 22, 310, 311, 5, 6, 17, 18, 5, 6, 25, 26, 25, 26, 274, 275, 111, 112, 136, 137, 136, 137, 160, 161, 105, 106, 233, 234, 233, 234, 225, 226, 229, 230, 233, 234, 7, 8, 280, 281, 288, 289, 15, 16, 31, 32, 126, 127, 130, 131, 19, 20, 31, 32, 31, 32, 31, 32, 115, 28, 142, 143, 138, 139, 162, 163, 83, 84, 3, 4, 460, 461, 471, 472, 475, 476, 471, 472, 475, 476, 456, 457, 83, 84, 11, 12, 19, 20, 27, 28, 31, 32, 206, 207, 210, 211, 217, 24, 312, 313, 7, 8, 19, 20, 7, 8, 27, 28, 27, 28, 276, 277, 23, 113, 138, 139, 138, 139, 162, 163, 107, 108, 224, 26, 227, 228, 223, 26, 222, 22, 224, 26, 227, 228, 111, 112, 282, 283, 290, 291, 9, 10, 116, 117, 120, 121, 13, 14, 231, 232, 231, 232, 850, 851, 105, 106, 132, 133, 156, 157, 144, 145, 93, 94, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 101, 102, 89, 90, 29, 30, 231, 232, 21, 22, 200, 201, 212, 213, 196, 197, 282, 283, 290, 291, 25, 26, 25, 26, 224, 26, 227, 228, 270, 271, 25, 26, 132, 133, 156, 157, 144, 145, 21, 22, 225, 226, 229, 230, 27, 28, 23, 24, 225, 226, 229, 230, 23, 113, 284, 285, 292, 293, 11, 12, 118, 119, 122, 123, 15, 16, 233, 234, 233, 234, 852, 853, 107, 108, 134, 135, 158, 159, 146, 147, 95, 96, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 103, 104, 91, 92, 31, 32, 233, 234, 23, 24, 202, 203, 214, 215, 198, 199, 284, 285, 292, 293, 27, 28, 27, 28, 225, 226, 229, 230, 272, 273, 27, 28, 134, 135, 158, 159, 146, 147, 23, 24, 223, 26, 224, 26, 227, 228, 231, 232, 231, 232, 136, 137, 160, 161, 278, 279, 286, 287, 29, 30, 204, 205, 208, 209, 216, 22, 231, 232, 1145, 1153, 854, 855, 5, 6, 148, 149, 152, 153, 25, 26, 1, 2, 17, 18, 13, 14, 136, 137, 160, 161, 172, 173, 168, 169, 21, 22, 109, 18, 81, 82, 124, 125, 128, 129, 29, 30, 188, 189, 192, 193, 9, 10, 278, 279, 286, 287, 111, 112, 9, 10, 21, 22, 298, 299, 306, 307, 109, 18, 148, 149, 152, 153, 29, 30, 114, 26, 27, 28, 225, 226, 229, 230, 233, 234, 233, 234, 138, 139, 162, 163, 280, 281, 288, 289, 31, 32, 206, 207, 210, 211, 217, 24, 233, 234, 1145, 1145, 856, 857, 7, 8, 150, 151, 154, 155, 27, 28, 3, 4, 19, 20, 15, 16, 138, 139, 162, 163, 174, 175, 170, 171, 23, 24, 19, 110, 83, 84, 126, 127, 130, 131, 31, 32, 190, 191, 194, 195, 11, 12, 280, 281, 288, 289, 23, 113, 11, 12, 23, 24, 300, 301, 308, 309, 19, 110, 150, 151, 154, 155, 31, 32, 115, 28, 231, 232, 220, 221, 231, 232, 227, 228, 231, 232, 156, 157, 144, 145, 29, 30, 282, 283, 290, 291, 200, 201, 212, 213, 21, 22, 870, 871, 866, 867, 111, 112, 1, 2, 21, 22, 25, 26, 218, 26, 114, 26, 13, 14, 105, 106, 156, 157, 144, 145, 164, 165, 222, 22, 114, 26, 21, 22, 81, 82, 116, 117, 120, 121, 21, 22, 114, 26, 21, 22, 21, 22, 5, 6, 266, 267, 25, 26, 220, 221, 13, 14, 294, 295, 302, 303, 21, 22, 41, 42, 53, 54, 53, 54, 53, 54, 233, 234, 19, 20, 233, 234, 229, 230, 233, 234, 158, 159, 146, 147, 31, 32, 284, 285, 292, 293, 202, 203, 214, 215, 23, 24, 872, 873, 868, 869, 23, 113, 3, 4, 23, 24, 27, 28, 219, 28, 115, 28, 15, 16, 107, 108, 158, 159, 146, 147, 166, 167, 23, 24, 115, 28, 23, 24, 83, 84, 118, 119, 122, 123, 23, 24, 115, 28, 23, 24, 23, 24, 7, 8, 268, 269, 27, 28, 19, 20, 15, 16, 296, 297, 304, 305, 23, 24, 43, 44, 55, 56, 55, 56, 55, 56, 220, 221, 231, 232, 220, 221, 231, 232, 224, 26, 227, 228, 223, 26, 105, 106, 278, 279, 286, 287, 188, 189, 192, 193, 13, 14, 874, 875, 184, 185, 180, 181, 5, 6, 1094, 10, 114, 26, 224, 26, 227, 228, 9, 10, 29, 30, 274, 275, 274, 275, 438, 439, 274, 275, 227, 228, 29, 30, 81, 82, 1, 2, 1, 2, 1, 2, 227, 228, 105, 106, 218, 26, 109, 18, 282, 283, 290, 291, 180, 181, 298, 299, 306, 307, 172, 173, 168, 169, 37, 38, 1124, 1125, 1124, 1125, 1124, 1125, 19, 20, 233, 234, 19, 20, 233, 234, 225, 226, 229, 230, 27, 28, 107, 108, 280, 281, 288, 289, 190, 191, 194, 195, 15, 16, 876, 877, 186, 187, 182, 183, 7, 8, 1095, 12, 115, 28, 225, 226, 229, 230, 11, 12, 31, 32, 276, 277, 276, 277, 440, 441, 276, 277, 229, 230, 31, 32, 83, 84, 3, 4, 3, 4, 3, 4, 229, 230, 107, 108, 219, 28, 19, 110, 284, 285, 292, 293, 182, 183, 300, 301, 308, 309, 174, 175, 170, 171, 39, 40, 1126, 1127, 1126, 1127, 1126, 1127, 231, 232, 224, 26, 227, 228, 223, 26, 231, 232, 21, 22, 25, 26, 109, 18, 176, 177, 282, 283, 290, 291, 109, 18, 29, 30, 25, 26, 25, 26, 97, 98, 109, 18, 1082, 10, 105, 106, 204, 205, 208, 209, 216, 22, 25, 26, 274, 275, 434, 435, 274, 275, 274, 275, 231, 232, 414, 415, 81, 82, 231, 232, 231, 232, 231, 232, 231, 232, 231, 232, 942, 943, 5, 6, 278, 279, 286, 287, 29, 30, 294, 295, 302, 303, 164, 165, 17, 18, 37, 38, 49, 50, 1124, 1125, 1128, 1129, 233, 234, 225, 226, 229, 230, 27, 28, 233, 234, 23, 24, 27, 28, 19, 110, 178, 179, 284, 285, 292, 293, 19, 110, 31, 32, 27, 28, 27, 28, 99, 100, 19, 110, 1083, 12, 107, 108, 206, 207, 210, 211, 217, 24, 27, 28, 276, 277, 436, 437, 276, 277, 276, 277, 233, 234, 416, 417, 83, 84, 233, 234, 233, 234, 233, 234, 233, 234, 233, 234, 944, 945, 7, 8, 280, 281, 288, 289, 31, 32, 296, 297, 304, 305, 166, 167, 19, 20, 39, 40, 51, 52, 1126, 1127, 1130, 1131, 218, 26, 231, 232, 218, 26, 231, 232, 231, 232, 223, 26, 172, 173, 168, 169, 111, 112, 278, 279, 286, 287, 196, 197, 25, 26, 9, 10, 5, 6, 81, 82, 218, 26, 1065, 1066, 1062, 1063, 200, 201, 212, 213, 1, 2, 17, 18, 430, 431, 0, 0, 0, 0, 231, 232, 231, 232, 410, 411, 81, 82, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 938, 939, 17, 18, 9, 10, 282, 283, 1158, 1159, 306, 307, 29, 30, 218, 26, 105, 106, 37, 38, 1128, 1129, 1128, 1129, 1124, 1125, 219, 28, 233, 234, 219, 28, 233, 234, 233, 234, 27, 28, 174, 175, 170, 171, 23, 113, 280, 281, 288, 289, 198, 199, 27, 28, 11, 12, 7, 8, 83, 84, 219, 28, 11, 12, 11, 12, 202, 203, 214, 215, 3, 4, 19, 20, 432, 433, 0, 0, 0, 0, 233, 234, 233, 234, 412, 413, 83, 84, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 940, 941, 19, 20, 11, 12, 284, 285, 1160, 1161, 308, 309, 31, 32, 219, 28, 107, 108, 39, 40, 1130, 1131, 1130, 1131, 1126, 1127, 224, 26, 227, 228, 231, 232, 227, 228, 231, 232, 218, 26, 164, 165, 218, 26, 1, 2, 220, 221, 282, 283, 290, 291, 172, 173, 180, 181, 5, 6, 93, 94, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 85, 86, 89, 90, 1169, 1170, 0, 0, 231, 232, 231, 232, 426, 427, 406, 407, 81, 82, 0, 0, 926, 927, 954, 955, 950, 951, 946, 947, 934, 935, 29, 30, 114, 26, 278, 279, 1162, 1259, 1269, 1270, 1273, 1274, 208, 280, 217, 22, 37, 38, 1128, 1129, 49, 50, 1128, 1129, 225, 226, 229, 230, 233, 234, 229, 230, 233, 234, 219, 28, 166, 167, 219, 28, 3, 4, 19, 20, 284, 285, 292, 293, 174, 175, 182, 183, 7, 8, 95, 96, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 91, 92, 1167, 1170, 0, 0, 233, 234, 233, 234, 428, 429, 408, 409, 83, 84, 0, 0, 928, 929, 956, 957, 952, 953, 948, 949, 936, 937, 31, 32, 115, 28, 280, 281, 1260, 1261, 1271, 1272, 1275, 1276, 280, 280, 24, 24, 39, 40, 1130, 1131, 51, 52, 1130, 1131, 231, 232, 231, 232, 223, 26, 222, 22, 223, 26, 224, 26, 227, 228, 29, 30, 224, 26, 227, 228, 278, 279, 286, 287, 176, 177, 21, 22, 25, 26, 136, 137, 136, 137, 160, 161, 25, 26, 25, 26, 124, 125, 128, 129, 81, 82, 442, 443, 747, 538, 231, 232, 422, 423, 418, 419, 402, 403, 81, 82, 930, 931, 922, 923, 918, 919, 902, 903, 9, 10, 204, 205, 208, 209, 216, 22, 1098, 10, 1262, 1263, 1277, 1278, 1285, 1286, 280, 19, 196, 197, 37, 38, 1124, 1125, 1128, 1129, 1128, 1129, 233, 234, 233, 234, 27, 28, 23, 24, 27, 28, 225, 226, 229, 230, 31, 32, 225, 226, 229, 230, 280, 281, 288, 289, 178, 179, 23, 24, 27, 28, 138, 139, 138, 139, 162, 163, 27, 28, 27, 28, 126, 127, 130, 131, 83, 84, 444, 445, 748, 749, 233, 234, 424, 425, 420, 421, 404, 405, 83, 84, 932, 933, 924, 925, 920, 921, 904, 905, 11, 12, 206, 207, 210, 211, 217, 24, 1099, 12, 1264, 1265, 1279, 1280, 1287, 1288, 280, 8, 198, 199, 39, 40, 1126, 1127, 1130, 1131, 1130, 1131, 231, 232, 223, 26, 231, 232, 220, 221, 224, 26, 227, 228, 231, 232, 223, 26, 109, 18, 224, 26, 227, 228, 282, 283, 290, 291, 105, 106, 114, 26, 132, 133, 156, 157, 144, 145, 231, 232, 477, 478, 0, 0, 485, 486, 81, 82, 378, 379, 382, 383, 386, 387, 390, 391, 394, 395, 398, 399, 81, 82, 906, 907, 910, 911, 914, 915, 898, 899, 25, 26, 200, 201, 212, 213, 196, 197, 1096, 10, 1266, 1267, 1281, 1282, 1289, 1290, 280, 8, 111, 112, 37, 38, 1128, 1129, 49, 50, 1124, 1125, 233, 234, 27, 28, 233, 234, 19, 20, 225, 226, 229, 230, 233, 234, 27, 28, 19, 110, 225, 226, 229, 230, 284, 285, 292, 293, 107, 108, 115, 28, 134, 135, 158, 159, 146, 147, 233, 234, 479, 480, 0, 0, 487, 488, 83, 84, 380, 381, 384, 385, 388, 389, 392, 393, 396, 397, 400, 401, 83, 84, 908, 909, 912, 913, 916, 917, 900, 901, 27, 28, 202, 203, 214, 215, 198, 199, 1097, 12, 1268, 285, 1283, 1284, 1291, 1292, 194, 195, 23, 113, 39, 40, 1130, 1131, 51, 52, 1126, 1127, 222, 22, 231, 232, 224, 26, 227, 228, 220, 221, 231, 232, 224, 26, 231, 232, 227, 228, 220, 221, 231, 232, 1166, 279, 286, 287, 25, 26, 218, 26, 148, 149, 152, 153, 164, 165, 466, 26, 0, 0, 0, 0, 481, 482, 93, 94, 85, 86, 89, 90, 114, 26, 21, 22, 105, 106, 41, 42, 77, 78, 53, 54, 886, 887, 890, 891, 894, 895, 25, 26, 231, 232, 1154, 1155, 850, 851, 17, 18, 278, 279, 286, 287, 29, 30, 13, 14, 21, 22, 37, 38, 1124, 1125, 1128, 1129, 1124, 1125, 23, 24, 233, 234, 225, 226, 229, 230, 19, 20, 233, 234, 225, 226, 233, 234, 229, 230, 19, 20, 233, 234, 1167, 1168, 288, 289, 27, 28, 219, 28, 150, 151, 154, 155, 166, 167, 467, 468, 0, 0, 0, 0, 483, 484, 95, 96, 87, 88, 91, 92, 115, 28, 23, 24, 107, 108, 43, 44, 79, 80, 55, 56, 888, 889, 892, 893, 896, 897, 27, 28, 233, 234, 1156, 1157, 852, 853, 19, 20, 280, 281, 288, 289, 31, 32, 15, 16, 23, 24, 39, 40, 1126, 1127, 1130, 1131, 1126, 1127, 231, 232, 224, 26, 227, 228, 222, 22, 231, 232, 220, 221, 220, 221, 222, 22, 1217, 1218, 29, 30, 223, 26, 218, 26, 310, 311, 220, 221, 224, 26, 227, 228, 111, 112, 1, 2, 458, 459, 469, 470, 473, 474, 454, 455, 25, 26, 218, 26, 93, 94, 85, 86, 85, 86, 85, 86, 73, 74, 1128, 1129, 1124, 1125, 1124, 1125, 61, 62, 29, 30, 25, 26, 231, 232, 1145, 1153, 854, 855, 124, 125, 128, 129, 282, 283, 290, 291, 184, 185, 180, 181, 37, 38, 1124, 1125, 1128, 1129, 1128, 1129, 233, 234, 225, 226, 229, 230, 23, 24, 233, 234, 19, 20, 19, 20, 23, 24, 1219, 1220, 31, 32, 27, 28, 219, 28, 312, 313, 19, 20, 225, 226, 229, 230, 23, 113, 3, 4, 460, 461, 471, 472, 475, 476, 456, 457, 27, 28, 219, 28, 95, 96, 87, 88, 87, 88, 87, 88, 75, 76, 1130, 1131, 1126, 1127, 1126, 1127, 63, 64, 31, 32, 27, 28, 233, 234, 1145, 1145, 856, 857, 126, 127, 130, 131, 284, 285, 292, 293, 186, 187, 182, 183, 39, 40, 1126, 1127, 1130, 1131, 1130, 1131, 224, 26, 227, 228, 231, 232, 227, 228, 218, 26, 231, 232, 224, 26, 1203, 1200, 1214, 1215, 218, 26, 220, 221, 231, 232, 282, 283, 290, 291, 220, 221, 231, 232, 223, 26, 9, 10, 5, 6, 25, 26, 176, 177, 25, 26, 114, 26, 17, 18, 204, 205, 208, 209, 216, 22, 231, 232, 37, 38, 254, 255, 1257, 259, 49, 50, 61, 62, 172, 173, 168, 169, 231, 232, 0, 0, 862, 863, 116, 117, 120, 121, 278, 279, 286, 287, 176, 177, 21, 22, 33, 34, 45, 46, 45, 46, 69, 70, 225, 226, 229, 230, 233, 234, 229, 230, 219, 28, 233, 234, 225, 226, 1204, 1205, 1216, 1209, 219, 28, 19, 20, 233, 234, 284, 285, 292, 293, 19, 20, 233, 234, 27, 28, 11, 12, 7, 8, 27, 28, 178, 179, 27, 28, 115, 28, 19, 20, 206, 207, 210, 211, 217, 24, 233, 234, 39, 40, 256, 257, 1258, 261, 51, 52, 63, 64, 174, 175, 170, 171, 233, 234, 0, 0, 864, 865, 118, 119, 122, 123, 280, 281, 288, 289, 178, 179, 23, 24, 35, 36, 47, 48, 47, 48, 71, 72, 231, 232, 222, 22, 220, 221, 231, 232, 220, 221, 218, 26, 231, 232, 223, 26, 231, 232, 224, 26, 227, 228, 218, 26, 278, 279, 286, 287, 25, 26, 231, 232, 109, 18, 114, 26, 204, 205, 208, 209, 216, 22, 231, 232, 25, 26, 1, 2, 1, 2, 212, 213, 196, 197, 109, 18, 37, 38, 1124, 1125, 1124, 1125, 1128, 1129, 61, 62, 164, 165, 882, 883, 870, 871, 866, 867, 858, 859, 184, 185, 180, 181, 111, 112, 262, 263, 5, 6, 222, 22, 140, 141, 136, 137, 160, 161, 81, 82, 233, 234, 23, 24, 19, 20, 233, 234, 19, 20, 219, 28, 233, 234, 27, 28, 233, 234, 225, 226, 229, 230, 219, 28, 280, 281, 288, 289, 27, 28, 233, 234, 19, 110, 115, 28, 206, 207, 210, 211, 217, 24, 233, 234, 27, 28, 3, 4, 3, 4, 214, 215, 198, 199, 19, 110, 39, 40, 1126, 1127, 1126, 1127, 1130, 1131, 63, 64, 166, 167, 884, 885, 872, 873, 868, 869, 860, 861, 186, 187, 182, 183, 23, 113, 264, 265, 7, 8, 23, 24, 142, 143, 138, 139, 162, 163, 83, 84, 223, 26, 224, 26, 227, 228, 223, 26, 231, 232, 231, 232, 231, 232, 227, 228, 224, 26, 227, 228, 231, 232, 231, 232, 220, 221, 282, 283, 290, 291, 223, 26, 220, 221, 231, 232, 200, 201, 212, 213, 21, 22, 1, 2, 21, 22, 1, 2, 231, 232, 231, 232, 537, 538, 533, 534, 33, 34, 45, 46, 45, 46, 69, 70, 57, 58, 223, 26, 878, 879, 874, 875, 1, 2, 97, 98, 176, 177, 29, 30, 29, 30, 350, 351, 354, 355, 105, 106, 132, 133, 156, 157, 144, 145, 81, 82, 27, 28, 225, 226, 229, 230, 27, 28, 233, 234, 233, 234, 233, 234, 229, 230, 225, 226, 229, 230, 233, 234, 233, 234, 19, 20, 284, 285, 292, 293, 27, 28, 19, 20, 233, 234, 202, 203, 214, 215, 23, 24, 3, 4, 23, 24, 3, 4, 233, 234, 233, 234, 539, 538, 535, 536, 35, 36, 47, 48, 47, 48, 71, 72, 59, 60, 27, 28, 880, 881, 876, 877, 3, 4, 99, 100, 178, 179, 31, 32, 31, 32, 352, 353, 356, 357, 107, 108, 134, 135, 158, 159, 146, 147, 83, 84, 231, 232, 231, 232, 231, 232, 227, 228, 231, 232, 223, 26, 231, 232, 223, 26, 231, 232, 223, 26, 224, 26, 227, 228, 218, 26, 1166, 279, 286, 287, 13, 14, 218, 26, 25, 26, 188, 189, 192, 193, 196, 197, 111, 112, 21, 22, 224, 26, 231, 232, 521, 522, 0, 0, 529, 530, 29, 30, 218, 26, 111, 112, 114, 26, 109, 18, 85, 86, 85, 86, 85, 86, 85, 86, 101, 102, 218, 26, 109, 18, 342, 343, 346, 347, 362, 363, 21, 22, 148, 149, 152, 153, 105, 106, 81, 82, 233, 234, 233, 234, 233, 234, 229, 230, 233, 234, 27, 28, 233, 234, 27, 28, 233, 234, 27, 28, 225, 226, 229, 230, 219, 28, 1167, 1168, 288, 289, 15, 16, 219, 28, 27, 28, 190, 191, 194, 195, 198, 199, 23, 113, 23, 24, 225, 226, 233, 234, 523, 524, 0, 0, 531, 532, 31, 32, 219, 28, 23, 113, 115, 28, 19, 110, 87, 88, 87, 88, 87, 88, 87, 88, 103, 104, 219, 28, 19, 110, 344, 345, 348, 349, 364, 365, 23, 24, 150, 151, 154, 155, 107, 108, 83, 84, 220, 221, 224, 26, 227, 228, 222, 22, 224, 26, 227, 228, 140, 141, 136, 137, 160, 161, 224, 26, 227, 228, 231, 232, 231, 232, 231, 232, 282, 283, 290, 291, 231, 232, 223, 26, 5, 5, 13, 5, 5, 5, 1, 5, 9, 9, 10, 494, 231, 232, 0, 0, 538, 551, 517, 518, 505, 506, 25, 26, 21, 22, 184, 185, 180, 181, 1, 2, 477, 478, 0, 0, 485, 486, 25, 26, 111, 112, 314, 315, 322, 323, 358, 359, 338, 339, 172, 173, 168, 169, 41, 42, 53, 54, 77, 78, 19, 20, 225, 226, 229, 230, 23, 24, 225, 226, 229, 230, 142, 143, 138, 139, 162, 163, 225, 226, 229, 230, 233, 234, 233, 234, 233, 234, 284, 285, 292, 293, 233, 234, 27, 28, 7, 7, 15, 7, 7, 7, 3, 7, 11, 11, 12, 550, 233, 234, 0, 0, 538, 552, 519, 520, 507, 508, 27, 28, 23, 24, 186, 187, 182, 183, 3, 4, 479, 480, 0, 0, 487, 488, 27, 28, 23, 113, 316, 317, 324, 325, 360, 361, 340, 341, 174, 175, 170, 171, 43, 44, 55, 56, 79, 80, 224, 26, 227, 228, 223, 26, 231, 232, 231, 232, 231, 232, 132, 133, 156, 157, 144, 145, 220, 221, 231, 232, 224, 26, 227, 228, 231, 232, 1166, 279, 286, 287, 172, 173, 180, 181, 218, 26, 21, 22, 9, 10, 196, 197, 17, 18, 544, 545, 540, 541, 525, 526, 513, 514, 509, 510, 501, 502, 493, 494, 17, 18, 176, 177, 462, 463, 466, 26, 0, 0, 0, 0, 481, 482, 450, 451, 21, 22, 318, 319, 326, 327, 330, 331, 334, 335, 164, 165, 109, 18, 37, 38, 1124, 1125, 1124, 1125, 225, 226, 229, 230, 27, 28, 233, 234, 233, 234, 233, 234, 134, 135, 158, 159, 146, 147, 19, 20, 233, 234, 225, 226, 229, 230, 233, 234, 1167, 1168, 288, 289, 174, 175, 182, 183, 219, 28, 23, 24, 11, 12, 198, 199, 19, 20, 546, 547, 542, 543, 527, 528, 515, 516, 511, 512, 503, 504, 495, 496, 19, 20, 178, 179, 464, 465, 467, 468, 0, 0, 0, 0, 483, 484, 452, 453, 23, 24, 320, 321, 328, 329, 332, 333, 336, 337, 166, 167, 19, 110, 39, 40, 1126, 1127, 1126, 1127, 231, 232, 220, 221, 224, 26, 227, 228, 231, 232, 218, 26, 148, 149, 152, 153, 990, 991, 224, 26, 227, 228, 223, 26, 231, 232, 218, 26, 231, 232, 282, 283, 290, 291, 224, 26, 227, 228, 218, 26, 25, 26, 21, 22, 223, 26, 17, 18, 140, 141, 136, 137, 160, 161, 105, 106, 497, 498, 489, 490, 25, 26, 109, 18, 218, 26, 458, 459, 469, 470, 473, 474, 454, 455, 446, 447, 218, 26, 5, 6, 223, 26, 266, 267, 29, 30, 21, 22, 220, 221, 37, 38, 1128, 1129, 1124, 1125, 233, 234, 19, 20, 225, 226, 229, 230, 233, 234, 219, 28, 150, 151, 154, 155, 992, 993, 225, 226, 229, 230, 27, 28, 233, 234, 219, 28, 233, 234, 284, 285, 292, 293, 225, 226, 229, 230, 219, 28, 27, 28, 23, 24, 27, 28, 19, 20, 142, 143, 138, 139, 162, 163, 107, 108, 499, 500, 491, 492, 27, 28, 19, 110, 219, 28, 460, 461, 471, 472, 475, 476, 456, 457, 448, 449, 219, 28, 7, 8, 27, 28, 268, 269, 31, 32, 23, 24, 19, 20, 39, 40, 1130, 1131, 1126, 1127, 218, 26, 231, 232, 218, 26, 231, 232, 220, 221, 231, 232, 218, 26, 224, 26, 227, 228, 231, 232, 224, 26, 227, 228, 231, 232, 231, 232, 227, 228, 1166, 279, 286, 287, 222, 22, 231, 232, 231, 232, 227, 228, 231, 232, 227, 228, 222, 22, 132, 133, 156, 157, 231, 232, 222, 22, 124, 125, 128, 129, 218, 26, 231, 232, 218, 26, 220, 221, 231, 232, 227, 228, 124, 125, 128, 129, 231, 232, 227, 228, 298, 299, 306, 307, 105, 106, 124, 125, 128, 129, 37, 38, 1124, 1125, 1128, 1129, 219, 28, 233, 234, 219, 28, 233, 234, 19, 20, 233, 234, 219, 28, 225, 226, 229, 230, 233, 234, 225, 226, 229, 230, 233, 234, 233, 234, 229, 230, 1167, 1168, 288, 289, 23, 24, 233, 234, 233, 234, 229, 230, 233, 234, 229, 230, 23, 24, 134, 135, 158, 159, 233, 234, 23, 24, 126, 127, 130, 131, 219, 28, 233, 234, 219, 28, 19, 20, 233, 234, 229, 230, 126, 127, 130, 131, 233, 234, 229, 230, 300, 301, 308, 309, 107, 108, 126, 127, 130, 131, 39, 40, 1126, 1127, 1130, 1131, 223, 26, 231, 232, 227, 228, 218, 26, 224, 26, 227, 228, 231, 232, 231, 232, 224, 26, 227, 228, 220, 221, 231, 232, 223, 26, 224, 26, 227, 228, 231, 232, 274, 275, 224, 26, 227, 228, 220, 221, 231, 232, 231, 232, 231, 232, 231, 232, 231, 232, 231, 232, 227, 228, 231, 232, 231, 232, 227, 228, 231, 232, 227, 228, 231, 232, 231, 232, 227, 228, 231, 232, 231, 232, 231, 232, 227, 228, 231, 232, 294, 295, 302, 303, 109, 18, 116, 117, 120, 121, 37, 38, 1128, 1129, 1124, 1125, 27, 28, 233, 234, 229, 230, 219, 28, 225, 226, 229, 230, 233, 234, 233, 234, 225, 226, 229, 230, 19, 20, 233, 234, 27, 28, 225, 226, 229, 230, 233, 234, 276, 277, 225, 226, 229, 230, 19, 20, 233, 234, 233, 234, 233, 234, 233, 234, 233, 234, 233, 234, 229, 230, 233, 234, 233, 234, 229, 230, 233, 234, 229, 230, 233, 234, 233, 234, 229, 230, 233, 234, 233, 234, 233, 234, 229, 230, 233, 234, 296, 297, 304, 305, 19, 110, 118, 119, 122, 123, 39, 40, 1130, 1131, 1126, 1127, 231, 232, 222, 22, 231, 232, 227, 228, 231, 232, 222, 22, 220, 221, 231, 232, 227, 228, 222, 22, 231, 232, 223, 26, 224, 26, 227, 228, 222, 22, 298, 299, 306, 307, 231, 232, 220, 221, 231, 232, 231, 232, 227, 228, 231, 232, 224, 26, 227, 228, 231, 232, 231, 232, 224, 26, 227, 228, 231, 232, 231, 232, 218, 26, 231, 232, 227, 228, 231, 232, 220, 221, 231, 232, 222, 22, 231, 232, 227, 228, 282, 283, 290, 291, 224, 26, 227, 228, 5, 6, 33, 34, 45, 46, 45, 46, 233, 234, 23, 24, 233, 234, 229, 230, 233, 234, 23, 24, 19, 20, 233, 234, 229, 230, 23, 24, 233, 234, 27, 28, 225, 226, 229, 230, 23, 24, 300, 301, 308, 309, 233, 234, 19, 20, 233, 234, 233, 234, 229, 230, 233, 234, 225, 226, 229, 230, 233, 234, 233, 234, 225, 226, 229, 230, 233, 234, 233, 234, 219, 28, 233, 234, 229, 230, 233, 234, 19, 20, 233, 234, 23, 24, 233, 234, 229, 230, 284, 285, 292, 293, 225, 226, 229, 230, 7, 8, 35, 36, 47, 48, 47, 48, 224, 26, 227, 228, 220, 221, 218, 26, 224, 26, 227, 228, 218, 26, 231, 232, 222, 22, 231, 232, 224, 26, 227, 228, 218, 26, 231, 232, 227, 228, 294, 295, 302, 303, 218, 26, 224, 26, 227, 228, 223, 26, 224, 26, 227, 228, 231, 232, 231, 232, 220, 221, 231, 232, 227, 228, 231, 232, 218, 26, 220, 221, 224, 26, 227, 228, 223, 26, 231, 232, 224, 26, 227, 228, 231, 232, 220, 221, 231, 232, 1166, 279, 286, 287, 231, 232, 223, 26, 218, 26, 172, 173, 180, 181, 105, 106, 225, 226, 229, 230, 19, 20, 219, 28, 225, 226, 229, 230, 219, 28, 233, 234, 23, 24, 233, 234, 225, 226, 229, 230, 219, 28, 233, 234, 229, 230, 296, 297, 304, 305, 219, 28, 225, 226, 229, 230, 27, 28, 225, 226, 229, 230, 233, 234, 233, 234, 19, 20, 233, 234, 229, 230, 233, 234, 219, 28, 19, 20, 225, 226, 229, 230, 27, 28, 233, 234, 225, 226, 229, 230, 233, 234, 19, 20, 233, 234, 1167, 1168, 288, 289, 233, 234, 27, 28, 219, 28, 174, 175, 182, 183, 107, 108, 231, 232, 224, 26, 227, 228, 231, 232, 218, 26, 231, 232, 231, 232, 218, 26, 224, 26, 227, 228, 218, 26, 231, 232, 220, 221, 231, 232, 231, 232, 282, 283, 290, 291, 224, 26, 227, 228, 222, 22, 218, 26, 220, 221, 224, 26, 227, 228, 231, 232, 227, 228, 223, 26, 231, 232, 224, 26, 227, 228, 231, 232, 222, 22, 231, 232, 224, 26, 227, 228, 231, 232, 222, 22, 224, 26, 227, 228, 220, 221, 222, 22, 282, 283, 290, 291, 224, 26, 227, 228, 231, 232, 5, 6, 111, 112, 233, 234, 225, 226, 229, 230, 233, 234, 219, 28, 233, 234, 233, 234, 219, 28, 225, 226, 229, 230, 219, 28, 233, 234, 19, 20, 233, 234, 233, 234, 284, 285, 292, 293, 225, 226, 229, 230, 23, 24, 219, 28, 19, 20, 225, 226, 229, 230, 233, 234, 229, 230, 27, 28, 233, 234, 225, 226, 229, 230, 233, 234, 23, 24, 233, 234, 225, 226, 229, 230, 233, 234, 23, 24, 225, 226, 229, 230, 19, 20, 23, 24, 284, 285, 292, 293, 225, 226, 229, 230, 233, 234, 7, 8, 23, 113, 224, 26, 227, 228, 231, 232, 220, 221, 222, 22, 224, 26, 227, 228, 231, 232, 231, 232, 224, 26, 227, 228, 223, 26, 218, 26, 224, 26, 227, 228, 1166, 279, 286, 287, 220, 221, 231, 232, 224, 26, 227, 228, 231, 232, 224, 26, 227, 228, 227, 228, 231, 232, 224, 26, 227, 228, 231, 232, 222, 22, 224, 26, 227, 228, 218, 26, 220, 221, 231, 232, 224, 26, 227, 228, 223, 26, 220, 221, 224, 26, 227, 228, 1166, 279, 286, 287, 223, 26, 218, 26, 220, 221, 109, 18, 222, 22, 225, 226, 229, 230, 233, 234, 19, 20, 23, 24, 225, 226, 229, 230, 233, 234, 233, 234, 225, 226, 229, 230, 27, 28, 219, 28, 225, 226, 229, 230, 1167, 1168, 288, 289, 19, 20, 233, 234, 225, 226, 229, 230, 233, 234, 225, 226, 229, 230, 229, 230, 233, 234, 225, 226, 229, 230, 233, 234, 23, 24, 225, 226, 229, 230, 219, 28, 19, 20, 233, 234, 225, 226, 229, 230, 27, 28, 19, 20, 225, 226, 229, 230, 1167, 1168, 288, 289, 27, 28, 219, 28, 19, 20, 19, 110, 23, 24], + "height":96, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":96, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":75, + "firstgid":1, + "image":"town_hf.png", + "imageheight":4864, + "imagewidth":4800, + "margin":0, + "name":"town", + "spacing":0, + "tilecount":1425, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":96 +} \ No newline at end of file diff --git a/gamefileshf/level/town/town_crypt.json b/gamefileshf/level/town/town_crypt.json new file mode 100755 index 00000000..2e7a04e5 --- /dev/null +++ b/gamefileshf/level/town/town_crypt.json @@ -0,0 +1,314 @@ +{ "backgroundcolor":"#000000", + "height":4, + "infinite":false, + "layers":[ + { + "data":[1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338], + "height":4, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":2, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":641, + "image":"11.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"11", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":705, + "image":"12.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"12", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":769, + "image":"13.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"13", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":833, + "image":"14.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"14", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":897, + "image":"15.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"15", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":961, + "image":"16.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"16", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1025, + "image":"17.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"17", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1089, + "image":"18.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"18", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1153, + "image":"19.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"19", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1217, + "image":"20.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"20", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1281, + "image":"21.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"21", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1345, + "image":"22.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"22", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":2 +} \ No newline at end of file diff --git a/gamefileshf/level/town/town_nest.json b/gamefileshf/level/town/town_nest.json new file mode 100755 index 00000000..cfb56f6f --- /dev/null +++ b/gamefileshf/level/town/town_nest.json @@ -0,0 +1,314 @@ +{ "backgroundcolor":"#000000", + "height":6, + "infinite":false, + "layers":[ + { + "data":[1163, 1299, 303, 1303, 1304, 1294, 1301, 1302, 1305, 1306, 1296, 1307, 1308, 1315, 1316, 1297, 1309, 1310, 1317, 1318, 1298, 1311, 1312, 1319, 1320, 285, 1313, 1314, 1321, 1322], + "height":6, + "id":4, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":5, + "x":0, + "y":0 + }], + "nextlayerid":5, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.2.0", + "tileheight":32, + "tilesets":[ + { + "columns":16, + "firstgid":1, + "image":"1.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"1", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":65, + "image":"2.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"2", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":129, + "image":"3.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"3", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":193, + "image":"4.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"4", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":257, + "image":"5.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"5", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":321, + "image":"6.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"6", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":385, + "image":"7.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"7", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":449, + "image":"8.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"8", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":513, + "image":"9.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"9", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":577, + "image":"10.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"10", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":641, + "image":"11.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"11", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":705, + "image":"12.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"12", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":769, + "image":"13.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"13", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":833, + "image":"14.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"14", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":897, + "image":"15.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"15", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":961, + "image":"16.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"16", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1025, + "image":"17.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"17", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1089, + "image":"18.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"18", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1153, + "image":"19.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"19", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1217, + "image":"20.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"20", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1281, + "image":"21.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"21", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }, + { + "columns":16, + "firstgid":1345, + "image":"22.png", + "imageheight":1024, + "imagewidth":1024, + "margin":0, + "name":"22", + "spacing":0, + "tilecount":64, + "tileheight":256, + "tilewidth":64 + }], + "tilewidth":64, + "type":"map", + "version":1.2, + "width":5 +} \ No newline at end of file diff --git a/gamefileshf/loadingScreens/cutl5.json b/gamefileshf/loadingScreens/cutl5.json new file mode 100755 index 00000000..cb02a636 --- /dev/null +++ b/gamefileshf/loadingScreens/cutl5.json @@ -0,0 +1,27 @@ +{ + "action": { "name": "resource.add", "id": "loadingScreen" }, + "palette": { + "id": "cutl5", + "file": "Nlevels/cutl5.pal" + }, + "texture": { + "id": "cutl5", + "file": "Nlevels/Cutl5.CEL", + "palette": "cutl5" + }, + "loadingScreen": { + "texture": "cutl5", + "size": [533, 22], + "anchor": "none", + "progressBarOffset": [53, 421], + "color": "0x39424A", + "onComplete": { + "name": "game.fadeOut", + "action": [ + { "name": "loadingScreen.clear" }, + { "name": "resource.pop", "id": "loadingScreen" }, + { "name": "game.fadeIn" } + ] + } + } +} \ No newline at end of file diff --git a/gamefileshf/loadingScreens/cutl6.json b/gamefileshf/loadingScreens/cutl6.json new file mode 100755 index 00000000..a4d5da76 --- /dev/null +++ b/gamefileshf/loadingScreens/cutl6.json @@ -0,0 +1,27 @@ +{ + "action": { "name": "resource.add", "id": "loadingScreen" }, + "palette": { + "id": "cutl6", + "file": "Nlevels/cutl6.pal" + }, + "texture": { + "id": "cutl6", + "file": "Nlevels/Cutl6.CEL", + "palette": "cutl6" + }, + "loadingScreen": { + "texture": "cutl6", + "size": [533, 22], + "anchor": "none", + "progressBarOffset": [53, 421], + "color": "0x372717", + "onComplete": { + "name": "game.fadeOut", + "action": [ + { "name": "loadingScreen.clear" }, + { "name": "resource.pop", "id": "loadingScreen" }, + { "name": "game.fadeIn" } + ] + } + } +} \ No newline at end of file diff --git a/gamefileshf/main.json b/gamefileshf/main.json index 682f5195..435c3a2a 100755 --- a/gamefileshf/main.json +++ b/gamefileshf/main.json @@ -5,6 +5,7 @@ "refWindowSize": [640, 480], "minWindowSize": [640, 480], "windowSize": [800, 600], + "framerate": 60, "keepAR": true, "stretchToFit": true, "smoothScreen": true, @@ -38,7 +39,10 @@ "name": "if.equal", "param1": { "name": "file.exists", "file": "ui_art/cursor.pcx" }, "param2": true, - "then": { "name": "load", "file": "ui/loadMain.json" }, + "then": [ + { "name": "variable.set", "key": "colorCycling", "value": true }, + { "name": "load", "file": "ui/loadMain.json" } + ], "else": { "name": "load", "file": "ui/betaNotSupported.json" } }, "else": { "name": "load", "file": ["ui/dataMissing.json", "hfmusic"] } diff --git a/gamefileshf/res/level/actions/autoMap.json b/gamefileshf/res/level/actions/autoMap.json new file mode 100755 index 00000000..905b8222 --- /dev/null +++ b/gamefileshf/res/level/actions/autoMap.json @@ -0,0 +1,81 @@ +{ + "action": [ + { + "name": "action.set", + "id": "showMap", + "action": { + "name": "if.equal", + "param1": "%currentLevel.hasAutomap%", + "param2": true, + "then": { + "name": "if.equal", + "param1": "%currentLevel.showAutomap%", + "param2": true, + "then": [ + { "name": "level.showAutomap", "show": false }, + { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + ], + "else": [ + { "name": "level.showAutomap", "show": true }, + { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, + { "name": "if", + "params": [ + "\\d*", "regex", "%currentLevel.name%", + "or", + "Crypt \\d*", "regex", "%currentLevel.name%", + "or", + "Nest \\d*", "regex", "%currentLevel.name%" + ], + "then": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "Level: [1]" }, + "else": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "[1]" } + } + ] + }, + "else": [ + { "name": "if", + "params": [ + "\\d*", "regex", "%currentLevel.name%", + "or", + "Crypt \\d*", "regex", "%currentLevel.name%", + "or", + "Nest \\d*", "regex", "%currentLevel.name%" + ], + "then": { "name": "load", "file": ["ui/level/noMap.json", "level ", "%currentLevel.name%"] }, + "else": { "name": "load", "file": ["ui/level/noMap.json", "", "%currentLevel.name%"] } + }, + { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + ] + } + }, + { + "name": "action.set", + "id": "updateMap", + "action": { + "name": "if.equal", + "param1": "%currentLevel.hasAutomap%", + "param2": true, + "then": { + "name": "if.equal", + "param1": "%currentLevel.showAutomap%", + "param2": true, + "then": [ + { "name": "drawable.visible", "id": "txtMapLabel", "visible": true }, + { "name": "if", + "params": [ + "\\d*", "regex", "%currentLevel.name%", + "or", + "Crypt \\d*", "regex", "%currentLevel.name%", + "or", + "Nest \\d*", "regex", "%currentLevel.name%" + ], + "then": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "Level: [1]" }, + "else": { "name": "text.setText", "id": "txtMapLabel", "binding": "%currentLevel.name%", "format": "[1]" } + } + ], + "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + }, + "else": { "name": "drawable.visible", "id": "txtMapLabel", "visible": false } + } + } + ] +} \ No newline at end of file diff --git a/gamefileshf/res/level/actions/colorCycling.json b/gamefileshf/res/level/actions/colorCycling.json deleted file mode 100755 index 58c5dfef..00000000 --- a/gamefileshf/res/level/actions/colorCycling.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "event": { - "id": "colorCycle", - "action": { "name": "palette.shiftLeft", "id": "colorCycle", "shift": 1, "range": [1, 32] }, - "time": 60 - } -} \ No newline at end of file diff --git a/gamefileshf/res/player/monkSounds.json b/gamefileshf/res/player/monkSounds.json index 354f6d97..54d2ab2b 100755 --- a/gamefileshf/res/player/monkSounds.json +++ b/gamefileshf/res/player/monkSounds.json @@ -6,6 +6,7 @@ { "id": "whereWouldIPutThis", "file": "Sfx/Monk/Monk16.wav" }, { "id": "cantCastThatHere", "file": "Sfx/Monk/Monk27.wav" }, { "id": "dontHaveASpellReady", "file": "Sfx/Monk/Monk34.wav" }, - { "id": "notEnoughMana", "file": "Sfx/Monk/Monk35.wav" } + { "id": "notEnoughMana", "file": "Sfx/Monk/Monk35.wav" }, + { "id": "die", "file": "Sfx/Monk/Monk71.wav" } ] } \ No newline at end of file diff --git a/gamefileshf/res/player/sound/loadByClass.json b/gamefileshf/res/player/sound/loadByClass.json index 81a356bf..ca2a4381 100755 --- a/gamefileshf/res/player/sound/loadByClass.json +++ b/gamefileshf/res/player/sound/loadByClass.json @@ -1,21 +1,21 @@ { "action": { "name": "switch", - "param": "{1}", + "param": "%currentLevel.currentPlayer.class%", "case": [ { "value": "Warrior", "action": { "name": "if.equal", - "param1": "{3}", + "param1": "{2}", "param2": ".", "then": { "name": "load", - "file": ["res/player/sound/loadWarrior.json", "{2}", "warrior{2}", "{4}"] + "file": ["res/player/sound/loadWarrior.json", "{1}", "warrior{1}", "{3}", "{4}"] }, "else": { "name": "load", - "file": ["res/player/sound/loadWarrior.json", "{2}", "{3}", "{4}"] + "file": ["res/player/sound/loadWarrior.json", "{1}", "{2}", "{3}", "{4}"] } } }, @@ -23,15 +23,15 @@ "value": "Rogue", "action": { "name": "if.equal", - "param1": "{3}", + "param1": "{2}", "param2": ".", "then": { "name": "load", - "file": ["res/player/sound/loadRogue.json", "{2}", "rogue{2}", "{4}"] + "file": ["res/player/sound/loadRogue.json", "{1}", "rogue{1}", "{3}", "{4}"] }, "else": { "name": "load", - "file": ["res/player/sound/loadRogue.json", "{2}", "{3}", "{4}"] + "file": ["res/player/sound/loadRogue.json", "{1}", "{2}", "{3}", "{4}"] } } }, @@ -39,15 +39,15 @@ "value": "Sorceror", "action": { "name": "if.equal", - "param1": "{3}", + "param1": "{2}", "param2": ".", "then": { "name": "load", - "file": ["res/player/sound/loadSorceror.json", "{2}", "sorceror{2}", "{4}"] + "file": ["res/player/sound/loadSorceror.json", "{1}", "sorceror{1}", "{3}", "{4}"] }, "else": { "name": "load", - "file": ["res/player/sound/loadSorceror.json", "{2}", "{3}", "{4}"] + "file": ["res/player/sound/loadSorceror.json", "{1}", "{2}", "{3}", "{4}"] } } }, @@ -55,15 +55,15 @@ "value": "Monk", "action": { "name": "if.equal", - "param1": "{3}", + "param1": "{2}", "param2": ".", "then": { "name": "load", - "file": ["res/player/sound/loadMonk.json", "{2}", "monk{2}", "{4}"] + "file": ["res/player/sound/loadMonk.json", "{1}", "monk{1}", "{3}", "{4}"] }, "else": { "name": "load", - "file": ["res/player/sound/loadMonk.json", "{2}", "{3}", "{4}"] + "file": ["res/player/sound/loadMonk.json", "{1}", "{2}", "{3}", "{4}"] } } }, diff --git a/gamefileshf/res/player/sound/loadMonk.json b/gamefileshf/res/player/sound/loadMonk.json index da609ad5..64d5ffed 100755 --- a/gamefileshf/res/player/sound/loadMonk.json +++ b/gamefileshf/res/player/sound/loadMonk.json @@ -5,11 +5,11 @@ "param2": 10, "then": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "Sfx/Monk", "Monk0{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "Sfx/Monk", "Monk0{1}", "{4}"] }, "else": { "name": "load", - "file": ["res/player/sound/{3}.json", "{2}", "Sfx/Monk", "Monk{1}"] + "file": ["res/player/sound/{3}.json", "{2}", "Sfx/Monk", "Monk{1}", "{4}"] } } } \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard.json b/gamefileshf/texts/lester/quests/farmersOrchard.json new file mode 100755 index 00000000..f9fc3cd7 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard.json @@ -0,0 +1,32 @@ +{ + "action": { + "name": "switch", + "param": "%currentLevel.quest.farmersOrchard.state%", + "case": [ + { + "value": 0, + "action": { "name": "load", "file": "texts/lester/quests/farmersOrchard1.json" } + }, + { + "value": 1, + "action": { "name": "load", "file": "texts/lester/quests/farmersOrchard2.json" } + }, + { + "value": 2, + "action": { "name": "load", "file": "texts/lester/quests/farmersOrchard3.json" } + }, + { + "value": 3, + "action": { "name": "load", "file": "texts/lester/quests/farmersOrchard4.json" } + }, + { + "value": -1, + "action": [ + { "name": "load", "file": "texts/lester/quests/farmersOrchard5.json" }, + { "name": "quest.delete", "quest": "farmersOrchard" } + ] + } + ], + "default": 0 + } +} \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard1.json b/gamefileshf/texts/lester/quests/farmersOrchard1.json new file mode 100755 index 00000000..a01be0bf --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard1.json @@ -0,0 +1,13 @@ +{ + "load": [ + "ui/level/showText.json", + "questText", + "50", + "texts/lester/quests/farmersOrchard1.txt" + ], + "audio": { + "file": "Sfx/Hellfire/Farmer7.wav", + "play": true, + "volume": "%game.soundVolume%" + } +} \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard1.txt b/gamefileshf/texts/lester/quests/farmersOrchard1.txt new file mode 100755 index 00000000..8aeac62b --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard1.txt @@ -0,0 +1,4 @@ +I need something done, but I couldn't +impose on a perfect stranger. Perhaps +after you've been here a while I might feel +more comfortable asking a favor. \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard2.json b/gamefileshf/texts/lester/quests/farmersOrchard2.json new file mode 100755 index 00000000..652d4ad9 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard2.json @@ -0,0 +1,13 @@ +{ + "load": [ + "ui/level/showText.json", + "questText", + "50", + "texts/lester/quests/farmersOrchard2.txt" + ], + "audio": { + "file": "Sfx/Hellfire/Farmer1.wav", + "play": true, + "volume": "%game.soundVolume%" + } +} \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard2.txt b/gamefileshf/texts/lester/quests/farmersOrchard2.txt new file mode 100755 index 00000000..8abb0080 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard2.txt @@ -0,0 +1,13 @@ +So, you're the hero everyone's been +talking about. Perhaps you could help a +poor, simple farmer out of a terrible mess? +At the edge of my orchard, just south of +here, there's a horrible thing swelling out +of the ground! I can't get to my crops or +my bales of hay, and my poor cows will +starve. The witch gave this to me and +said that it would blast that thing out +of my field. If you could destroy it, I +would be forever grateful. I'd do it +myself, but someone has to stay here with +the cows... \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard3.json b/gamefileshf/texts/lester/quests/farmersOrchard3.json new file mode 100755 index 00000000..b796ea86 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard3.json @@ -0,0 +1,13 @@ +{ + "load": [ + "ui/level/showText.json", + "questText", + "50", + "texts/lester/quests/farmersOrchard3.txt" + ], + "audio": { + "file": "Sfx/Hellfire/Farmer3.wav", + "play": true, + "volume": "%game.soundVolume%" + } +} \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard3.txt b/gamefileshf/texts/lester/quests/farmersOrchard3.txt new file mode 100755 index 00000000..67785016 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard3.txt @@ -0,0 +1,6 @@ +Is it gone? Did you send it back to the +dark recesses of Hades that spawned it? +You what? Oh, don't tell me you lost it! +Those things don't come cheap, you know. +You've got to find it, and then blast +that horror out of our town. \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard4.json b/gamefileshf/texts/lester/quests/farmersOrchard4.json new file mode 100755 index 00000000..d139df99 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard4.json @@ -0,0 +1,13 @@ +{ + "load": [ + "ui/level/showText.json", + "questText", + "50", + "texts/lester/quests/farmersOrchard4.txt" + ], + "audio": { + "file": "Sfx/Hellfire/Farmer2.wav", + "play": true, + "volume": "%game.soundVolume%" + } +} \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard4.txt b/gamefileshf/texts/lester/quests/farmersOrchard4.txt new file mode 100755 index 00000000..4380dc69 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard4.txt @@ -0,0 +1,4 @@ +I knew that it couldn't be as simple as +that witch made it sound. It's a sad +world when you can't even trust your +neighbors. \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard5.json b/gamefileshf/texts/lester/quests/farmersOrchard5.json new file mode 100755 index 00000000..39ce4cf2 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard5.json @@ -0,0 +1,14 @@ +{ + "load": [ + "ui/level/showText.json", + "questText", + "50", + "texts/lester/quests/farmersOrchard5.txt" + ], + "audio": { + "file": "Sfx/Hellfire/Farmer4.wav", + "play": true, + "volume": "%game.soundVolume%" + }, + "action": { "name": "quest.setState", "quest": "farmersOrchard", "state": -1 } +} \ No newline at end of file diff --git a/gamefileshf/texts/lester/quests/farmersOrchard5.txt b/gamefileshf/texts/lester/quests/farmersOrchard5.txt new file mode 100755 index 00000000..4119c439 --- /dev/null +++ b/gamefileshf/texts/lester/quests/farmersOrchard5.txt @@ -0,0 +1,7 @@ +I heard the explosion from here! Many +thanks to you, kind stranger. What with +all these things comin' out of the ground, +monsters taking over the church, and so +forth, these are trying times. I am but a +poor farmer, but here -- take this with my +great thanks. \ No newline at end of file diff --git a/gamefileshf/texts/quests/farmersOrchard.json b/gamefileshf/texts/quests/farmersOrchard.json new file mode 100755 index 00000000..912c9f18 --- /dev/null +++ b/gamefileshf/texts/quests/farmersOrchard.json @@ -0,0 +1,3 @@ +{ + "load": "texts/lester/quests/farmersOrchard2.json" +} \ No newline at end of file diff --git a/gamefileshf/towners/lester/load.json b/gamefileshf/towners/lester/load.json new file mode 100755 index 00000000..ab7e1133 --- /dev/null +++ b/gamefileshf/towners/lester/load.json @@ -0,0 +1,24 @@ +{ + "action": { + "name": "if.equal", + "param1": "%currentLevel.hasQuest.farmersOrchard%", + "param2": true, + "then": { + "name": ">=", + "param1": "%currentLevel.currentPlayer.level%", + "param2": 15, + "then": { + "name": "if.equal", + "param1": "%currentLevel.quest.farmersOrchard.state%", + "param2": 0, + "then": [ + { "name": "quest.setState", "quest": "farmersOrchard", "state": 1 }, + { "name": "load", "file": "texts/lester/quests/farmersOrchard.json" }, + { "name": "load", "file": "towners/lester/runeBomb.json" } + ], + "else": { "name": "load", "file": "texts/lester/quests/farmersOrchard.json" } + }, + "else": { "name": "load", "file": "texts/lester/quests/farmersOrchard1.json" } + } + } +} \ No newline at end of file diff --git a/gamefileshf/towners/lester/runeBomb.json b/gamefileshf/towners/lester/runeBomb.json new file mode 100755 index 00000000..1b3f6812 --- /dev/null +++ b/gamefileshf/towners/lester/runeBomb.json @@ -0,0 +1,7 @@ +{ + "item": { + "class": "runeBomb", + "mapPosition": [63, 16] + }, + "action": { "name": "item.executeAction", "action": "levelDrop", "mapPosition": [63, 16] } +} \ No newline at end of file diff --git a/gamefileshf/towners/pepin/panelMain.json b/gamefileshf/towners/pepin/panelMain.json new file mode 100755 index 00000000..aba2e1ee --- /dev/null +++ b/gamefileshf/towners/pepin/panelMain.json @@ -0,0 +1,125 @@ +{ + "action": { + "name": "resource.add", + "id": "userPanelMain" + }, + "animation": [ + { + "texturePack": "pentspn2", + "id": "pent1", + "position": [67, 140], + "anchor": "none", + "refresh": 50 + }, + { + "texturePack": "pentspn2", + "id": "pent2", + "position": [537, 140], + "anchor": "none", + "refresh": 50 + } + ], + "text": [ + { + "id": "panelTitle1", + "font": "smaltextGold", + "position": [480, 46], + "anchor": "none", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "Welcome to the" + }, + { + "id": "panelTitle2", + "font": "smaltextGold", + "position": [480, 70], + "anchor": "none", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "Healer's Home" + }, + { + "id": "panelText", + "font": "smaltextGold", + "position": [480, 142], + "anchor": "none", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "Would you like to:" + } + ], + "button": [ + { + "id": "talk", + "font": "smaltextBlue", + "sound": "titlslct", + "focus": true, + "focusSound": "titlemov", + "position": [480, 178], + "anchor": "none", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "Talk to Pepin", + "onClick": { "name": "load", "file": "towners/pepin/panelTalk.json" }, + "onFocus": [ + "anchorLeftPentagram", + "anchorRightPentagram" + ] + }, + { + "id": "buyItems", + "font": "smaltext", + "sound": "titlslct", + "focus": true, + "focusSound": "titlemov", + "position": [480, 202], + "anchor": "none", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "Buy Items", + "onClick": [ + { "name": "resource.ignore", "id": "userPanel", "ignore": true }, + { "name": "resource.ignore", "id": "userPanelMain", "ignore": true }, + { "name": "resource.add", "id": "userPanelBigFrame" }, + { "name": "load", "file": "ui/level/panel/big.json" }, + { "name": "load", "file": "towners/pepin/buy/common.json" }, + { "name": "load", "file": "towners/pepin/buy/panel.json" } + ], + "onFocus": [ + "anchorLeftPentagram", + "anchorRightPentagram" + ] + }, + { + "id": "back", + "font": "smaltext", + "sound": "titlslct", + "focus": true, + "focusSound": "titlemov", + "position": [480, 226], + "anchor": "none", + "horizontalAlign": "center", + "horizontalSpaceOffset": 1, + "text": "Leave Healer's Home", + "onClick": { "name": "resource.popAll", "id": "userPanel" }, + "onFocus": [ + "anchorLeftPentagram", + "anchorRightPentagram" + ] + } + ], + "action": [ + "anchorLeftPentagram", + "anchorRightPentagram", + { + "name": "if.notEqual", + "param1": "%currentLevel.currentPlayer.lifeDamage%", + "param2": 0, + "then": [ + { "name": "sound.loadPlay", "file": "sfx/misc/cast8.wav" }, + { "name": "player.setProperty", "property": "lifeDamage", "value": 0 }, + "updateLifeManaOrbs" + ] + } + ] +} \ No newline at end of file diff --git a/gamefileshf/ui/level/gameSettings.json b/gamefileshf/ui/level/gameSettings.json index a6cc36a5..0f40e93c 100755 --- a/gamefileshf/ui/level/gameSettings.json +++ b/gamefileshf/ui/level/gameSettings.json @@ -2,6 +2,7 @@ "action": [ { "name": "game.setMusicVolume", "volume": {1} }, { "name": "game.setSoundVolume", "volume": {2} }, - { "name": "variable.set", "key": "jog", "val": {3} } + { "name": "game.setGamma", "gamma": {3} }, + { "name": "variable.set", "key": "jog", "value": {4} } ] } \ No newline at end of file diff --git a/gamefileshf/ui/level/menu/game.json b/gamefileshf/ui/level/menu/game.json index ac1bcc20..cdde6b38 100755 --- a/gamefileshf/ui/level/menu/game.json +++ b/gamefileshf/ui/level/menu/game.json @@ -18,7 +18,7 @@ "onClick": [ "menu.saveAndCloseAction", { "name": "load", "file": ["ui/level/msgBox/show.json", "saving..."] }, - { "name": "load", "file": ["ui/singlePlayer/save.json", "|currentLevel|currentPlayer.name|"] }, + { "name": "load", "file": "level/saveGame.json" }, { "name": "loadJson", "json": { "action": "closeMsgBox" } } ], "onFocus": [ @@ -76,7 +76,7 @@ "horizontalSpaceOffset": 2, "onClick": [ "menu.saveAndCloseAction", - { "name": "load", "file": ["level/load2.json", "|currentLevel|path|"] } + { "name": "load", "file": "level/loadCurrentSave.json" } ], "onFocus": [ "anchorLeftPentagram", diff --git a/gamefileshf/ui/level/menu/game2.json b/gamefileshf/ui/level/menu/game2.json index 28ceeffa..ee244238 100755 --- a/gamefileshf/ui/level/menu/game2.json +++ b/gamefileshf/ui/level/menu/game2.json @@ -1,16 +1,16 @@ { "action": [ { "name": "resource.add", "id": "gameMenu2" }, - { "name": "variable.setIfNull", "key": "jog", "val": false }, + { "name": "variable.setIfNull", "key": "jog", "value": false }, { "name": "action.set", "id": "updateAudioProgressBar", "action": [ { "name": "drawable.resizeToPositionX", "id": "progressBar1", "idToPosition": "option1", "offset": 14 }, - { "name": "game.setProperty", "property": "musicVolume", "value": "|progressBar1|size.x|", "propRange": [0, 100], "valueRange": [14, 270] }, + { "name": "game.setProperty", "property": "musicVolume", "value": "%progressBar1.size.x%", "propRange": [0, 100], "valueRange": [14, 270] }, { "name": "if.equal", - "param1": "|game|musicVolume|", + "param1": "%game.musicVolume%", "param2": 0, "then": { "name": "audio.stop", "id": "main" }, "else": { "name": "audio.play", "id": "main" } @@ -22,13 +22,16 @@ "id": "updateSoundProgressBar", "action": [ { "name": "drawable.resizeToPositionX", "id": "progressBar2", "idToPosition": "option2", "offset": 14 }, - { "name": "game.setProperty", "property": "soundVolume", "value": "|progressBar2|size.x|", "propRange": [0, 100], "valueRange": [14, 270] } + { "name": "game.setProperty", "property": "soundVolume", "value": "%progressBar2.size.x%", "propRange": [0, 100], "valueRange": [14, 270] } ] }, { "name": "action.set", "id": "updateGammaProgressBar", - "action": { "name": "drawable.resizeToPositionX", "id": "progressBar3", "idToPosition": "option3", "offset": 14 } + "action": [ + { "name": "drawable.resizeToPositionX", "id": "progressBar3", "idToPosition": "option3", "offset": 14 }, + { "name": "game.setProperty", "property": "gamma", "value": "%progressBar3.size.x%", "propRange": [30, 100], "valueRange": [14, 270] } + ] }, { "name": "action.set", @@ -104,7 +107,7 @@ "name": "action.set", "id": "updateJogLeftKeyboardShortcut", "action": [ - { "name": "variable.set", "key": "jog", "val": false }, + { "name": "variable.set", "key": "jog", "value": false }, "updateJog" ] }, @@ -112,7 +115,7 @@ "name": "action.set", "id": "updateJogRightKeyboardShortcut", "action": [ - { "name": "variable.set", "key": "jog", "val": true }, + { "name": "variable.set", "key": "jog", "value": true }, "updateJog" ] } @@ -135,7 +138,7 @@ }, { "id": "option", - "file":"data/option.cel", + "file": "data/option.cel", "palette": "town" } ], @@ -174,49 +177,49 @@ "id": "optbar1", "position": [261, 119], "anchor": "none", - "texture":"optbar" + "texture": "optbar" }, { "id": "option1", "position": [263, 121], "anchor": "none", - "texture":"option" + "texture": "option" }, { "id": "optbar2", "position": [261, 164], "anchor": "none", - "texture":"optbar" + "texture": "optbar" }, { "id": "option2", "position": [263, 166], "anchor": "none", - "texture":"option" + "texture": "option" }, { "id": "optbar3", "position": [261, 209], "anchor": "none", - "texture":"optbar" + "texture": "optbar" }, { "id": "option3", "position": [263, 211], "anchor": "none", - "texture":"option" + "texture": "option" }, { "id": "optbar4", "position": [261, 254], "anchor": "none", - "texture":"optbar" + "texture": "optbar" }, { "id": "option4", "position": [263, 256], "anchor": "none", - "texture":"option" + "texture": "option" } ], "button": [ @@ -275,8 +278,8 @@ "name": "if.equal", "param1": "%jog%", "param2": false, - "then": { "name": "variable.set", "key": "jog", "val": true }, - "else": { "name": "variable.set", "key": "jog", "val": false } + "then": { "name": "variable.set", "key": "jog", "value": true }, + "else": { "name": "variable.set", "key": "jog", "value": false } }, "updateJog" ] @@ -414,7 +417,7 @@ "horizontalSpaceOffset": 2, "onClick": [ { "name": "resource.pop" }, - { "name": "load", "file": "ui/level/saveSettings.json" }, + "saveSettings", { "name": "load", "file": "ui/level/menu/game.json" } ], "onFocus": [ @@ -427,9 +430,11 @@ "anchorLeftPentagram", "updateJog", { "name": "drawable.anchor", "id": "pent2", "idAnchor": "optbar1", "anchor": "right" }, - { "name": "drawable.moveX", "id": "option1", "idAnchorTo": "progressBar1", "range": 283, "position": "|game|musicVolume|", "max": 100, "steps": 17 }, - { "name": "drawable.moveX", "id": "option2", "idAnchorTo": "progressBar2", "range": 283, "position": "|game|soundVolume|", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option1", "idAnchorTo": "progressBar1", "range": 283, "position": "%game.musicVolume%", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option2", "idAnchorTo": "progressBar2", "range": 283, "position": "%game.soundVolume%", "max": 100, "steps": 17 }, + { "name": "drawable.moveX", "id": "option3", "idAnchorTo": "progressBar3", "range": 283, "position": "%game.gamma%", "min": 30, "max": 100, "steps": 15 }, { "name": "drawable.anchorSizeX", "id": "progressBar1", "idAnchorTo": "option1", "offset": 14 }, - { "name": "drawable.anchorSizeX", "id": "progressBar2", "idAnchorTo": "option2", "offset": 14 } + { "name": "drawable.anchorSizeX", "id": "progressBar2", "idAnchorTo": "option2", "offset": 14 }, + { "name": "drawable.anchorSizeX", "id": "progressBar3", "idAnchorTo": "option3", "offset": 14 } ] } \ No newline at end of file diff --git a/gamefileshf/ui/level/saveSettings.json b/gamefileshf/ui/level/saveSettings.json index a0c1a236..3e51980c 100755 --- a/gamefileshf/ui/level/saveSettings.json +++ b/gamefileshf/ui/level/saveSettings.json @@ -2,8 +2,9 @@ "action": { "name": "file.copy", "file": ["ui/level/gameSettings.json", - "|game|musicVolume|", - "|game|soundVolume|", + "%game.musicVolume%", + "%game.soundVolume%", + "%game.gamma%", "%jog%"], "writeFile": "gameSettings.json" } diff --git a/gamefileshf/ui/mainMenu.json b/gamefileshf/ui/mainMenu.json index 40e74c89..39e1aad6 100755 --- a/gamefileshf/ui/mainMenu.json +++ b/gamefileshf/ui/mainMenu.json @@ -180,16 +180,16 @@ "onHoverLeave": { "name": "text.setText", "id": "versionInfo", - "binding": ["|game|title|", "|game|version|"], + "binding": ["%game.title%", "%game.version%"], "format": "[1] v[2]" } }, "action": [ - { "name": "menu.setFont", "id": "menu", "index": 1, "idFont": "font42y" }, + { "name": "menu.setFont", "id": "menu", "index": 1, "font": "font42y" }, { "name": "text.setText", "id": "versionInfo", - "binding": ["|game|title|", "|game|version|"], + "binding": ["%game.title%", "%game.version%"], "format": "[1] v[2]" } ] diff --git a/gamefileshf/ui/singlePlayer/newHero.json b/gamefileshf/ui/singlePlayer/newHero.json index 64a5d9a5..2c6858a4 100755 --- a/gamefileshf/ui/singlePlayer/newHero.json +++ b/gamefileshf/ui/singlePlayer/newHero.json @@ -8,7 +8,7 @@ { "name": "text.setText", "id": "txtMagic", "text": "10" }, { "name": "text.setText", "id": "txtDexterity", "text": "20" }, { "name": "text.setText", "id": "txtVitality", "text": "25" }, - { "name": "variable.set", "key": "charClass", "val": "Warrior" } + { "name": "variable.set", "key": "charClass", "value": "Warrior" } ], "animation": [ { @@ -35,7 +35,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Warrior" }, + { "name": "variable.set", "key": "charClass", "value": "Warrior" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "30" }, @@ -57,7 +57,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Rogue" }, + { "name": "variable.set", "key": "charClass", "value": "Rogue" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "20" }, @@ -79,7 +79,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Sorceror" }, + { "name": "variable.set", "key": "charClass", "value": "Sorceror" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "15" }, @@ -101,7 +101,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Monk" }, + { "name": "variable.set", "key": "charClass", "value": "Monk" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "25" }, @@ -123,7 +123,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Bard" }, + { "name": "variable.set", "key": "charClass", "value": "Bard" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "20" }, @@ -145,7 +145,7 @@ "anchor": "none", "onClick": [ { "name": "sound.play", "id": "titlemov" }, - { "name": "variable.set", "key": "charClass", "val": "Barbarian" }, + { "name": "variable.set", "key": "charClass", "value": "Barbarian" }, { "name": "load", "file": "ui/singlePlayer/setPlayerImage.json" }, { "name": "text.setText", "id": "txtLevel", "text": "1" }, { "name": "text.setText", "id": "txtStrength", "text": "40" }, diff --git a/gamefileshf/ui/support.json b/gamefileshf/ui/support.json index d2d67d37..d40b19db 100755 --- a/gamefileshf/ui/support.json +++ b/gamefileshf/ui/support.json @@ -11,7 +11,7 @@ }, "texture": { "id": "support", - "file":"ui_art/support.pcx" + "file": "ui_art/support.pcx" }, "image": { "id": "support", diff --git a/src/Actions/ActAudio.h b/src/Actions/ActAudio.h index 64750203..d20720e3 100755 --- a/src/Actions/ActAudio.h +++ b/src/Actions/ActAudio.h @@ -37,13 +37,14 @@ class ActAudioPlay : public Action { private: std::string id; + Variable volume; bool clear; bool loop{ false }; bool hasLoop{ false }; public: - ActAudioPlay(const std::string& id_, bool clear_) - : id(id_), clear(clear_) {} + ActAudioPlay(const std::string& id_, const Variable& volume_, + bool clear_) : id(id_), volume(volume_), clear(clear_) {} void setLoop(bool loop_) noexcept { @@ -63,18 +64,21 @@ class ActAudioPlay : public Action if (hasLoop == true) { song->setLoop(loop); -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) auto musicLoop = dynamic_cast(song.get()); if (musicLoop != nullptr) { musicLoop->setLoop(loop); song->setLoop(true); } -#endif } - song->setVolume((float)game.MusicVolume()); - if (song->getStatus() != sf::Music::Playing) + auto vol = game.getVarOrProp(volume, game.SoundVolume()); + song->setVolume((float)vol); + + if (song->getStatus() != sf::Music::Playing || + song->getPlayingOffset() == sf::Time::Zero || + song->getPlayingOffset() >= song->getDuration()) { + song->stop(); song->play(); } } diff --git a/src/Actions/ActCondition.h b/src/Actions/ActCondition.h index 4267595c..5650157b 100755 --- a/src/Actions/ActCondition.h +++ b/src/Actions/ActCondition.h @@ -3,27 +3,10 @@ #include "Action.h" #include "FileUtils.h" #include "Game.h" +#include "IfCondition.h" #include "Image.h" #include "Parser/ParseVariable.h" #include "Utils/Utils.h" -#include "VarOrPredicate.h" - -static Variable getVariable(const Game& game, const VarOrPredicate& varOrPred) -{ - if (std::holds_alternative(varOrPred) == true) - { - return game.getVarOrProp(std::get(varOrPred)); - } - else - { - auto predicate = std::get>(varOrPred).get(); - if (predicate != nullptr) - { - return predicate->getResult(game); - } - return {}; - } -} class ActIfCondition : public Action { @@ -34,25 +17,6 @@ class ActIfCondition : public Action std::shared_ptr condThen; std::shared_ptr condElse; - bool ifCondition(Game& game, bool condResult) - { - if (condResult == true) - { - if (condThen != nullptr) - { - return condThen->execute(game); - } - } - else - { - if (condElse != nullptr) - { - return condElse->execute(game); - } - } - return true; - } - public: ActIfCondition(uint16_t conditionHash16_, const VarOrPredicate& param1_, @@ -64,24 +28,22 @@ class ActIfCondition : public Action virtual bool execute(Game& game) { - auto var1 = getVariable(game, param1); - auto var2 = getVariable(game, param2); + auto var1 = IfCondition::getVariable(game, param1); + auto var2 = IfCondition::getVariable(game, param2); - switch (conditionHash16) + if (IfCondition::evalCondition(conditionHash16, var1, var2) == true) { - default: - case str2int16("=="): - return ifCondition(game, var1 == var2); - case str2int16("!="): - return ifCondition(game, var1 != var2); - case str2int16(">"): - return ifCondition(game, var1 > var2); - case str2int16(">="): - return ifCondition(game, var1 >= var2); - case str2int16("<"): - return ifCondition(game, var1 < var2); - case str2int16("<="): - return ifCondition(game, var1 <= var2); + if (condThen != nullptr) + { + return condThen->execute(game); + } + } + else + { + if (condElse != nullptr) + { + return condElse->execute(game); + } } return true; } @@ -104,10 +66,10 @@ class ActInListCondition : public Action { if (list.empty() == false) { - auto var1 = getVariable(game, var); + auto var1 = IfCondition::getVariable(game, var); for (const auto& elem : list) { - if (var1 == getVariable(game, elem)) + if (var1 == IfCondition::getVariable(game, elem)) { if (condThen != nullptr) { @@ -125,6 +87,39 @@ class ActInListCondition : public Action } }; +class ActMultiIfCondition : public Action +{ +private: + IfCondition conditions; + std::shared_ptr condThen; + std::shared_ptr condElse; + +public: + ActMultiIfCondition(const std::shared_ptr& then_, + const std::shared_ptr& else_) : condThen(then_), condElse(else_) {} + + IfCondition& Conditions() noexcept { return conditions; } + + virtual bool execute(Game& game) + { + if (conditions.eval(game) == true) + { + if (condThen != nullptr) + { + return condThen->execute(game); + } + } + else + { + if (condElse != nullptr) + { + return condElse->execute(game); + } + } + return true; + } +}; + class ActSwitchCondition : public Action { private: @@ -142,10 +137,10 @@ class ActSwitchCondition : public Action { if (conditions.empty() == false) { - auto var1 = getVariable(game, var); + auto var1 = IfCondition::getVariable(game, var); for (const auto& elem : conditions) { - if (var1 == getVariable(game, elem.first)) + if (var1 == IfCondition::getVariable(game, elem.first)) { if (elem.second != nullptr) { diff --git a/src/Actions/ActDrawable.h b/src/Actions/ActDrawable.h index 1ad05308..bd19593d 100755 --- a/src/Actions/ActDrawable.h +++ b/src/Actions/ActDrawable.h @@ -369,14 +369,15 @@ class ActDrawableMoveX : public Action std::string idAnchorTo; unsigned range; Variable position; + unsigned min; unsigned max; Variable steps; public: ActDrawableMoveX(const std::string& id_, const std::string& idAnchorTo_, - unsigned range_, const Variable& position_, unsigned max_, const Variable& steps_) - : id(id_), idAnchorTo(idAnchorTo_), range(range_), - position(position_), max(max_), steps(steps_) {} + unsigned range_, const Variable& position_, unsigned min_, unsigned max_, + const Variable& steps_) : id(id_), idAnchorTo(idAnchorTo_), range(range_), + position(position_), min(min_), max(max_), steps(steps_) {} virtual bool execute(Game& game) { @@ -387,8 +388,9 @@ class ActDrawableMoveX : public Action auto itemPos = itemAnchor->DrawPosition(); auto itemAnchorPos = itemPos; auto newRange = (float)std::max(0, (int)range - (int)item->Size().x); - auto offset = (float)game.getVarOrProp(position, max); - offset = std::round((offset * newRange) / (float)max); + auto offset = (float)std::clamp(game.getVarOrProp(position), min, max) - min; + auto newMax = max - min; + offset = std::round((offset * newRange) / (float)newMax); auto numSteps = game.getVarOrProp(steps, -1); if (numSteps > 1) { @@ -418,14 +420,15 @@ class ActDrawableMoveY : public Action std::string idAnchorTo; unsigned range; Variable position; + unsigned min; unsigned max; Variable steps; public: ActDrawableMoveY(const std::string& id_, const std::string& idAnchorTo_, - unsigned range_, const Variable& position_, unsigned max_, const Variable& steps_) - : id(id_), idAnchorTo(idAnchorTo_), range(range_), - position(position_), max(max_), steps(steps_) {} + unsigned range_, const Variable& position_, unsigned min_, unsigned max_, + const Variable& steps_) : id(id_), idAnchorTo(idAnchorTo_), range(range_), + position(position_), min(min_), max(max_), steps(steps_) {} virtual bool execute(Game& game) { @@ -436,8 +439,9 @@ class ActDrawableMoveY : public Action auto itemPos = itemAnchor->DrawPosition(); auto itemAnchorPos = itemPos; auto newRange = (float)std::max(0, (int)range - (int)item->Size().y); - auto offset = (float)game.getVarOrProp(position, max); - offset = std::round((offset * newRange) / (float)max); + auto offset = (float)std::clamp(game.getVarOrProp(position), min, max) - min; + auto newMax = max - min; + offset = std::round((offset * newRange) / (float)newMax); auto numSteps = game.getVarOrProp(steps, -1); if (numSteps > 1) { @@ -583,12 +587,12 @@ class ActDrawableResizeXY : public Action if (item != nullptr) { sf::Vector2i inputRange( - (int)game.getVarOrPropLong(inputRangeMin), - (int)game.getVarOrPropLong(inputRangeMax)); + (int)game.getVarOrPropLongV(inputRangeMin), + (int)game.getVarOrPropLongV(inputRangeMax)); if (inputRange.y > inputRange.x) { - auto newSize = game.getVarOrPropLong(size); + auto newSize = game.getVarOrPropLongV(size); newSize = (int64_t)Utils::normalizeNumber( (long)newSize, inputRange, sizeRange); @@ -734,7 +738,7 @@ class ActDrawableSetAction : public Action public: ActDrawableSetAction(const std::string& id_, - const char* name, const std::shared_ptr& action_) + const std::string_view name, const std::shared_ptr& action_) : id(id_), nameHash(str2int16(name)), action(action_) {} virtual bool execute(Game& game) noexcept diff --git a/src/Actions/ActFont.h b/src/Actions/ActFont.h new file mode 100755 index 00000000..cdcc65c2 --- /dev/null +++ b/src/Actions/ActFont.h @@ -0,0 +1,40 @@ +#pragma once + +#include "Action.h" +#include "Font.h" +#include "Game.h" + +class ActFontSetPalette : public Action +{ +private: + std::string id; + std::string idPalette; + sf::Color color; + +public: + ActFontSetPalette(const std::string& id_, + const std::string& idPalette_, const sf::Color& color_) + : id(id_), idPalette(idPalette_), color(color_) {} + + virtual bool execute(Game& game) + { + auto font = game.Resources().getFont(id); + if (holdsBitmapFont(font) == true) + { + auto bitmapFont = std::get>(font); + if (bitmapFont->hasPalette() == true) + { + auto palette = game.Resources().getPalette(idPalette); + if (palette != nullptr) + { + bitmapFont->setPalette(palette); + } + } + else + { + bitmapFont->setColor(color); + } + } + return true; + } +}; diff --git a/src/Actions/ActGame.h b/src/Actions/ActGame.h index e8e7dcde..8f516a4f 100755 --- a/src/Actions/ActGame.h +++ b/src/Actions/ActGame.h @@ -3,6 +3,41 @@ #include "Action.h" #include "Game.h" +class ActGameAddToProperty : public Action +{ +private: + std::string prop; + Variable value; + +public: + ActGameAddToProperty(const std::string& prop_, const Variable& value_) + : prop(prop_), value(value_) {} + + virtual bool execute(Game& game) + { + auto prop2 = game.getVarOrPropStringS(prop); + Variable value2; + if (game.getProperty(prop, value2) == true) + { + if (std::holds_alternative(value2) == true && + std::holds_alternative(value) == true) + { + auto val = std::get(value2) + std::get(value); + value2.emplace(val); + game.setProperty(prop2, value2); + } + else if (std::holds_alternative(value2) == true && + std::holds_alternative(value) == true) + { + auto val = std::get(value2) + std::get(value); + value2.emplace(val); + game.setProperty(prop2, value2); + } + } + return true; + } +}; + class ActGameClearPlayingSounds : public Action { public: @@ -63,6 +98,22 @@ class ActGamePauseOnFocusLoss : public Action } }; +class ActGameSetGamma : public Action +{ +private: + Variable gamma; + +public: + ActGameSetGamma(const Variable& gamma_) noexcept : gamma(gamma_) {} + + virtual bool execute(Game& game) + { + auto val = game.getVarOrProp(gamma, 30u); + game.Gamma(val); + return true; + } +}; + class ActGameSetMusicVolume : public Action { private: @@ -73,8 +124,8 @@ class ActGameSetMusicVolume : public Action virtual bool execute(Game& game) { - auto vol = game.getVarOrProp(volume, 100u); - game.MusicVolume(vol); + auto val = game.getVarOrProp(volume, 100u); + game.MusicVolume(val); return true; } }; @@ -106,7 +157,7 @@ class ActGameSetProperty : public Action virtual bool execute(Game& game) { - auto prop2 = game.getVarOrPropString(prop); + auto prop2 = game.getVarOrPropStringS(prop); auto value2 = game.getVarOrProp(value); if (std::holds_alternative(value2) == true) { @@ -133,8 +184,8 @@ class ActGameSetSoundVolume : public Action virtual bool execute(Game& game) { - auto vol = game.getVarOrProp(volume, 100u); - game.SoundVolume(vol); + auto val = game.getVarOrProp(volume, 100u); + game.SoundVolume(val); return true; } }; diff --git a/src/Actions/ActIO.h b/src/Actions/ActIO.h index 899f14d5..19156067 100755 --- a/src/Actions/ActIO.h +++ b/src/Actions/ActIO.h @@ -3,6 +3,25 @@ #include "Action.h" #include "FileUtils.h" #include "Game.h" +#include "GameUtils.h" + +class ActDirCopy : public Action +{ +private: + std::string dirSrc; + std::string dirDst; + +public: + ActDirCopy(const std::string& dirSrc_, const std::string& dirDst_) + : dirSrc(dirSrc_), dirDst(dirDst_) {} + + virtual bool execute(Game& game) + { + FileUtils::copyDir(GameUtils::replaceStringWithVarOrProp(dirSrc, game).c_str(), + GameUtils::replaceStringWithVarOrProp(dirDst, game).c_str()); + return true; + } +}; class ActDirCreate : public Action { @@ -14,7 +33,7 @@ class ActDirCreate : public Action virtual bool execute(Game& game) { - FileUtils::createDir(game.getVarOrPropString(dir).c_str()); + FileUtils::createDir(GameUtils::replaceStringWithVarOrProp(dir, game).c_str()); return true; } }; @@ -37,7 +56,8 @@ class ActFileCopy : public Action if (filesRead.size() > 0) { const auto& fileRead = filesRead[0]; - auto str = FileUtils::readText(game.getVarOrPropString(fileRead).c_str()); + auto str = FileUtils::readText( + GameUtils::replaceStringWithVarOrProp(fileRead, game).c_str()); std::string param; Variable var2; @@ -50,20 +70,7 @@ class ActFileCopy : public Action (varStr.front() == '%') && (varStr.back() == '%')) { - if (game.getVariable(filesRead[i], var2) == true) - { - param = VarUtils::toString(var2); - } - else - { - param = nullText; - } - } - else if ((varStr.size() > 2) && - (varStr.front() == '|') && - (varStr.back() == '|')) - { - if (GameUtils::getObjectProperty(game, varStr, var2) == true) + if (game.getVarOrProp(varStr, var2) == true) { param = VarUtils::toString(var2); } @@ -76,24 +83,23 @@ class ActFileCopy : public Action { param = varStr; } - Utils::replaceStringInPlace(str, "{" + std::to_string(i) + "}", param); + Utils::replaceStringInPlace(str, "{" + Utils::toString(i) + "}", param); } - auto writePath = game.getVarOrPropString(dir); + auto writePath = GameUtils::replaceStringWithVarOrProp(dir, game); if (writePath.size() > 0 && Utils::endsWith(writePath, "/") == false) { writePath += '/'; - FileUtils::createDir(writePath.c_str()); } if (fileWrite.size() > 0) { - writePath += game.getVarOrPropString(fileWrite); + writePath += game.getVarOrPropStringS(fileWrite); } else { - writePath += game.getVarOrPropString(FileUtils::getFileFromPath(fileRead)); + writePath += game.getVarOrPropStringS(FileUtils::getFileFromPath(fileRead)); } - FileUtils::saveText(writePath.c_str(), str); + FileUtils::saveText(writePath, str); } return true; } @@ -109,7 +115,7 @@ class ActIODelete : public Action virtual bool execute(Game& game) { - FileUtils::deleteFile(game.getVarOrPropString(dir).c_str()); + FileUtils::deleteFile(GameUtils::replaceStringWithVarOrProp(dir, game).c_str()); return true; } }; @@ -118,13 +124,15 @@ class ActIODeleteAll : public Action { private: std::string dir; + bool deleteRoot; public: - ActIODeleteAll(const std::string& dir_) : dir(dir_) {} + ActIODeleteAll(const std::string& dir_, bool deleteRoot_) + : dir(dir_), deleteRoot(deleteRoot_) {} virtual bool execute(Game& game) { - FileUtils::deleteAll(game.getVarOrPropString(dir).c_str()); + FileUtils::deleteAll(GameUtils::replaceStringWithVarOrProp(dir, game).c_str(), deleteRoot); return true; } }; diff --git a/src/Actions/ActImage.h b/src/Actions/ActImage.h index 39a44724..7df19e10 100755 --- a/src/Actions/ActImage.h +++ b/src/Actions/ActImage.h @@ -70,12 +70,12 @@ class ActImageInverseResizeXY : public Action if (image != nullptr) { sf::Vector2i inputRange( - (int)game.getVarOrPropLong(inputRangeMin), - (int)game.getVarOrPropLong(inputRangeMax)); + (int)game.getVarOrPropLongV(inputRangeMin), + (int)game.getVarOrPropLongV(inputRangeMax)); if (inputRange.y > inputRange.x) { - auto newSize = (int)game.getVarOrPropLong(size); + auto newSize = (int)game.getVarOrPropLongV(size); newSize = (int)Utils::normalizeNumber( (long)newSize, inputRange, sizeRange); @@ -197,54 +197,32 @@ class ActImageSetTexture : public Action } }; -class ActImageSetTextureFromItem : public Action +class ActImageSetTextureFromQueryable : public Action { private: std::string id; - std::string idLevel; - ItemLocation itemLocation; + std::string query; + size_t textureIdx; bool resetRect; public: - ActImageSetTextureFromItem(const std::string& id_, const std::string& idLevel_, - const ItemLocation& itemLocation_, bool resetRect_) : id(id_), - idLevel(idLevel_), itemLocation(itemLocation_), resetRect(resetRect_) {} + ActImageSetTextureFromQueryable(const std::string& id_, + const std::string& query_, size_t textureIdx_, + bool resetRect_) : id(id_), query(query_), + textureIdx(textureIdx_), resetRect(resetRect_) {} virtual bool execute(Game& game) { auto image = game.Resources().getResource(id); if (image != nullptr) { - auto level = game.Resources().getLevel(idLevel); - if (level != nullptr) + auto queryable = game.getQueryable(query); + if (queryable != nullptr) { - auto item = level->getItem(itemLocation); - if (item != nullptr) + TextureInfo ti; + if (queryable->getTexture(textureIdx, ti) == true) { - TextureInfo ti; - if (item->Class()->getInventoryTexture(ti) == true) - { - image->setTexture(*ti.texture); - if (resetRect == true) - { - image->setTextureRect(ti.textureRect); - } - else - { - auto oldRect = image->getTextureRect(); - oldRect.left = ti.textureRect.left; - oldRect.top = ti.textureRect.top; - image->setTextureRect(oldRect); - } - } - if (item->Class()->getInventoryTexturePack()->isIndexed() == true) - { - image->setPalette(item->Class()->getInventoryTexturePack()->getPalette()); - } - else - { - image->setPalette(nullptr); - } + image->setTexture(ti, resetRect); } } } @@ -277,26 +255,7 @@ class ActImageSetTextureFromPack : public Action TextureInfo ti; if (tex->get(textureIdx, ti) == true) { - image->setTexture(*ti.texture); - if (resetRect == true) - { - image->setTextureRect(ti.textureRect); - } - else - { - auto oldRect = image->getTextureRect(); - oldRect.left = ti.textureRect.left; - oldRect.top = ti.textureRect.top; - image->setTextureRect(oldRect); - } - } - if (tex->isIndexed() == true) - { - image->setPalette(tex->getPalette()); - } - else - { - image->setPalette(nullptr); + image->setTexture(ti, resetRect); } } } diff --git a/src/Actions/ActItem.h b/src/Actions/ActItem.h index dbb99211..1018ce07 100755 --- a/src/Actions/ActItem.h +++ b/src/Actions/ActItem.h @@ -10,20 +10,73 @@ static void updateCursorWithItemImage(Game& game, const Item& item) { TextureInfo ti; - if (item.Class()->getInventoryTexture(ti) == true) + if (item.getTexture(1, ti) == true) { - auto image = std::make_shared(*ti.texture); - image->setTextureRect(ti.textureRect); - if (item.Class()->getInventoryTexturePack()->isIndexed() == true) - { - image->setPalette(item.Class()->getInventoryTexturePack()->getPalette()); - } + auto image = std::make_shared(); + image->setTexture(ti, true); image->setOrigin(); game.Resources().addCursor(image); game.updateCursorPosition(); } } +class ActItemAddCursor : public Action +{ +private: + std::string idLevel; + ItemLocation itemLocation; + +public: + ActItemAddCursor(const std::string& idLevel_, const ItemLocation& itemLocation_) + : idLevel(idLevel_), itemLocation(itemLocation_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(idLevel); + if (level != nullptr) + { + auto item = level->getItem(itemLocation); + if (item != nullptr) + { + updateCursorWithItemImage(game, *item); + } + } + return true; + } +}; + +class ActItemAddQuantity : public Action +{ +private: + std::string idLevel; + ItemLocation itemLocation; + Variable quantity; + bool remove; + +public: + ActItemAddQuantity(const std::string& idLevel_, const ItemLocation& itemLocation_, + const Variable& quantity_, bool remove_) : idLevel(idLevel_), + itemLocation(itemLocation_), quantity(quantity_), remove(remove_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(idLevel); + if (level != nullptr) + { + auto quantVal = (LevelObjValue)game.getVarOrPropLongV(quantity); + if (quantVal != 0) + { + if (remove == true) + { + quantVal = -std::abs(quantVal); + } + level->addItemQuantity(itemLocation, quantVal); + } + } + return true; + } +}; + class ActItemDelete : public Action { private: @@ -83,32 +136,40 @@ class ActItemDrop : public Action } }; -class ActItemExecuteDropAction : public Action +class ActItemExecuteAction : public Action { private: std::string idLevel; - std::string idPlayer; + ItemLocation itemLocation; + uint16_t actionHash16; public: - ActItemExecuteDropAction(const std::string& idLevel_, const std::string& idPlayer_) - : idLevel(idLevel_), idPlayer(idPlayer_) {} + ActItemExecuteAction(const std::string& idLevel_, + const ItemLocation& itemLocation_, uint16_t actionHash16_) + : idLevel(idLevel_), itemLocation(itemLocation_), actionHash16(actionHash16_) {} virtual bool execute(Game& game) { auto level = game.Resources().getLevel(idLevel); if (level != nullptr) { - auto player = level->getPlayerOrCurrent(idPlayer); - if (player != nullptr && - player->SelectedItem() == nullptr) + Player* player; + auto item = level->getItem(itemLocation, player); + + if (holdsItemCoordInventory(itemLocation) == true && + std::get(itemLocation).isSelectedItem() == true && + player != nullptr) { auto mapPos = player->MapPositionMoveTo(); - auto item = level->getItem(mapPos); - if (item != nullptr) + item = level->getItem(mapPos); + } + if (item != nullptr) + { + if (actionHash16 == str2int16("levelDrop")) { item->resetDropAnimation(*level); - item->Class()->executeAction(game, str2int16("levelDrop")); } + item->Class()->executeAction(game, actionHash16); } } return true; @@ -122,12 +183,13 @@ class ActItemLoadFromLevel : public Action ItemCoordInventory itemCoord; InventoryPosition invPos{ InventoryPosition::TopLeft }; bool useInvPos{ false }; + bool splitIntoMultiple{ false }; std::shared_ptr inventoryFullAction; public: ActItemLoadFromLevel(const std::string& idLevel_, - const ItemCoordInventory& itemCoord_) - : idLevel(idLevel_), itemCoord(itemCoord_) {} + const ItemCoordInventory& itemCoord_, bool splitIntoMultiple_) + : idLevel(idLevel_), itemCoord(itemCoord_), splitIntoMultiple(splitIntoMultiple_) {} void setInventoryPosition(InventoryPosition invPos_) noexcept { @@ -171,7 +233,8 @@ class ActItemLoadFromLevel : public Action size_t invIdx = itemCoord.getInventoryIdx(); if (invIdx < player->getInventorySize()) { - if (player->setItemInFreeSlot(invIdx, item2, invPos) == true) + if (player->setItemInFreeSlot( + invIdx, item2, invPos, splitIntoMultiple) == true) { item->Class()->executeAction(game, str2int16("levelPick")); } @@ -238,7 +301,7 @@ class ActItemSetProperty : public Action auto item = level->getItem(itemLocation, player); if (item != nullptr) { - auto prop2 = game.getVarOrPropString(prop); + auto prop2 = game.getVarOrPropStringS(prop); if (prop2.empty() == false) { auto value2 = game.getVarOrProp(value); @@ -408,11 +471,14 @@ class ActItemUse : public Action if (item != nullptr && player != nullptr) { - if (player->canUseItem(*item) == true && - item->use(*player, level) == true) + uint32_t itemsLeft; + if (item->use(*player, level, itemsLeft) == true) { item->Class()->executeAction(game, str2int16("use")); - level->deleteItem(itemCoord); + if (itemsLeft == 0) + { + level->deleteItem(itemCoord); + } } } } diff --git a/src/Actions/ActLevel.h b/src/Actions/ActLevel.h index a4817260..8c07817b 100755 --- a/src/Actions/ActLevel.h +++ b/src/Actions/ActLevel.h @@ -84,6 +84,25 @@ class ActLevelClearPlayerTextures : public Action } }; +class ActLevelClearQuests : public Action +{ +private: + std::string id; + +public: + ActLevelClearQuests(const std::string& id_) : id(id_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(id); + if (level != nullptr) + { + level->clearQuests(); + } + return true; + } +}; + class ActLevelMove : public Action { private: @@ -173,21 +192,139 @@ class ActLevelSave : public Action private: std::string id; std::string file; - bool skipDefaults; - bool skipCurrentPlayer; + bool saveDefaults; + bool saveCurrentPlayer; + bool saveQuests; public: ActLevelSave(const std::string& id_, const std::string& file_, - bool skipDefaults_, bool skipCurrentPlayer_) - : id(id_), file(file_), skipDefaults(skipDefaults_), - skipCurrentPlayer(skipCurrentPlayer_) {} + bool saveDefaults_, bool saveCurrentPlayer_, bool saveQuests_) + : id(id_), file(file_), saveDefaults(saveDefaults_), + saveCurrentPlayer(saveCurrentPlayer_), saveQuests(saveQuests_) {} virtual bool execute(Game& game) noexcept { auto level = game.Resources().getLevel(id); if (level != nullptr) { - level->save(file, skipDefaults, skipCurrentPlayer); + Save::Properties props; + props.saveDefaults = saveDefaults; + props.saveCurrentPlayer = saveCurrentPlayer; + props.saveQuests = saveQuests; + + level->save(GameUtils::replaceStringWithVarOrProp(file, game).c_str(), + props, game); + } + return true; + } +}; + +class ActLevelSetAutomap : public Action +{ +private: + std::string id; + std::string idTexturePack; + std::pair tileSize; + +public: + ActLevelSetAutomap(const std::string& id_, const std::string& idTexturePack_, + const std::pair& tileSize_) : id(id_), + idTexturePack(idTexturePack_), tileSize(tileSize_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(id); + if (level != nullptr) + { + auto automap = game.Resources().getTexturePack(idTexturePack); + if (automap != nullptr) + { + level->setAutomap(automap, tileSize.first, tileSize.second); + } + } + return true; + } +}; + +class ActLevelSetAutomapBackground : public Action +{ +private: + std::string id; + sf::Color background; + +public: + ActLevelSetAutomapBackground(const std::string& id_, const sf::Color color_) + : id(id_), background(color_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(id); + if (level != nullptr) + { + level->setAutomapBackgroundColor(background); + } + return true; + } +}; + +class ActLevelSetAutomapPosition : public Action +{ +private: + std::string id; + sf::Vector2i position; + +public: + ActLevelSetAutomapPosition(const std::string& id_, const sf::Vector2i& position_) + : id(id_), position(position_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(id); + if (level != nullptr) + { + level->setAutomapRelativePosition(position); + } + return true; + } +}; + +class ActLevelSetAutomapSize : public Action +{ +private: + std::string id; + sf::Vector2i size; + +public: + ActLevelSetAutomapSize(const std::string& id_, const sf::Vector2i& size_) + : id(id_), size(size_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(id); + if (level != nullptr) + { + level->setAutomapRelativeSize(size); + } + return true; + } +}; + +class ActLevelShowAutomap : public Action +{ +private: + std::string id; + bool show; + +public: + ActLevelShowAutomap(const std::string& id_, bool show_) + : id(id_), show(show_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(id); + if (level != nullptr) + { + level->ShowAutomap(show); } return true; } diff --git a/src/Actions/ActLevelObject.h b/src/Actions/ActLevelObject.h index 1c85d6c3..72c07d63 100755 --- a/src/Actions/ActLevelObject.h +++ b/src/Actions/ActLevelObject.h @@ -4,6 +4,73 @@ #include "Game.h" #include "Game/LevelObject.h" +class ActLevelObjDelete : public Action +{ +private: + std::string idLevel; + std::string idObject; + +public: + ActLevelObjDelete(const std::string& idLevel_, const std::string& idObject_) + : idLevel(idLevel_), idObject(idObject_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(idLevel); + if (level != nullptr) + { + level->deleteLevelObjectById(idObject); + } + return true; + } +}; + +class ActLevelObjDeleteByClass : public Action +{ +private: + std::string idLevel; + std::string idClass; + +public: + ActLevelObjDeleteByClass(const std::string& idLevel_, const std::string& idClass_) + : idLevel(idLevel_), idClass(idClass_) {} + + virtual bool execute(Game& game) + { + auto level = game.Resources().getLevel(idLevel); + if (level != nullptr) + { + level->deleteLevelObjectByClass(idClass); + } + return true; + } +}; + +class ActLevelObjExecuteAction : public Action +{ +private: + std::string idLevel; + std::string idObject; + +public: + ActLevelObjExecuteAction(const std::string& idLevel_, + const std::string& idObject_) : idLevel(idLevel_), idObject(idObject_) {} + + virtual bool execute(Game& game) noexcept + { + auto level = game.Resources().getLevel(idLevel); + if (level != nullptr) + { + auto obj = level->getLevelObject(idObject); + if (obj != nullptr) + { + obj->executeAction(game); + } + } + return true; + } +}; + class ActLevelObjSetOutline : public Action { private: diff --git a/src/Actions/ActLoad.h b/src/Actions/ActLoad.h index a7a35177..1a607ef8 100755 --- a/src/Actions/ActLoad.h +++ b/src/Actions/ActLoad.h @@ -67,7 +67,7 @@ class ActLoadRandom : public Action { if (args.size() > 0) { - auto files = FileUtils::getFileList(args[0].c_str(), endsWith); + auto files = FileUtils::getFileList(args[0], endsWith); if (files.size() > 0) { diff --git a/src/Actions/ActMenu.h b/src/Actions/ActMenu.h index f86f8319..3d0d6827 100755 --- a/src/Actions/ActMenu.h +++ b/src/Actions/ActMenu.h @@ -207,19 +207,19 @@ class ActMenuSetFont : public Action { auto newFont = game.Resources().getFont(idFont); auto text = button->getDrawableText(); - if (hasNullFont(newFont) == false && + if (holdsNullFont(newFont) == false && text != nullptr) { auto bitmapText = dynamic_cast(text); if (bitmapText != nullptr && - hasBitmapFont(newFont) == true) + holdsBitmapFont(newFont) == true) { bitmapText->setFont(std::get>(newFont)); return true; } auto stringText = dynamic_cast(text); if (stringText != nullptr && - hasFreeTypeFont(newFont) == true) + holdsFreeTypeFont(newFont) == true) { stringText->setFont(*std::get>(newFont)); } @@ -245,7 +245,7 @@ class ActMenuSetIndex : public Action auto menu = game.Resources().getResource(id); if (menu != nullptr) { - auto idx = (size_t)game.getVarOrPropLong(idxVar); + auto idx = (size_t)game.getVarOrPropLongV(idxVar); menu->setCurrentIdx(idx); } return true; diff --git a/src/Actions/ActMovie.h b/src/Actions/ActMovie.h index 9b1bfc40..9085d791 100755 --- a/src/Actions/ActMovie.h +++ b/src/Actions/ActMovie.h @@ -15,7 +15,7 @@ class ActMoviePause : public Action virtual bool execute(Game& game) { - auto movie = game.Resources().getResource(id); + auto movie = game.Resources().getResource(id); if (movie != nullptr) { movie->pause(); @@ -34,7 +34,7 @@ class ActMoviePlay : public Action virtual bool execute(Game& game) { - auto movie = game.Resources().getResource(id); + auto movie = game.Resources().getResource(id); if (movie != nullptr) { movie->play(); diff --git a/src/Actions/ActPalette.h b/src/Actions/ActPalette.h index 35bdc479..caf5d7b1 100755 --- a/src/Actions/ActPalette.h +++ b/src/Actions/ActPalette.h @@ -6,6 +6,33 @@ #include #include +class ActPaletteReplace : public Action +{ +private: + std::string idDstPal; + std::string idSrcPal; + size_t srcStart; + size_t size; + size_t dstStart; + +public: + ActPaletteReplace(const std::string& idDstPal_, const std::string& idSrcPal_, + size_t srcStart_, size_t size_, size_t dstStart_) noexcept + : idDstPal(idDstPal_), idSrcPal(idSrcPal_), srcStart(srcStart_), + size(size_), dstStart(dstStart_) {} + + virtual bool execute(Game& game) + { + auto dstPal = game.Resources().getPalette(idDstPal); + auto srcPal = game.Resources().getPalette(idSrcPal); + if (dstPal != nullptr && srcPal != nullptr) + { + dstPal->replaceRange(*srcPal, srcStart, size, dstStart); + } + return false; + } +}; + class ActPaletteShiftLeft : public Action { private: diff --git a/src/Actions/ActPlayer.h b/src/Actions/ActPlayer.h index 143520e5..e2a1cde1 100755 --- a/src/Actions/ActPlayer.h +++ b/src/Actions/ActPlayer.h @@ -6,37 +6,44 @@ #include "Game/Level.h" #include -class ActPlayerAddGold : public Action +class ActPlayerAddItemQuantity : public Action { private: std::string idPlayer; std::string idLevel; - Variable gold; + std::string itemClass; + InventoryPosition invPos{ InventoryPosition::TopLeft }; + Variable quantity; bool remove; public: - ActPlayerAddGold(const std::string& idPlayer_, const std::string& idLevel_, - const Variable& gold_, bool remove_) : idPlayer(idPlayer_), idLevel(idLevel_), - gold(gold_), remove(remove_) {} + ActPlayerAddItemQuantity(const std::string& idPlayer_, const std::string& idLevel_, + const std::string& itemClass_, InventoryPosition invPos_, const Variable& quantity_, + bool remove_) : idPlayer(idPlayer_), idLevel(idLevel_), itemClass(itemClass_), + invPos(invPos_), quantity(quantity_), remove(remove_) {} virtual bool execute(Game& game) { auto level = game.Resources().getLevel(idLevel); if (level != nullptr) { - auto player = level->getPlayerOrCurrent(idPlayer); - if (player != nullptr) + auto itemClassPtr = level->getItemClass(itemClass); + if (itemClassPtr != nullptr) { - auto goldVal = (LevelObjValue)game.getVarOrPropLong(gold); - if (goldVal != 0) + auto player = level->getPlayerOrCurrent(idPlayer); + if (player != nullptr) { - if (remove == true) - { - player->addGold(*level, -std::abs(goldVal)); - } - else + auto quantVal = (LevelObjValue)game.getVarOrPropLongV(quantity); + if (quantVal != 0) { - player->addGold(*level, goldVal); + if (remove == true) + { + player->addItemQuantity(*itemClassPtr, -std::abs(quantVal), invPos); + } + else + { + player->addItemQuantity(*itemClassPtr, quantVal, invPos); + } } } } @@ -67,7 +74,7 @@ class ActPlayerAddToProperty : public Action auto player = level->getPlayerOrCurrent(idPlayer); if (player != nullptr) { - auto propVal = game.getVarOrPropString(prop); + auto propVal = game.getVarOrPropStringS(prop); if (propVal.empty() == false) { auto value2 = game.getVarOrProp(value); @@ -181,26 +188,28 @@ class ActPlayerMoveToClick : public Action } }; -class ActPlayerSave : public Action +class ActPlayerSelectSpell : public Action { private: std::string idPlayer; std::string idLevel; - std::string file; - bool skipDefaults; + std::string spell; public: - ActPlayerSave(const std::string& idPlayer_, const std::string& idLevel_, - const std::string& file_, bool skipDefaults_) : idPlayer(idPlayer_), - idLevel(idLevel_), file(file_), skipDefaults(skipDefaults_) {} + ActPlayerSelectSpell(const std::string& idPlayer_, + const std::string& idLevel_, const std::string& spell_) + : idPlayer(idPlayer_), idLevel(idLevel_), spell(spell_) {} - virtual bool execute(Game& game) noexcept + virtual bool execute(Game& game) { auto level = game.Resources().getLevel(idLevel); if (level != nullptr) { - auto obj = level->getPlayerOrCurrent(idPlayer); - level->save(file, *obj, skipDefaults); + auto player = level->getPlayerOrCurrent(idPlayer); + if (player != nullptr) + { + player->SelectedSpell(spell); + } } return true; } @@ -281,7 +290,7 @@ class ActPlayerSetProperty : public Action auto player = level->getPlayerOrCurrent(idPlayer); if (player != nullptr) { - auto prop2 = game.getVarOrPropString(prop); + auto prop2 = game.getVarOrPropStringS(prop); if (prop2.empty() == false) { auto value2 = game.getVarOrProp(value); @@ -341,6 +350,7 @@ class ActPlayerSetTextureIndex : public Action if (player != nullptr) { player->setTextureIdx(idx); + player->updateTexture(); } } return true; diff --git a/src/Actions/ActResource.h b/src/Actions/ActResource.h index e2600014..b64635c2 100755 --- a/src/Actions/ActResource.h +++ b/src/Actions/ActResource.h @@ -49,6 +49,24 @@ class ActResourceIgnore : public Action } }; +class ActResourceMoveToTop : public Action +{ +private: + std::string id; + +public: + ActResourceMoveToTop(const std::string& id_) : id(id_) {} + + virtual bool execute(Game& game) + { + if (id.empty() == false) + { + game.Resources().moveResourceToTop(id); + } + return true; + } +}; + class ActResourcePop : public Action { private: diff --git a/src/Actions/ActSound.h b/src/Actions/ActSound.h index 4a64057e..55e02aaa 100755 --- a/src/Actions/ActSound.h +++ b/src/Actions/ActSound.h @@ -27,7 +27,7 @@ class ActSoundLoadPlay : public Action if (sndBuffer == nullptr && id.empty() == false) { - sndBuffer = Parser::parseSoundObj(game, id, file); + sndBuffer = Parser::parseSoundObj(game, id, file, {}); } if (sndBuffer != nullptr) { diff --git a/src/Actions/ActText.h b/src/Actions/ActText.h index 5dfd0077..1988b597 100755 --- a/src/Actions/ActText.h +++ b/src/Actions/ActText.h @@ -4,7 +4,7 @@ #include "BitmapText.h" #include "Game.h" #include "StringText.h" -#include "Text2.h" +#include "Text.h" #include "TextUtils.h" class ActTextAppendText : public Action @@ -36,7 +36,7 @@ class ActTextAppendText : public Action virtual bool execute(Game& game) { - auto text = game.Resources().getResource(id); + auto text = game.Resources().getResource(id); if (text != nullptr) { auto str = text->getText(); @@ -58,7 +58,7 @@ class ActTextSetColor : public Action virtual bool execute(Game& game) { - auto text = game.Resources().getResource(id); + auto text = game.Resources().getResource(id); if (text != nullptr) { text->setColor(color); @@ -79,24 +79,24 @@ class ActTextSetFont : public Action virtual bool execute(Game& game) { - auto text2 = game.Resources().getResource(id); + auto text2 = game.Resources().getResource(id); if (text2 != nullptr) { auto newFont = game.Resources().getFont(idFont); auto text = text2->getDrawableText(); - if (hasNullFont(newFont) == false && + if (holdsNullFont(newFont) == false && text != nullptr) { auto bitmapText = dynamic_cast(text); if (bitmapText != nullptr && - hasBitmapFont(newFont) == true) + holdsBitmapFont(newFont) == true) { bitmapText->setFont(std::get>(newFont)); return true; } auto stringText = dynamic_cast(text); if (stringText != nullptr && - hasFreeTypeFont(newFont) == true) + holdsFreeTypeFont(newFont) == true) { stringText->setFont(*std::get>(newFont)); } @@ -132,7 +132,7 @@ class ActTextSetSpacing : public Action virtual bool execute(Game& game) { - auto text = game.Resources().getResource(id); + auto text = game.Resources().getResource(id); if (text != nullptr) { if (hasHorizSpaceOffset == true) @@ -177,7 +177,7 @@ class ActTextSetText : public Action virtual bool execute(Game& game) { - auto text = game.Resources().getResource(id); + auto text = game.Resources().getResource(id); if (text != nullptr) { text->setText(TextUtils::getText(game, textOp, textFormat, bindings)); diff --git a/src/Actions/ActVariable.h b/src/Actions/ActVariable.h index d8f783e5..729d0e27 100755 --- a/src/Actions/ActVariable.h +++ b/src/Actions/ActVariable.h @@ -4,6 +4,40 @@ #include "Game.h" #include "UIObject.h" +class ActVariableAdd : public Action +{ +private: + std::string key; + Variable value; + +public: + ActVariableAdd(const std::string& key_, const Variable& value_) + : key(key_), value(value_) {} + + virtual bool execute(Game& game) + { + Variable value2; + if (game.getVariableNoToken(key, value2) == true) + { + if (std::holds_alternative(value2) == true && + std::holds_alternative(value) == true) + { + auto val = std::get(value2) + std::get(value); + value2.emplace(val); + game.setVariable(key, value2); + } + else if (std::holds_alternative(value2) == true && + std::holds_alternative(value) == true) + { + auto val = std::get(value2) + std::get(value); + value2.emplace(val); + game.setVariable(key, value2); + } + } + return true; + } +}; + class ActVariableClear : public Action { private: @@ -106,7 +140,7 @@ class ActVariableSetIfNull : public Action if (key.size() > 0) { Variable var; - if (game.getVariableNoPercentage(key, var) == false) + if (game.getVariableNoToken(key, var) == false) { game.setVariable(key, val); } diff --git a/src/Actions/Action.h b/src/Actions/Action.h index d6d50ce9..47540651 100755 --- a/src/Actions/Action.h +++ b/src/Actions/Action.h @@ -5,6 +5,6 @@ class Game; class Action { public: - virtual ~Action() {} + virtual ~Action() = default; virtual bool execute(Game& game) = 0; }; diff --git a/src/Anchor.h b/src/Anchor.h index 98ccf490..49f0b7c1 100755 --- a/src/Anchor.h +++ b/src/Anchor.h @@ -14,10 +14,10 @@ enum class Anchor : int using T = std::underlying_type_t; -inline Anchor operator~ (Anchor a) noexcept { return (Anchor)~static_cast(a); } -inline Anchor operator| (Anchor a, Anchor b) noexcept { return (Anchor)(static_cast(a) | static_cast(b)); } -inline Anchor operator& (Anchor a, Anchor b) noexcept { return (Anchor)(static_cast(a) & static_cast(b)); } -inline Anchor operator^ (Anchor a, Anchor b) noexcept { return (Anchor)(static_cast(a) ^ static_cast(b)); } -inline Anchor& operator|= (Anchor& a, Anchor b) noexcept { a = (Anchor)(static_cast(a) | static_cast(b)); return a; } -inline Anchor& operator&= (Anchor& a, Anchor b) noexcept { a = (Anchor)(static_cast(a) & static_cast(b)); return a; } -inline Anchor& operator^= (Anchor& a, Anchor b) noexcept { a = (Anchor)(static_cast(a) ^ static_cast(b)); return a; } +constexpr Anchor operator~ (Anchor a) noexcept { return (Anchor)~static_cast(a); } +constexpr Anchor operator| (Anchor a, Anchor b) noexcept { return (Anchor)(static_cast(a) | static_cast(b)); } +constexpr Anchor operator& (Anchor a, Anchor b) noexcept { return (Anchor)(static_cast(a) & static_cast(b)); } +constexpr Anchor operator^ (Anchor a, Anchor b) noexcept { return (Anchor)(static_cast(a) ^ static_cast(b)); } +constexpr Anchor& operator|= (Anchor& a, Anchor b) noexcept { a = (Anchor)(static_cast(a) | static_cast(b)); return a; } +constexpr Anchor& operator&= (Anchor& a, Anchor b) noexcept { a = (Anchor)(static_cast(a) & static_cast(b)); return a; } +constexpr Anchor& operator^= (Anchor& a, Anchor b) noexcept { a = (Anchor)(static_cast(a) ^ static_cast(b)); return a; } diff --git a/src/AudioSource.h b/src/AudioSource.h index 64534c68..b8e8f96b 100755 --- a/src/AudioSource.h +++ b/src/AudioSource.h @@ -7,7 +7,6 @@ #include #include -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) struct SoundBufferLoops { sf::SoundBuffer soundBuffer; @@ -29,9 +28,3 @@ typedef std::variant< std::shared_ptr, std::shared_ptr> AudioSource; -#else -typedef std::variant< - std::shared_ptr, - std::shared_ptr> - AudioSource; -#endif diff --git a/src/BaseAnimation.cpp b/src/BaseAnimation.cpp index 744686ad..aaa811aa 100755 --- a/src/BaseAnimation.cpp +++ b/src/BaseAnimation.cpp @@ -53,17 +53,22 @@ bool BaseAnimation::update(sf::Time elapsedTime) noexcept return false; } - // add delta time currentTime += elapsedTime; - // if current time is bigger then the frame time advance one frame - if (currentTime >= frameTime) + if (currentTime < frameTime) { - // reset time, but keep the remainder - currentTime = sf::microseconds(currentTime.asMicroseconds() % frameTime.asMicroseconds()); - - updateFrameIndex(); - return true; + return false; } - return false; + do + { + currentTime -= frameTime; + updateFrameIndex(); + if (animType == AnimationType::PlayOnce && + currentTextureIdx >= textureIndexRange.second) + { + break; + } + } while (currentTime >= frameTime); + + return true; } diff --git a/src/BitmapButton.cpp b/src/BitmapButton.cpp index 4eb02adc..2910c705 100755 --- a/src/BitmapButton.cpp +++ b/src/BitmapButton.cpp @@ -25,5 +25,5 @@ void BitmapButton::update(Game& game) return; } auto contains = sprite.getGlobalBounds().contains(game.MousePositionf()); - Button::update(game, contains); + Button::updateEvents(game, contains); } diff --git a/src/BitmapFont.cpp b/src/BitmapFont.cpp index abea9756..87f06218 100755 --- a/src/BitmapFont.cpp +++ b/src/BitmapFont.cpp @@ -1,254 +1,13 @@ #include "BitmapFont.h" #include -#include "Game.h" +#include "SFML/Sprite2.h" -// This piece of code was originally from Lazy Foo' Productions (http://lazyfoo.net/) -void BitmapFont::calculateCharSizes(const sf::Image& img, bool verticalDirection) +BitmapFont::BitmapFont(const std::shared_ptr& charTextures_, int padding_) + : charTextures(charTextures_), padding(padding_) { - //Set the background color - auto bgColor = img.getPixel(0, 0); - - //Set the cell dimensions - int cellW = img.getSize().x / columns; - int cellH = img.getSize().y / rows; - - //New line variables - int top = cellH; - int baseA = cellH; - - //The current character we're setting - int currentChar = 0; - - //Go through the cell rows - int iRow = 0; - int iCol = 0; - while (currentChar < 256) - { - //Set the character offset - chars[currentChar].left = cellW * iCol; - chars[currentChar].top = cellH * iRow; - - //Set the dimensions of the character - chars[currentChar].width = cellW; - chars[currentChar].height = cellH; - - //Find Left Side - //Go through pixel columns - for (int pCol = 0; pCol < cellW; pCol++) - { - //Go through pixel rows - for (int pRow = 0; pRow < cellH; pRow++) - { - //Get the pixel offsets - int pX = (cellW * iCol) + pCol; - int pY = (cellH * iRow) + pRow; - - //If a non colorkey pixel is found - if (img.getPixel(pX, pY) != bgColor) - { - //Set the x offset - chars[currentChar].left = pX; - - //Break the loops - pCol = cellW; - pRow = cellH; - } - } - } - - //Find Right Side - //Go through pixel columns - for (int pColW = cellW - 1; pColW >= 0; pColW--) - { - //Go through pixel rows - for (int pRowW = 0; pRowW < cellH; pRowW++) - { - //Get the pixel offsets - int pX = (cellW * iCol) + pColW; - int pY = (cellH * iRow) + pRowW; - - //If a non colorkey pixel is found - if (img.getPixel(pX, pY) != bgColor) - { - //Set the width - chars[currentChar].width = (pX - chars[currentChar].left) + 1; - - //Break the loops - pColW = -1; - pRowW = cellH; - } - } - } - - //Find Top - //Go through pixel rows - for (int pRow = 0; pRow < cellH; pRow++) - { - //Go through pixel columns - for (int pCol = 0; pCol < cellW; pCol++) - { - //Get the pixel offsets - int pX = (cellW * iCol) + pCol; - int pY = (cellH * iRow) + pRow; - - //If a non colorkey pixel is found - if (img.getPixel(pX, pY) != bgColor) - { - //If new top is found - if (pRow < top) - { - top = pRow; - } - - //Break the loops - pCol = cellW; - pRow = cellH; - } - } - } - - //Find Bottom of A - if (currentChar == 'A') - { - //Go through pixel rows - for (int pRow = cellH - 1; pRow >= 0; pRow--) - { - //Go through pixel columns - for (int pCol = 0; pCol < cellW; pCol++) - { - //Get the pixel offsets - int pX = (cellW * iCol) + pCol; - int pY = (cellH * iRow) + pRow; - - //If a non colorkey pixel is found - if (img.getPixel(pX, pY) != bgColor) - { - //Bottom of a is found - baseA = pRow; - - //Break the loops - pCol = cellW; - pRow = -1; - } - } - } - } - - //Go to the next character - currentChar++; - - if (verticalDirection == false) - { - iCol++; - if (iCol >= columns) - { - iCol = 0; - iRow++; - } - } - else - { - iRow++; - if (iRow >= rows) - { - iRow = 0; - iCol++; - } - } - } - - //Calculate space - space = cellW / 2; - - //Calculate new line - newLine = baseA - top; - - //Lop off excess top pixels - for (auto& chrRect : chars) - { - chrRect.top += top; - chrRect.height -= top; - } -} - -BitmapFont::BitmapFont(const std::shared_ptr& tex, int rows_, int columns_, - int padding_, bool verticalDirection) - : texture(tex), rows(rows_), columns(columns_), padding(padding_) -{ - this->calculateCharSizes(texture->copyToImage(), verticalDirection); -} - -BitmapFont::BitmapFont(const std::shared_ptr& tex, int rows_, int columns_, - int padding_, bool verticalDirection, const sf::Image& img) - : texture(tex), rows(rows_), columns(columns_), padding(padding_) -{ - this->calculateCharSizes(img, verticalDirection); -} - -BitmapFont::BitmapFont(const std::shared_ptr& tex, int rows_, int columns_, - int padding_, bool verticalDirection, const std::vector& charSizes) - : texture(tex), rows(rows_), columns(columns_), padding(padding_) -{ - size_t charStartIdx = 0; - if (charSizes.size() == 130 || charSizes.size() == 258) - { - charStartIdx = 2; - } - else if ((charSizes.size() == 128 || charSizes.size() == 256) == false) - { - this->calculateCharSizes(tex->copyToImage(), verticalDirection); - return; - } - - int cellW = tex->getSize().x / columns; - int cellH = tex->getSize().y / rows; - int iRow = 0; - int iCol = 0; - for (size_t i = 0; i < 256; i++) - { - chars[i].left = cellW * iCol; - chars[i].top = cellH * iRow; - auto charSizeIdx = i + charStartIdx; - if (charSizeIdx < charSizes.size()) - { - chars[i].width = charSizes[charSizeIdx]; - } - else - { - chars[i].width = 0; - } - chars[i].height = cellH; - - if (verticalDirection == false) - { - iCol++; - if (iCol >= columns) - { - iCol = 0; - iRow++; - } - } - else - { - iRow++; - if (iRow >= rows) - { - iRow = 0; - iCol++; - } - } - } - - if (charStartIdx > 0) - { - space = charSizes[0]; - newLine = charSizes[1]; - } - else - { - space = charSizes[' ']; - newLine = charSizes['\n']; - } + newLine = charTextures_->getCharWidth('\n'); + space = charTextures_->getCharWidth(' '); + tab = charTextures_->getCharWidth('\t'); } float BitmapFont::calculateLineLength(const char* text, int horizSpaceOffset) const noexcept @@ -277,15 +36,12 @@ float BitmapFont::calculateLineLength(const char* text, int horizSpaceOffset) co else if (ch == '\t') { //Move over - curX += (float)chars['\t'].width; + curX += (float)tab; } else { - //Get the ASCII value of the character - int ascii = (unsigned char)ch; - //Move over the width of the character + padding - curX += (float)chars[ascii].width + (float)(wasSpace ? 0 : padding); + curX += (float)charTextures->getCharWidth(ch) + (float)(wasSpace ? 0 : padding); wasSpace = false; } text++; @@ -351,15 +107,12 @@ sf::Vector2f BitmapFont::calculateSize(const std::string& text, else if (ch == '\t') { //Move over - curX += (float)chars['\t'].width; + curX += (float)tab; } else { - //Get the ASCII value of the character - int ascii = (unsigned char)ch; - //Move over the width of the character + padding - curX += (float)chars[ascii].width + (float)(wasSpace ? 0 : padding); + curX += (float)charTextures->getCharWidth(ch) + (float)(wasSpace ? 0 : padding); wasSpace = false; } if (textPtr[1] != 0) @@ -387,8 +140,15 @@ void BitmapFont::draw(const sf::Vector2f& pos, const std::string& text, sf::Rend sf::RenderStates states, const sf::Color& color, int horizSpaceOffset, int vertSpaceOffset, float sizeX, HorizontalAlign align) const { - sf::Sprite sprite(*texture); - sprite.setColor(color); + Sprite2 sprite(charTextures->getTexture(), palette); + if (color == sf::Color::White) + { + sprite.setColor(defaultColor); + } + else + { + sprite.setColor(color); + } //Temp offsets float curX = pos.x, curY = pos.y; @@ -396,11 +156,11 @@ void BitmapFont::draw(const sf::Vector2f& pos, const std::string& text, sf::Rend if (align == HorizontalAlign::Center) { - curX += std::round((sizeX / 2.f) - (calculateLineLength(&text.c_str()[0], horizSpaceOffset) / 2.f)); + curX += std::round((sizeX / 2.f) - (calculateLineLength(text.data(), horizSpaceOffset) / 2.f)); } else if (align == HorizontalAlign::Right) { - curX += (sizeX - calculateLineLength(&text.c_str()[0], horizSpaceOffset)); + curX += (sizeX - calculateLineLength(text.data(), horizSpaceOffset)); } //Go through the text @@ -417,11 +177,11 @@ void BitmapFont::draw(const sf::Vector2f& pos, const std::string& text, sf::Rend curX = pos.x; if (align == HorizontalAlign::Center) { - curX += std::round((sizeX / 2.f) - (calculateLineLength(&text.c_str()[i + 1], horizSpaceOffset) / 2.f)); + curX += std::round((sizeX / 2.f) - (calculateLineLength(text.data() + i + 1, horizSpaceOffset) / 2.f)); } else if (align == HorizontalAlign::Right) { - curX += (sizeX - calculateLineLength(&text.c_str()[i + 1], horizSpaceOffset)); + curX += (sizeX - calculateLineLength(text.data() + i + 1, horizSpaceOffset)); } wasSpace = false; } @@ -438,20 +198,21 @@ void BitmapFont::draw(const sf::Vector2f& pos, const std::string& text, sf::Rend else if (ch == '\t') { //Move over - curX += (float)chars['\t'].width; + curX += (float)tab; } else { - //Get the ASCII value of the character - int ascii = (unsigned char)ch; + TextureInfo ti; + charTextures->get((size_t)ch, ti); //Show the character + sprite.setTexture(*ti.texture); + sprite.setTextureRect(ti.textureRect); sprite.setPosition(curX, curY); - sprite.setTextureRect(chars[ascii]); target.draw(sprite, states); //Move over the width of the character + padding - curX += (float)chars[ascii].width + (float)(wasSpace ? 0 : padding); + curX += (float)ti.textureRect.width + (float)(wasSpace ? 0 : padding); wasSpace = false; } curX += (float)horizSpaceOffset; diff --git a/src/BitmapFont.h b/src/BitmapFont.h index 263ec623..272c7a6b 100755 --- a/src/BitmapFont.h +++ b/src/BitmapFont.h @@ -2,34 +2,35 @@ #include "Alignment.h" #include +#include "Palette.h" #include #include +#include "TexturePacks/BitmapFontTexturePack.h" #include class BitmapFont { private: - std::shared_ptr texture; - sf::IntRect chars[256]; + std::shared_ptr charTextures; + std::shared_ptr palette; + sf::Color defaultColor{ sf::Color::White }; int newLine{ 0 }; int space{ 0 }; - int rows{ 0 }; - int columns{ 0 }; + int tab{ 0 }; int padding{ 0 }; - void calculateCharSizes(const sf::Image& img, bool verticalDirection); float calculateLineLength(const char* text, int horizSpaceOffset) const noexcept; public: - BitmapFont(const std::shared_ptr& tex, int rows_, int columns_, - int padding_, bool verticalDirection); - BitmapFont(const std::shared_ptr& tex, int rows_, int columns_, - int padding_, bool verticalDirection, const sf::Image& img); - BitmapFont(const std::shared_ptr& tex, int rows_, int columns_, - int padding_, bool verticalDirection, const std::vector& charSizes); + BitmapFont(const std::shared_ptr& charTextures_, int padding_); int getNewLine() const noexcept { return newLine; } + void setColor(const sf::Color& color_) { defaultColor = color_; } + + void setPalette(const std::shared_ptr& pal) noexcept { palette = pal; } + bool hasPalette() const noexcept { return palette != nullptr; } + sf::Vector2f calculateSize(const std::string& text) const; sf::Vector2f calculateSize(const std::string& text, int horizSpaceOffset, int vertSpaceOffset, unsigned* lineCount = nullptr) const; diff --git a/src/BitmapText.cpp b/src/BitmapText.cpp index 8c141a8e..3964bc00 100755 --- a/src/BitmapText.cpp +++ b/src/BitmapText.cpp @@ -3,12 +3,12 @@ #include "GameUtils.h" #include "Utils/Utils.h" -void BitmapText::calcDrawPos() noexcept +void BitmapText::calculateDrawPosition() noexcept { drawPos = GameUtils::getAlignmentPosition(pos, size, horizAlign, vertAlign); } -void BitmapText::calcSize() +void BitmapText::calculateSize() { size = font->calculateSize(text, horizSpaceOffset, vertSpaceOffset, &lineCount); } @@ -20,7 +20,7 @@ void BitmapText::updateSize(const Game& game) noexcept return; } GameUtils::setAnchorPosSize(anchor, pos, size, game.OldWindowSize(), game.WindowSize()); - calcDrawPos(); + calculateDrawPosition(); } void BitmapText::draw(sf::RenderTarget& target, sf::RenderStates states) const @@ -32,16 +32,19 @@ void BitmapText::draw(sf::RenderTarget& target, sf::RenderStates states) const } } -bool BitmapText::getProperty(const std::string& prop, Variable& var) const +bool BitmapText::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); switch (propHash) { + case str2int16("length"): + var = Variable((int64_t)text.size()); + break; case str2int16("lineCount"): var = Variable((int64_t)lineCount); break; diff --git a/src/BitmapText.h b/src/BitmapText.h index 92e32d85..58b9e456 100755 --- a/src/BitmapText.h +++ b/src/BitmapText.h @@ -22,16 +22,16 @@ class BitmapText : public DrawableText unsigned lineCount{ 0 }; bool visible{ true }; - void calcDrawPos() noexcept; - void calcSize(); + void calculateDrawPosition() noexcept; + void calculateSize(); public: BitmapText(const std::string& text_, const std::shared_ptr& font_, int horizSpaceOffset_ = 0, int vertSpaceOffset_ = 0) : text(text_), font(font_), horizSpaceOffset(horizSpaceOffset_), vertSpaceOffset(vertSpaceOffset_) { - calcSize(); - calcDrawPos(); + calculateSize(); + calculateDrawPosition(); } void setFont(const std::shared_ptr& font_) noexcept { font = font_; } @@ -43,7 +43,7 @@ class BitmapText : public DrawableText if (anchor != anchor_) { anchor = anchor_; - calcDrawPos(); + calculateDrawPosition(); } } virtual void updateSize(const Game& game) noexcept; @@ -55,8 +55,8 @@ class BitmapText : public DrawableText return false; } text = str; - calcSize(); - calcDrawPos(); + calculateSize(); + calculateDrawPosition(); return true; } @@ -69,7 +69,7 @@ class BitmapText : public DrawableText virtual void Position(const sf::Vector2f& position) noexcept { pos = position; - calcDrawPos(); + calculateDrawPosition(); } virtual sf::Vector2f Size() const noexcept { return size; } virtual void Size(const sf::Vector2f& size_) noexcept {} @@ -82,7 +82,7 @@ class BitmapText : public DrawableText if (horizAlign != align) { horizAlign = align; - calcDrawPos(); + calculateDrawPosition(); } } virtual void setVerticalAlign(const VerticalAlign align) noexcept @@ -90,7 +90,7 @@ class BitmapText : public DrawableText if (vertAlign != align) { vertAlign = align; - calcDrawPos(); + calculateDrawPosition(); } } @@ -99,8 +99,8 @@ class BitmapText : public DrawableText if (horizSpaceOffset != offset) { horizSpaceOffset = offset; - calcSize(); - calcDrawPos(); + calculateSize(); + calculateDrawPosition(); } } virtual void setVerticalSpaceOffset(int offset) @@ -108,8 +108,8 @@ class BitmapText : public DrawableText if (vertSpaceOffset != offset) { vertSpaceOffset = offset; - calcSize(); - calcDrawPos(); + calculateSize(); + calculateDrawPosition(); } } @@ -120,5 +120,5 @@ class BitmapText : public DrawableText void update(Game& game) noexcept {} - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/Button.cpp b/src/Button.cpp index 02972b5c..f1e147ad 100755 --- a/src/Button.cpp +++ b/src/Button.cpp @@ -322,10 +322,8 @@ void Button::onTouchEnded(Game& game, bool contains) } } -void Button::update(Game& game, bool contains) +void Button::updateEvents(Game& game, bool contains) { - onHover(game, contains); - if (game.wasMousePressed() == true) { onMouseButtonPressed(game, contains); @@ -336,6 +334,7 @@ void Button::update(Game& game, bool contains) } if (game.wasMouseMoved() == true) { + onHover(game, contains); onMouseMoved(game); } if (game.hasTouchBegan() == true) @@ -344,6 +343,7 @@ void Button::update(Game& game, bool contains) } if (game.hasTouchMoved() == true) { + onHover(game, contains); onMouseMoved(game); } if (game.hasTouchEnded() == true) @@ -351,8 +351,8 @@ void Button::update(Game& game, bool contains) onTouchEnded(game, contains); } if (contains == true && - captureInputEvents == true) + captureInputEvents != InputEvent::None) { - game.clearInputEvents(); + game.clearInputEvents(captureInputEvents); } } diff --git a/src/Button.h b/src/Button.h index 54dce548..01673d96 100755 --- a/src/Button.h +++ b/src/Button.h @@ -1,5 +1,6 @@ #pragma once +#include "InputEvent.h" #include #include "SFML/Audio/SoundBuffer.hpp" #include "UIObject.h" @@ -27,7 +28,7 @@ class Button : public virtual UIObject bool beingDragged{ false }; bool wasLeftClicked{ false }; bool wasRightClicked{ false }; - bool captureInputEvents{ false }; + InputEvent captureInputEvents{ InputEvent::None }; void onHover(Game& game, bool contains); void onMouseButtonPressed(Game& game, bool contains); @@ -36,9 +37,11 @@ class Button : public virtual UIObject void onTouchBegan(Game& game, bool contains); void onTouchEnded(Game& game, bool contains); + void updateEvents(Game& game, bool contains); + public: - bool getCaptureInputEvents() const noexcept { return captureInputEvents; } - void setCaptureInputEvents(bool captureEvents) noexcept { captureInputEvents = captureEvents; } + InputEvent getCaptureInputEvents() const noexcept { return captureInputEvents; } + void setCaptureInputEvents(InputEvent e) noexcept { captureInputEvents = e; } virtual std::shared_ptr getAction(uint16_t nameHash16) const noexcept; virtual bool setAction(uint16_t nameHash16, const std::shared_ptr& action) noexcept; @@ -52,7 +55,5 @@ class Button : public virtual UIObject void setClickUp(bool clickUp_) noexcept { clickUp = clickUp_; } void setFocusSound(const sf::SoundBuffer* buffer) noexcept { focusSound = buffer; } - void update(Game& game, bool contains); - virtual void setColor(const sf::Color& color_) = 0; }; diff --git a/src/CachedImagePack.cpp b/src/CachedImagePack.cpp new file mode 100755 index 00000000..2242c0dc --- /dev/null +++ b/src/CachedImagePack.cpp @@ -0,0 +1,26 @@ +#include "CachedImagePack.h" +#include + +CachedImagePack::CachedImagePack(const ImageContainer* imgContainer_, + const std::shared_ptr& palette_, bool isIndexed_) + : imgContainer(imgContainer_), palette(palette_), isIndexed(isIndexed_) +{ + cache.resize(imgContainer_->size()); + + if (isIndexed == false && + palette == nullptr) + { + isIndexed = true; + } +} + +sf::Image& CachedImagePack::operator[] (size_t index) +{ + assert(index < imgContainer->size()); + if (cache[index].has_value() == false) + { + cache[index] = imgContainer->get(index, + (isIndexed == true ? nullptr : &palette->palette)); + } + return *cache[index]; +} diff --git a/src/CachedImagePack.h b/src/CachedImagePack.h index b268cc01..38246505 100755 --- a/src/CachedImagePack.h +++ b/src/CachedImagePack.h @@ -1,6 +1,5 @@ #pragma once -#include #include "ImageContainers/ImageContainer.h" #include #include @@ -11,31 +10,18 @@ class CachedImagePack private: const ImageContainer* imgContainer{ nullptr }; std::shared_ptr palette; - bool isIndexed{ false }; + bool isIndexed{ true }; mutable std::vector> cache; public: CachedImagePack() noexcept {} CachedImagePack(const ImageContainer* imgContainer_, - const std::shared_ptr& palette_, bool isIndexed_ = false) - : imgContainer(imgContainer_), palette(palette_), isIndexed(isIndexed_) - { - cache.resize(imgContainer_->size()); - } + const std::shared_ptr& palette_, bool isIndexed_ = false); sf::Image& get(size_t index) { return (*this)[index]; } - sf::Image& operator[] (size_t index) - { - assert(index < imgContainer->size()); - if (!cache[index]) - { - cache[index] = imgContainer->get(index, - (isIndexed == true ? nullptr : &palette->palette)); - } - return *cache[index]; - } + sf::Image& operator[] (size_t index); const std::shared_ptr& getPalette() const noexcept { return palette; } bool IsIndexed() const noexcept { return isIndexed; } diff --git a/src/Circle.cpp b/src/Circle.cpp index d698020b..9c66107c 100755 --- a/src/Circle.cpp +++ b/src/Circle.cpp @@ -15,12 +15,12 @@ void Circle::updateSize(const Game& game) setPosition(pos); } -bool Circle::getProperty(const std::string& prop, Variable& var) const +bool Circle::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - return GameUtils::getUIObjProp(*this, str2int16(props.first.c_str()), props.second, var); + return GameUtils::getUIObjProp(*this, str2int16(props.first), props.second, var); } diff --git a/src/Circle.h b/src/Circle.h index dd930af9..a7913f4f 100755 --- a/src/Circle.h +++ b/src/Circle.h @@ -32,5 +32,5 @@ class Circle : public sf::CircleShape, public UIObject } } - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/Dun.cpp b/src/Dun.cpp index a6e08197..e06dd6e2 100755 --- a/src/Dun.cpp +++ b/src/Dun.cpp @@ -3,9 +3,9 @@ #include "PhysFSStream.h" #include "StreamReader.h" -Dun::Dun(const std::string& fileName, int16_t defaultTile) +Dun::Dun(const std::string_view fileName, int16_t defaultTile) { - sf::PhysFSStream file(fileName); + sf::PhysFSStream file(fileName.data()); if (file.hasError() == true) { return; @@ -13,7 +13,7 @@ Dun::Dun(const std::string& fileName, int16_t defaultTile) std::vector fileData((size_t)file.getSize()); file.read(fileData.data(), file.getSize()); - LittleEndianStreamReader fileStream(fileData); + LittleEndianStreamReader fileStream(fileData.data(), fileData.size()); width = fileStream.read(); height = fileStream.read(); diff --git a/src/Dun.h b/src/Dun.h index 0f338e03..f8b729f1 100755 --- a/src/Dun.h +++ b/src/Dun.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include "Utils/Helper2D.h" #include @@ -19,7 +19,7 @@ class Dun public: Dun() noexcept {} - Dun(const std::string& fileName, int16_t defaultTile = -1); + Dun(const std::string_view fileName, int16_t defaultTile = -1); Dun(size_t width_, size_t height_, int16_t defaultTile = -1); Misc::Helper2D operator[] (size_t x) noexcept; diff --git a/src/Event.cpp b/src/Event.cpp index c0f86fb1..40a5a81d 100755 --- a/src/Event.cpp +++ b/src/Event.cpp @@ -7,7 +7,12 @@ bool Event::execute(Game& game) { return true; } - + if (currentTime == sf::Time::Zero) + { + // prevents executing events created while loading big files immediately + currentTime = sf::microseconds(1); + return false; + } currentTime += game.getElapsedTime(); if (currentTime >= timeout) diff --git a/src/Event.h b/src/Event.h index 655727bb..b4a160d9 100755 --- a/src/Event.h +++ b/src/Event.h @@ -4,6 +4,7 @@ #include #include #include +#include class Event : public Action { @@ -19,7 +20,7 @@ class Event : public Action : action(action_), timeout(timeout_) {} const std::string& getId() const noexcept { return id; } - void setId(const std::string& id_) { id = id_; } + void setId(const std::string_view id_) { id = id_; } void setAction(const std::shared_ptr& action_) noexcept { action = action_; } diff --git a/src/EventManager.h b/src/EventManager.h index 6daed01d..ebb0c7b3 100755 --- a/src/EventManager.h +++ b/src/EventManager.h @@ -14,7 +14,7 @@ class EventManager void addBack(const std::shared_ptr& action) { events.push_back(action); } void addFront(const std::shared_ptr& action) { events.push_front(action); } - bool exists(const std::string& id) const + bool exists(const std::string_view id) const { if (id.empty() == false) { diff --git a/src/FadeInOut.cpp b/src/FadeInOut.cpp index 4ae36768..bbeca5fd 100755 --- a/src/FadeInOut.cpp +++ b/src/FadeInOut.cpp @@ -49,9 +49,9 @@ void FadeInOut::update(Game& game) noexcept currentTime += game.getElapsedTime(); - if (currentTime >= frameTime) + while (currentTime >= frameTime) { - currentTime = sf::microseconds(currentTime.asMicroseconds() % frameTime.asMicroseconds()); + currentTime -= frameTime; auto color = getFillColor(); @@ -66,6 +66,7 @@ void FadeInOut::update(Game& game) noexcept game.EnableInput(true); } game.setFadeInOut(nullptr); + return; } else { diff --git a/src/FileUtils.cpp b/src/FileUtils.cpp index 17f39b6a..c6f4c17a 100755 --- a/src/FileUtils.cpp +++ b/src/FileUtils.cpp @@ -6,52 +6,94 @@ namespace FileUtils { + bool copyDir(const char* dirSrcName, const char* dirDstName) + { + PHYSFS_Stat stat; + if (PHYSFS_stat(dirSrcName, &stat) == 0 || + stat.filetype != PHYSFS_FILETYPE_DIRECTORY) + { + return false; + } + if (PHYSFS_stat(dirDstName, &stat) != 0 && + stat.filetype != PHYSFS_FILETYPE_DIRECTORY) + { + return false; + } + + createDir(dirDstName); + auto paths = PHYSFS_enumerateFiles(dirSrcName); + if (paths != nullptr) + { + for (char** path = paths; *path != nullptr; path++) + { + auto fullSrcPath = std::string(dirSrcName) + '/' + *path; + auto fullDstPath = std::string(dirDstName) + '/' + *path; + + if (PHYSFS_stat(fullSrcPath.c_str(), &stat) == 0) + { + continue; + } + if (stat.filetype == PHYSFS_FILETYPE_DIRECTORY) + { + copyDir(fullSrcPath.c_str(), fullDstPath.c_str()); + } + else + { + // copy file (read source file and write destination) + sf::PhysFSStream fileRead(fullSrcPath); + auto fileWrite = PHYSFS_openWrite(fullDstPath.c_str()); + if (fileRead.hasError() == false && + fileWrite != nullptr) + { + std::vector data((size_t)fileRead.getSize()); + fileRead.read(data.data(), fileRead.getSize()); + PHYSFS_writeBytes(fileWrite, data.data(), data.size()); + PHYSFS_close(fileWrite); + } + } + } + PHYSFS_freeList(paths); + return true; + } + return false; + } + bool createDir(const char* dirName) noexcept { return PHYSFS_mkdir(dirName) != 0; } - bool deleteAll(const char* filePath) + bool deleteAll(const char* filePath, bool deleteRoot) { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) PHYSFS_Stat fileStat; if (PHYSFS_stat(filePath, &fileStat) == 0) { return false; } -#endif bool ret = false; -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) if (fileStat.filetype == PHYSFS_FILETYPE_DIRECTORY) -#else - if (PHYSFS_isDirectory(filePath) != 0) -#endif { auto paths = PHYSFS_enumerateFiles(filePath); - if (paths != NULL) + if (paths != nullptr) { auto writeDir = PHYSFS_getWriteDir(); - if (writeDir != NULL) + if (writeDir != nullptr) { - for (char** path = paths; *path != NULL; path++) + for (char** path = paths; *path != nullptr; path++) { auto fullPath = std::string(filePath) + '/' + *path; -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) if (PHYSFS_stat(fullPath.c_str(), &fileStat) == 0) { continue; } if (fileStat.filetype == PHYSFS_FILETYPE_DIRECTORY) -#else - if (PHYSFS_isDirectory(fullPath.c_str()) != 0) -#endif { - deleteAll(fullPath.c_str()); + deleteAll(fullPath.c_str(), true); } else { auto realDir = PHYSFS_getRealDir(fullPath.c_str()); - if (realDir != NULL) + if (realDir != nullptr) { if (std::strcmp(writeDir, realDir) == 0) { @@ -63,8 +105,15 @@ namespace FileUtils } PHYSFS_freeList(paths); } + if (deleteRoot == true) + { + ret = PHYSFS_delete(filePath) != 0; + } + } + else + { + ret = PHYSFS_delete(filePath) != 0; } - ret = PHYSFS_delete(filePath) != 0; return ret; } @@ -72,7 +121,7 @@ namespace FileUtils { auto writeDir = PHYSFS_getWriteDir(); auto realDir = PHYSFS_getRealDir(filePath); - if (writeDir != NULL && realDir != NULL) + if (writeDir != nullptr && realDir != nullptr) { if (strcmp(writeDir, realDir) == 0) { @@ -87,16 +136,14 @@ namespace FileUtils return PHYSFS_exists(filePath) != 0; } - std::vector getFileList(const std::string& filePath, const std::string& fileExt) + std::vector getFileList(const std::string& filePath, const std::string_view fileExt) { std::vector vec; auto files = PHYSFS_enumerateFiles(filePath.c_str()); - if (files != NULL) + if (files != nullptr) { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) PHYSFS_Stat fileStat; -#endif - for (char** file = files; *file != NULL; file++) + for (char** file = files; *file != nullptr; file++) { auto file2 = filePath + '/' + std::string(*file); @@ -104,7 +151,6 @@ namespace FileUtils { continue; } -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) if (PHYSFS_stat(file2.c_str(), &fileStat) == 0) { continue; @@ -113,56 +159,54 @@ namespace FileUtils { vec.push_back(file2); } -#else - if (PHYSFS_isDirectory(file2.c_str()) == 0) - { - vec.push_back(file2); - } -#endif } PHYSFS_freeList(files); } return vec; } - struct MatchPathSeparator + std::string getFileFromPath(const std::string_view path) { - bool operator()(char ch) const noexcept + auto found = path.find_last_of("/\\"); + if (found != std::string::npos) { - return ch == '\\' || ch == '/'; + return std::string(path.substr(found + 1)); } - }; - - std::string getFileFromPath(const std::string& path) - { - return std::string(std::find_if(path.rbegin(), path.rend(), MatchPathSeparator()).base(), path.end()); + return std::string(path); } - std::string getFileWithoutExt(const std::string& fileName) + std::string getFileWithoutExt(const std::string_view fileName) { auto pos = fileName.rfind("."); if (pos == 0 || pos == std::string::npos) { - return fileName; + return std::string(fileName); } - return fileName.substr(0, pos); + return std::string(fileName.substr(0, pos)); + } + + std::string getPathFromFile(const std::string_view path) + { + auto found = path.find_last_of("/\\"); + if (found != std::string::npos) + { + return std::string(path.substr(0, found)); + } + return {}; } std::vector getSaveDirList() { std::vector vecDirs; auto dirs = PHYSFS_enumerateFiles(""); - if (dirs != NULL) + if (dirs != nullptr) { auto writeDir = PHYSFS_getWriteDir(); - if (writeDir != NULL) + if (writeDir != nullptr) { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) PHYSFS_Stat fileStat; -#endif - for (char** dir = dirs; *dir != NULL; dir++) + for (char** dir = dirs; *dir != nullptr; dir++) { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) if (PHYSFS_stat(*dir, &fileStat) == 0) { continue; @@ -171,14 +215,12 @@ namespace FileUtils { continue; } -#else - if (PHYSFS_isDirectory(*dir) == 0) + if (**dir == '.') { continue; } -#endif auto realDir = PHYSFS_getRealDir(*dir); - if (realDir != NULL) + if (realDir != nullptr) { if (strcmp(writeDir, realDir) == 0) { @@ -232,48 +274,28 @@ namespace FileUtils #ifdef __ANDROID__ auto userDir = "data/data/com.dgengine/files/"; #else -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) auto userDir = PHYSFS_getPrefDir("DGEngine", dirName); -#else - auto userDir = PHYSFS_getUserDir(); -#endif #endif -#if (__ANDROID__) || (!(PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1))) - if (PHYSFS_setWriteDir(userDir) != 0) - { - if (PHYSFS_mkdir(dirName) != 0) - { - auto writeDir = std::string(userDir) + dirName; - return PHYSFS_setWriteDir(writeDir.c_str()) != 0; - } - } - return false; -#else - if (userDir == NULL) + if (userDir == nullptr) { return false; } return PHYSFS_setWriteDir(userDir) != 0; -#endif } - bool saveText(const char* filePath, const char* str, size_t strLen) noexcept + bool saveText(const std::string_view filePath, const std::string_view str) noexcept { - auto file = PHYSFS_openWrite(filePath); - if (file != NULL) + auto path = getPathFromFile(filePath); + if (path.empty() == false) { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) - PHYSFS_writeBytes(file, str, strLen); -#else - PHYSFS_write(file, str, 1, strLen); -#endif + createDir(path.c_str()); + } + auto file = PHYSFS_openWrite(filePath.data()); + if (file != nullptr) + { + PHYSFS_writeBytes(file, str.data(), str.size()); return PHYSFS_close(file) != 0; } return false; } - - bool saveText(const char* filePath, const std::string& str) noexcept - { - return saveText(filePath, str.c_str(), str.size()); - } } diff --git a/src/FileUtils.h b/src/FileUtils.h index 4f026388..4783eabd 100755 --- a/src/FileUtils.h +++ b/src/FileUtils.h @@ -1,23 +1,30 @@ #pragma once #include +#include #include namespace FileUtils { + bool copyDir(const char* dirSrcName, const char* dirDstName); + bool createDir(const char* dirName) noexcept; - bool deleteAll(const char* filePath); + // deletes all files in folder. if deleteRoot is false, + // the directory "filePath" is empty, but isn't deleted. + bool deleteAll(const char* filePath, bool deleteRoot = true); bool deleteFile(const char* filePath) noexcept; bool exists(const char* filePath) noexcept; - std::vector getFileList(const std::string& filePath, const std::string& fileExt = ""); + std::vector getFileList(const std::string& filePath, const std::string_view fileExt = ""); + + std::string getFileFromPath(const std::string_view path); - std::string getFileFromPath(const std::string& path); + std::string getFileWithoutExt(const std::string_view fileName); - std::string getFileWithoutExt(const std::string& fileName); + std::string getPathFromFile(const std::string_view path); std::vector getSaveDirList(); @@ -29,6 +36,6 @@ namespace FileUtils const char* getSaveDir() noexcept; bool setSaveDir(const char* dirName) noexcept; - bool saveText(const char* filePath, const char* str, size_t strLen) noexcept; - bool saveText(const char* filePath, const std::string& str) noexcept; + // creates path if it doesn't exist + bool saveText(const std::string_view filePath, const std::string_view str) noexcept; } diff --git a/src/Font.h b/src/Font.h index e62a95e1..2c094808 100755 --- a/src/Font.h +++ b/src/Font.h @@ -5,11 +5,11 @@ #include typedef std::variant< - nullptr_t, + std::nullptr_t, std::shared_ptr, std::shared_ptr> Font; -#define hasNullFont std::holds_alternative -#define hasBitmapFont std::holds_alternative> -#define hasFreeTypeFont std::holds_alternative> +#define holdsNullFont std::holds_alternative +#define holdsBitmapFont std::holds_alternative> +#define holdsFreeTypeFont std::holds_alternative> diff --git a/src/Game.cpp b/src/Game.cpp index fc7cd478..73253609 100755 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -2,7 +2,7 @@ #include "GameUtils.h" #include "Json/JsonUtils.h" #include "Parser/ParseVariable.h" -#include "SFMLUtils.h" +#include "SFML/SFMLUtils.h" #include "Shaders.h" #include "Utils/ReverseIterable.h" #include "Utils/Utils.h" @@ -197,9 +197,9 @@ void Game::updateSize() } for (auto& res : resourceManager) { - for (auto& obj : res.drawables) + for (auto obj : res.drawables) { - obj.second->updateSize(*this); + obj->updateSize(*this); } } } @@ -403,11 +403,11 @@ void Game::update() { if (((int)res.ignore & (int)IgnoreResource::Update) == 0) { - for (auto& obj : reverse(res.drawables)) + for (auto obj : reverse(res.drawables)) { if (paused == false && res.ignore != IgnoreResource::Update) { - obj.second->update(*this); + obj->update(*this); } } } @@ -424,9 +424,9 @@ void Game::drawUI() { if (((int)res.ignore & (int)IgnoreResource::Draw) == 0) { - for (auto& obj : res.drawables) + for (auto obj : res.drawables) { - windowTex.draw(*obj.second); + windowTex.draw(*obj); } } else if (((int)res.ignore & (int)IgnoreResource::All) != 0) @@ -464,7 +464,14 @@ void Game::drawFadeEffect() void Game::drawWindow() { windowTex.display(); - window.draw(windowSprite); + sf::RenderStates states = sf::RenderStates::Default; + if (Shaders::supportsGamma() && + gamma > 30 && gamma <= 100) + { + states.shader = &Shaders::Gamma; + Shaders::Gamma.setUniform("gamma", (float)(130 - gamma) * 0.01f); + } + window.draw(windowSprite, states); window.display(); } @@ -476,6 +483,100 @@ void Game::draw() drawWindow(); } +void Game::clearInputEvents(InputEvent e) noexcept +{ + if (e == InputEvent::None) + { + return; + } + else if (e == InputEvent::All) + { + mousePressed = false; + mouseReleased = false; + mouseMoved = false; + mouseScrolled = false; + keyPressed = false; + textEntered = false; + touchBegan = false; + touchMoved = false; + touchEnded = false; + return; + } + if (mousePressed == true && + ((int)e & (int)InputEvent::MousePress) != 0) + { + if (((int)e & (int)InputEvent::LeftClick) != 0 && + mousePressEvt.button == sf::Mouse::Button::Left) + { + mousePressed = false; + } + else if (((int)e & (int)InputEvent::MiddleClick) != 0 && + mousePressEvt.button == sf::Mouse::Button::Middle) + { + mousePressed = false; + } + else if (((int)e & (int)InputEvent::RightClick) != 0 && + mousePressEvt.button == sf::Mouse::Button::Right) + { + mousePressed = false; + } + } + if (mouseReleased == true && + ((int)e & (int)InputEvent::MouseRelease) != 0) + { + if (((int)e & (int)InputEvent::LeftClick) != 0 && + mouseReleaseEvt.button == sf::Mouse::Button::Left) + { + mouseReleased = false; + } + else if (((int)e & (int)InputEvent::MiddleClick) != 0 && + mouseReleaseEvt.button == sf::Mouse::Button::Middle) + { + mouseReleased = false; + } + else if (((int)e & (int)InputEvent::RightClick) != 0 && + mouseReleaseEvt.button == sf::Mouse::Button::Right) + { + mouseReleased = false; + } + } + if (mouseMoved == true && + ((int)e & (int)InputEvent::MouseMove) != 0) + { + mouseMoved = false; + } + if (mouseScrolled == true && + ((int)e & (int)InputEvent::MouseScroll) != 0) + { + mouseScrolled = false; + } + if (keyPressed == true && + ((int)e & (int)InputEvent::KeyPress) != 0) + { + keyPressed = false; + } + if (textEntered == true && + ((int)e & (int)InputEvent::TextEnter) != 0) + { + textEntered = false; + } + if (touchBegan == true && + ((int)e & (int)InputEvent::TouchBegin) != 0) + { + touchBegan = false; + } + if (touchMoved == true && + ((int)e & (int)InputEvent::TouchMove) != 0) + { + touchMoved = false; + } + if (touchEnded == true && + ((int)e & (int)InputEvent::TouchEnd) != 0) + { + touchEnded = false; + } +} + void Game::SmoothScreen(bool smooth_) { smoothScreen = smooth_; @@ -564,7 +665,7 @@ void Game::addPlayingSound(const sf::SoundBuffer* obj) } } -bool Game::getVariableNoPercentage(const std::string& key, Variable& var) const +bool Game::getVariableNoToken(const std::string& key, Variable& var) const { auto it = variables.find(key); if (it != variables.cend()) @@ -575,35 +676,29 @@ bool Game::getVariableNoPercentage(const std::string& key, Variable& var) const return false; } -bool Game::getVariable(const std::string& key, Variable& var) const +bool Game::getVarOrPropNoToken(const std::string& key, Variable& var) const { - auto it = findVariable(key); - if (it != variables.cend()) + if (getVariableNoToken(key, var) == true) { - var = it->second; return true; } - return false; + return GameUtils::getObjectProperty(*this, key, var); } -std::map::const_iterator Game::findVariable(const std::string& key) const +bool Game::getVarOrProp(const std::string_view key, Variable& var) const { if ((key.size() > 2) && (key.front() == '%') && (key.back() == '%')) { - return variables.find(key.substr(1, key.size() - 2)); - } - return variables.end(); -} - -bool Game::getVarOrProp(const std::string& key, Variable& var) const -{ - if (getVariable(key, var) == true) - { - return true; + auto key2 = key.substr(1, key.size() - 2); + if (getVariableNoToken(std::string(key2), var) == true) + { + return true; + } + return GameUtils::getObjectProperty(*this, key2, var); } - return GameUtils::getObjectProperty(*this, key, var); + return false; } Variable Game::getVarOrProp(const Variable& var) const @@ -619,7 +714,7 @@ Variable Game::getVarOrProp(const Variable& var) const return var; } -bool Game::getVarOrPropBool(const std::string& key) const +bool Game::getVarOrPropBoolS(const std::string_view key) const { Variable var; if (getVarOrProp(key, var) == true) @@ -629,16 +724,16 @@ bool Game::getVarOrPropBool(const std::string& key) const return false; } -bool Game::getVarOrPropBool(const Variable& var) const +bool Game::getVarOrPropBoolV(const Variable& var) const { if (std::holds_alternative(var)) { - return getVarOrPropBool(std::get(var)); + return getVarOrPropBoolS(std::get(var)); } return VarUtils::toBool(var); } -double Game::getVarOrPropDouble(const std::string& key) const +double Game::getVarOrPropDoubleS(const std::string_view key) const { Variable var; if (getVarOrProp(key, var) == true) @@ -648,16 +743,16 @@ double Game::getVarOrPropDouble(const std::string& key) const return 0.0; } -double Game::getVarOrPropDouble(const Variable& var) const +double Game::getVarOrPropDoubleV(const Variable& var) const { if (std::holds_alternative(var)) { - return getVarOrPropDouble(std::get(var)); + return getVarOrPropDoubleS(std::get(var)); } return VarUtils::toDouble(var); } -int64_t Game::getVarOrPropLong(const std::string& key) const +int64_t Game::getVarOrPropLongS(const std::string_view key) const { Variable var; if (getVarOrProp(key, var) == true) @@ -667,53 +762,55 @@ int64_t Game::getVarOrPropLong(const std::string& key) const return 0; } -int64_t Game::getVarOrPropLong(const Variable& var) const +int64_t Game::getVarOrPropLongV(const Variable& var) const { if (std::holds_alternative(var)) { - return getVarOrPropLong(std::get(var)); + return getVarOrPropLongS(std::get(var)); } return VarUtils::toLong(var); } -std::string Game::getVarOrPropString(const std::string& key) const +std::string Game::getVarOrPropStringS(const std::string_view key) const { - Variable var; - if (getVariable(key, var) == true) + if ((key.size() > 2) && + (key.front() == '%') && + (key.back() == '%')) { - if (std::holds_alternative(var)) + auto key2 = key.substr(1, key.size() - 2); + Variable var; + if (getVariableNoToken(std::string(key2), var) == true) { - GameUtils::getObjectProperty(*this, std::get(var), var); + if (std::holds_alternative(var)) + { + auto key3 = std::get(var).substr(1, std::get(var).size() - 2); + GameUtils::getObjectProperty(*this, key3, var); + } + return VarUtils::toString(var); + } + else if (GameUtils::getObjectProperty(*this, key2, var) == true) + { + return VarUtils::toString(var); } } - else if (GameUtils::getObjectProperty(*this, key, var) == false) - { - return key; - } - return VarUtils::toString(var); + return std::string(key); } -std::string Game::getVarOrPropString(const Variable& var) const +std::string Game::getVarOrPropStringV(const Variable& var) const { if (std::holds_alternative(var)) { - return getVarOrPropString(std::get(var)); + return getVarOrPropStringS(std::get(var)); } return VarUtils::toString(var); } void Game::clearVariable(const std::string& key) { - if (key.size() > 1) + auto it = variables.find(key); + if (it != variables.end()) { - if ((key.front() == '%') && (key.back() == '%')) - { - auto it = variables.find(key.substr(1, key.size() - 2)); - if (it != variables.end()) - { - variables.erase(it); - } - } + variables.erase(it); } } @@ -743,29 +840,53 @@ void Game::saveVariables(const std::string& filePath, const std::vector(val) == true) + { + Gamma((unsigned)std::get(val)); + } + } + break; case str2int16("keepAR"): { if (std::holds_alternative(val) == true) @@ -944,7 +1073,7 @@ void Game::setProperty(const std::string& prop, const Variable& val) } } -const Queryable* Game::getQueryable(const std::string& prop) const +const Queryable* Game::getQueryable(const std::string_view prop) const { if (prop.empty() == true) { @@ -956,7 +1085,7 @@ const Queryable* Game::getQueryable(const std::string& prop) const { return this; } - const Queryable* queryable = resourceManager.getDrawable(props.first); + const Queryable* queryable = resourceManager.getDrawable(std::string(props.first)); if (queryable == nullptr) { if (props.first == "focus") diff --git a/src/Game.h b/src/Game.h index 6bcfb062..00c49e4c 100755 --- a/src/Game.h +++ b/src/Game.h @@ -2,6 +2,7 @@ #include "EventManager.h" #include "FadeInOut.h" +#include "InputEvent.h" #include "LoadingScreen.h" #include #include "Menu.h" @@ -37,15 +38,15 @@ class Game : public sf::NonCopyable, public Queryable sf::Vector2i mousePositioni; sf::Vector2f mousePositionf; - sf::Event::MouseButtonEvent mousePressEvt; - sf::Event::MouseButtonEvent mouseReleaseEvt; - sf::Event::MouseMoveEvent mouseMoveEvt; - sf::Event::MouseWheelScrollEvent mouseScrollEvt; - sf::Event::KeyEvent keyPressEvt; - sf::Event::TextEvent textEnteredEvt; - sf::Event::TouchEvent touchBeganEvt; - sf::Event::TouchEvent touchMovedEvt; - sf::Event::TouchEvent touchEndedEvt; + sf::Event::MouseButtonEvent mousePressEvt{}; + sf::Event::MouseButtonEvent mouseReleaseEvt{}; + sf::Event::MouseMoveEvent mouseMoveEvt{}; + sf::Event::MouseWheelScrollEvent mouseScrollEvt{}; + sf::Event::KeyEvent keyPressEvt{}; + sf::Event::TextEvent textEnteredEvt{}; + sf::Event::TouchEvent touchBeganEvt{}; + sf::Event::TouchEvent touchMovedEvt{}; + sf::Event::TouchEvent touchEndedEvt{}; bool mousePressed{ false }; bool mouseReleased{ false }; bool mouseMoved{ false }; @@ -58,6 +59,7 @@ class Game : public sf::NonCopyable, public Queryable unsigned musicVolume{ 100 }; unsigned soundVolume{ 100 }; + unsigned gamma{ 30 }; sf::Time elapsedTime; @@ -101,8 +103,6 @@ class Game : public sf::NonCopyable, public Queryable void updateSize(); void updateWindowTex(); - std::map::const_iterator findVariable(const std::string& key) const; - public: Game() noexcept : refSize(640, 480), minSize(640, 480), size(640, 480) {} ~Game(); @@ -198,18 +198,7 @@ class Game : public sf::NonCopyable, public Queryable void clearTouchMoved() noexcept { touchMoved = false; } void clearTouchEnded() noexcept { touchEnded = false; } - void clearInputEvents() noexcept - { - mousePressed = false; - mouseReleased = false; - mouseMoved = false; - mouseScrolled = false; - keyPressed = false; - textEntered = false; - touchBegan = false; - touchMoved = false; - touchEnded = false; - } + void clearInputEvents(InputEvent e) noexcept; void MinWidth(unsigned width_) noexcept { size.x = width_; } void MinHeight(unsigned height_) noexcept { size.y = height_; } @@ -243,6 +232,11 @@ class Game : public sf::NonCopyable, public Queryable { soundVolume = std::min(volume, 100u); } + unsigned Gamma() const noexcept { return gamma; } + void Gamma(unsigned gamma_) noexcept + { + gamma = std::clamp(gamma_, 30u, 100u); + } void addPlayingSound(const sf::SoundBuffer& obj); void addPlayingSound(const sf::SoundBuffer* obj); @@ -298,8 +292,8 @@ class Game : public sf::NonCopyable, public Queryable const std::map& getVariables() const noexcept { return variables; } - bool getVariableNoPercentage(const std::string& key, Variable& var) const; - bool getVariable(const std::string& key, Variable& var) const; + // gets variable without tokens. ex: "var" + bool getVariableNoToken(const std::string& key, Variable& var) const; template U getVarOrProp(const Variable& var, U defVal = U()) @@ -322,25 +316,28 @@ class Game : public sf::NonCopyable, public Queryable return defVal; } - bool getVarOrProp(const std::string& key, Variable& var) const; + bool getVarOrPropNoToken(const std::string& key, Variable& var) const; + bool getVarOrProp(const std::string_view key, Variable& var) const; Variable getVarOrProp(const Variable& var) const; - bool getVarOrPropBool(const std::string& key) const; - bool getVarOrPropBool(const Variable& var) const; - double getVarOrPropDouble(const std::string& key) const; - double getVarOrPropDouble(const Variable& var) const; - int64_t getVarOrPropLong(const std::string& key) const; - int64_t getVarOrPropLong(const Variable& var) const; - std::string getVarOrPropString(const std::string& key) const; - std::string getVarOrPropString(const Variable& var) const; - + bool getVarOrPropBoolS(const std::string_view key) const; + bool getVarOrPropBoolV(const Variable& var) const; + double getVarOrPropDoubleS(const std::string_view key) const; + double getVarOrPropDoubleV(const Variable& var) const; + int64_t getVarOrPropLongS(const std::string_view key) const; + int64_t getVarOrPropLongV(const Variable& var) const; + std::string getVarOrPropStringS(const std::string_view key) const; + std::string getVarOrPropStringV(const Variable& var) const; + + // no tokens in key. void clearVariable(const std::string& key); + // no tokens in key. void setVariable(const std::string& key, const Variable& value); void saveVariables(const std::string& filePath, const std::vector& varNames) const; - virtual bool getProperty(const std::string& prop, Variable& var) const; - void setProperty(const std::string& prop, const Variable& val); + virtual bool getProperty(const std::string_view prop, Variable& var) const; + void setProperty(const std::string_view prop, const Variable& val); - virtual const Queryable* getQueryable(const std::string& prop) const; + virtual const Queryable* getQueryable(const std::string_view prop) const; }; diff --git a/src/Game/BaseClass.cpp b/src/Game/BaseClassActions.cpp similarity index 66% rename from src/Game/BaseClass.cpp rename to src/Game/BaseClassActions.cpp index a44a5dce..49236dd0 100755 --- a/src/Game/BaseClass.cpp +++ b/src/Game/BaseClassActions.cpp @@ -1,7 +1,7 @@ -#include "BaseClass.h" +#include "BaseClassActions.h" #include "Game.h" -std::shared_ptr BaseClass::getAction(uint16_t nameHash16) const noexcept +std::shared_ptr BaseClassActions::getAction(uint16_t nameHash16) const noexcept { for (const auto& elem : actions) { @@ -13,7 +13,7 @@ std::shared_ptr BaseClass::getAction(uint16_t nameHash16) const noexcept return nullptr; } -void BaseClass::setAction(uint16_t nameHash16, const std::shared_ptr& action_) +void BaseClassActions::setAction(uint16_t nameHash16, const std::shared_ptr& action_) { if (nameHash16 == str2int16("") || action_ == nullptr) @@ -31,7 +31,7 @@ void BaseClass::setAction(uint16_t nameHash16, const std::shared_ptr& ac actions.push_back(std::make_pair(nameHash16, action_)); } -void BaseClass::executeAction(Game& game, uint16_t nameHash16, bool executeNow) const +void BaseClassActions::executeAction(Game& game, uint16_t nameHash16, bool executeNow) const { for (const auto& elem : actions) { diff --git a/src/Game/BaseClass.h b/src/Game/BaseClassActions.h similarity index 86% rename from src/Game/BaseClass.h rename to src/Game/BaseClassActions.h index 6820b904..ffe4d46d 100755 --- a/src/Game/BaseClass.h +++ b/src/Game/BaseClassActions.h @@ -4,12 +4,13 @@ #include #include -class BaseClass +class BaseClassActions { private: std::vector>> actions; public: + virtual ~BaseClassActions() = default; std::shared_ptr getAction(uint16_t nameHash16) const noexcept; void setAction(uint16_t nameHash16, const std::shared_ptr& action_); void executeAction(Game& game, uint16_t nameHash16, bool executeNow = false) const; diff --git a/src/Game/BaseClassDefaults.h b/src/Game/BaseClassDefaults.h new file mode 100755 index 00000000..2b65f315 --- /dev/null +++ b/src/Game/BaseClassDefaults.h @@ -0,0 +1,106 @@ +#pragma once + +#include "BaseClassActions.h" +#include +#include +#include "Utils/Utils.h" + +template +class BaseClassDefaults : public BaseClassActions +{ +private: + std::vector> defaults; + +public: + const std::vector>& Defaults() const noexcept { return defaults; } + + void setDefaultByHash(uint16_t propHash, T val) + { + if (propHash == str2int16("")) + { + return; + } + for (auto& elem : defaults) + { + if (elem.first == propHash) + { + elem.second = val; + return; + } + } + defaults.push_back(std::make_pair(propHash, val)); + } + + void setDefault(const std::string_view prop, T val) + { + setDefaultByHash(str2int16(prop), val); + } + + bool isDefault(uint16_t propHash, T& value) const noexcept + { + for (const auto& elem : defaults) + { + if (elem.first == propHash) + { + if (elem.second == value) + { + return true; + } + break; + } + } + return false; + } + + bool isDefault(const std::pair& prop) const noexcept + { + for (const auto& elem : defaults) + { + if (elem.first == prop.first) + { + if (elem.second == prop.second) + { + return true; + } + break; + } + } + return false; + } + + T getDefaultByHash(uint16_t propHash) const noexcept + { + T value{}; + getDefaultByHash(propHash, value); + return value; + } + + T getDefault(const std::string_view prop) const noexcept + { + T value{}; + getDefault(prop, value); + return value; + } + + bool getDefault(const std::string_view prop, T& value) const noexcept + { + if (defaults.empty() == false) + { + return getDefaultByHash(str2int16(prop), value); + } + return false; + } + + bool getDefaultByHash(uint16_t propHash, T& value) const noexcept + { + for (const auto& prop : defaults) + { + if (prop.first == propHash) + { + value = prop.second; + return true; + } + } + return false; + } +}; diff --git a/src/Game/BaseLevelObject.cpp b/src/Game/BaseLevelObject.cpp index 8eebf2c0..c1d81833 100755 --- a/src/Game/BaseLevelObject.cpp +++ b/src/Game/BaseLevelObject.cpp @@ -7,6 +7,19 @@ bool BaseLevelObject::hasValidState() const noexcept return (texturePack != nullptr); } +bool BaseLevelObject::getTexture(TextureInfo& ti) const +{ + if (sprite.getTexture() != nullptr) + { + ti.texture = sprite.getTexture(); + ti.textureRect = sprite.getTextureRect(); + ti.offset = {}; + ti.palette = sprite.getPalette(); + return true; + } + return false; +} + void BaseLevelObject::updateDrawPosition(const Level& level) { updateDrawPosition(level, level.Map().getCoord(mapPosition)); @@ -124,9 +137,8 @@ bool BaseLevelObject::updateTexture() TextureInfo ti; if (texturePack->get(animation.currentTextureIdx, ti) == true) { + sprite.setTexture(ti, true); offset = ti.offset; - sprite.setTexture(*ti.texture, false); - sprite.setTextureRect(ti.textureRect); return true; } return false; @@ -140,7 +152,7 @@ void BaseLevelObject::queueAction(const std::shared_ptr& action) } } -void BaseLevelObject::queueAction(const BaseClass& class_, uint16_t nameHash16) +void BaseLevelObject::queueAction(const BaseClassActions& class_, uint16_t nameHash16) { auto action = class_.getAction(nameHash16); queueAction(action); diff --git a/src/Game/BaseLevelObject.h b/src/Game/BaseLevelObject.h index 8db7b2bb..24c97696 100755 --- a/src/Game/BaseLevelObject.h +++ b/src/Game/BaseLevelObject.h @@ -1,10 +1,10 @@ #pragma once #include "BaseAnimation.h" -#include "BaseClass.h" +#include "BaseClassActions.h" #include "LevelObject.h" #include -#include "Sprite2.h" +#include "SFML/Sprite2.h" #include "TexturePacks/TexturePack.h" struct BaseLevelObject @@ -33,6 +33,7 @@ struct BaseLevelObject } bool hasValidState() const noexcept; + bool getTexture(TextureInfo& ti) const; void updateDrawPosition(const Level& level); void updateDrawPosition(const Level& level, const sf::Vector2f& drawPos); void updateHover(Game& game, Level& level, LevelObject* levelObj); @@ -41,7 +42,7 @@ struct BaseLevelObject bool updateTexture(); void queueAction(const std::shared_ptr& action); - void queueAction(const BaseClass& class_, uint16_t nameHash16); + void queueAction(const BaseClassActions& class_, uint16_t nameHash16); void processQueuedActions(Game& game); BaseLevelObject() noexcept {} diff --git a/src/Game/Classifier.cpp b/src/Game/Classifier.cpp new file mode 100755 index 00000000..da40fc1d --- /dev/null +++ b/src/Game/Classifier.cpp @@ -0,0 +1,72 @@ +#include "Classifier.h" + +Variable Classifier::get(const Queryable& obj, uint16_t skipFirst) const +{ + Variable returnVar; + bool hasResult = false; + for (const auto& classVal : classifierValues) + { + bool hasValue = false; + Variable value; + if (classVal.property.empty() == true) + { + hasValue = true; + } + else if (obj.getProperty(classVal.property, value) == true) + { + hasValue = true; + } + if (hasValue == true) + { + for (const auto& itemElem : classVal.values) + { + bool compareResult = false; + + if (std::holds_alternative(itemElem.compare) == true) + { + const auto& minMax = std::get(itemElem.compare); + LevelObjValue intVal = 0; + if (std::holds_alternative(value) == true) + { + intVal = (LevelObjValue)std::get(value); + } + else if (std::holds_alternative(value) == true) + { + intVal = (LevelObjValue)std::get(value); + } + if (intVal >= minMax.first && intVal <= minMax.second) + { + compareResult = true; + } + } + else + { + const auto& str = std::get(value); + if (std::holds_alternative(itemElem.compare) == true && + std::get(itemElem.compare) == str) + { + compareResult = true; + } + } + if (compareResult == true) + { + if (skipFirst > 0) + { + skipFirst--; + } + else + { + returnVar = itemElem.value; + hasResult = true; + } + break; + } + } + if (hasResult == true) + { + break; + } + } + } + return returnVar; +} diff --git a/src/Game/Classifier.h b/src/Game/Classifier.h new file mode 100755 index 00000000..f870001b --- /dev/null +++ b/src/Game/Classifier.h @@ -0,0 +1,33 @@ +#pragma once + +#include "GameProperties.h" +#include "Queryable.h" +#include +#include + +struct ClassifierValue +{ + typedef std::pair ValuePair; + + // std::pair of min / max or std::string + std::variant compare; + Variable value; +}; + +struct ClassifierValueInterval +{ + std::string property; + std::vector values; +}; + +class Classifier +{ +private: + std::vector classifierValues; + +public: + Classifier(std::vector values) noexcept + : classifierValues(std::move(values)) {} + + Variable get(const Queryable& obj, uint16_t skipFirst = 0) const; +}; diff --git a/src/Game/Classifiers.h b/src/Game/Classifiers.h new file mode 100755 index 00000000..f197bc0d --- /dev/null +++ b/src/Game/Classifiers.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include "Classifier.h" +#include "GameUtils.h" + +class Queryable; + +template +class Classifiers +{ +private: + std::array, Size_> classifiers; + +public: + bool getVar(size_t idx, const Queryable& obj, Variable& var) const + { + if (idx >= classifiers.size()) + { + return false; + } + auto classifier = classifiers[idx].first; + if (classifier == nullptr) + { + return false; + } + var = classifier->get(obj, classifiers[idx].second); + return true; + } + + bool getText(size_t idx, const Queryable& obj, std::string& text) const + { + if (idx >= classifiers.size()) + { + return false; + } + auto classifier = classifiers[idx].first; + if (classifier == nullptr) + { + return false; + } + text = VarUtils::toString(classifier->get(obj, classifiers[idx].second)); + if (text.empty() == false) + { + text = GameUtils::replaceStringWithQueryable(text, obj); + } + return true; + } + + void set(size_t idx, Classifier* classifier, uint16_t skipFirst) + { + if (idx >= classifiers.size()) + { + return; + } + classifiers[idx] = std::make_pair(classifier, skipFirst); + } +}; diff --git a/src/Game/Formula.cpp b/src/Game/Formula.cpp index 03512d9c..bad732e8 100755 --- a/src/Game/Formula.cpp +++ b/src/Game/Formula.cpp @@ -1,35 +1,51 @@ #include "Formula.h" +#if (_MSC_VER >= 1914) +#include +#else +#include +#endif #include "Utils/Utils.h" -Formula::Formula(const std::string& formula) +Formula::Formula(const std::string_view formula) { // tokenize formula - const std::string delimiters{ "+-*/()" }; - std::string buffer; - std::vector tokens; - for (auto c : formula) + const std::string_view delimiters{ "+-*/()" }; + size_t bufferStart = 0; + size_t bufferSize = 0; + std::vector tokens; + for (size_t i = 0; i < formula.size(); i++) { + auto c = formula[i]; if (c == ' ') { + if (bufferSize == 0) + { + bufferStart++; + } continue; } if (delimiters.find(c) != std::string::npos) { - if (buffer.size() > 0) + if (bufferSize > 0) { - tokens.push_back(buffer); + tokens.push_back(std::string_view(formula.data() + bufferStart, bufferSize)); } - tokens.push_back(std::string(1, c)); - buffer.clear(); + tokens.push_back(std::string_view(&formula[i], 1)); + bufferStart = i + 1; + bufferSize = 0; } else { - buffer += c; + bufferSize++; } } - if (buffer.size() > 0 && buffer != ")") + if (bufferSize > 0) { - tokens.push_back(buffer); + auto token = std::string_view(formula.data() + bufferStart, bufferSize); + if (token != ")") + { + tokens.push_back(token); + } } // create internal formula @@ -71,18 +87,38 @@ Formula::Formula(const std::string& formula) } else { - try +#if (_MSC_VER >= 1914) + double val = 0.0; + auto err = std::from_chars(elem.data(), elem.data() + elem.size(), val); + if (err.ec == std::errc() || + err.ec == std::errc::result_out_of_range) { - elements.push_back({ std::stod(elem) }); + elements.push_back({ val }); } - catch (std::out_of_range e) + else + { + elements.push_back(std::string(elem)); + } +#else + int& errno_ref = errno; + const char* sPtr = elem.data(); + char* ePtr; + errno_ref = 0; + double val = std::strtod(sPtr, &ePtr); + + if (errno_ref == ERANGE) // out of range { elements.push_back({ 0.0 }); } - catch (std::invalid_argument e) + else if (sPtr == ePtr) // invalid argument + { + elements.push_back(std::string(elem)); + } + else { - elements.push_back({ elem }); + elements.push_back({ val }); } +#endif } } // remove trailing closing brackets (faster eval, same result) diff --git a/src/Game/Formula.h b/src/Game/Formula.h index 47c25aa8..767e5aa8 100755 --- a/src/Game/Formula.h +++ b/src/Game/Formula.h @@ -2,6 +2,7 @@ #include "LevelObject.h" #include +#include #include #include @@ -28,7 +29,7 @@ class Formula public: Formula() noexcept {} - Formula(const std::string& formula); + Formula(const std::string_view formula); bool empty() const noexcept { return elements.empty(); } diff --git a/src/Game/ItemProperties.h b/src/Game/GameHashes.h similarity index 94% rename from src/Game/ItemProperties.h rename to src/Game/GameHashes.h index a85b0d0d..d823169f 100755 --- a/src/Game/ItemProperties.h +++ b/src/Game/GameHashes.h @@ -2,13 +2,18 @@ #include "Utils/Utils.h" +namespace ItemClasses +{ + const uint16_t Gold = str2int16("gold"); +} + namespace ItemProp { const uint16_t Identified = str2int16("identified"); const uint16_t Magical = str2int16("magical"); - const uint16_t Gold = str2int16("gold"); - const uint16_t GoldMax = str2int16("goldMax"); + const uint16_t Capacity = str2int16("capacity"); + const uint16_t Quantity = str2int16("quantity"); const uint16_t LifeAndManaDamage = str2int16("lifeAndManaDamage"); const uint16_t AllAttributes = str2int16("allAttributes"); diff --git a/src/Game/GameProperties.h b/src/Game/GameProperties.h index e33dd8e5..6d9fff76 100755 --- a/src/Game/GameProperties.h +++ b/src/Game/GameProperties.h @@ -60,7 +60,7 @@ enum class PlayerItemMount : size_t Size }; -enum class PlayerAction : size_t +enum class PlayerStatus : size_t { Stand, Walk, diff --git a/src/Game/Inventories.h b/src/Game/Inventories.h new file mode 100755 index 00000000..4138682e --- /dev/null +++ b/src/Game/Inventories.h @@ -0,0 +1,172 @@ +#pragma once + +#include +#include "GameHashes.h" +#include "Inventory.h" + +template +class Inventories : private std::array +{ + typedef std::array InvArray; + +public: + using InvArray::begin; + using InvArray::end; + using InvArray::cbegin; + using InvArray::cend; + using InvArray::rbegin; + using InvArray::rend; + using InvArray::crbegin; + using InvArray::crend; + + using InvArray::size; + using InvArray::max_size; + using InvArray::operator[]; + + bool empty() const noexcept + { + for (const auto& inv : (*this)) + { + if (inv.empty() == false) + { + return false; + } + } + return true; + } + + bool getFreeSlot(const Item& item, size_t& invIdx, + size_t& itemIdx, InventoryPosition invPos) const + { + for (; invIdx < size(); invIdx++) + { + if ((*this)[invIdx].getFreeSlot(item, itemIdx, invPos) == true) + { + return true; + } + } + return false; + } + + bool hasFreeSlot(const Item& item) const + { + for (const auto& inv : (*this)) + { + if (inv.hasFreeSlot(item) == true) + { + return true; + } + } + return false; + } + + unsigned countFreeSlots(uint16_t classIdHash16) const + { + unsigned count = 0; + for (const auto& inv : (*this)) + { + count += inv.countFreeSlots(classIdHash16); + } + return count; + } + + bool findByClass(uint16_t classIdHash16, size_t& invIdx, + size_t& itemIdx, Item*& item) const + { + for (; invIdx < size(); invIdx++) + { + if ((*this)[invIdx].findByClass(classIdHash16, itemIdx, item) == true) + { + return true; + } + else if (invIdx < size() - 1) + { + itemIdx = 0; + } + } + return false; + } + + uint32_t findFreeQuantity(uint16_t classIdHash16, + size_t& invIdx, size_t& itemIdx, Item*& item) const + { + for (; invIdx < size(); invIdx++) + { + uint32_t freeQuantity = 0; + if ((freeQuantity = (*this)[invIdx].findFreeQuantity( + classIdHash16, itemIdx, item)) > 0) + { + return freeQuantity; + } + else if (invIdx < size() - 1) + { + itemIdx = 0; + } + } + return 0; + } + + // returns the remaining quantity to add/remove. 0 if all quantity was added. + LevelObjValue addQuantity(const ItemClass& itemClass, + LevelObjValue amount, InventoryPosition invPos) + { + for (auto& inv : (*this)) + { + amount = inv.addQuantity(itemClass, amount, invPos); + if (amount == 0) + { + return 0; + } + } + return amount; + } + + // Gets the sum of all the quantities for a specified item class id or 0. + // returns true if the item is quantifiable or false (and sets quantity to 0) otherwise. + bool getQuantity(uint16_t classIdHash16, uint32_t& quantity) const + { + bool isQuantifiable = false; + uint64_t totalQuantity = 0; + for (const auto& inv : (*this)) + { + uint32_t quantity; + if (inv.getQuantity(classIdHash16, quantity) == true) + { + totalQuantity += quantity; + isQuantifiable = true; + } + } + if (totalQuantity > std::numeric_limits::max()) + { + totalQuantity = std::numeric_limits::max(); + } + quantity = (uint32_t)totalQuantity; + return isQuantifiable; + } + + // returns the sum of all the quantities for a specified item class id. + uint32_t getQuantity(uint16_t classIdHash16) const + { + uint32_t quantity; + getQuantity(classIdHash16, quantity); + return quantity; + } + + uint32_t getMaxCapacity(const ItemClass& itemClass) const + { + if (itemClass.getDefaultByHash(ItemProp::Capacity) <= 0) + { + return 0; + } + uint64_t maxCapacity = 0; + for (const auto& inv : (*this)) + { + maxCapacity += inv.getMaxCapacity(itemClass); + } + if (maxCapacity >= std::numeric_limits::max()) + { + return std::numeric_limits::max(); + } + return (uint32_t)maxCapacity; + } +}; diff --git a/src/Game/Inventory.cpp b/src/Game/Inventory.cpp new file mode 100755 index 00000000..04242f5c --- /dev/null +++ b/src/Game/Inventory.cpp @@ -0,0 +1,804 @@ +#include "Inventory.h" +#include "Game/GameHashes.h" +#include "Utils/Utils.h" + +Inventory::Inventory(size_t size_) +{ + init(size_); +} + +Inventory::Inventory(const ItemXY& size_) +{ + init(size_); +} + +void Inventory::init(size_t size_) +{ + uint8_t newSize = (size_ > 0xFF ? 0xFF : (uint8_t)size_); + size = ItemXY(newSize, 1); + items.resize(newSize); + resetIndexes(); +} + +void Inventory::init(const ItemXY& size_) +{ + if (size_.x * size_.y > 1024) + { + size.x = 32; + size.y = 32; + } + else + { + size = size_; + } + items.resize(size.x * size.y); + resetIndexes(); +} + +void Inventory::resetIndexes() noexcept +{ + for (auto& item : items) + { + item.second = -1; + } +} + +bool Inventory::empty() const noexcept +{ + for (const auto& item : items) + { + if (item.first != nullptr || + item.second >= 0) + { + return false; + } + } + return true; +} + +void Inventory::allowType(const std::string_view type) +{ + auto typeHash = str2int16(type); + allowTypeByHash(typeHash); +} + +void Inventory::allowTypeByHash(uint16_t typeHash16) +{ + if (std::find(allowedTypes.begin(), allowedTypes.end(), typeHash16) == allowedTypes.end()) + { + allowedTypes.push_back(typeHash16); + } +} + +bool Inventory::isTypeAllowed(const std::string_view type) const +{ + return isTypeAllowed(str2int16(type)); +} + +bool Inventory::isTypeAllowed(uint16_t typeHash16) const +{ + if (allowedTypes.empty() == true) + { + return true; + } + return (std::find(allowedTypes.begin(), allowedTypes.end(), typeHash16) != allowedTypes.end()); +} + +Item* Inventory::get(size_t idx) const +{ + if (idx < items.size()) + { + if (items[idx].second >= 0 && + ((size_t)items[idx].second) < items.size()) + { + return items[(size_t)items[idx].second].first.get(); + } + return items[idx].first.get(); + } + return nullptr; +} + +bool Inventory::set(size_t idx, std::unique_ptr& item) +{ + std::unique_ptr oldItem; + return set(idx, item, oldItem); +} + +bool Inventory::set(size_t idx, std::unique_ptr& item, + std::unique_ptr& oldItem) +{ + if (idx < items.size()) + { + if (item != nullptr && + isTypeAllowed(item->Class()->TypeHash16()) == false) + { + return false; + } + if (enforceItemSize == false) + { + return setAndDontEnforceItemSize(idx, item, oldItem); + } + else + { + return setAndEnforceItemSize( + ItemXY((uint8_t)(idx % size.x), (uint8_t)(idx / size.x)), + item, + oldItem); + } + } + return false; +} + +bool Inventory::set(const ItemXY& position, std::unique_ptr& item) +{ + std::unique_ptr oldItem; + return set(position, item, oldItem); +} + +bool Inventory::set(const ItemXY& position, std::unique_ptr& item, + std::unique_ptr& oldItem) +{ + size_t idx = position.x + position.y * size.x; + if (idx < items.size()) + { + if (item != nullptr && + isTypeAllowed(item->Class()->TypeHash16()) == false) + { + return false; + } + if (enforceItemSize == false) + { + return setAndDontEnforceItemSize(idx, item, oldItem); + } + else + { + return setAndEnforceItemSize(position, item, oldItem); + } + } + return false; +} + +bool Inventory::setAndDontEnforceItemSize(size_t idx, std::unique_ptr& item, + std::unique_ptr& oldItem) +{ + Item* itemPtr = item.get(); + if (item != nullptr) + { + item->MapPosition({ -1, -1 }); + } + oldItem = std::move(items[idx].first); + items[idx].first = std::move(item); + items[idx].second = -1; + + LevelObjValue transferedQuantity; + if (updateQuantities(itemPtr, oldItem.get(), transferedQuantity) == true) + { + oldItem = nullptr; + } + return true; +} + +bool Inventory::setAndEnforceItemSize(const ItemXY& position, + std::unique_ptr& item, std::unique_ptr& oldItem) +{ + if (size.x == 0 || size.y == 0) + { + return false; + } + ItemXY itemSize(1, 1); + if (item != nullptr) + { + itemSize = item->Class()->InventorySize(); + if (itemSize.x > size.x + || itemSize.y > size.y) + { + return false; + } + } + auto pos = position; + size_t posEndX = (size_t)(pos.x + itemSize.x); + size_t posEndY = (size_t)(pos.y + itemSize.y); + if (posEndX > size.x) + { + posEndX = size.x; + pos.x = size.x - itemSize.x; + } + if (posEndY > size.y) + { + posEndY = size.y; + pos.y = size.y - itemSize.y; + } + Item* itemPtr = item.get(); + Item* oldItemPtr = nullptr; + for (size_t i = pos.x; i < posEndX; i++) + { + for (size_t j = pos.y; j < posEndY; j++) + { + const auto& item2 = get(i, j); + if (item2 != nullptr) + { + if (oldItemPtr == nullptr) + { + oldItemPtr = item2; + } + else if (oldItemPtr != item2) + { + return false; + } + } + } + } + if (oldItemPtr != nullptr) + { + int32_t oldIdx = -1; + for (size_t i = 0; i < items.size(); i++) + { + if (oldIdx >= 0) + { + if (items[i].second == oldIdx) + { + items[i].second = -1; + } + continue; + } + if (items[i].first.get() == oldItemPtr) + { + oldIdx = (int32_t)i; + oldItem = std::move(items[i].first); + } + } + } + else + { + oldItem = nullptr; + } + + int32_t newIdx = -1; + for (size_t i = pos.x; i < posEndX; i++) + { + for (size_t j = pos.y; j < posEndY; j++) + { + size_t idx = i + j * size.x; + if (newIdx >= 0) + { + items[idx].second = newIdx; + continue; + } + if (item != nullptr) + { + item->MapPosition({ -1, -1 }); + } + items[idx].first = std::move(item); + items[idx].second = -1; + newIdx = (int32_t)idx; + } + } + + LevelObjValue transferedQuantity; + if (updateQuantities(itemPtr, oldItemPtr, transferedQuantity) == true) + { + oldItem = nullptr; + } + + return true; +} + +bool Inventory::isFull() const noexcept +{ + for (const auto& item : items) + { + if (item.first == nullptr && + item.second < 0) + { + return false; + } + } + return true; +} + +bool Inventory::isSlotInUse(size_t idx) const +{ + if (idx >= items.size()) + { + return false; + } + return items[idx].first != nullptr; +} + +bool Inventory::isSlotInUse(const ItemXY& position) const +{ + if (position.x >= size.x + || position.y >= size.y) + { + return false; + } + return isSlotInUse(position.x + position.y * size.x); +} + +bool Inventory::isSlotEmpty(int x, int y, + const ItemXY& itemSize, size_t& itemIdx) const +{ + size_t sizeX = (size_t)x; + size_t sizeY = (size_t)y; + if (enforceItemSize == true) + { + sizeX += itemSize.x; + sizeY += itemSize.y; + } + else + { + sizeX++; + sizeY++; + } + for (size_t i = x; i < sizeX; i++) + { + for (size_t j = y; j < sizeY; j++) + { + size_t idx = i + j * size.x; + if (items[idx].first != nullptr || + items[idx].second >= 0) + { + return false; + } + } + } + itemIdx = (size_t)(x + y * (int)size.x); + return true; +} + +bool Inventory::getFreeSlot(const Item& item, + size_t& itemIdx, InventoryPosition invPos) const +{ + if (isTypeAllowed(item.Class()->TypeHash16()) == false) + { + return false; + } + + const auto& itemSize = item.Class()->InventorySize(); + + if (itemSize.x > size.x || itemSize.y > size.y) + { + return false; + } + + int sizeX = (int)size.x - (int)itemSize.x; + int sizeY = (int)size.y - (int)itemSize.y; + + switch (invPos) + { + default: + case InventoryPosition::TopLeft: + { + for (int y = 0; y <= sizeY; y++) + { + for (int x = 0; x <= sizeX; x++) + { + if (isSlotEmpty(x, y, itemSize, itemIdx) == true) + { + return true; + } + } + } + break; + } + case InventoryPosition::TopRight: + { + for (int y = 0; y <= sizeY; y++) + { + for (int x = sizeX; x >= 0; x--) + { + if (isSlotEmpty(x, y, itemSize, itemIdx) == true) + { + return true; + } + } + } + break; + } + case InventoryPosition::BottomLeft: + { + for (int y = sizeY; y >= 0; y--) + { + for (int x = 0; x <= sizeX; x++) + { + if (isSlotEmpty(x, y, itemSize, itemIdx) == true) + { + return true; + } + } + } + break; + } + case InventoryPosition::BottomRight: + { + for (int y = sizeY; y >= 0; y--) + { + for (int x = sizeX; x >= 0; x--) + { + if (isSlotEmpty(x, y, itemSize, itemIdx) == true) + { + return true; + } + } + } + break; + } + } + return false; +} + +bool Inventory::hasFreeSlot(const Item& item) const +{ + size_t itemIdx; + return getFreeSlot(item, itemIdx, InventoryPosition::TopLeft); +} + +bool Inventory::findByClass(uint16_t classIdHash16, size_t& idx, Item*& item) const +{ + auto size = items.size(); + if (idx < size) + { + for (size_t i = idx; i < size; i++) + { + if (isSlotInUse(i) == true) + { + if (items[i].first->Class()->IdHash16() == classIdHash16) + { + idx = i; + item = items[i].first.get(); + return true; + } + } + } + } + idx = size; + return false; +} + +uint32_t Inventory::findFreeQuantity( + uint16_t classIdHash16, size_t& idx, Item*& itemFound) const +{ + auto size = items.size(); + if (idx < size) + { + for (size_t i = idx; i < size; i++) + { + if (isSlotInUse(i) == true) + { + if (items[i].first->Class()->IdHash16() == classIdHash16) + { + auto itemPtr = items[i].first.get(); + auto itemQuantity = itemPtr->getIntByHash(ItemProp::Quantity); + auto itemCapacity = itemPtr->getIntByHash(ItemProp::Capacity); + if (itemQuantity < itemCapacity && + itemCapacity > 0) + { + idx = i; + itemFound = itemPtr; + return (uint32_t)(itemCapacity - itemQuantity); + } + } + } + } + } + idx = size; + return 0; +} + +uint32_t Inventory::findBiggestFreeQuantity(uint16_t classIdHash16, + Item*& itemFound, uint32_t quantityNeded) const +{ + uint32_t biggestFreeQuantity = 0; + uint32_t freeQuantity = 0; + Item* biggestItem = nullptr; + Item* foundItem = nullptr; + size_t idx = 0; + while ((freeQuantity = findFreeQuantity(classIdHash16, idx, foundItem))) + { + if (quantityNeded < freeQuantity && + biggestFreeQuantity < freeQuantity) + { + biggestFreeQuantity = freeQuantity; + biggestItem = foundItem; + } + idx++; + } + if (biggestItem != nullptr) + { + itemFound = biggestItem; + return biggestFreeQuantity; + } + return 0; +} + +uint32_t Inventory::findSmallestFreeQuantity(uint16_t classIdHash16, + Item*& itemFound, uint32_t quantityNeded) const +{ + uint32_t smallestFreeQuantity = std::numeric_limits::max(); + uint32_t freeQuantity = 0; + Item* smallestItem = nullptr; + Item* foundItem = nullptr; + size_t idx = 0; + while ((freeQuantity = findFreeQuantity(classIdHash16, idx, foundItem))) + { + if (quantityNeded < freeQuantity && + smallestFreeQuantity > freeQuantity) + { + smallestFreeQuantity = freeQuantity; + smallestItem = foundItem; + } + idx++; + } + if (smallestItem != nullptr) + { + itemFound = smallestItem; + return smallestFreeQuantity; + } + return 0; +} + +unsigned Inventory::countFreeSlotsNoChecks(uint16_t classIdHash16) const +{ + unsigned count = 0; + for (const auto& item : items) + { + if (item.first == nullptr && item.second < 0) + { + count++; + } + } + return count; +} + +unsigned Inventory::countFreeSlots(uint16_t classIdHash16) const +{ + unsigned count = 0; + if (isTypeAllowed(classIdHash16) == true) + { + count = countFreeSlotsNoChecks(classIdHash16); + } + return count; +} + +LevelObjValue Inventory::addQuantity(const ItemClass& itemClass, + LevelObjValue amount, InventoryPosition invPos) +{ + if (amount == 0 || + itemClass.getDefaultByHash(ItemProp::Capacity) <= 0 || + isTypeAllowed(itemClass.TypeHash16()) == false) + { + return amount; + } + bool remove = amount < 0; + size_t itemIdx = 0; + Item* item; + + if (remove == true) + { + // remove from smallest first + uint32_t freeSlots = 0; + while ((freeSlots = findFreeQuantity(itemClass.IdHash16(), itemIdx, item)) > 0) + { + auto newQuant = item->addQuantity(amount); + if (newQuant == 0) + { + std::unique_ptr nullItem; + set(itemIdx, nullItem); + } + if (amount == 0) + { + return 0; + } + itemIdx++; + } + + // remove from any item of the same type + itemIdx = 0; + while (findByClass(itemClass.IdHash16(), itemIdx, item) == true) + { + auto newQuant = item->addQuantity(amount); + if (newQuant == 0) + { + std::unique_ptr nullItem; + set(itemIdx, nullItem); + } + if (amount == 0) + { + return 0; + } + itemIdx++; + } + } + else + { + uint32_t freeSlots = 0; + while ((freeSlots = findFreeQuantity(itemClass.IdHash16(), itemIdx, item)) > 0) + { + item->addQuantity(amount); + if (amount == 0) + { + return 0; + } + itemIdx++; + } + } + if (remove == false) + { + while (true) + { + if (amount <= 0) + { + return 0; + } + auto newItem = std::make_unique(&itemClass); + auto capacity = newItem->getIntByHash(ItemProp::Capacity); + if (capacity <= 0) + { + return amount; + } + LevelObjValue quantity = capacity; + if (amount <= capacity) + { + quantity = amount; + } + newItem->setIntByHash(ItemProp::Quantity, quantity); + + size_t itemIdx2 = 0; + if (getFreeSlot(*newItem, itemIdx2, invPos) == true) + { + set(itemIdx2, newItem); + amount -= quantity; + } + else + { + break; + } + } + } + return amount; +} + +bool Inventory::getQuantity(uint16_t classIdHash16, uint32_t& quantity) const +{ + bool isQuantifiable = false; + int64_t totalQuantity = 0; + if (isTypeAllowed(classIdHash16) == true) + { + for (const auto& item : (*this)) + { + LevelObjValue quant; + if (item.Class()->IdHash16() == classIdHash16) + { + if (item.getIntByHash(ItemProp::Quantity, quant) == true) + { + totalQuantity += quant; + isQuantifiable = true; + } + } + } + if (totalQuantity < 0) + { + totalQuantity = 0; + } + else if (totalQuantity > std::numeric_limits::max()) + { + totalQuantity = std::numeric_limits::max(); + } + } + quantity = (uint32_t)totalQuantity; + return isQuantifiable; +} + +uint32_t Inventory::getQuantity(uint16_t classIdHash16) const +{ + uint32_t quantity; + getQuantity(classIdHash16, quantity); + return quantity; +} + +uint32_t Inventory::getMaxCapacity(const ItemClass& itemClass) const +{ + if (itemClass.getDefaultByHash(ItemProp::Capacity) <= 0 || + isTypeAllowed(itemClass.IdHash16()) == false) + { + return 0; + } + uint64_t maxCapacity = 0; + size_t itemIdx = 0; + Item* item; + uint32_t freeQuantity = 0; + while ((freeQuantity = findFreeQuantity(itemClass.IdHash16(), itemIdx, item)) > 0) + { + maxCapacity += freeQuantity; + itemIdx++; + } + auto freeSlots = countFreeSlotsNoChecks(itemClass.IdHash16()); + if (freeSlots > 0) + { + auto defaultCapacity = itemClass.getDefaultByHash(ItemProp::Capacity); + if (defaultCapacity > 0) + { + maxCapacity += (uint64_t)defaultCapacity * freeSlots; + if (maxCapacity >= std::numeric_limits::max()) + { + return std::numeric_limits::max(); + } + } + } + return (uint32_t)maxCapacity; +} + +bool Inventory::getProperty(const std::string_view prop, Variable& var) const +{ + if (prop.empty() == true) + { + return false; + } + auto props = Utils::splitStringIn2(prop, '.'); + switch (str2int16(props.first)) + { + case str2int16("capacity"): + var = Variable((int64_t)items.size()); + break; + case str2int16("enforceItemSize"): + var = Variable(enforceItemSize); + break; + case str2int16("isFull"): + var = Variable(isFull()); + break; + case str2int16("size"): + { + if (props.second == "x") + { + var = Variable((int64_t)size.x); + } + else + { + var = Variable((int64_t)size.y); + } + } + break; + default: + return false; + } + return true; +} + +bool Inventory::updateQuantities(Item* itemToAdd, Item* itemToRemove, + LevelObjValue& transferedQuantity, bool onlyUpdateIfFullTransfer) +{ + transferedQuantity = 0; + bool removeItem = false; + LevelObjValue capacity; + LevelObjValue capacityOld; + if (itemToAdd != nullptr && + itemToRemove != nullptr && + itemToAdd->Class() == itemToRemove->Class() && + itemToAdd->getIntByHash(ItemProp::Capacity, capacity) == true && + itemToRemove->getIntByHash(ItemProp::Capacity, capacityOld) == true) + { + auto quantityA = itemToAdd->getIntByHash(ItemProp::Quantity); + auto quantityB = itemToRemove->getIntByHash(ItemProp::Quantity); + + if (quantityA + quantityB <= capacity) + { + transferedQuantity = quantityB; + quantityA += quantityB; + quantityB = 0; + removeItem = true; + } + else if (onlyUpdateIfFullTransfer == true) + { + return false; + } + else + { + transferedQuantity = capacity - quantityA; + quantityB -= capacity - quantityA; + quantityA = capacity; + } + itemToAdd->setIntByHash(ItemProp::Quantity, quantityA); + itemToRemove->setIntByHash(ItemProp::Quantity, quantityB); + } + return removeItem; +} diff --git a/src/Game/Inventory.h b/src/Game/Inventory.h new file mode 100755 index 00000000..8d1ea92f --- /dev/null +++ b/src/Game/Inventory.h @@ -0,0 +1,191 @@ +#pragma once + +#include "GameProperties.h" +#include "Item.h" +#include "ItemXY.h" +#include +#include +#include "Utils/iterator_tpl.h" +#include + +class Inventory +{ +private: + // if index >= 0, it points to the item. + typedef std::pair, int32_t> ItemCell; + + std::vector items; + ItemXY size; + std::vector allowedTypes; + bool enforceItemSize{ false }; + + // Doesn't perform the check for allowed class types. only for items whose size is 1 + unsigned countFreeSlotsNoChecks(uint16_t classIdHash16) const; + + bool setAndDontEnforceItemSize(size_t idx, std::unique_ptr& item, + std::unique_ptr& oldItem); + + bool setAndEnforceItemSize(const ItemXY& position, std::unique_ptr& item, + std::unique_ptr& oldItem); + + bool isSlotEmpty(int x, int y, + const ItemXY& itemSize, size_t& itemIdx) const; + + void resetIndexes() noexcept; + +public: + struct it_state + { + size_t idx; + inline void next(const Inventory* ref) + { + idx++; + for (; idx < ref->items.size(); idx++) + { + if (ref->items[idx].first == nullptr) + { + continue; + } + return; + } + } + inline void prev(const Inventory* ref) + { + auto size = ref->items.size(); + if (size > 0) + { + idx--; + for (; idx < size; idx--) + { + if (ref->items[idx].first == nullptr) + { + continue; + } + return; + } + } + idx = size; + } + inline void begin(const Inventory* ref) + { + idx = 0; + if (ref->items.empty() == false && + ref->items[idx].first == nullptr) + { + next(ref); + } + } + inline void end(const Inventory* ref) noexcept + { + idx = ref->items.size(); + } + inline Item& get(Inventory* ref) + { + return *ref->items[idx].first; + } + inline const Item& get(const Inventory* ref) + { + return *ref->items[idx].first; + } + inline bool cmp(const it_state& s) const noexcept + { + return idx != s.idx; + } + }; + + SETUP_ITERATORS(Inventory, const Item&, it_state); + SETUP_REVERSE_ITERATORS(Inventory, const Item&, it_state); + + Inventory() noexcept {} + Inventory(size_t size_); + Inventory(const ItemXY& size_); + + void init(size_t size_); + void init(const ItemXY& size_); + + bool empty() const noexcept; + + size_t Size() const noexcept { return items.size(); } + const ItemXY& getXYSize() const noexcept { return size; } + + bool getEnforceItemSize() const noexcept { return enforceItemSize; } + void setEnforceItemSize(bool enforceItemSize_) noexcept { enforceItemSize = enforceItemSize_; } + + const std::vector& AllowedTypes() const noexcept { return allowedTypes; } + + void allowType(const std::string_view type); + void allowTypeByHash(uint16_t typeHash16); + + bool isTypeAllowed(const std::string_view type) const; + bool isTypeAllowed(uint16_t typeHash16) const; + + size_t getIndex(size_t x, size_t y) const noexcept { return x + y * size.x; } + size_t getIndex(const ItemXY& pos) const noexcept { return getIndex(pos.x, pos.y); } + + Item* get(size_t idx) const; + Item* get(size_t x, size_t y) const { return get(x + y * size.x); } + Item* get(const ItemXY& pos) const { return get(pos.x, pos.y); } + + bool set(size_t idx, std::unique_ptr& item); + bool set(size_t idx, std::unique_ptr& item, std::unique_ptr& oldItem); + + bool set(const ItemXY& position, std::unique_ptr& item); + bool set(const ItemXY& position, std::unique_ptr& item, + std::unique_ptr& oldItem); + + bool isFull() const noexcept; + + // only checks the specified slot. if a slot is indexing another slot, it returns false. + bool isSlotInUse(size_t idx) const; + // only checks the specified slot. if a slot is indexing another slot, it returns false. + bool isSlotInUse(const ItemXY& position) const; + + bool getFreeSlot(const Item& item, + size_t& itemIdx, InventoryPosition invPos) const; + + bool hasFreeSlot(const Item& item) const; + + // finds an item by the item's class id + // returns true if successful and sets both index and item + bool findByClass(uint16_t classIdHash16, size_t& idx, Item*& item) const; + + // finds an item with capacity/quantity that has quantity < capacity + // returns the free quantity or 0 if no items with free quantity exists + uint32_t findFreeQuantity(uint16_t classIdHash16, size_t& idx, Item*& itemFound) const; + + // finds an item with capacity/quantity that has the biggest free quantity + // that can store the quantity needed (by default 0). + // returns the free quantity or 0 if no items with free quantity exists + uint32_t findBiggestFreeQuantity(uint16_t classIdHash16, + Item*& itemFound, uint32_t quantityNeded = 0) const; + + // finds an item with capacity/quantity that has the smallest free quantity + // that can store the quantity needed (by default 0). + // returns the free quantity or 0 if no items with free quantity exists + uint32_t findSmallestFreeQuantity(uint16_t classIdHash16, + Item*& itemFound, uint32_t quantityNeded = 0) const; + + // only for items whose size is 1 + unsigned countFreeSlots(uint16_t classIdHash16) const; + + // returns the remaining quantity to add/remove. 0 if all quantity was added. + LevelObjValue addQuantity(const ItemClass& itemClass, + LevelObjValue amount, InventoryPosition invPos); + + // Gets the sum of all the quantities for a specified item class id or 0. + // returns true if the item is quantifiable or false (and sets quantity to 0) otherwise. + bool getQuantity(uint16_t classIdHash16, uint32_t& quantity) const; + + // returns the sum of all the quantities for a specified item class id. + uint32_t getQuantity(uint16_t classIdHash16) const; + + uint32_t getMaxCapacity(const ItemClass& itemClass) const; + + bool getProperty(const std::string_view prop, Variable& var) const; + + // Transfers the quantity in the second item to the first item. + // onlyUpdateIfFullTransfer - if true, only updates the first item if the second item's quantity fits in the first + // return true if the second item's quantity is 0. + static bool updateQuantities(Item* itemToAdd, Item* itemToRemove, + LevelObjValue& transferedQuantity, bool onlyUpdateIfFullTransfer = false); +}; diff --git a/src/Game/Item.cpp b/src/Game/Item.cpp index 1ab78634..80e97633 100755 --- a/src/Game/Item.cpp +++ b/src/Game/Item.cpp @@ -1,8 +1,8 @@ #include "Item.h" #include "Game.h" +#include "GameHashes.h" #include "GameUtils.h" #include "Game/Level.h" -#include "ItemProperties.h" #include "Player.h" #include "Utils/Utils.h" @@ -12,14 +12,10 @@ Item::Item(const ItemClass* class__) : class_(class__) base.animation.textureIndexRange = class__->getDropTextureIndexRange(); base.animation.textureIndexRange.second--; base.animation.currentTextureIdx = base.animation.textureIndexRange.second; - base.animation.frameTime = class_->DefaultAnimationSpeed(); + base.animation.frameTime = class__->AnimationSpeed(); base.animation.animType = AnimationType::PlayOnce; base.hoverCellSize = 1; - if (class__->getInventoryTexturePack()->isIndexed() == true) - { - base.sprite.setPalette(class__->getInventoryTexturePack()->getPalette()); - } - base.sprite.setOutline(class__->DefaultOutline(), class__->DefaultOutlineIgnore()); + base.sprite.setOutline(class__->Outline(), class__->OutlineIgnore()); base.updateTexture(); applyDefaults(); } @@ -38,6 +34,19 @@ void Item::resetDropAnimation(Level& level) noexcept } } +bool Item::getTexture(size_t textureNumber, TextureInfo& ti) const +{ + switch (textureNumber) + { + case 0: + return base.getTexture(ti); + case 1: + return class_->getInventoryTexture(*this, ti); + default: + return false; + } +} + void Item::executeAction(Game& game) const { class_->executeAction(game, str2int16("action")); @@ -63,16 +72,20 @@ void Item::update(Game& game, Level& level) } } -bool Item::getProperty(const std::string& prop, Variable& var) const +bool Item::getProperty(const std::string_view prop, Variable& var) const { if (prop.empty() == true) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); switch (propHash) { + case str2int16("class"): + case str2int16("classId"): + var = Variable(class_->Id()); + break; case str2int16("shortName"): var = Variable(ShortName()); break; @@ -89,7 +102,7 @@ bool Item::getProperty(const std::string& prop, Variable& var) const case str2int16("description"): { updateNameAndDescriptions(); - size_t idx = std::strtoul(props.second.c_str(), NULL, 10); + size_t idx = Utils::strtou(props.second); if (idx >= descriptions.size()) { idx = 0; @@ -101,18 +114,18 @@ bool Item::getProperty(const std::string& prop, Variable& var) const { updateNameAndDescriptions(); bool hasDescr = false; - size_t idx = std::strtoul(props.second.c_str(), NULL, 10); + size_t idx = Utils::strtou(props.second); if (idx < descriptions.size()) { hasDescr = descriptions[idx].empty() == false; } - var = Variable((bool)hasDescr); + var = Variable(hasDescr); break; } case str2int16("prices"): { LevelObjValue value; - if (class_->evalFormula(str2int16(props.second.c_str()), *this, value) == false) + if (class_->evalFormula(str2int16(props.second), *this, value) == false) { if (getIntByHash(propHash, value) == false) { @@ -123,7 +136,7 @@ bool Item::getProperty(const std::string& prop, Variable& var) const break; } case str2int16("identified"): - var = Variable((bool)identified); + var = Variable(identified); break; case str2int16("type"): var = Variable(std::string("item")); @@ -144,7 +157,7 @@ bool Item::getProperty(const std::string& prop, Variable& var) const var = Variable(needsRepair()); break; case str2int16("propertyCount"): - var = Variable((int64_t)propertiesSize); + var = Variable((int64_t)properties.size()); break; case str2int16("hasProperty"): var = Variable(hasInt(props.second)); @@ -166,7 +179,7 @@ bool Item::getProperty(const std::string& prop, Variable& var) const return true; } -void Item::setProperty(const std::string& prop, const Variable& val) +void Item::setProperty(const std::string_view prop, const Variable& val) { if (prop.empty() == true) { @@ -181,25 +194,15 @@ void Item::setProperty(const std::string& prop, const Variable& val) { val2 = (LevelObjValue)std::get(val); } - setIntByHash(str2int16(prop.c_str()), val2); + setIntByHash(str2int16(prop), val2); } bool Item::hasIntByHash(uint16_t propHash) const noexcept { - if (propertiesSize > 0) - { - for (size_t i = 0; i < propertiesSize; i++) - { - if (properties[i].first == propHash) - { - return true; - } - } - } - return false; + return properties.hasValue(propHash); } -bool Item::hasInt(const char* prop) const noexcept +bool Item::hasInt(const std::string_view prop) const noexcept { return hasIntByHash(str2int16(prop)); } @@ -211,7 +214,7 @@ LevelObjValue Item::getIntByHash(uint16_t propHash) const return value; } -LevelObjValue Item::getInt(const char* prop) const +LevelObjValue Item::getInt(const std::string_view prop) const { LevelObjValue value = 0; getInt(prop, value); @@ -234,31 +237,14 @@ bool Item::getIntByHash(uint16_t propHash, LevelObjValue& value) const == std::numeric_limits::max()); break; default: - { - if (propertiesSize > 0) - { - for (size_t i = 0; i < propertiesSize; i++) - { - if (properties[i].first == propHash) - { - value = properties[i].second; - return true; - } - } - } - return false; - } + return properties.getValue(propHash, value); } return true; } -bool Item::getInt(const char* prop, LevelObjValue& value) const +bool Item::getInt(const std::string_view prop, LevelObjValue& value) const { - if (propertiesSize > 0) - { - return getIntByHash(str2int16(prop), value); - } - return false; + return getIntByHash(str2int16(prop), value); } void Item::setIntByHash(uint16_t propHash, LevelObjValue value) @@ -270,24 +256,7 @@ void Item::setIntByHash(uint16_t propHash, LevelObjValue value) break; default: { - bool noUpdate = true; - for (size_t i = 0; i < propertiesSize; i++) - { - if (properties[i].first == propHash) - { - properties[i].second = value; - noUpdate = false; - break; - } - } - if (noUpdate == true && - propertiesSize < properties.size()) - { - properties[propertiesSize] = std::make_pair(propHash, value); - propertiesSize++; - noUpdate = false; - } - if (noUpdate == true) + if (properties.setValue(propHash, value) == false) { return; } @@ -296,7 +265,7 @@ void Item::setIntByHash(uint16_t propHash, LevelObjValue value) updateNameAndDescr = true; } -void Item::setInt(const char* prop, LevelObjValue value) +void Item::setInt(const std::string_view prop, LevelObjValue value) { setIntByHash(str2int16(prop), value); } @@ -405,15 +374,25 @@ bool Item::useHelper(uint16_t propHash, uint16_t useOpHash, uint16_t valueHash, return useHelper(propHash, useOpHash, value, player, level); } -bool Item::use(Player& player, const Level* level) const +bool Item::use(Player& player, const Level* level, uint32_t& quantityLeft) { + quantityLeft = 0; LevelObjValue useOn; if (getIntByHash(ItemProp::UseOn, useOn) == false || - useOn == str2int16("")) + useOn == str2int16("") || + player.canUseItem(*this) == false) { return false; } + LevelObjValue itemQuantity; + bool hasQuantity = getIntByHash(ItemProp::Quantity, itemQuantity); + if (hasQuantity == true && + itemQuantity <= 0) + { + return true; + } + auto propHash = (uint16_t)useOn; auto useOp = getIntByHash(ItemProp::UseOp); bool ret = false; @@ -454,7 +433,58 @@ bool Item::use(Player& player, const Level* level) const } if (ret == true) { + if (hasQuantity == true) + { + itemQuantity--; + setIntByHash(ItemProp::Quantity, itemQuantity); + quantityLeft = (uint32_t)itemQuantity; + player.updateItemQuantityCache(ItemProp::Quantity); + } player.updateProperties(); } return ret; } + +LevelObjValue Item::addQuantity(LevelObjValue& amount) +{ + LevelObjValue capacity; + if (amount == 0 || + getIntByHash(ItemProp::Capacity, capacity) == false) + { + return 0; + } + auto quantity = getIntByHash(ItemProp::Quantity); + if (amount < 0) + { + auto absAmount = std::abs(amount); + if (absAmount <= quantity) + { + auto newQuant = quantity - absAmount; + setIntByHash(ItemProp::Quantity, newQuant); + amount = 0; + return newQuant; + } + else + { + setIntByHash(ItemProp::Quantity, 0); + amount += quantity; + return 0; + } + } + else + { + if (amount + quantity <= capacity) + { + auto newQuant = amount + quantity; + setIntByHash(ItemProp::Quantity, newQuant); + amount = 0; + return newQuant; + } + else + { + setIntByHash(ItemProp::Quantity, capacity); + amount -= (capacity - quantity); + return capacity; + } + } +} diff --git a/src/Game/Item.h b/src/Game/Item.h index 4965d695..e8ef7dc0 100755 --- a/src/Game/Item.h +++ b/src/Game/Item.h @@ -4,13 +4,14 @@ #include "BaseLevelObject.h" #include "ItemClass.h" #include "Save/SaveItem.h" +#include "Utils/FixedMap.h" class Player; class Item : public LevelObject { private: - typedef std::array ItemProperties; + typedef FixedMap ItemProperties; const ItemClass* class_; @@ -23,7 +24,6 @@ class Item : public LevelObject mutable std::string name; mutable std::array descriptions; - size_t propertiesSize{ 0 }; ItemProperties properties; bool identified{ false }; @@ -36,8 +36,8 @@ class Item : public LevelObject bool useHelper(uint16_t propHash, uint16_t useOpHash, uint16_t valueHash, uint16_t valueMaxHash, Player& player, const Level* level) const; - friend void Save::serialize(void* serializeObj, const Level& level, - const Item& item, bool skipDefaults); + friend void Save::serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const Item& item); public: using iterator = ItemProperties::iterator; @@ -46,16 +46,16 @@ class Item : public LevelObject using const_reverse_iterator = ItemProperties::const_reverse_iterator; iterator begin() noexcept { return properties.begin(); } - iterator end() noexcept { return properties.begin() + propertiesSize; } + iterator end() noexcept { return properties.end(); } const_iterator begin() const noexcept { return properties.begin(); } - const_iterator end() const noexcept { return properties.begin() + propertiesSize; } + const_iterator end() const noexcept { return properties.end(); } const_iterator cbegin() const noexcept { return properties.cbegin(); } - const_iterator cend() const noexcept { return properties.cbegin() + propertiesSize; } - reverse_iterator rbegin() noexcept { return properties.rend() - propertiesSize; } + const_iterator cend() const noexcept { return properties.cend(); } + reverse_iterator rbegin() noexcept { return properties.rbegin(); } reverse_iterator rend() noexcept { return properties.rend(); } - const_reverse_iterator rbegin() const noexcept { return properties.rend() - propertiesSize; } + const_reverse_iterator rbegin() const noexcept { return properties.rbegin(); } const_reverse_iterator rend() const noexcept { return properties.rend(); } - const_reverse_iterator crbegin() const noexcept { return properties.crend() - propertiesSize; } + const_reverse_iterator crbegin() const noexcept { return properties.crbegin(); } const_reverse_iterator crend() const noexcept { return properties.crend(); } Item(const ItemClass* class__); @@ -68,8 +68,10 @@ class Item : public LevelObject virtual const MapCoord& MapPosition() const noexcept { return base.mapPosition; } virtual void MapPosition(const MapCoord& pos) noexcept { base.mapPosition = pos; } + virtual bool getTexture(size_t textureNumber, TextureInfo& ti) const; + virtual void executeAction(Game& game) const; - virtual bool getNumberProp(const char* prop, Number32& value) const + virtual bool getNumberProp(const std::string_view prop, Number32& value) const { LevelObjValue val; bool ret = getInt(prop, val); @@ -80,7 +82,6 @@ class Item : public LevelObject return ret; } virtual bool Passable() const noexcept { return true; } - virtual void setAction(const std::shared_ptr& action_) noexcept {} virtual void setColor(const sf::Color& color) { base.sprite.setColor(color); } virtual void setOutline(const sf::Color& outline, const sf::Color& ignore) noexcept { @@ -93,9 +94,10 @@ class Item : public LevelObject virtual bool Hoverable() const noexcept { return base.enableHover; } virtual void Hoverable(bool hoverable) noexcept { base.enableHover = hoverable; } - virtual void serialize(void* serializeObj, const Level& level, bool skipDefaults) const + virtual void serialize(void* serializeObj, Save::Properties& props, + const Game& game, const Level& level) const { - Save::serialize(serializeObj, level, *this, skipDefaults); + Save::serialize(serializeObj, props, game, level, *this); } virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const @@ -106,37 +108,24 @@ class Item : public LevelObject void updateDrawPosition(const Level& level) { base.updateDrawPosition(level); } - virtual bool getProperty(const std::string& prop, Variable& var) const; - virtual void setProperty(const std::string& prop, const Variable& val); + virtual bool getProperty(const std::string_view prop, Variable& var) const; + virtual void setProperty(const std::string_view prop, const Variable& val); + + virtual std::string_view getId() const { return {}; } + virtual std::string_view getClassId() const { return class_->Id(); } const ItemClass* Class() const noexcept { return class_; } bool hasIntByHash(uint16_t propHash) const noexcept; - bool hasInt(const char* prop) const noexcept; - bool hasInt(const std::string& prop) const noexcept - { - return hasInt(prop.c_str()); - } + bool hasInt(const std::string_view prop) const noexcept; LevelObjValue getIntByHash(uint16_t propHash) const; - LevelObjValue getInt(const char* prop) const; - LevelObjValue getInt(const std::string& prop) const - { - return getInt(prop.c_str()); - } + LevelObjValue getInt(const std::string_view prop) const; bool getIntByHash(uint16_t propHash, LevelObjValue& value) const; - bool getInt(const char* prop, LevelObjValue& value) const; - bool getInt(const std::string& prop, LevelObjValue& value) const - { - return getInt(prop.c_str(), value); - } + bool getInt(const std::string_view prop, LevelObjValue& value) const; void setIntByHash(uint16_t propHash, LevelObjValue value); - void setInt(const char* prop, LevelObjValue value); - void setInt(const std::string& prop, LevelObjValue value) - { - return setInt(prop.c_str(), value); - } + void setInt(const std::string_view prop, LevelObjValue value); void applyDefaults(); @@ -144,7 +133,10 @@ class Item : public LevelObject bool needsRepair() const; bool isUsable() const noexcept; - bool use(Player& player, const Level* level) const; + bool use(Player& player, const Level* level, uint32_t& itemsLeft); + + // returns the new item quantity. removes from the amount what was added/removed. + LevelObjValue addQuantity(LevelObjValue& amount); const std::string& Name() const noexcept { return name; } const std::string& ShortName() const noexcept { return class_->ShortName(); } diff --git a/src/Game/ItemClass.cpp b/src/Game/ItemClass.cpp index e464f82a..c8dcdf83 100755 --- a/src/Game/ItemClass.cpp +++ b/src/Game/ItemClass.cpp @@ -1,6 +1,4 @@ #include "ItemClass.h" -#include -#include "Game.h" #include "GameUtils.h" ItemClass::ItemClass(const std::shared_ptr& textureDrop_, @@ -25,88 +23,29 @@ void ItemClass::setDropTexturePack(const std::shared_ptr& textureDr } } -void ItemClass::setDefault(const char* prop, LevelObjValue val) +bool ItemClass::getInventoryTexture(const Queryable& item, TextureInfo& ti) const { - auto propertyHash = str2int16(prop); - if (propertyHash == str2int16("")) + Variable newInvIdx; + if (classifiers.getVar(InventoryTextureClassifier, item, newInvIdx) == true) { - return; - } - for (auto& elem : defaults) - { - if (elem.first == propertyHash) + if (std::holds_alternative(newInvIdx) == true) { - elem.second = val; - return; - } - } - defaults.push_back(std::make_pair(propertyHash, val)); -} - -bool ItemClass::isDefault(const LevelObjProperty& prop) const noexcept -{ - for (const auto& elem : defaults) - { - if (elem.first == prop.first) - { - if (elem.second == prop.second) + if (textureInventory->get((size_t)std::get(newInvIdx), ti) == true) { return true; } - break; - } - } - return false; -} - -LevelObjValue ItemClass::getDefaultByHash(uint16_t propHash) const noexcept -{ - LevelObjValue value = 0; - getDefaultByHash(propHash, value); - return value; -} - -LevelObjValue ItemClass::getDefault(const char* prop) const noexcept -{ - LevelObjValue value = 0; - getDefault(prop, value); - return value; -} - -bool ItemClass::getDefault(const char* prop, LevelObjValue& value) const noexcept -{ - if (defaults.empty() == false) - { - return getDefaultByHash(str2int16(prop), value); - } - return false; -} - -bool ItemClass::getDefaultByHash(uint16_t propHash, LevelObjValue& value) const noexcept -{ - for (const auto& prop : defaults) - { - if (prop.first == propHash) - { - value = prop.second; - return true; } } - return false; + return textureInventory->get(inventoryIdx, ti); } bool ItemClass::getFullName(const Queryable& item, std::string& fullName) const { std::string strPrefix; - if (prefix != nullptr) - { - strPrefix = prefix->getName(item); - } std::string strSuffix; - if (suffix != nullptr) - { - strSuffix = suffix->getName(item); - } + classifiers.getText(PrefixClassifier, item, strPrefix); + classifiers.getText(SuffixClassifier, item, strSuffix); + bool hasPrefix = strPrefix.empty() == false; bool hasSuffix = strSuffix.empty() == false; @@ -137,31 +76,29 @@ bool ItemClass::getFullName(const Queryable& item, std::string& fullName) const return true; } -void ItemClass::setDescription(size_t idx, Namer* namer, uint16_t skipFirst) +void ItemClass::setInventoryTexture(Classifier* classifier) { - if (idx < descriptions.size()) - { - descriptions[idx] = std::make_pair(namer, skipFirst); - } + classifiers.set(InventoryTextureClassifier, classifier, 0); +} + +void ItemClass::setPrefix(Classifier* classifier) +{ + classifiers.set(PrefixClassifier, classifier, 0); +} + +void ItemClass::setSuffix(Classifier* classifier) +{ + classifiers.set(SuffixClassifier, classifier, 0); +} + +void ItemClass::setDescription(size_t idx, Classifier* classifier, uint16_t skipFirst) +{ + classifiers.set(DescriptionClassifier + idx, classifier, skipFirst); } bool ItemClass::getDescription(size_t idx, const Queryable& item, std::string& description) const { - if (idx >= descriptions.size()) - { - return false; - } - auto namer = descriptions[idx].first; - if (namer == nullptr) - { - return false; - } - description = namer->getName(item, descriptions[idx].second); - if (description.empty() == false) - { - description = GameUtils::replaceStringWithQueryable(description, item); - } - return true; + return classifiers.getText(DescriptionClassifier + idx, item, description); } void ItemClass::setFormula(uint16_t nameHash, const Formula& formula) @@ -170,21 +107,7 @@ void ItemClass::setFormula(uint16_t nameHash, const Formula& formula) { return; } - size_t i = 0; - for (; i < formulasSize; i++) - { - auto& elem = formulas[i]; - if (elem.first == nameHash) - { - elem.second = formula; - return; - } - } - if (i < formulas.size()) - { - formulas[i] = std::make_pair(nameHash, formula); - formulasSize++; - } + formulas.setValue(nameHash, formula); } void ItemClass::deleteFormula(uint16_t nameHash) @@ -193,18 +116,7 @@ void ItemClass::deleteFormula(uint16_t nameHash) { return; } - for (size_t i = 0; i < formulasSize; i++) - { - if (formulas[i].first == nameHash) - { - formulas[i].second = {}; - std::move(formulas.begin() + i + 1, - formulas.begin() + formulasSize, - formulas.begin() + i); - formulasSize--; - return; - } - } + formulas.deleteValue(nameHash); } bool ItemClass::evalFormula(uint16_t nameHash, const LevelObject& obj, LevelObjValue& val) const @@ -215,14 +127,11 @@ bool ItemClass::evalFormula(uint16_t nameHash, const LevelObject& obj, LevelObjV bool ItemClass::evalFormula(uint16_t nameHash, const LevelObject& objA, const LevelObject& objB, LevelObjValue& val) const { - for (size_t i = 0; i < formulasSize; i++) + const auto formula = formulas.getValue(nameHash); + if (formula != nullptr) { - const auto& formula = formulas[i]; - if (formula.first == nameHash) - { - val = (LevelObjValue)formula.second.eval(objA, objB); - return true; - } + val = (LevelObjValue)formula->eval(objA, objB); + return true; } return false; } diff --git a/src/Game/ItemClass.h b/src/Game/ItemClass.h index b38c9322..a38b97be 100755 --- a/src/Game/ItemClass.h +++ b/src/Game/ItemClass.h @@ -1,16 +1,16 @@ #pragma once -#include "BaseClass.h" +#include "BaseClassDefaults.h" +#include "Classifiers.h" #include "Formula.h" #include "GameProperties.h" #include "ItemXY.h" -#include "Namer.h" -#include "Queryable.h" #include #include "TexturePacks/TexturePack.h" +#include "Utils/FixedMap.h" #include "Utils/Utils.h" -class ItemClass : public BaseClass +class ItemClass : public BaseClassDefaults { private: std::shared_ptr textureDrop; @@ -23,23 +23,23 @@ class ItemClass : public BaseClass std::string shortName; std::string type; std::string subType; + uint16_t idHash16{ 0 }; uint16_t typeHash16{ 0 }; - std::vector defaults; - ItemXY inventorySize; - Namer* prefix{ nullptr }; - Namer* suffix{ nullptr }; + Classifiers<8> classifiers; - std::array, 5> descriptions; + FixedMap formulas; - std::array, 6> formulas; - size_t formulasSize{ 0 }; + sf::Time animationSpeed{ sf::milliseconds(40) }; + sf::Color outline{ sf::Color::Transparent }; + sf::Color outlineIgnore{ sf::Color::Transparent }; - sf::Time defaultAnimationSpeed{ sf::milliseconds(40) }; - sf::Color defaultOutline{ sf::Color::Transparent }; - sf::Color defaultOutlineIgnore{ sf::Color::Transparent }; + static constexpr size_t InventoryTextureClassifier = 0; + static constexpr size_t PrefixClassifier = 1; + static constexpr size_t SuffixClassifier = 2; + static constexpr size_t DescriptionClassifier = 3; public: ItemClass(const std::shared_ptr& textureDrop_, @@ -68,62 +68,47 @@ class ItemClass : public BaseClass const TexturePack* getDropTexturePack() const noexcept { return textureDrop.get(); } const TexturePack* getInventoryTexturePack() const noexcept { return textureInventory.get(); } - bool getInventoryTexture(TextureInfo& ti) const - { - return textureInventory->get(inventoryIdx, ti); - } - - const std::vector& Defaults() const noexcept { return defaults; } - void setDefault(const char* prop, LevelObjValue val); - bool isDefault(const LevelObjProperty& prop) const noexcept; - - LevelObjValue getDefaultByHash(uint16_t propHash) const noexcept; - LevelObjValue getDefault(const char* prop) const noexcept; - LevelObjValue getDefault(const std::string& prop) const noexcept - { - return getDefault(prop.c_str()); - } - - bool getDefaultByHash(uint16_t propHash, LevelObjValue& value) const noexcept; - bool getDefault(const char* prop, LevelObjValue& value) const noexcept; - bool getDefault(const std::string& prop, LevelObjValue& value) const noexcept - { - return getDefault(prop.c_str(), value); - } + bool getInventoryTexture(const Queryable& item, TextureInfo& ti) const; const std::string& Id() const noexcept { return id; } const std::string& Name() const noexcept { return name; } const std::string& ShortName() const noexcept { return shortName; } const std::string& Type() const noexcept { return type; } const std::string& SubType() const noexcept { return subType; } + uint16_t IdHash16() const noexcept { return idHash16; } uint16_t TypeHash16() const noexcept { return typeHash16; } const ItemXY& InventorySize() const noexcept { return inventorySize; } - const sf::Time& DefaultAnimationSpeed() const noexcept { return defaultAnimationSpeed; } - const sf::Color& DefaultOutline() const noexcept { return defaultOutline; } - const sf::Color& DefaultOutlineIgnore() const noexcept { return defaultOutlineIgnore; } + const sf::Time& AnimationSpeed() const noexcept { return animationSpeed; } + const sf::Color& Outline() const noexcept { return outline; } + const sf::Color& OutlineIgnore() const noexcept { return outlineIgnore; } + + void setInventoryTexture(Classifier* classifier); + void setPrefix(Classifier* classifier); + void setSuffix(Classifier* classifier); - void Id(const std::string id_) { id = id_; } - void Name(const std::string name_) { name = name_; } - void ShortName(const std::string name_) { shortName = name_; } - void Type(const std::string type_) + void Id(const std::string_view id_) + { + id = id_; + idHash16 = str2int16(id_); + } + void Name(const std::string_view name_) { name = name_; } + void ShortName(const std::string_view name_) { shortName = name_; } + void Type(const std::string_view type_) { type = type_; - typeHash16 = str2int16(Utils::toLower(type_).c_str()); + typeHash16 = str2int16(Utils::toLower(type_)); } - void SubType(const std::string subType_) { subType = subType_; } + void SubType(const std::string_view subType_) { subType = subType_; } void InventorySize(const ItemXY inventorySize_) noexcept { inventorySize = inventorySize_; } - void DefaultAnimationSpeed(const sf::Time time) noexcept { defaultAnimationSpeed = time; } - void DefaultOutline(const sf::Color color) noexcept { defaultOutline = color; } - void DefaultOutlineIgnore(const sf::Color color) noexcept { defaultOutlineIgnore = color; } - - void setPrefix(Namer* namer) noexcept { prefix = namer; } - void setSuffix(Namer* namer) noexcept { suffix = namer; } + void AnimationSpeed(const sf::Time time) noexcept { animationSpeed = time; } + void Outline(const sf::Color color) noexcept { outline = color; } + void OutlineIgnore(const sf::Color color) noexcept { outlineIgnore = color; } bool getFullName(const Queryable& item, std::string& fullName) const; - void setDescription(size_t idx, Namer* namer, uint16_t skipFirst); + void setDescription(size_t idx, Classifier* classifier, uint16_t skipFirst); bool getDescription(size_t idx, const Queryable& item, std::string& description) const; diff --git a/src/Game/ItemCollection.cpp b/src/Game/ItemCollection.cpp deleted file mode 100755 index 1396dd62..00000000 --- a/src/Game/ItemCollection.cpp +++ /dev/null @@ -1,476 +0,0 @@ -#include "ItemCollection.h" -#include "Utils/Utils.h" - -ItemCollection::ItemCollection(size_t size_) -{ - init(size_); -} - -ItemCollection::ItemCollection(const ItemXY& size_) -{ - init(size_); -} - -void ItemCollection::init(size_t size_) -{ - uint8_t newSize = (size_ > 0xFF ? 0xFF : (uint8_t)size_); - size = ItemXY(newSize, 1); - items.resize(newSize); - resetIndexes(); -} - -void ItemCollection::init(const ItemXY& size_) -{ - if (size_.x * size_.y > 1024) - { - size.x = 32; - size.y = 32; - } - else - { - size = size_; - } - items.resize(size.x * size.y); - resetIndexes(); -} - -void ItemCollection::resetIndexes() noexcept -{ - for (auto& item : items) - { - item.second = -1; - } -} - -void ItemCollection::allowType(const std::string& type) -{ - auto typeHash = str2int16(type.c_str()); - if (std::find(allowedTypes.begin(), allowedTypes.end(), typeHash) == allowedTypes.end()) - { - allowedTypes.push_back(typeHash); - } -} - -bool ItemCollection::isTypeAllowed(const std::string& type) const -{ - return isTypeAllowed(str2int16(type.c_str())); -} - -bool ItemCollection::isTypeAllowed(uint16_t typeHash16) const -{ - if (allowedTypes.empty() == true) - { - return true; - } - return (std::find(allowedTypes.begin(), allowedTypes.end(), typeHash16) != allowedTypes.end()); -} - -Item* ItemCollection::get(size_t idx) const -{ - if (idx < items.size()) - { - if (items[idx].second >= 0 && - ((size_t)items[idx].second) < items.size()) - { - return items[(size_t)items[idx].second].first.get(); - } - return items[idx].first.get(); - } - return nullptr; -} - -bool ItemCollection::set(size_t idx, std::unique_ptr& item) -{ - std::unique_ptr oldItem; - return set(idx, item, oldItem); -} - -bool ItemCollection::set(size_t idx, std::unique_ptr& item, - std::unique_ptr& oldItem) -{ - if (idx < items.size()) - { - if (item != nullptr && - isTypeAllowed(item->Class()->TypeHash16()) == false) - { - return false; - } - if (enforceItemSize == false) - { - return setAndDontEnforceItemSize(idx, item, oldItem); - } - else - { - return setAndEnforceItemSize( - ItemXY((uint8_t)(idx % size.x), (uint8_t)(idx / size.x)), - item, - oldItem); - } - } - return false; -} - -bool ItemCollection::set(const ItemXY& position, std::unique_ptr& item) -{ - std::unique_ptr oldItem; - return set(position, item, oldItem); -} - -bool ItemCollection::set(const ItemXY& position, - std::unique_ptr& item, std::unique_ptr& oldItem) -{ - size_t idx = position.x + position.y * size.x; - if (idx < items.size()) - { - if (item != nullptr && - isTypeAllowed(item->Class()->TypeHash16()) == false) - { - return false; - } - if (enforceItemSize == false) - { - return setAndDontEnforceItemSize(idx, item, oldItem); - } - else - { - return setAndEnforceItemSize(position, item, oldItem); - } - } - return false; -} - -bool ItemCollection::setAndDontEnforceItemSize(size_t idx, - std::unique_ptr& item, std::unique_ptr& oldItem) -{ - if (item != nullptr) - { - item->MapPosition({ -1, -1 }); - } - oldItem = std::move(items[idx].first); - items[idx].first = std::move(item); - items[idx].second = -1; - return true; -} - -bool ItemCollection::setAndEnforceItemSize(const ItemXY& position, - std::unique_ptr& item, std::unique_ptr& oldItem) -{ - if (size.x == 0 || size.y == 0) - { - return false; - } - ItemXY itemSize(1, 1); - if (item != nullptr) - { - itemSize = item->Class()->InventorySize(); - if (itemSize.x > size.x - || itemSize.y > size.y) - { - return false; - } - } - auto pos = position; - size_t posEndX = (size_t)(pos.x + itemSize.x); - size_t posEndY = (size_t)(pos.y + itemSize.y); - if (posEndX > size.x) - { - posEndX = size.x; - pos.x = size.x - itemSize.x; - } - if (posEndY > size.y) - { - posEndY = size.y; - pos.y = size.y - itemSize.y; - } - Item* oldItemTemp = nullptr; - for (size_t i = pos.x; i < posEndX; i++) - { - for (size_t j = pos.y; j < posEndY; j++) - { - const auto& item2 = get(i, j); - if (item2 != nullptr) - { - if (oldItemTemp == nullptr) - { - oldItemTemp = item2; - } - else if (oldItemTemp != item2) - { - return false; - } - } - } - } - if (oldItemTemp != nullptr) - { - int32_t oldIdx = -1; - for (size_t i = 0; i < items.size(); i++) - { - if (oldIdx >= 0) - { - if (items[i].second == oldIdx) - { - items[i].second = -1; - } - continue; - } - if (items[i].first.get() == oldItemTemp) - { - oldIdx = (int32_t)i; - oldItem = std::move(items[i].first); - } - } - } - else - { - oldItem = nullptr; - } - - int32_t newIdx = -1; - for (size_t i = pos.x; i < posEndX; i++) - { - for (size_t j = pos.y; j < posEndY; j++) - { - size_t idx = i + j * size.x; - if (newIdx >= 0) - { - items[idx].second = newIdx; - continue; - } - if (item != nullptr) - { - item->MapPosition({ -1, -1 }); - } - items[idx].first = std::move(item); - items[idx].second = -1; - newIdx = (int32_t)idx; - } - } - return true; -} - -bool ItemCollection::isFull() const noexcept -{ - for (const auto& item : items) - { - if (item.first == nullptr && - item.second < 0) - { - return false; - } - } - return true; -} - -bool ItemCollection::isItemSlotInUse(size_t idx) const -{ - if (idx >= items.size()) - { - return false; - } - return items[idx].first != nullptr; -} - -bool ItemCollection::isItemSlotInUse(const ItemXY& position) const -{ - if (position.x >= size.x - || position.y >= size.y) - { - return false; - } - return isItemSlotInUse(position.x + position.y * size.x); -} - -bool ItemCollection::isItemSlotEmpty(int x, int y, - const ItemXY& itemSize, size_t& itemIdx) const -{ - size_t sizeX = (size_t)x; - size_t sizeY = (size_t)y; - if (enforceItemSize == true) - { - sizeX += itemSize.x; - sizeY += itemSize.y; - } - else - { - sizeX++; - sizeY++; - } - for (size_t i = x; i < sizeX; i++) - { - for (size_t j = y; j < sizeY; j++) - { - size_t idx = i + j * size.x; - if (items[idx].first != nullptr || - items[idx].second >= 0) - { - return false; - } - } - } - itemIdx = (size_t)(x + y * (int)size.x); - return true; -} - -bool ItemCollection::getFreeItemSlot(const Item& item, - size_t& itemIdx, InventoryPosition invPos) const -{ - if (isTypeAllowed(item.Class()->TypeHash16()) == false) - { - return false; - } - - const auto& itemSize = item.Class()->InventorySize(); - - if (itemSize.x > size.x || itemSize.y > size.y) - { - return false; - } - - int sizeX = (int)size.x - (int)itemSize.x; - int sizeY = (int)size.y - (int)itemSize.y; - - switch (invPos) - { - default: - case InventoryPosition::TopLeft: - { - for (int y = 0; y <= sizeY; y++) - { - for (int x = 0; x <= sizeX; x++) - { - if (isItemSlotEmpty(x, y, itemSize, itemIdx) == true) - { - return true; - } - } - } - break; - } - case InventoryPosition::TopRight: - { - for (int y = 0; y <= sizeY; y++) - { - for (int x = sizeX; x >= 0; x--) - { - if (isItemSlotEmpty(x, y, itemSize, itemIdx) == true) - { - return true; - } - } - } - break; - } - case InventoryPosition::BottomLeft: - { - for (int y = sizeY; y >= 0; y--) - { - for (int x = 0; x <= sizeX; x++) - { - if (isItemSlotEmpty(x, y, itemSize, itemIdx) == true) - { - return true; - } - } - } - break; - } - case InventoryPosition::BottomRight: - { - for (int y = sizeY; y >= 0; y--) - { - for (int x = sizeX; x >= 0; x--) - { - if (isItemSlotEmpty(x, y, itemSize, itemIdx) == true) - { - return true; - } - } - } - break; - } - } - return false; -} - -bool ItemCollection::hasFreeItemSlot(const Item& item) const -{ - size_t itemIdx; - return getFreeItemSlot(item, itemIdx); -} - -bool ItemCollection::find(uint16_t itemTypeHash16, - size_t& idx, Item*& item) const -{ - auto size = items.size(); - if (idx < size) - { - for (size_t i = idx; i < size; i++) - { - if (isItemSlotInUse(i) == true) - { - if (items[i].first->Class()->TypeHash16() == itemTypeHash16) - { - idx = i; - item = items[i].first.get(); - return true; - } - } - } - } - idx = size; - return false; -} - -unsigned ItemCollection::countFreeSlots(const ItemClass& itemClass) const -{ - // only for items whose size is 1 - unsigned count = 0; - if (isTypeAllowed(itemClass.TypeHash16()) == true) - { - for (const auto& item : items) - { - if (item.first == nullptr || item.second < 0) - { - count++; - } - } - } - return count; -} - -bool ItemCollection::getProperty(const std::string& prop, Variable& var) const -{ - if (prop.empty() == true) - { - return false; - } - auto props = Utils::splitStringIn2(prop, '.'); - switch (str2int16(props.first.c_str())) - { - case str2int16("capacity"): - var = Variable((int64_t)items.size()); - break; - case str2int16("enforceItemSize"): - var = Variable((bool)enforceItemSize); - break; - case str2int16("isFull"): - var = Variable((bool)isFull()); - break; - case str2int16("size"): - { - if (props.second == "x") - { - var = Variable((int64_t)size.x); - } - else - { - var = Variable((int64_t)size.y); - } - } - break; - default: - return false; - } - return true; -} diff --git a/src/Game/ItemCollection.h b/src/Game/ItemCollection.h deleted file mode 100755 index b2e069b2..00000000 --- a/src/Game/ItemCollection.h +++ /dev/null @@ -1,141 +0,0 @@ -#pragma once - -#include "GameProperties.h" -#include "Item.h" -#include "ItemXY.h" -#include -#include -#include "Utils/iterator_tpl.h" -#include - -class ItemCollection -{ -private: - typedef std::pair, int32_t> ItemCell; - - std::vector items; - ItemXY size; - std::vector allowedTypes; - bool enforceItemSize{ false }; - - bool setAndDontEnforceItemSize(size_t idx, - std::unique_ptr& item, std::unique_ptr& oldItem); - - bool setAndEnforceItemSize(const ItemXY& position, - std::unique_ptr& item, std::unique_ptr& oldItem); - - bool isItemSlotEmpty(int x, int y, - const ItemXY& itemSize, size_t& itemIdx) const; - - void resetIndexes() noexcept; - -public: - struct it_state - { - size_t idx; - inline void next(const ItemCollection* ref) - { - idx++; - for (; idx < ref->items.size(); idx++) - { - if (ref->items[idx].first == nullptr) - { - continue; - } - return; - } - } - inline void prev(const ItemCollection* ref) - { - auto size = ref->items.size(); - if (size > 0) - { - idx--; - for (; idx < size; idx--) - { - if (ref->items[idx].first == nullptr) - { - continue; - } - return; - } - } - idx = size; - } - inline void begin(const ItemCollection* ref) - { - idx = 0; - if (ref->items.empty() == false && - ref->items[idx].first == nullptr) - { - next(ref); - } - } - inline void end(const ItemCollection* ref) noexcept - { - idx = ref->items.size(); - } - inline Item& get(ItemCollection* ref) - { - return *ref->items[idx].first; - } - inline const Item& get(const ItemCollection* ref) - { - return *ref->items[idx].first; - } - inline bool cmp(const it_state& s) const noexcept - { - return idx != s.idx; - } - }; - - SETUP_ITERATORS(ItemCollection, const Item&, it_state); - SETUP_REVERSE_ITERATORS(ItemCollection, const Item&, it_state); - - ItemCollection() noexcept {} - ItemCollection(size_t size_); - ItemCollection(const ItemXY& size_); - - void init(size_t size_); - void init(const ItemXY& size_); - - size_t Size() const noexcept { return items.size(); } - - void setEnforceItemSize(bool enforceItemSize_) noexcept { enforceItemSize = enforceItemSize_; } - - void allowType(const std::string& type); - - bool isTypeAllowed(const std::string& type) const; - bool isTypeAllowed(uint16_t typeHash16) const; - - size_t getIndex(size_t x, size_t y) const noexcept { return x + y * size.x; } - size_t getIndex(const ItemXY& pos) const noexcept { return getIndex(pos.x, pos.y); } - - Item* get(size_t idx) const; - Item* get(size_t x, size_t y) const { return get(x + y * size.x); } - Item* get(const ItemXY& pos) const { return get(pos.x, pos.y); } - - bool set(size_t idx, std::unique_ptr& item); - bool set(size_t idx, std::unique_ptr& item, std::unique_ptr& oldItem); - - bool set(const ItemXY& position, std::unique_ptr& item); - bool set(const ItemXY& position, std::unique_ptr& item, - std::unique_ptr& oldItem); - - bool isFull() const noexcept; - - bool isItemSlotInUse(size_t idx) const; - bool isItemSlotInUse(const ItemXY& position) const; - - bool getFreeItemSlot(const Item& item, size_t& itemIdx, - InventoryPosition invPos = InventoryPosition::TopLeft) const; - - bool hasFreeItemSlot(const Item& item) const; - - bool find(uint16_t itemTypeHash16, - size_t& idx, Item*& item) const; - - unsigned countFreeSlots(const ItemClass& itemClass) const; - - bool getProperty(const std::string& prop, Variable& var) const; -}; diff --git a/src/Game/ItemLocation.h b/src/Game/ItemLocation.h index 497d3eb0..1c03fe57 100755 --- a/src/Game/ItemLocation.h +++ b/src/Game/ItemLocation.h @@ -1,6 +1,7 @@ #pragma once #include "ItemXY.h" +#include "MapCoord.h" #include #include @@ -19,15 +20,15 @@ class ItemCoordInventory // inventoryIdx = -1 points to player's selected item ItemCoordInventory() noexcept : inventoryIdx(-1), itemIdx(0) {}; - ItemCoordInventory(const std::string& playerId_) : + ItemCoordInventory(const std::string_view playerId_) : playerId(playerId_), inventoryIdx(-1), itemIdx(0) {}; - ItemCoordInventory(const std::string& playerId_, size_t inventoryIdx_, size_t itemIdx_) + ItemCoordInventory(const std::string_view playerId_, size_t inventoryIdx_, size_t itemIdx_) : playerId(playerId_), inventoryIdx(((int16_t)inventoryIdx_) & 0x7FFF), itemIdx((int16_t)itemIdx_) {} - ItemCoordInventory(const std::string& playerId_, size_t inventoryIdx_, const ItemXY& itemXY_) + ItemCoordInventory(const std::string_view playerId_, size_t inventoryIdx_, const ItemXY& itemXY_) : playerId(playerId_), inventoryIdx(((int16_t)inventoryIdx_) | 0x8000), itemXY(itemXY_) {} @@ -77,3 +78,6 @@ class ItemCoordInventory }; typedef std::variant ItemLocation; + +#define holdsMapCoord std::holds_alternative +#define holdsItemCoordInventory std::holds_alternative diff --git a/src/Game/ItemTypes.h b/src/Game/ItemTypes.h deleted file mode 100755 index db3ab35b..00000000 --- a/src/Game/ItemTypes.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "Utils/Utils.h" - -namespace ItemTypes -{ - const uint16_t Gold = str2int16("gold"); -} diff --git a/src/Game/Level.cpp b/src/Game/Level.cpp index 0410c0a7..a182fe27 100755 --- a/src/Game/Level.cpp +++ b/src/Game/Level.cpp @@ -1,28 +1,73 @@ #include "Level.h" #include "Game.h" #include "GameUtils.h" -#include "Shaders.h" +#include "Game/GameHashes.h" +#include "SimpleLevelObject.h" #include "Utils/Utils.h" void Level::Init(LevelMap map_, - std::shared_ptr tilesBottom_, - std::shared_ptr tilesTop_, - int tileWidth_, int tileHeight_) + const std::vector>& texturePackLayers, + int tileWidth, int tileHeight) { map = std::move(map_); - tilesBottom = tilesBottom_; - tilesTop = tilesTop_; clickedObject = nullptr; hoverObject = nullptr; - tileWidth = tileWidth_; - tileHeight = tileHeight_; - map.setTileSize(tileWidth, tileHeight); + tileWidth = std::max(tileWidth, 2); + tileHeight = std::max(tileHeight, 2); + + size_t numLayers = levelLayers.size() - 1; + for (size_t i = 0; i < numLayers; i++) + { + setTileLayer(i, &view, texturePackLayers[i], tileWidth, tileHeight, true); + } + setAutomap(nullptr, tileWidth, tileHeight); + + map.setDefaultTileSize(tileWidth, tileHeight); setCurrentMapPosition(MapCoord(map.Width() / 2, map.Height() / 2)); updateLevelObjectPositions(); - updateViewPort = true; + viewPortNeedsUpdate = true; +} + +void Level::Init() +{ + clickedObject = nullptr; + hoverObject = nullptr; + + updateLevelObjectPositions(); + viewPortNeedsUpdate = true; +} + +void Level::setTileLayer(size_t layer, View2* view_, + std::shared_ptr tiles, + int tileWidth, int tileHeight, bool visible_) +{ + levelLayers[layer].tiles = tiles; + levelLayers[layer].view = view_; + levelLayers[layer].tileWidth = tileWidth; + levelLayers[layer].tileHeight = tileHeight; + levelLayers[layer].blockWidth = tileWidth / 2; + levelLayers[layer].blockHeight = tileHeight / 2; + levelLayers[layer].visible = visible_; +} + +void Level::setAutomap(std::shared_ptr tiles, int tileWidth, int tileHeight) +{ + tileWidth = std::max(tileWidth, 2); + tileHeight = std::max(tileHeight, 2); + + setTileLayer(AutomapLayer, &automapView, tiles, + tileWidth, tileHeight, levelLayers[AutomapLayer].visible); + viewPortNeedsUpdate = true; +} + +void Level::setCurrentMapViewCenter(const sf::Vector2f& coord_) +{ + currentMapViewCenter = coord_; + currentAutomapViewCenter.x = std::round((coord_.x * (float)AutomapTileWidth()) / (float)TileWidth()); + currentAutomapViewCenter.y = std::round((coord_.y * (float)AutomapTileHeight()) / (float)TileHeight()); } void Level::updateLevelObjectPositions() @@ -113,6 +158,49 @@ void Level::executeHoverLeaveAction(Game& game) } } +void Level::setAutomapRelativePosition(const sf::Vector2i& position) noexcept +{ + automapRelativePosition.x = std::clamp(position.x / 100.f, 0.f, 1.f); + automapRelativePosition.y = std::clamp(position.y / 100.f, 0.f, 1.f); + updateAutomapPosition(view.getPosition()); +} + +void Level::Position(const sf::Vector2f& position) noexcept +{ + view.setPosition(position); + updateAutomapPosition(position); +} + +void Level::updateAutomapPosition(sf::Vector2f position) +{ + position.x = std::round(position.x + view.getSize().x * automapRelativePosition.x); + position.y = std::round(position.y + view.getSize().y * automapRelativePosition.y); + automapView.setPosition(position); + viewPortNeedsUpdate = true; +} + +void Level::setAutomapRelativeSize(const sf::Vector2i& size) +{ + automapRelativeSize.x = std::clamp(size.x / 100.f, 0.f, 1.f); + automapRelativeSize.y = std::clamp(size.y / 100.f, 0.f, 1.f); + updateAutomapSize(Size()); +} + +void Level::Size(const sf::Vector2f& size) +{ + view.setSize(size); + updateAutomapPosition(view.getPosition()); + updateAutomapSize(size); +} + +void Level::updateAutomapSize(sf::Vector2f size) +{ + size.x = std::round(size.x * automapRelativeSize.x); + size.y = std::round(size.y * automapRelativeSize.y); + automapView.setSize(size); + viewPortNeedsUpdate = true; +} + void Level::Zoom(float factor, bool smooth) noexcept { if (factor > 2.f) @@ -222,6 +310,58 @@ void Level::addPlayer(std::unique_ptr player, const MapCoord& mapCoord) players.push_back(std::move(player)); } +void Level::deleteLevelObjectById(const std::string_view id) +{ + if (id.empty() == true) + { + return; + } + for (auto it = levelObjects.begin(); it != levelObjects.end(); ++it) + { + if ((*it)->getId() == id) + { + auto obj = it->get(); + map[obj->MapPosition()].removeObject(obj); + if (clickedObject == obj) + { + clickedObject = nullptr; + } + if (hoverObject == obj) + { + hoverObject = nullptr; + } + levelObjects.erase(it); + break; + } + } +} + +void Level::deleteLevelObjectByClass(const std::string_view classId) +{ + if (classId.empty() == true) + { + return; + } + for (auto it = levelObjects.begin(); it != levelObjects.end(); ++it) + { + if ((*it)->getClassId() == classId) + { + auto obj = it->get(); + map[obj->MapPosition()].removeObject(obj); + if (clickedObject == obj) + { + clickedObject = nullptr; + } + if (hoverObject == obj) + { + hoverObject = nullptr; + } + levelObjects.erase(it); + break; + } + } +} + void Level::draw(sf::RenderTarget& target, sf::RenderStates states) const { if (visible == false) @@ -230,40 +370,90 @@ void Level::draw(sf::RenderTarget& target, sf::RenderStates states) const } auto origView = target.getView(); - target.setView(view.getView()); - sf::Sprite sprite; + Sprite2 sprite; TextureInfo ti; sf::FloatRect tileRect; - const sf::Texture* palette = nullptr; + size_t layerToDrawLevelObjects = 0; - auto tiles = tilesBottom.get(); - if (tiles != nullptr) + if (levelLayers[1].tiles != nullptr) { - if (tiles->isIndexed() == true && - tiles->getPalette() != nullptr && - Shaders::supportsPalettes() == true) + layerToDrawLevelObjects = 1; + } + else if (levelLayers[2].tiles != nullptr) + { + layerToDrawLevelObjects = 2; + } + + for (size_t i = 0; i < levelLayers.size(); i++) + { + const auto& layer = levelLayers[i]; + auto tiles = layer.tiles.get(); + + if (layer.view == nullptr) + { + continue; + } + if (layer.visible == false) { - palette = &tiles->getPalette()->texture; + // don't skip layer (level objects are drawn in this layer) + if (i != layerToDrawLevelObjects) + { + continue; + } + } + else + { + if (layer.background != sf::Color::Transparent && + tiles != nullptr) + { + target.setView(origView); + sf::RectangleShape background(layer.view->getSize()); + background.setPosition(layer.view->getPosition()); + background.setFillColor(layer.background); + target.draw(background); + } } - if (palette != nullptr) + + target.setView(layer.view->getView()); + + if (tiles == nullptr) { - states.shader = &Shaders::Palette; - Shaders::Palette.setUniform("palette", *palette); + // don't skip layer (level objects are drawn in this layer) + if (i != layerToDrawLevelObjects) + { + continue; + } } - for (Coord x = visibleStart.x; x < visibleEnd.x; x++) + for (Coord x = layer.visibleStart.x; x < layer.visibleEnd.x; x++) { - for (Coord y = visibleStart.y; y < visibleEnd.y; y++) + for (Coord y = layer.visibleStart.y; y < layer.visibleEnd.y; y++) { int16_t index; if (map.isMapCoordValid(x, y) == false) { - index = map.getOutOfBoundsTileIndexBack(x, y); + index = map.getOutOfBoundsTileIndex(i, x, y); } else { - index = map[x][y].TileIndexBack(); + index = map[x][y].getTileIndex(i); + + if (i == layerToDrawLevelObjects) // draw level objets in this layer + { + for (const auto& drawObj : map[x][y]) + { + if (drawObj != nullptr) + { + target.draw(*drawObj, states); + } + } + if (tiles == nullptr || + layer.visible == false) + { + continue; + } + } } if (index < 0) { @@ -271,17 +461,16 @@ void Level::draw(sf::RenderTarget& target, sf::RenderStates states) const } if (tiles->get((size_t)index, ti) == true) { - auto coords = map.getCoord(MapCoord(x, y)); - coords.y -= (float)(ti.textureRect.height - tileHeight); + auto coords = map.getCoord(MapCoord(x, y), layer.blockWidth, layer.blockHeight); + coords.y -= (float)(ti.textureRect.height - layer.tileHeight); coords += ti.offset; tileRect.left = coords.x; tileRect.top = coords.y; tileRect.width = (float)ti.textureRect.width; tileRect.height = (float)ti.textureRect.height; - if (visibleRect.intersects(tileRect) == true) + if (layer.visibleRect.intersects(tileRect) == true) { - sprite.setTexture(*ti.texture); - sprite.setTextureRect(ti.textureRect); + sprite.setTexture(ti, true); sprite.setPosition(coords); target.draw(sprite, states); } @@ -290,113 +479,99 @@ void Level::draw(sf::RenderTarget& target, sf::RenderStates states) const } } - palette = nullptr; - tiles = tilesTop.get(); - - if (tiles != nullptr && - tiles->isIndexed() == true && - tiles->getPalette() != nullptr && - Shaders::supportsPalettes() == true) - { - palette = &tiles->getPalette()->texture; - } - if (palette != nullptr) - { - states.shader = &Shaders::Palette; - Shaders::Palette.setUniform("palette", *palette); - } - else + // draw player direction in automap, if enabled (baseIndex >= 0) + if (levelLayers[AutomapLayer].tiles != nullptr && + levelLayers[AutomapLayer].visible == true && + automapPlayerDirectionBaseIndex >= 0 && + currentPlayer != nullptr) { - states.shader = NULL; - } - - for (Coord x = visibleStart.x; x < visibleEnd.x; x++) - { - for (Coord y = visibleStart.y; y < visibleEnd.y; y++) + auto direction = (size_t)currentPlayer->getDirection(); + auto index = (size_t)automapPlayerDirectionBaseIndex + direction; + if (direction < (size_t)PlayerDirection::All && + levelLayers[AutomapLayer].tiles->get(index, ti) == true) { - int16_t index; - if (map.isMapCoordValid(x, y) == false) - { - index = map.getOutOfBoundsTileIndexFront(x, y); - } - else - { - index = map[x][y].TileIndexFront(); - bool drewObj = false; - - for (const auto& drawObj : map[x][y]) - { - if (drawObj != nullptr) - { - target.draw(*drawObj, states); - drewObj = true; - } - } - if (drewObj == true && - palette != nullptr) - { - Shaders::Palette.setUniform("palette", *palette); - } - } - if (tiles != nullptr) + target.setView(levelLayers[AutomapLayer].view->getView()); + + auto coords = currentAutomapViewCenter; + coords.x -= (float)(ti.textureRect.width / 2); + coords.y -= (float)(ti.textureRect.height / 2); + coords += ti.offset; + tileRect.left = coords.x; + tileRect.top = coords.y; + tileRect.width = (float)ti.textureRect.width; + tileRect.height = (float)ti.textureRect.height; + if (levelLayers[AutomapLayer].visibleRect.intersects(tileRect) == true) { - if (index < 0) - { - continue; - } - if (tiles->get((size_t)index, ti) == true) - { - auto coords = map.getCoord(MapCoord(x, y)); - coords.y -= (float)(ti.textureRect.height - tileHeight); - coords += ti.offset; - tileRect.left = coords.x; - tileRect.top = coords.y; - tileRect.width = (float)ti.textureRect.width; - tileRect.height = (float)ti.textureRect.height; - if (visibleRect.intersects(tileRect) == true) - { - sprite.setTexture(*ti.texture); - sprite.setTextureRect(ti.textureRect); - sprite.setPosition(coords); - target.draw(sprite, states); - } - } + sprite.setTexture(ti, true); + sprite.setPosition(coords); + target.draw(sprite, states); } } } + target.setView(origView); } void Level::updateSize(const Game& game) { view.updateSize(game); + automapView.updateSize(game); + updateAutomapPosition(view.getPosition()); + updateAutomapSize(view.getSize()); updateVisibleArea(); } void Level::updateVisibleArea() { - const auto& viewCenter = view.getCenter(); - const auto& viewSize = view.getVisibleSize(); - - visibleRect = sf::FloatRect(viewCenter.x - std::round(viewSize.x / 2), - viewCenter.y - std::round(viewSize.y / 2), - std::round(viewSize.x), - std::round(viewSize.y)); - - sf::Vector2f TL{ visibleRect.left, visibleRect.top }; - sf::Vector2f TR{ TL.x + visibleRect.width + tileWidth, TL.y }; - sf::Vector2f BL{ TL.x, TL.y + visibleRect.height + tileHeight }; - sf::Vector2f BR{ TR.x, BL.y }; + sf::FloatRect visibleRect; + MapCoord visibleStart; + MapCoord visibleEnd; + int tileWidth{ 0 }; + int tileHeight{ 0 }; + View2* layerView{ nullptr }; - auto mapTL = map.getTile(TL); - auto mapTR = map.getTile(TR); - auto mapBL = map.getTile(BL); - auto mapBR = map.getTile(BR); - - visibleStart.x = mapTL.x - 2; - visibleEnd.x = mapBR.x + 12; - visibleStart.y = mapTR.y - 2; - visibleEnd.y = mapBL.y + 12; + for (auto& layer : levelLayers) + { + if (layer.tileWidth == 0 && + layer.tileHeight == 0) + { + continue; + } + if (layer.tileWidth != tileWidth || + layer.tileHeight != tileHeight || + layer.view != layerView) + { + tileWidth = layer.tileWidth; + tileHeight = layer.tileHeight; + layerView = layer.view; + + const auto& viewCenter = layer.view->getCenter(); + const auto& viewSize = layer.view->getVisibleSize(); + + visibleRect = sf::FloatRect(viewCenter.x - std::round(viewSize.x / 2), + viewCenter.y - std::round(viewSize.y / 2), + std::round(viewSize.x), + std::round(viewSize.y)); + + sf::Vector2f TL{ visibleRect.left, visibleRect.top }; + sf::Vector2f TR{ TL.x + visibleRect.width + tileWidth, TL.y }; + sf::Vector2f BL{ TL.x, TL.y + visibleRect.height + tileHeight }; + sf::Vector2f BR{ TR.x, BL.y }; + + auto mapTL = map.getTile(TL, layer.blockWidth, layer.blockHeight); + auto mapTR = map.getTile(TR, layer.blockWidth, layer.blockHeight); + auto mapBL = map.getTile(BL, layer.blockWidth, layer.blockHeight); + auto mapBR = map.getTile(BR, layer.blockWidth, layer.blockHeight); + + visibleStart.x = mapTL.x - 2; + visibleEnd.x = mapBR.x + 12; + visibleStart.y = mapTR.y - 2; + visibleEnd.y = mapBL.y + 12; + } + layer.visibleRect = visibleRect; + layer.visibleStart = visibleStart; + layer.visibleEnd = visibleEnd; + } } void Level::updateMouse(const Game& game) @@ -488,10 +663,10 @@ void Level::update(Game& game) { return; } - if (updateViewPort == true) + if (viewPortNeedsUpdate == true) { - updateViewPort = false; view.updateViewport(game); + automapView.updateViewport(game); updateVisibleArea(); } if (pause == true) @@ -519,9 +694,9 @@ void Level::update(Game& game) { onTouchBegan(game); } - if (captureInputEvents == true) + if (captureInputEvents != InputEvent::None) { - game.clearInputEvents(); + game.clearInputEvents(captureInputEvents); } } else @@ -539,23 +714,29 @@ void Level::update(Game& game) if (followCurrentPlayer == true && currentPlayer != nullptr) { currentMapPosition = currentPlayer->MapPosition(); - currentMapViewCenter = currentPlayer->getBasePosition(); + setCurrentMapViewCenter(currentPlayer->getBasePosition()); } - if (view.getCenter() != currentMapViewCenter) + if (view.getCenter() != currentMapViewCenter || + viewPortNeedsUpdate == true) { view.setCenter(currentMapViewCenter); + automapView.setCenter(currentAutomapViewCenter); updateVisibleArea(); } + if (viewPortNeedsUpdate == true) + { + viewPortNeedsUpdate = false; + } } -bool Level::getProperty(const std::string& prop, Variable& var) const +bool Level::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); switch (propHash) { case str2int16("clickedObject"): @@ -574,8 +755,16 @@ bool Level::getProperty(const std::string& prop, Variable& var) const } } break; + case str2int16("hasAutomap"): + var = Variable((levelLayers[AutomapLayer].tiles != nullptr)); + return true; + break; case str2int16("hasCurrentPlayer"): - var = Variable((bool)(currentPlayer != nullptr)); + var = Variable((currentPlayer != nullptr)); + return true; + break; + case str2int16("hasQuest"): + var = Variable(hasQuest(props.second)); return true; break; case str2int16("hoverObject"): @@ -598,6 +787,16 @@ bool Level::getProperty(const std::string& prop, Variable& var) const var = Variable(path); return true; break; + case str2int16("levelObject"): + { + std::string_view props2; + auto obj = parseLevelObjectIdOrMapPosition(props.second, props2); + if (obj != nullptr) + { + return obj->getProperty(props2, var); + } + } + break; case str2int16("player"): { auto props2 = Utils::splitStringIn2(props.second, '.'); @@ -621,6 +820,10 @@ bool Level::getProperty(const std::string& prop, Variable& var) const } } } + case str2int16("showAutomap"): + var = Variable(levelLayers[AutomapLayer].visible); + return true; + break; case str2int16("zoom"): var = Variable((double)stopZoomFactor); return true; @@ -635,14 +838,14 @@ bool Level::getProperty(const std::string& prop, Variable& var) const return false; } -const Queryable* Level::getQueryable(const std::string& prop) const +const Queryable* Level::getQueryable(const std::string_view prop) const { if (prop.empty() == true) { return this; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); const Queryable* queryable = nullptr; switch (propHash) { @@ -700,6 +903,36 @@ const Queryable* Level::getQueryable(const std::string& prop) const return queryable; } +LevelObject* Level::parseLevelObjectIdOrMapPosition( + const std::string_view str, std::string_view& props) const +{ + auto strPair = Utils::splitStringIn2(str, '.'); + auto strPair2 = Utils::splitStringIn2(strPair.first, ','); + if (strPair2.second.empty() == false) + { + MapCoord mapPos(Utils::strtou(strPair2.first), Utils::strtou(strPair2.second)); + if (map.isMapCoordValid(mapPos) == true) + { + props = strPair.second; + return map[mapPos].getObject(); + } + } + else + { + for (const auto& obj : levelObjects) + { + auto simpleObj = dynamic_cast(obj.get()); + if (simpleObj != nullptr && + simpleObj->Id() == strPair2.first) + { + props = strPair.second; + return simpleObj; + } + } + } + return nullptr; +} + void Level::clearLevelObjects() { for (const auto& obj : levelObjects) @@ -713,7 +946,39 @@ void Level::clearLevelObjects() levelObjects.clear(); } -Player* Level::getPlayer(const std::string& id) const noexcept +LevelObject* Level::getLevelObject(const std::string_view id) const noexcept +{ + if (id.empty() == true) + { + return nullptr; + } + for (const auto& obj : levelObjects) + { + if (obj->getId() == id) + { + return obj.get(); + } + } + return nullptr; +} + +LevelObject* Level::getLevelObjectByClass(const std::string_view classId) const noexcept +{ + if (classId.empty() == true) + { + return nullptr; + } + for (const auto& obj : levelObjects) + { + if (obj->getClassId() == classId) + { + return obj.get(); + } + } + return nullptr; +} + +Player* Level::getPlayer(const std::string_view id) const noexcept { for (const auto& player : players) { @@ -725,7 +990,7 @@ Player* Level::getPlayer(const std::string& id) const noexcept return nullptr; } -Player* Level::getPlayerOrCurrent(const std::string& id) const noexcept +Player* Level::getPlayerOrCurrent(const std::string_view id) const noexcept { if (id.empty() == true) { @@ -739,7 +1004,7 @@ void Level::clearPlayerClasses(size_t clearIdx) if (clearIdx < playerClasses.size()) { auto removeIfFunc = [&](const auto& cls) { - auto it = std::find_if(players.begin(), players.end(), [&](const auto& plr) { + auto it = std::find_if(players.begin(), players.end(), [&cls](const auto& plr) { return plr->getPlayerClass() == cls.second.get(); }); return it == players.end(); @@ -843,7 +1108,7 @@ Item* Level::getItem(const ItemLocation& location) const Item* Level::getItem(const ItemLocation& location, Player*& player) const { - if (std::holds_alternative(location) == true) + if (holdsMapCoord(location) == true) { player = nullptr; return getItem(std::get(location)); @@ -859,7 +1124,7 @@ std::unique_ptr Level::removeItem(const MapCoord& mapCoord) if (map.isMapCoordValid(mapCoord) == true) { auto item = map[mapCoord].removeObject(); - return deleteLevelObject(item); + return removeLevelObject(item); } return nullptr; } @@ -905,7 +1170,7 @@ std::unique_ptr Level::removeItem(const ItemLocation& location) std::unique_ptr Level::removeItem(const ItemLocation& location, Player*& player) { - if (std::holds_alternative(location) == true) + if (holdsMapCoord(location) == true) { player = nullptr; return removeItem(std::get(location)); @@ -928,7 +1193,7 @@ bool Level::setItem(const MapCoord& mapCoord, std::unique_ptr& item) { if (oldItem != nullptr) { - deleteLevelObject(oldItem); + removeLevelObject(oldItem); mapCell.removeObject(oldItem); } return true; @@ -975,7 +1240,7 @@ bool Level::setItem(const ItemCoordInventory& itemCoord, std::unique_ptr& bool Level::setItem(const ItemLocation& location, std::unique_ptr& item) { - if (std::holds_alternative(location) == true) + if (holdsMapCoord(location) == true) { return setItem(std::get(location), item); } @@ -985,6 +1250,32 @@ bool Level::setItem(const ItemLocation& location, std::unique_ptr& item) } } +LevelObjValue Level::addItemQuantity(const ItemLocation& location, LevelObjValue amount) +{ + Player* player; + auto item = getItem(location, player); + if (item != nullptr) + { + if (amount != 0) + { + LevelObjValue newAmount = amount; + auto newQuant = item->addQuantity(newAmount); + + if (player != nullptr && + std::get(location).isSelectedItem() == false) + { + player->updateItemQuantityCache( + item->Class()->IdHash16(), (amount - newAmount)); + } + if (newQuant == 0) + { + removeItem(location); + } + } + } + return amount; +} + void Level::addQuest(Quest quest_) { for (const auto& quest : quests) @@ -997,7 +1288,12 @@ void Level::addQuest(Quest quest_) quests.push_back(std::move(quest_)); } -void Level::deleteQuest(const std::string& questId) +void Level::clearQuests() +{ + quests.clear(); +} + +void Level::deleteQuest(const std::string_view questId) { for (auto it = quests.begin(); it != quests.end(); ++it) { @@ -1009,7 +1305,19 @@ void Level::deleteQuest(const std::string& questId) } } -void Level::setQuestState(const std::string& questId, int state) noexcept +bool Level::hasQuest(const std::string_view questId) const noexcept +{ + for (auto& quest : quests) + { + if (quest.Id() == questId) + { + return true; + } + } + return false; +} + +void Level::setQuestState(const std::string_view questId, int state) noexcept { for (auto& quest : quests) { @@ -1051,17 +1359,17 @@ uint32_t Level::getLevelFromExperience(uint32_t experience) const return experiencePoints.size(); } -const char* Level::getPropertyName(uint16_t hash16) const +const std::string_view Level::getPropertyName(uint16_t hash16) const { const auto elem = propertyNames.find(hash16); if (elem != propertyNames.cend()) { - return elem->second.c_str(); + return elem->second; } - return ""; + return {}; } -void Level::setPropertyName(uint16_t hash16, const std::string& prop) +void Level::setPropertyName(uint16_t hash16, const std::string_view prop) { - propertyNames[hash16] = prop; + propertyNames[hash16] = std::string(prop); } diff --git a/src/Game/Level.h b/src/Game/Level.h index e474910e..65141fb4 100755 --- a/src/Game/Level.h +++ b/src/Game/Level.h @@ -1,32 +1,35 @@ #pragma once #include "Actions/Action.h" +#include "Classifier.h" +#include "InputEvent.h" #include "ItemClass.h" #include "ItemLocation.h" #include "LevelMap.h" +#include "LevelObjectClass.h" #include -#include "Namer.h" #include "Palette.h" #include "Player.h" #include "PlayerClass.h" #include "Quest.h" #include "Save/SaveLevel.h" +#include "SFML/View2.h" #include "Sol.h" +#include "SpellClass.h" #include #include "TexturePacks/TexturePack.h" #include "UIObject.h" #include #include -#include "View2.h" class Level : public UIObject { private: - View2 view; - sf::FloatRect visibleRect; - MapCoord visibleStart; - MapCoord visibleEnd; - bool updateViewPort{ false }; + View2 view{ true }; + View2 automapView{ true }; + sf::Vector2f automapRelativePosition{ 0.f, 0.f }; // relative to this UIObject + sf::Vector2f automapRelativeSize{ 1.f, 1.f }; + bool viewPortNeedsUpdate{ false }; float currentZoomFactor{ 1.f }; float startZoomFactor{ 1.f }; float stopZoomFactor{ 1.f }; @@ -44,16 +47,35 @@ class Level : public UIObject MapCoord mapCoordOverMouse; MapCoord currentMapPosition; sf::Vector2f currentMapViewCenter; + sf::Vector2f currentAutomapViewCenter; std::string id; std::string name; std::string path; - std::shared_ptr tilesBottom; - std::shared_ptr tilesTop; + struct LevelLayer + { + std::shared_ptr tiles; + View2* view{ nullptr }; + sf::Color background{ sf::Color::Transparent }; + sf::FloatRect visibleRect; + MapCoord visibleStart; + MapCoord visibleEnd; + int tileWidth{ 0 }; + int tileHeight{ 0 }; + int blockWidth{ 0 }; // a tile is 4 blocks + int blockHeight{ 0 }; + bool visible{ false }; // currently, only used for automap + }; + +public: + static constexpr size_t NumberOfLayers = LevelCell::NumberOfLayers - 1; + static constexpr size_t AutomapLayer = NumberOfLayers - 1; - int tileWidth{ 0 }; - int tileHeight{ 0 }; +private: + std::array levelLayers; + + int32_t automapPlayerDirectionBaseIndex{ -1 }; std::shared_ptr leftAction; std::shared_ptr rightAction; @@ -71,15 +93,17 @@ class Level : public UIObject LevelObject* hoverObject{ nullptr }; Player* currentPlayer{ nullptr }; - std::unordered_map> namers; + std::unordered_map> classifiers; std::unordered_map> itemClasses; + std::unordered_map> levelObjectClasses; + std::unordered_map> spellClasses; std::vector>> playerClasses; bool followCurrentPlayer{ true }; bool pause{ false }; bool visible{ true }; - bool captureInputEvents{ true }; + InputEvent captureInputEvents{ InputEvent::All }; std::vector quests; std::vector experiencePoints; @@ -90,16 +114,56 @@ class Level : public UIObject return level.map[x][y]; } + void updateAutomapPosition(sf::Vector2f position); + void updateAutomapSize(sf::Vector2f position); + + void setCurrentMapViewCenter(const sf::Vector2f& coord_); + void setCurrentMapPosition(const MapCoord& mapPos) { currentMapPosition = mapPos; - currentMapViewCenter = map.getCoord(currentMapPosition); + setCurrentMapViewCenter(map.getCoord(currentMapPosition)); } void addLevelObject(std::unique_ptr obj, const MapCoord& mapCoord, bool addToFront); void addLevelObject(std::unique_ptr obj, LevelCell& mapCell, bool addToFront); void addPlayer(std::unique_ptr player, const MapCoord& mapCoord); + // Removes level object from level. Object still needs to be deleted from map. + // Returns the removed object. + template + std::unique_ptr removeLevelObject(const LevelObject* obj) + { + std::unique_ptr oldObj; + for (auto it = levelObjects.begin(); it != levelObjects.end(); ++it) + { + if (it->get() == obj) + { + auto oldObjPtr = dynamic_cast(it->get()); + it->release(); + oldObj.reset(oldObjPtr); + levelObjects.erase(it); + break; + } + } + if (clickedObject == obj) + { + clickedObject = nullptr; + } + if (hoverObject == obj) + { + hoverObject = nullptr; + } + return oldObj; + } + + LevelObject* parseLevelObjectIdOrMapPosition( + const std::string_view str, std::string_view& props) const; + + void setTileLayer(size_t layer, View2* view_, + std::shared_ptr tiles, + int tileWidth, int tileHeight, bool visible_); + void updateLevelObjectPositions(); void updateMouse(const Game& game); void updateVisibleArea(); @@ -109,16 +173,18 @@ class Level : public UIObject void onMouseScrolled(Game& game); void onTouchBegan(Game& game); - friend void Save::save(const std::string& filePath, const Level& level, - bool skipDefaults, bool skipCurrentPlayer); - friend void Save::serialize(void* serializeObj, const Level& level, - bool skipDefaults, bool skipCurrentPlayer); + friend void Save::save(const std::string_view filePath, + Save::Properties& props, const Game& game, const Level& level); + friend void Save::serialize(void* serializeObj, + Save::Properties& props, const Game& game, const Level& level); public: void Init(LevelMap map_, - std::shared_ptr tilesBottom_, - std::shared_ptr tilesTop_, - int tileWidth_, int tileHeight_); + const std::vector>& texturePackLayers, + int tileWidth, int tileHeight); + void Init(); + + void setAutomap(std::shared_ptr tiles, int tileWidth, int tileHeight); Misc::Helper2D operator[] (Coord x) const noexcept { @@ -134,21 +200,24 @@ class Level : public UIObject Coord Width() const noexcept { return map.Width(); } Coord Height() const noexcept { return map.Height(); } - void Id(const std::string& id_) { id = id_; } - void Name(const std::string& name_) { name = name_; } - void Path(const std::string& path_) { path = path_; } + void Id(const std::string_view id_) { id = id_; } + void Name(const std::string_view name_) { name = name_; } + void Path(const std::string_view path_) { path = path_; } void clearLevelObjects(); - void addNamer(const std::string key, std::unique_ptr obj) + LevelObject* getLevelObject(const std::string_view id) const noexcept; + LevelObject* getLevelObjectByClass(const std::string_view classId) const noexcept; + + void addClassifier(const std::string key, std::unique_ptr obj) { - namers.insert(std::make_pair(key, std::move(obj))); + classifiers.insert(std::make_pair(key, std::move(obj))); } - Namer* getNamer(const std::string& key) const + Classifier* getClassifier(const std::string& key) const { - auto it = namers.find(key); - if (it != namers.end()) + auto it = classifiers.find(key); + if (it != classifiers.end()) { return it->second.get(); } @@ -175,6 +244,46 @@ class Level : public UIObject return nullptr; } + bool hasLevelObjectClass(const std::string& key) const + { + return levelObjectClasses.find(key) != levelObjectClasses.end(); + } + + void addLevelObjectClass(const std::string key, std::unique_ptr obj) + { + levelObjectClasses.insert(std::make_pair(key, std::move(obj))); + } + + LevelObjectClass* getLevelObjectClass(const std::string& key) const + { + auto it = levelObjectClasses.find(key); + if (it != levelObjectClasses.end()) + { + return it->second.get(); + } + return nullptr; + } + + bool hasSpellClass(const std::string& key) const + { + return spellClasses.find(key) != spellClasses.end(); + } + + void addSpellClass(const std::string key, std::unique_ptr obj) + { + spellClasses.insert(std::make_pair(key, std::move(obj))); + } + + SpellClass* getSpellClass(const std::string& key) const + { + auto it = spellClasses.find(key); + if (it != spellClasses.end()) + { + return it->second.get(); + } + return nullptr; + } + void addPlayerClass(const std::string key, std::unique_ptr obj) { playerClasses.push_back(std::make_pair(key, std::move(obj))); @@ -195,8 +304,8 @@ class Level : public UIObject std::vector>& Players() noexcept { return players; } const std::vector>& Players() const noexcept { return players; } - Player* getPlayer(const std::string& id) const noexcept; - Player* getPlayerOrCurrent(const std::string& id) const noexcept; + Player* getPlayer(const std::string_view id) const noexcept; + Player* getPlayerOrCurrent(const std::string_view id) const noexcept; // doesn't clear currently used player classes void clearPlayerClasses(size_t clearIdx); @@ -204,7 +313,11 @@ class Level : public UIObject void clearPlayerTextures() noexcept; void clearPlayers(size_t clearIdx); - void resetView() { view.reset(); } + void resetView() + { + view.reset(); + automapView.reset(); + } void executeHoverEnterAction(Game& game); void executeHoverLeaveAction(Game& game); @@ -220,55 +333,42 @@ class Level : public UIObject virtual std::shared_ptr getAction(uint16_t nameHash16) const noexcept; virtual bool setAction(uint16_t nameHash16, const std::shared_ptr& action) noexcept; - virtual void setAnchor(const Anchor anchor) noexcept { view.setAnchor(anchor); } + virtual void setAnchor(const Anchor anchor) noexcept + { + view.setAnchor(anchor); + automapView.setAnchor(anchor); + } virtual void updateSize(const Game& game); virtual const sf::Vector2f& DrawPosition() const noexcept { return view.getPosition(); } virtual const sf::Vector2f& Position() const noexcept { return view.getPosition(); } - virtual void Position(const sf::Vector2f& position) noexcept - { - view.setPosition(position); - updateViewPort = true; - } + virtual void Position(const sf::Vector2f& position) noexcept; virtual sf::Vector2f Size() const noexcept { return view.getSize(); } - virtual void Size(const sf::Vector2f& size) - { - view.setSize(size); - updateViewPort = true; - } + virtual void Size(const sf::Vector2f& size); + + // between [0, 100] + void setAutomapRelativePosition(const sf::Vector2i& position) noexcept; + // between [0, 100] + void setAutomapRelativeSize(const sf::Vector2i& size); + + void setAutomapBackgroundColor(sf::Color color) { levelLayers[AutomapLayer].background = color; } float Zoom() const noexcept { return stopZoomFactor; } void Zoom(float factor, bool smooth = false) noexcept; - void updateViewport(const Game& game) { view.updateViewport(game); } + void updateViewport(const Game& game) + { + view.updateViewport(game); + automapView.updateViewport(game); + } void addLevelObject(std::unique_ptr obj, bool addToFront); - template - std::unique_ptr deleteLevelObject(const LevelObject* obj) - { - std::unique_ptr oldObj; - for (auto it = levelObjects.begin(); it != levelObjects.end(); ++it) - { - if (it->get() == obj) - { - auto oldObjPtr = dynamic_cast(it->get()); - it->release(); - oldObj.reset(oldObjPtr); - levelObjects.erase(it); - break; - } - } - if (clickedObject == obj) - { - clickedObject = nullptr; - } - if (hoverObject == obj) - { - hoverObject = nullptr; - } - return oldObj; - } + // Deletes level object by id. If id is empty, no action is performed. + void deleteLevelObjectById(const std::string_view id); + + // Deletes level object by class id. If id is empty, no action is performed. + void deleteLevelObjectByClass(const std::string_view classId); MapCoord getMapCoordOverMouse() const noexcept { return mapCoordOverMouse; } @@ -278,7 +378,7 @@ class Level : public UIObject } void move() noexcept { - currentMapViewCenter = mousePositionf; + setCurrentMapViewCenter(mousePositionf); } void addPlayer(std::unique_ptr player); @@ -295,8 +395,11 @@ class Level : public UIObject void FollowCurrentPlayer(bool follow) noexcept { followCurrentPlayer = follow; } - int TileWidth() const noexcept { return tileWidth; } - int TileHeight() const noexcept { return tileHeight; } + int TileWidth() const noexcept { return levelLayers[0].tileWidth; } + int TileHeight() const noexcept { return levelLayers[0].tileHeight; } + + int AutomapTileWidth() const noexcept { return levelLayers[AutomapLayer].tileWidth; } + int AutomapTileHeight() const noexcept { return levelLayers[AutomapLayer].tileHeight; } virtual bool Pause() const noexcept { return pause; } virtual void Pause(bool pause_) noexcept { pause = pause_; } @@ -304,26 +407,33 @@ class Level : public UIObject virtual bool Visible() const noexcept { return visible; } virtual void Visible(bool visible_) noexcept { visible = visible_; } - bool getCaptureInputEvents() const noexcept { return captureInputEvents; } - void setCaptureInputEvents(bool captureEvents) noexcept { captureInputEvents = captureEvents; } - - void save(const std::string& filePath, bool skipDefaults, bool skipCurrentPlayer) const + // setting a negative value will disable drawing player direction in the automap + void setAutomapPlayerDirectionBaseIndex(int32_t index) noexcept { - Save::save(filePath, *this, skipDefaults, skipCurrentPlayer); + automapPlayerDirectionBaseIndex = index; } - void save(const std::string& filePath, const LevelObject& obj, bool skipDefaults) const + + bool ShowAutomap() const noexcept { return levelLayers[AutomapLayer].visible; } + void ShowAutomap(bool show_) noexcept { levelLayers[AutomapLayer].visible = show_; } + + InputEvent getCaptureInputEvents() const noexcept { return captureInputEvents; } + void setCaptureInputEvents(InputEvent e) noexcept { captureInputEvents = e; } + + void save(const std::string_view filePath, + Save::Properties& props, const Game& game) const { - Save::save(filePath, *this, obj, skipDefaults); + Save::save(filePath, props, game, *this); } - virtual void serialize(void* serializeObj, const Level& level, bool skipDefaults) + virtual void serialize(void* serializeObj, + Save::Properties& props, const Game& game, const Level& level) { - Save::serialize(serializeObj, *this, skipDefaults, false); + Save::serialize(serializeObj, props, game, *this); } virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; virtual void update(Game& game); - virtual bool getProperty(const std::string& prop, Variable& var) const; - virtual const Queryable* getQueryable(const std::string& prop) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; + virtual const Queryable* getQueryable(const std::string_view prop) const; Item* getItem(const MapCoord& mapCoord) const noexcept; Item* getItem(const ItemCoordInventory& itemCoord) const; @@ -357,10 +467,15 @@ class Level : public UIObject return setItem(location, nullItem); } + // returns the remaining quantity to add/remove. 0 if all quantity was added. + LevelObjValue addItemQuantity(const ItemLocation& location, LevelObjValue amount); + const std::vector& Quests() const noexcept { return quests; }; void addQuest(Quest quest_); - void deleteQuest(const std::string& questId); - void setQuestState(const std::string& questId, int state) noexcept; + void clearQuests(); + void deleteQuest(const std::string_view questId); + bool hasQuest(const std::string_view questId) const noexcept; + void setQuestState(const std::string_view questId, int state) noexcept; void setExperiencePoints(const std::vector& experiencePoints_) { @@ -370,6 +485,6 @@ class Level : public UIObject uint32_t getExperienceFromLevel(uint32_t level) const; uint32_t getLevelFromExperience(uint32_t experience) const; - const char* getPropertyName(uint16_t hash16) const; - void setPropertyName(uint16_t hash16, const std::string& prop); + const std::string_view getPropertyName(uint16_t hash16) const; + void setPropertyName(uint16_t hash16, const std::string_view prop); }; diff --git a/src/Game/LevelCell.cpp b/src/Game/LevelCell.cpp index 44b2b81e..5f37feb2 100755 --- a/src/Game/LevelCell.cpp +++ b/src/Game/LevelCell.cpp @@ -1,5 +1,13 @@ #include "LevelCell.h" +void LevelCell::setTileIndex(int16_t tileIndex_) noexcept +{ + for (size_t i = 0; i < tileIndexes.size() - 1; i++) + { + tileIndexes[i] = tileIndex_; + } +} + bool LevelCell::PassableIgnoreObject(const LevelObject* ignoreObj) const { if (PassableIgnoreObject() == false) @@ -56,12 +64,18 @@ LevelObject* LevelCell::front() const void LevelCell::addFront(LevelObject* obj) { - objects.insert(objects.begin(), obj); + if (std::find(objects.begin(), objects.end(), obj) == objects.end()) + { + objects.insert(objects.begin(), obj); + } } void LevelCell::addBack(LevelObject* obj) { - objects.push_back(obj); + if (std::find(objects.begin(), objects.end(), obj) == objects.end()) + { + objects.push_back(obj); + } } void LevelCell::removeObject(const LevelObject* obj) diff --git a/src/Game/LevelCell.h b/src/Game/LevelCell.h index 2e5678df..0f964cb4 100755 --- a/src/Game/LevelCell.h +++ b/src/Game/LevelCell.h @@ -7,15 +7,20 @@ class LevelCell { +public: + // number of layers + sol + static constexpr size_t NumberOfLayers = 6; + static constexpr size_t SolLayer = NumberOfLayers - 1; + private: - // 0 - back, 1 - front, 2 - sol - std::array tileIndexes; + std::array tileIndexes; std::vector objects; public: - LevelCell() : tileIndexes{ -1, -1, 0 } {} - LevelCell(int16_t back, int16_t front, int16_t sol) - : tileIndexes{ back, front, sol } {} + LevelCell() : tileIndexes{ -1, -1, -1, -1, -1, 0 } {} + LevelCell(int16_t layer1, int16_t layer2, int16_t layer3, + int16_t layer4, int16_t layer5, int16_t layer6) + : tileIndexes{ layer1, layer2, layer3, layer4, layer5, layer6 } {} using iterator = std::vector::iterator; using const_iterator = std::vector::const_iterator; @@ -35,15 +40,12 @@ class LevelCell const_reverse_iterator crbegin() const noexcept { return objects.crbegin(); } const_reverse_iterator crend() const noexcept { return objects.crend(); } - int16_t TileIndexBack() const noexcept { return tileIndexes[0]; } - int16_t TileIndexFront() const noexcept { return tileIndexes[1]; } + int16_t getTileIndex(size_t layer) const noexcept { return tileIndexes[layer]; } - void TileIndex(size_t index, int16_t tileIndex_) noexcept { tileIndexes[index] = tileIndex_; } - void TileIndexBack(int16_t tileIndex_) noexcept { tileIndexes[0] = tileIndex_; } - void TileIndexFront(int16_t tileIndex_) noexcept { tileIndexes[1] = tileIndex_; } - void Sol(int16_t sol_) noexcept { tileIndexes[2] = sol_; } + void setTileIndex(int16_t tileIndex_) noexcept; + void setTileIndex(size_t layer, int16_t tileIndex_) noexcept { tileIndexes[layer] = tileIndex_; } - bool PassableIgnoreObject() const noexcept { return !(tileIndexes[2] & 0x01); } + bool PassableIgnoreObject() const noexcept { return !(tileIndexes[SolLayer] & 0x01); } bool PassableIgnoreObject(const LevelObject* ignoreObj) const; bool Passable() const; diff --git a/src/Game/LevelHelper.cpp b/src/Game/LevelHelper.cpp index c689a443..e04ea584 100755 --- a/src/Game/LevelHelper.cpp +++ b/src/Game/LevelHelper.cpp @@ -2,6 +2,7 @@ #include "TexturePacks/IndexedTexturePack.h" #include "TexturePacks/SimpleTexturePack.h" #include "TexturePacks/VectorTexturePack.h" +#include "Utils/Utils.h" namespace LevelHelper { @@ -107,18 +108,64 @@ namespace LevelHelper return texturePack; } + // reduces the sheet size and number of textures that fit in a texture + // to avoid creating big textures with too many blanks. + void getIdealTilesetSheetSize( + size_t minimumTextureSize, size_t maximumTextureSize, + size_t numTexturesToFit, + size_t tileWidth, size_t tileHeight, + size_t& sheetWidth, size_t& sheetHeight, + size_t& numTexturesThatFitX, size_t& numTexturesThatFitY) + { + numTexturesThatFitX = maximumTextureSize / tileWidth; + numTexturesThatFitY = maximumTextureSize / tileHeight; + sheetWidth = tileWidth * numTexturesThatFitX; + sheetHeight = tileHeight * numTexturesThatFitY; + + while (sheetWidth > minimumTextureSize && + sheetHeight > minimumTextureSize) + { + size_t newSheetWidth, newSheetHeight; + if (sheetWidth >= sheetHeight) + { + newSheetWidth = sheetWidth - tileWidth; + newSheetHeight = sheetHeight; + } + else + { + newSheetWidth = sheetWidth; + newSheetHeight = sheetHeight - tileHeight; + } + size_t newMaxFitX = newSheetWidth / tileWidth; + size_t newMaxFitY = newSheetHeight / tileHeight; + auto maxNumTextures = newMaxFitX * newMaxFitY; + if (maxNumTextures < numTexturesToFit) + { + return; + } + numTexturesThatFitX = newMaxFitX; + numTexturesThatFitY = newMaxFitY; + sheetWidth = newSheetWidth; + sheetHeight = newSheetHeight; + } + } + + // creates spritesheets for level sprites based on the maximum supported texture size + // and tries to fit as many tiles into the smallest number of textures. std::shared_ptr loadTilesetAndBatchSprites( CachedImagePack& imgPack, const Min& min, bool top, bool skipBlankTiles) { std::shared_ptr texturePack; SimpleMultiTexturePack* multiTexturePack = nullptr; IndexedTexturePack* indexedTexturePack = nullptr; + size_t numTexturesToFit; if (skipBlankTiles == false) { texturePack = std::make_shared( imgPack.getPalette(), imgPack.IsIndexed()); multiTexturePack = (SimpleMultiTexturePack*)texturePack.get(); + numTexturesToFit = min.size(); } else { @@ -127,31 +174,41 @@ namespace LevelHelper multiTexturePack = texturePack2.get(); texturePack = std::make_shared(std::move(texturePack2), true); indexedTexturePack = (IndexedTexturePack*)texturePack.get(); + numTexturesToFit = min.size() - min.blankTopPillars(); } + auto maxTextureSize = sf::Texture::getMaximumSize(); + if (maxTextureSize > 1024u) + { + // with this maximum, all original pillars fit into one texture. + maxTextureSize = std::min(maxTextureSize, 2560u); + } + unsigned pillarWidth = 64; unsigned pillarHeight = (top == true ? ((min[0].size() - 1) * 32) : 32); - if (pillarHeight > 1024) + if (pillarHeight > maxTextureSize) { return texturePack; } size_t i = 0; - size_t xMax = 16; - size_t yMax = (top == true ? (1024 / pillarHeight) : 32); - unsigned sheetHeight = pillarHeight * yMax; + size_t xMax, yMax, sheetWidth, sheetHeight; + + getIdealTilesetSheetSize(1024, maxTextureSize, numTexturesToFit, + pillarWidth, pillarHeight, sheetWidth, sheetHeight, xMax, yMax); + sf::Vector2f offset(0.f, (top == true ? -32.f : 0.f)); - sf::Image2 newPillar; bool mainLoop = true; while (mainLoop == true) { - newPillar.create(1024, sheetHeight, sf::Color::Transparent); + sf::Image2 newPillar; + newPillar.create(sheetWidth, sheetHeight, sf::Color::Transparent); bool loop = true; size_t x = 0; size_t y = 0; while (loop == true) { - size_t newX = x * 64; + size_t newX = x * pillarWidth; size_t newY = y * pillarHeight; bool hasTile = drawMinPillar(newPillar, newX, newY, min[i], imgPack, top); @@ -185,6 +242,15 @@ namespace LevelHelper } multiTexturePack->addTexturePack(std::make_shared(newPillar), std::make_pair(xMax, yMax), offset, 0, true); + + // calculate new sheet size for the remaining tiles. + if (mainLoop == true) + { + numTexturesToFit -= xMax * yMax; + getIdealTilesetSheetSize(std::min(512u, maxTextureSize), + maxTextureSize, numTexturesToFit, + pillarWidth, pillarHeight, sheetWidth, sheetHeight, xMax, yMax); + } } return texturePack; } @@ -202,33 +268,47 @@ namespace LevelHelper } } - void saveTilesetSprite(const std::string& path, - CachedImagePack& imgPack, const Min& min, int bottomTopOrBoth, bool skipBlankTiles) + void saveTilesetSprite(const std::string& path, CachedImagePack& imgPack, + const Min& min, int bottomTopOrBoth, bool skipBlankTiles, unsigned maxTextureSize) { - sf::Image2 newPillar; + size_t numTexturesToFit = min.size(); + if (bottomTopOrBoth == 1 && + skipBlankTiles == true) + { + numTexturesToFit -= min.blankTopPillars(); + } + unsigned pillarWidth = 64; + unsigned pillarHeight = (bottomTopOrBoth != 0 ? (min[0].size() * 32) : 32); + if (pillarHeight > maxTextureSize) + { + return; + } size_t i = 0; + size_t xMax, yMax, sheetWidth, sheetHeight; + + getIdealTilesetSheetSize(1024, maxTextureSize, numTexturesToFit, + pillarWidth, pillarHeight, sheetWidth, sheetHeight, xMax, yMax); + size_t file = 1; - size_t xMax = 16; - size_t yMax = (bottomTopOrBoth != 0 ? 4 : 32); - size_t topPillarHeight = (min[0].size() - 1) * 32; bool mainLoop = true; while (mainLoop == true) { - newPillar.create(1024, 1024, sf::Color::Transparent); + sf::Image2 newPillar; + newPillar.create(sheetWidth, sheetHeight, sf::Color::Transparent); bool loop = true; size_t x = 0; size_t y = 0; while (loop == true) { - size_t newX = x * 64; - size_t newY = y * (bottomTopOrBoth != 0 ? 256 : 32); + size_t newX = x * pillarWidth; + size_t newY = y * pillarHeight; bool hasTile = false; if (bottomTopOrBoth < 0) { - hasTile = drawMinPillar(newPillar, newX, newY + topPillarHeight, min[i], imgPack, false); + hasTile = drawMinPillar(newPillar, newX, newY + pillarHeight - 32, min[i], imgPack, false); hasTile |= drawMinPillar(newPillar, newX, newY, min[i], imgPack, true); } else @@ -258,8 +338,17 @@ namespace LevelHelper mainLoop = false; } } - newPillar.saveToFile(path + std::to_string(file) + ".png"); + newPillar.saveToFile(path + Utils::toString(file) + ".png"); file++; + + // calculate new sheet size for the remaining tiles. + if (mainLoop == true) + { + numTexturesToFit -= xMax * yMax; + getIdealTilesetSheetSize(std::min(512u, maxTextureSize), + maxTextureSize, numTexturesToFit, + pillarWidth, pillarHeight, sheetWidth, sheetHeight, xMax, yMax); + } } } } diff --git a/src/Game/LevelHelper.h b/src/Game/LevelHelper.h index 0865b043..86600cb9 100755 --- a/src/Game/LevelHelper.h +++ b/src/Game/LevelHelper.h @@ -13,5 +13,5 @@ namespace LevelHelper // bottomTopOrBoth : -1 for both, 0 for bottom, 1 for top void saveTilesetSprite(const std::string& path, CachedImagePack& imgPack, - const Min& min, int bottomTopOrBoth, bool skipBlankTiles); + const Min& min, int bottomTopOrBoth, bool skipBlankTiles, unsigned maxTextureSize = 1024u); } diff --git a/src/Game/LevelMap.cpp b/src/Game/LevelMap.cpp index cc996559..f322e711 100755 --- a/src/Game/LevelMap.cpp +++ b/src/Game/LevelMap.cpp @@ -1,7 +1,7 @@ #include "LevelMap.h" #include "PathFinder.h" -LevelMap::LevelMap(const std::string& tilFileName, const std::string& solFileName, +LevelMap::LevelMap(const std::string_view tilFileName, const std::string_view solFileName, Coord width_, Coord height_, int16_t defaultTile) : mapSize(width_, height_), tileSet(tilFileName), sol(solFileName) { @@ -39,7 +39,7 @@ void LevelMap::resize(int16_t defaultTile) } else { - cells.resize(mapSize.x * mapSize.y, { defaultTile, -1, 0 }); + cells.resize(mapSize.x * mapSize.y, { defaultTile, -1, -1, -1, -1, 0 }); } } else @@ -56,17 +56,16 @@ void LevelMap::resize(const TileBlock& defaultTile) for (Coord i = 0; i < mapSize.x; i++) { auto tileIdx = defaultTile.getTileIndex(i, j); - (*this)[i][j].TileIndex(0, tileIdx); - (*this)[i][j].TileIndex(1, tileIdx); - (*this)[i][j].TileIndex(2, sol.get(tileIdx)); + (*this)[i][j].setTileIndex(tileIdx); + (*this)[i][j].setTileIndex(LevelCell::SolLayer, sol.get(tileIdx)); } } } -void LevelMap::setTileSize(int32_t tileWidth_, int32_t tileHeight_) noexcept +void LevelMap::setDefaultTileSize(int32_t tileWidth_, int32_t tileHeight_) noexcept { - blockWidth = tileWidth_ / 2; - blockHeight = tileHeight_ / 2; + defaultBlockWidth = std::max(1, tileWidth_ / 2); + defaultBlockHeight = std::max(1, tileHeight_ / 2); } void LevelMap::setTileSetArea(Coord x, Coord y, const Dun& dun) @@ -130,15 +129,13 @@ void LevelMap::setTileSetArea(Coord x, Coord y, const Dun& dun) if (dunIndex == -1) { - cell.TileIndexBack(-1); - cell.TileIndexFront(-1); - cell.Sol(0); + cell.setTileIndex(-1); + cell.setTileIndex(LevelCell::SolLayer, 0); } else { - cell.TileIndexBack(tileIndex); - cell.TileIndexFront(tileIndex); - cell.Sol(sol.get(tileIndex)); + cell.setTileIndex(tileIndex); + cell.setTileIndex(LevelCell::SolLayer, sol.get(tileIndex)); } } } @@ -162,16 +159,16 @@ void LevelMap::setSimpleArea(Coord x, Coord y, const Dun& dun) auto& cell = cells[(size_t)(cellX + (cellY * mapSize.x))]; auto tileIndex = dun[i][j]; - cell.TileIndexBack(tileIndex); - cell.TileIndexFront(tileIndex); - cell.Sol((tileIndex >= 0 ? sol.get(tileIndex) : 0)); + cell.setTileIndex(tileIndex); + cell.setTileIndex(LevelCell::SolLayer, (tileIndex >= 0 ? sol.get(tileIndex) : 0)); } } } -void LevelMap::setSimpleArea(Coord x, Coord y, size_t index, const Dun& dun) +void LevelMap::setSimpleArea(Coord x, Coord y, size_t layer, + const Dun& dun, bool normalizeSolLayer) { - if (index > 2) + if (layer > LevelCell::NumberOfLayers) { return; } @@ -191,11 +188,12 @@ void LevelMap::setSimpleArea(Coord x, Coord y, size_t index, const Dun& dun) auto& cell = cells[(size_t)(cellX + (cellY * mapSize.x))]; auto tileIndex = dun[i][j]; - if (index == 2) // sol + if (layer == LevelCell::SolLayer && + normalizeSolLayer == true) { tileIndex = (tileIndex != 0 ? 1 : 0); } - cell.TileIndex(index, tileIndex); + cell.setTileIndex(layer, tileIndex); } } } @@ -212,6 +210,12 @@ bool LevelMap::isMapCoordValid(const MapCoord& mapCoord) const noexcept } sf::Vector2f LevelMap::getCoord(const MapCoord& tile) const +{ + return getCoord(tile, defaultBlockWidth, defaultBlockHeight); +} + +sf::Vector2f LevelMap::getCoord(const MapCoord& tile, + int32_t blockWidth, int32_t blockHeight) const { return sf::Vector2f( (float)((tile.y*(-blockWidth)) + blockWidth * tile.x + mapSize.y * blockWidth - blockWidth), @@ -220,6 +224,12 @@ sf::Vector2f LevelMap::getCoord(const MapCoord& tile) const } MapCoord LevelMap::getTile(const sf::Vector2f& coords) const noexcept +{ + return getTile(coords, defaultBlockWidth, defaultBlockHeight); +} + +MapCoord LevelMap::getTile(const sf::Vector2f& coords, + int32_t blockWidth, int32_t blockHeight) const noexcept { // Position on the map in pixels int32_t flatX = (int32_t)coords.x; @@ -282,33 +292,15 @@ MapCoord LevelMap::getTile(const sf::Vector2f& coords) const noexcept return MapCoord((Coord)isoPosX, (Coord)isoPosY); } -void LevelMap::setOutOfBoundsTileBack(int16_t tile) noexcept -{ - if (tile >= 0) - { - if ((size_t)tile < tileSet.size()) - { - outOfBoundsTileBack = tileSet[tile]; - } - } - else - { - outOfBoundsTileBack = {}; - } -} - -void LevelMap::setOutOfBoundsTileFront(int16_t tile) noexcept +void LevelMap::setOutOfBoundsTileIndex(size_t layer, int16_t tile) noexcept { - if (tile >= 0) + if (tile >= 0 && (size_t)tile < tileSet.size()) { - if ((size_t)tile < tileSet.size()) - { - outOfBoundsTileFront = tileSet[tile]; - } + outOfBoundsTiles[layer] = tileSet[tile]; } else { - outOfBoundsTileFront = {}; + outOfBoundsTiles[layer] = {}; } } @@ -322,8 +314,8 @@ std::vector LevelMap::getPath(const MapCoord& a, const MapCoord& b) co return path; } - MapSearchNode start(this, a.x, a.y, PlayerDirection::All); - MapSearchNode end(this, b.x, b.y, PlayerDirection::All); + MapSearchNode start(*this, a.x, a.y, PlayerDirection::All); + MapSearchNode end(*this, b.x, b.y, PlayerDirection::All); MapSearchNode endOrig(end); if (end.IsValid() == false) @@ -335,12 +327,12 @@ std::vector LevelMap::getPath(const MapCoord& a, const MapCoord& b) co if (((*this)[b]).hasObjects() == true) { if (start.GoalDistanceEstimateC(end) == 1.f || - getNearestPassableEndNode(start, end) == false) + getNearestPassableEndNode(*this, start, end) == false) { path.push_back(b); return path; } - if (end.IsPassableIgnoreObject() == false) + if ((*this)[end.x][end.y].PassableIgnoreObject() == false) { return path; } @@ -351,14 +343,14 @@ std::vector LevelMap::getPath(const MapCoord& a, const MapCoord& b) co } } - PathFinder pathFinder(PATH_FINDER_MAX); + PathFinder pathFinder(this); pathFinder.SetStartAndGoalStates(start, end); unsigned int SearchState; do { SearchState = pathFinder.SearchStep(); - if (pathFinder.GetStepCount() == PATH_FINDER_MAX) + if (pathFinder.GetStepCount() == PathFinder::MaxNodes) { pathFinder.CancelSearch(); } @@ -396,7 +388,7 @@ std::string LevelMap::toCSV(bool zeroBasedIndex) const { for (int i = 0; i < mapSize.x; i++) { - str += std::to_string((*this)[i][j].TileIndexBack() + inc) + ","; + str += Utils::toString((*this)[i][j].getTileIndex(0) + inc) + ","; } str += "\n"; } diff --git a/src/Game/LevelMap.h b/src/Game/LevelMap.h index 68d7174c..87a0b21d 100755 --- a/src/Game/LevelMap.h +++ b/src/Game/LevelMap.h @@ -15,12 +15,11 @@ class LevelMap std::vector cells; MapCoord mapSize; - TileBlock outOfBoundsTileBack; - TileBlock outOfBoundsTileFront; + std::array outOfBoundsTiles; - // a tile is 4 blocks - int32_t blockWidth{ 0 }; - int32_t blockHeight{ 0 }; + // default block size - a tile is 4 blocks + int32_t defaultBlockWidth{ 1 }; + int32_t defaultBlockHeight{ 1 }; TileSet tileSet; Sol sol; @@ -59,17 +58,23 @@ class LevelMap const_reverse_iterator crend() const noexcept { return cells.crend(); } LevelMap() noexcept {} - LevelMap(const std::string& tilFileName, const std::string& solFileName, + LevelMap(const std::string_view tilFileName, const std::string_view solFileName, Coord width_, Coord height_, int16_t defaultTile = -1); LevelMap(Coord width_, Coord height_, int16_t defaultTile = -1); + LevelMap& operator=(const LevelMap&) = default; + LevelMap& operator=(LevelMap&&) = default; + LevelMap(const LevelMap&) = default; + LevelMap(LevelMap&&) = default; + void resize(Coord width_, Coord height_, int16_t defaultTile = -1); - void setTileSize(int32_t tileWidth_, int32_t tileHeight_) noexcept; + void setDefaultTileSize(int32_t tileWidth_, int32_t tileHeight_) noexcept; void setTileSetArea(Coord x, Coord y, const Dun& dun); void setSimpleArea(Coord x, Coord y, const Dun& dun); - void setSimpleArea(Coord x, Coord y, size_t index, const Dun& dun); + void setSimpleArea(Coord x, Coord y, size_t layer, + const Dun& dun, bool normalizeSolLayer = true); Misc::Helper2D operator[] (Coord x) noexcept { @@ -92,19 +97,16 @@ class LevelMap bool isMapCoordValid(const MapCoord& mapCoord) const noexcept; sf::Vector2f getCoord(const MapCoord& tile) const; + sf::Vector2f getCoord(const MapCoord& tile, int32_t blockWidth, int32_t blockHeight) const; MapCoord getTile(const sf::Vector2f& coords) const noexcept; + MapCoord getTile(const sf::Vector2f& coords, int32_t blockWidth, int32_t blockHeight) const noexcept; - int16_t getOutOfBoundsTileIndexBack(int32_t xCoord, int32_t yCoord) const noexcept - { - return outOfBoundsTileBack.getTileIndex(xCoord, yCoord); - } - int16_t getOutOfBoundsTileIndexFront(int32_t xCoord, int32_t yCoord) const noexcept + int16_t getOutOfBoundsTileIndex(size_t layer, int32_t xCoord, int32_t yCoord) const noexcept { - return outOfBoundsTileFront.getTileIndex(xCoord, yCoord); + return outOfBoundsTiles[layer].getTileIndex(xCoord, yCoord); } - void setOutOfBoundsTileBack(int16_t tile) noexcept; - void setOutOfBoundsTileFront(int16_t tile) noexcept; + void setOutOfBoundsTileIndex(size_t layer, int16_t tile) noexcept; std::vector getPath(const MapCoord& a, const MapCoord& b) const; diff --git a/src/Game/LevelObject.h b/src/Game/LevelObject.h index 385019db..6bcebc4b 100755 --- a/src/Game/LevelObject.h +++ b/src/Game/LevelObject.h @@ -1,14 +1,14 @@ #pragma once -#include "Actions/Action.h" #include "MapCoord.h" #include #include "Number.h" #include "Palette.h" #include "Queryable.h" +#include "Save/SaveProperties.h" #include #include -#include +#include #include "Variable.h" class Game; @@ -27,21 +27,26 @@ class LevelObject : public sf::Drawable, public Queryable // Game virtual void executeAction(Game& game) const = 0; - virtual bool getNumberProp(const char* prop, Number32& value) const = 0; + virtual bool getNumberProp(const std::string_view prop, Number32& value) const = 0; virtual bool hasPalette() const = 0; virtual bool Hoverable() const = 0; virtual void Hoverable(bool hoverable) = 0; virtual bool Passable() const = 0; - virtual void setAction(const std::shared_ptr& action) = 0; virtual void setColor(const sf::Color& color) = 0; virtual void setOutline(const sf::Color& outline, const sf::Color& ignore) = 0; virtual void setOutlineOnHover(bool outlineOnHover) = 0; virtual void setPalette(const std::shared_ptr& palette) = 0; - virtual void serialize(void* serializeObj, const Level& level, bool skipDefaults) const = 0; + virtual std::string_view getId() const = 0; + virtual std::string_view getClassId() const = 0; + + // serialize this object. + // serializeObj - currently is a RapidJson writer class + virtual void serialize(void* serializeObj, Save::Properties& props, + const Game& game, const Level& level) const = 0; // Update virtual void update(Game& game, Level& level) = 0; - virtual void setProperty(const std::string& prop, const Variable& val) = 0; + virtual void setProperty(const std::string_view prop, const Variable& val) = 0; }; diff --git a/src/Game/LevelObjectClass.h b/src/Game/LevelObjectClass.h new file mode 100755 index 00000000..812c97fb --- /dev/null +++ b/src/Game/LevelObjectClass.h @@ -0,0 +1,75 @@ +#pragma once + +#include "AnimationType.h" +#include "BaseClassDefaults.h" +#include "Classifiers.h" +#include +#include +#include "TexturePacks/TexturePack.h" + +class LevelObjectClass : public BaseClassDefaults +{ +private: + const sf::Texture* texture{ nullptr }; + sf::IntRect textureRect; + std::shared_ptr texturePack; + std::pair textureIndexRange; + sf::Time frameTime; + AnimationType animType{ AnimationType::PlayOnce }; + + std::string id; + std::string name; + std::string text1; + std::string text2; + + Classifiers<3> classifiers; + +public: + LevelObjectClass(const sf::Texture& texture_) : texture(&texture_) {} + LevelObjectClass(const std::shared_ptr& texturePack_, + const std::pair& textureIndexRange_, + const sf::Time& frameTime_, AnimationType animType_) + : texturePack(texturePack_), textureIndexRange(textureIndexRange_), + frameTime(frameTime_), animType(animType_) {} + + const sf::Texture* getTexture() const noexcept { return texture; } + + const sf::IntRect& getTextureRect() const noexcept { return textureRect; } + void setTextureRect(const sf::IntRect& textureRect_) { textureRect = textureRect_; } + + const TexturePack* getTexturePack() const noexcept { return texturePack.get(); } + + const std::pair& getTextureIndexRange() const noexcept + { + return textureIndexRange; + } + + const sf::Time& getFrameTime() const noexcept { return frameTime; } + + AnimationType getAnimationType() const noexcept { return animType; } + + const std::string& Id() const noexcept { return id; } + const std::string& Name() const noexcept { return name; } + const std::string& Text1() const noexcept { return text1; } + const std::string& Text2() const noexcept { return text2; } + + void Id(const std::string_view id_) { id = id_; } + void Name(const std::string_view name_) { name = name_; } + void Text1(const std::string_view text1_) { text1 = text1_; } + void Text2(const std::string_view text2_) { text2 = text2_; } + + bool getFullName(const Queryable& obj, std::string& fullName) const + { + return classifiers.getText(0, obj, fullName); + } + void setNameClassifier(Classifier* classifier) { classifiers.set(0, classifier, 0); } + + bool getDescription(size_t idx, const Queryable& obj, std::string& description) const + { + return classifiers.getText(idx + 1, obj, description); + } + void setDescription(size_t idx, Classifier* classifier, uint16_t skipFirst) + { + classifiers.set(idx + 1, classifier, skipFirst); + } +}; diff --git a/src/Game/Namer.cpp b/src/Game/Namer.cpp deleted file mode 100755 index 7d9b9e72..00000000 --- a/src/Game/Namer.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "Namer.h" - -std::string Namer::getName(const Queryable& obj, uint16_t skipFirst) const -{ - std::string strName; - bool hasName = false; - for (const auto& nameVal : nameValues) - { - bool hasValue = false; - LevelObjValue value = 0; - if (nameVal.property.empty() == true) - { - hasValue = true; - } - else - { - Variable var; - if (obj.getProperty(nameVal.property, var) == true) - { - if (std::holds_alternative(var) == true) - { - value = (LevelObjValue)std::get(var); - hasValue = true; - } - else if (std::holds_alternative(var) == true) - { - value = (LevelObjValue)std::get(var); - hasValue = true; - } - } - } - if (hasValue == true) - { - for (const auto& itemElem : nameVal.values) - { - if (value >= itemElem.min && value <= itemElem.max) - { - if (skipFirst > 0) - { - skipFirst--; - } - else - { - strName = itemElem.text; - hasName = true; - } - break; - } - } - if (hasName == true) - { - break; - } - } - } - return strName; -} diff --git a/src/Game/Namer.h b/src/Game/Namer.h deleted file mode 100755 index 68d8983f..00000000 --- a/src/Game/Namer.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "GameProperties.h" -#include "Queryable.h" -#include -#include - -struct NameValue -{ - LevelObjValue min{ 0 }; - LevelObjValue max{ 0 }; - std::string text; -}; - -struct NameValueInterval -{ - std::string property; - std::vector values; -}; - -class Namer -{ -private: - std::vector nameValues; - -public: - Namer(std::vector nameValues_) noexcept - : nameValues(std::move(nameValues_)) {} - - std::string getName(const Queryable& obj, uint16_t skipFirst = 0) const; -}; diff --git a/src/Game/Number.h b/src/Game/Number.h index ce8528e7..aed6bf54 100755 --- a/src/Game/Number.h +++ b/src/Game/Number.h @@ -182,4 +182,28 @@ struct Number32 } return *this; } + + constexpr bool operator==(const Number32& right) const noexcept + { + return (type == right.type && + intNum == right.intNum); + } }; + +constexpr bool operator==(const Number32& left, const int32_t& right) noexcept +{ + return (left.isInt32() == true && + left.getInt32() == right); +} + +constexpr bool operator==(const Number32& left, const uint32_t& right) noexcept +{ + return (left.isUInt32() == true && + left.getUInt32() == right); +} + +constexpr bool operator==(const Number32& left, const float& right) noexcept +{ + return (left.isFloat() == true && + left.getFloat() == right); +} diff --git a/src/Game/PathFinder.cpp b/src/Game/PathFinder.cpp index ec56840f..95f63ab5 100755 --- a/src/Game/PathFinder.cpp +++ b/src/Game/PathFinder.cpp @@ -2,33 +2,27 @@ #include #include "LevelMap.h" -bool MapSearchNode::IsValid() const noexcept +MapSearchNode::MapSearchNode(const LevelMap& map, int16_t x_, int16_t y_, + const PlayerDirection& direction_) noexcept : x(x_), y(y_), direction(direction_) { - return (x >= 0 && - x < map->Width() && - y >= 0 && - y < map->Height()); + if (map.isMapCoordValid(x_, y_) == true) + { + cost = map[(Coord)x_][(Coord)y_].Passable() ? NodePassable : NodeNotPassable; + } + else + { + cost = NodeInvalid; + } } -bool MapSearchNode::IsPassableIgnoreObject() const noexcept +bool MapSearchNode::IsValid() const noexcept { - if (IsValid() == true) - { - return (*map)[(Coord)x][(Coord)y].PassableIgnoreObject(); - } - return false; + return cost != NodeInvalid; } -bool MapSearchNode::IsPassable(int16_t x_, int16_t y_) const +bool MapSearchNode::IsPassable() const { - if (x_ >= 0 && - x_ < map->Width() && - y_ >= 0 && - y_ < map->Height()) - { - return (*map)[(Coord)x_][(Coord)y_].Passable(); - } - return false; + return cost == NodePassable; } bool MapSearchNode::IsSameState(MapSearchNode& rhs) noexcept @@ -54,7 +48,11 @@ bool MapSearchNode::IsGoal(MapSearchNode& nodeGoal) noexcept bool MapSearchNode::addSuccessor(AStarSearch* astarsearch, int16_t x_, int16_t y_, int16_t parent_x, int16_t parent_y) { - if ((IsPassable(x_, y_) == true) && !((parent_x == x_) && (parent_y == y_))) + const auto& map = *((PathFinder*)astarsearch)->map; + + if ((map.isMapCoordValid(x_, y_) == true) && + (map[(Coord)x_][(Coord)y_].Passable() == true) && + !((parent_x == x_) && (parent_y == y_))) { auto direction_ = getPlayerDirection( MapCoord((Coord)parent_x, (Coord)parent_y), @@ -109,11 +107,7 @@ bool MapSearchNode::GetSuccessors(AStarSearch* astarsearch, MapSe float MapSearchNode::GetCost() const { - if (IsPassable(x, y) == true) - { - return 1.f; - } - return 9.f; + return cost; } float MapSearchNode::GetCost(MapSearchNode& successor) @@ -121,10 +115,10 @@ float MapSearchNode::GetCost(MapSearchNode& successor) return GetCost(); } -const bool addNearestSuccessor(std::vector& neighbours, +const bool addNearestSuccessor(const LevelMap& map, std::vector& neighbours, int16_t x_, int16_t y_, MapSearchNode parent) { - MapSearchNode neighbour(parent); + MapSearchNode neighbour(map, x_, y_, parent.direction); neighbour.x = x_; neighbour.y = y_; if ((neighbour.IsPassable() == true) && !((parent.x == x_) && (parent.y == y_))) @@ -135,35 +129,36 @@ const bool addNearestSuccessor(std::vector& neighbours, return false; } -bool getNearestPassableEndNode(const MapSearchNode& start, MapSearchNode& end) +bool getNearestPassableEndNode(const LevelMap& map, + const MapSearchNode& start, MapSearchNode& end) { std::vector neighbours; - bool canWalkLeft = addNearestSuccessor(neighbours, end.x - 1, end.y, end); - bool canWalkRight = addNearestSuccessor(neighbours, end.x + 1, end.y, end); - bool canWalkUp = addNearestSuccessor(neighbours, end.x, end.y - 1, end); - bool canWalkDown = addNearestSuccessor(neighbours, end.x, end.y + 1, end); + bool canWalkLeft = addNearestSuccessor(map, neighbours, end.x - 1, end.y, end); + bool canWalkRight = addNearestSuccessor(map, neighbours, end.x + 1, end.y, end); + bool canWalkUp = addNearestSuccessor(map, neighbours, end.x, end.y - 1, end); + bool canWalkDown = addNearestSuccessor(map, neighbours, end.x, end.y + 1, end); if (canWalkLeft == true) { if (canWalkUp == true) { - addNearestSuccessor(neighbours, end.x - 1, end.y - 1, end); + addNearestSuccessor(map, neighbours, end.x - 1, end.y - 1, end); } if (canWalkDown == true) { - addNearestSuccessor(neighbours, end.x - 1, end.y + 1, end); + addNearestSuccessor(map, neighbours, end.x - 1, end.y + 1, end); } } if (canWalkRight == true) { if (canWalkUp == true) { - addNearestSuccessor(neighbours, end.x + 1, end.y - 1, end); + addNearestSuccessor(map, neighbours, end.x + 1, end.y - 1, end); } if (canWalkDown == true) { - addNearestSuccessor(neighbours, end.x + 1, end.y + 1, end); + addNearestSuccessor(map, neighbours, end.x + 1, end.y + 1, end); } } diff --git a/src/Game/PathFinder.h b/src/Game/PathFinder.h index 3bdd6d82..057bbb64 100755 --- a/src/Game/PathFinder.h +++ b/src/Game/PathFinder.h @@ -3,31 +3,42 @@ #include "GameProperties.h" #include "stlastar.h" -#define PATH_FINDER_MAX 150 - class LevelMap; +template +class AStarMapSearch : public AStarSearch +{ +public: + const LevelMap* map{ nullptr }; + + static constexpr int MaxNodes = 150; + + AStarMapSearch(const LevelMap* map_) : AStarSearch(MaxNodes), map(map_) {} +}; + class MapSearchNode { private: + static constexpr float NodeInvalid = std::numeric_limits::max(); + static constexpr float NodeNotPassable = 9.f; + static constexpr float NodePassable = 1.f; + bool addSuccessor(AStarSearch* astarsearch, int16_t x_, int16_t y_, int16_t parent_x, int16_t parent_y); public: - const LevelMap* map = nullptr; int16_t x; int16_t y; + float cost; PlayerDirection direction; - MapSearchNode() noexcept : map(nullptr), x(0), y(0), direction(PlayerDirection::All) {} - MapSearchNode(const LevelMap* map_, int16_t x_, int16_t y_, - const PlayerDirection& direction_) noexcept : map(map_), x(x_), y(y_), direction(direction_) {} + MapSearchNode() noexcept : x(0), y(0), cost(NodeNotPassable), direction(PlayerDirection::All) {} + MapSearchNode(const LevelMap& map, int16_t x_, int16_t y_, + const PlayerDirection& direction_) noexcept; bool IsValid() const noexcept; - bool IsPassableIgnoreObject() const noexcept; - bool IsPassable() const { return IsPassable(x, y); } - bool IsPassable(int16_t x_, int16_t y_) const; + bool IsPassable() const; float GoalDistanceEstimateC(const MapSearchNode& nodeGoal) const noexcept; float GetCost() const; @@ -39,6 +50,7 @@ class MapSearchNode bool IsSameState(MapSearchNode& rhs) noexcept; }; -bool getNearestPassableEndNode(const MapSearchNode& start, MapSearchNode& end); +bool getNearestPassableEndNode(const LevelMap& map, + const MapSearchNode& start, MapSearchNode& end); -typedef AStarSearch PathFinder; +typedef AStarMapSearch PathFinder; diff --git a/src/Game/Player.cpp b/src/Game/Player.cpp index 3586fa61..ca87601c 100755 --- a/src/Game/Player.cpp +++ b/src/Game/Player.cpp @@ -1,9 +1,7 @@ #include "Player.h" -#include #include "Game.h" +#include "GameHashes.h" #include "GameUtils.h" -#include "ItemProperties.h" -#include "ItemTypes.h" #include "Level.h" #include "Utils/Utils.h" @@ -11,29 +9,18 @@ Player::Player(const PlayerClass* class__, const Level& level) : class_(class__) { base.animation.animType = AnimationType::Looped; base.hoverCellSize = 2; - base.sprite.setOutline(class__->DefaultOutline(), class__->DefaultOutlineIgnore()); + base.sprite.setOutline(class__->Outline(), class__->OutlineIgnore()); + action = class__->getAction(str2int16("action")); calculateRange(); applyDefaults(level); } void Player::calculateRange() { - auto oldTexturePack = base.texturePack; base.texturePack = class_->getTexturePack(textureIdx); if (base.texturePack != nullptr && direction < PlayerDirection::Size) { - if (base.texturePack != oldTexturePack) - { - if (base.texturePack->isIndexed() == true) - { - base.sprite.setPalette(base.texturePack->getPalette()); - } - else - { - base.sprite.setPalette(nullptr); - } - } class_->getTextureAnimationRange(textureIdx, animation, base.animation); if (direction != PlayerDirection::All) { @@ -44,7 +31,6 @@ void Player::calculateRange() } else { - base.sprite.setPalette(nullptr); base.animation.clear(); } base.animation.reset(); @@ -94,76 +80,117 @@ void Player::updateWalkPathStep(sf::Vector2f& newDrawPos) void Player::updateWalkPath(Game& game, Level& level) { currentWalkTime += game.getElapsedTime(); - if (currentWalkTime < speed.walk) - { - return; - } - currentWalkTime = sf::microseconds( - currentWalkTime.asMicroseconds() % speed.walk.asMicroseconds()); - - auto newDrawPos = drawPosA; - if (drawPosA == drawPosB) + while (currentWalkTime >= speed.walk) { - if (walkPath.empty() == true && - hasWalkingAnimation() == true) - { - setStandAnimation(); - resetAnimationTime(); - playerAction = PlayerAction::Stand; - } - while (walkPath.empty() == false) + currentWalkTime -= speed.walk; + + auto newDrawPos = drawPosA; + if (drawPosA == drawPosB) { - const auto& nextMapPos = walkPath.back(); - if (walkPath.size() == 1) + if (walkPath.empty() == true && + hasWalkingAnimation() == true) + { + setStandAnimation(); + resetAnimationTime(); + playerStatus = PlayerStatus::Stand; + } + while (walkPath.empty() == false) { - const auto levelObj = level.Map()[nextMapPos].front(); - if (levelObj != nullptr) + const auto& nextMapPos = walkPath.back(); + if (walkPath.size() == 1) + { + const auto levelObj = level.Map()[nextMapPos].front(); + if (levelObj != nullptr) + { + levelObj->executeAction(game); + walkPath.pop_back(); + + setStandAnimation(); + resetAnimationTime(); + playerStatus = PlayerStatus::Stand; + return; + } + } + if (nextMapPos == base.mapPosition) { - levelObj->executeAction(game); walkPath.pop_back(); - - setStandAnimation(); - resetAnimationTime(); - playerAction = PlayerAction::Stand; - return; + continue; } + playSound(walkSound); + setWalkAnimation(); + setDirection(getPlayerDirection(base.mapPosition, nextMapPos)); + MapPosition(level, nextMapPos); + currPositionStep = 0.1f; + updateWalkPathStep(newDrawPos); + break; } - if (nextMapPos == base.mapPosition) - { - walkPath.pop_back(); - continue; - } - playSound(walkSound); - setWalkAnimation(); - setDirection(getPlayerDirection(base.mapPosition, nextMapPos)); - MapPosition(level, nextMapPos); - currPositionStep = 0.1f; + } + else + { updateWalkPathStep(newDrawPos); - break; } + base.updateDrawPosition(level, newDrawPos); } - else - { - updateWalkPathStep(newDrawPos); - } - base.updateDrawPosition(level, newDrawPos); } void Player::setWalkPath(const std::vector& walkPath_) { - if (walkPath_.empty() == true) + if (walkPath_.empty() == true || + playerStatus == PlayerStatus::Dead) { return; } walkPath = walkPath_; - playerAction = PlayerAction::Walk; + playerStatus = PlayerStatus::Walk; if (walkPath.empty() == false) { mapPositionMoveTo = walkPath.front(); } } +void Player::setRestStatus(uint16_t restStatus_) noexcept +{ + restStatus = std::min(restStatus_, (uint16_t)1); + switch (playerStatus) + { + case PlayerStatus::Stand: + setStandAnimation(); + break; + case PlayerStatus::Walk: + setWalkAnimation(); + break; + default: + break; + } +} + +void Player::setStatus(PlayerStatus status_) noexcept +{ + playerStatus = status_; + switch (playerStatus) + { + case PlayerStatus::Dead: + { + base.animation.currentTextureIdx = base.animation.textureIndexRange.second; + break; + } + default: + break; + } +} + +bool Player::getTexture(size_t textureNumber, TextureInfo& ti) const +{ + switch (textureNumber) + { + case 0: + return base.getTexture(ti); + default: + return false; + } +} + void Player::executeAction(Game& game) const { if (action != nullptr) @@ -181,13 +208,14 @@ void Player::MapPosition(Level& level, const MapCoord& pos) void Player::move(Level& level, const MapCoord& pos) { - if (base.mapPosition == pos) + if (base.mapPosition == pos || + playerStatus == PlayerStatus::Dead) { return; } clearWalkPath(); setStandAnimation(); - playerAction = PlayerAction::Stand; + playerStatus = PlayerStatus::Stand; resetAnimationTime(); drawPosA = drawPosB = level.Map().getCoord(pos); base.updateMapPositionBack(level, pos, this); @@ -196,9 +224,9 @@ void Player::move(Level& level, const MapCoord& pos) void Player::updateAI(Level& level) { - switch (playerAction) + switch (playerStatus) { - case PlayerAction::Walk: + case PlayerStatus::Walk: return; default: break; @@ -256,19 +284,26 @@ void Player::update(Game& game, Level& level) updateAI(level); } - switch (playerAction) + if (playerStatus != PlayerStatus::Dead && + LifeNow() <= 0) + { + playerStatus = PlayerStatus::Dead; + playSound(dieSound); + } + + switch (playerStatus) { default: - case PlayerAction::Stand: + case PlayerStatus::Stand: updateAnimation(game); break; - case PlayerAction::Walk: + case PlayerStatus::Walk: updateWalk(game, level); break; - case PlayerAction::Attack: + case PlayerStatus::Attack: updateAttack(game, level); break; - case PlayerAction::Dead: + case PlayerStatus::Dead: updateDead(game, level); break; } @@ -276,14 +311,20 @@ void Player::update(Game& game, Level& level) base.updateHover(game, level, this); } -bool Player::getProperty(const std::string& prop, Variable& var) const +const std::string& Player::Name() const +{ + updateNameAndDescriptions(); + return name; +} + +bool Player::getProperty(const std::string_view prop, Variable& var) const { if (prop.empty() == true) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - switch (str2int16(props.first.c_str())) + switch (str2int16(props.first)) { case str2int16("type"): var = Variable(std::string("player")); @@ -292,14 +333,26 @@ bool Player::getProperty(const std::string& prop, Variable& var) const var = Variable(id); break; case str2int16("name"): - var = Variable(name); + var = Variable(Name()); + break; + case str2int16("simpleName"): + var = Variable(SimpleName()); break; case str2int16("d"): case str2int16("description"): - var = Variable(GameUtils::replaceStringWithQueryable(class_->Description(), *this)); + { + updateNameAndDescriptions(); + size_t idx = Utils::strtou(props.second); + if (idx >= descriptions.size()) + { + idx = 0; + } + var = Variable(descriptions[idx]); break; + } case str2int16("class"): - var = Variable(class_->Name()); + case str2int16("classId"): + var = Variable(class_->Id()); break; case str2int16("totalKills"): var = Variable((int64_t)class_->TotalKills()); @@ -321,7 +374,7 @@ bool Player::getProperty(const std::string& prop, Variable& var) const } case str2int16("canUseItem"): { - std::string props2; + std::string_view props2; size_t invIdx; size_t itemIdx; if (parseInventoryAndItem(props.second, props2, invIdx, itemIdx) == true) @@ -346,7 +399,7 @@ bool Player::getProperty(const std::string& prop, Variable& var) const break; case str2int16("hasItem"): { - std::string props2; + std::string_view props2; size_t invIdx; size_t itemIdx; if (parseInventoryAndItem(props.second, props2, invIdx, itemIdx) == true) @@ -358,16 +411,28 @@ bool Player::getProperty(const std::string& prop, Variable& var) const } case str2int16("isItemSlotInUse"): { - std::string props2; + std::string_view props2; size_t invIdx; size_t itemIdx; if (parseInventoryAndItem(props.second, props2, invIdx, itemIdx) == true) { - var = Variable(inventories[invIdx].isItemSlotInUse(itemIdx)); + var = Variable(inventories[invIdx].isSlotInUse(itemIdx)); break; } return false; } + case str2int16("isStanding"): + var = Variable(playerStatus == PlayerStatus::Stand); + break; + case str2int16("isWalking"): + var = Variable(playerStatus == PlayerStatus::Walk); + break; + case str2int16("isAttacking"): + var = Variable(playerStatus == PlayerStatus::Attack); + break; + case str2int16("isDead"): + var = Variable(playerStatus == PlayerStatus::Dead); + break; case str2int16("selectedItem"): { if (selectedItem != nullptr) @@ -376,10 +441,9 @@ bool Player::getProperty(const std::string& prop, Variable& var) const } return false; } - break; case str2int16("item"): { - std::string props2; + std::string_view props2; size_t invIdx; size_t itemIdx; if (parseInventoryAndItem(props.second, props2, invIdx, itemIdx) == true) @@ -402,10 +466,42 @@ bool Player::getProperty(const std::string& prop, Variable& var) const } return false; } + case str2int16("itemQuantity"): + { + auto classIdHash16 = str2int16(props.second); + uint32_t itemQuantity = 0; + if (itemQuantityCache.getValue(classIdHash16, itemQuantity) == false) + { + if (inventories.getQuantity(classIdHash16, itemQuantity) == true) + { + itemQuantityCache.updateValue(classIdHash16, itemQuantity); + } + } + var = Variable((int64_t)itemQuantity); + break; + } + case str2int16("selectedSpell"): + { + if (selectedSpell != nullptr) + { + return selectedSpell->getProperty(props.second, var); + } + return false; + } + case str2int16("spell"): + { + auto props2 = Utils::splitStringIn2(props.second, '.'); + auto spell = getSpell(std::string(props2.first)); + if (spell != nullptr) + { + return spell->getProperty(props2.second, var); + } + return false; + } default: { Number32 value; - if (getNumberProp(prop.c_str(), value) == true) + if (getNumberProp(prop, value) == true) { var = Variable(value.getInt64()); break; @@ -416,13 +512,13 @@ bool Player::getProperty(const std::string& prop, Variable& var) const return true; } -void Player::setProperty(const std::string& prop, const Variable& val) +void Player::setProperty(const std::string_view prop, const Variable& val) { if (prop.empty() == true) { return; } - auto propHash16 = str2int16(prop.c_str()); + auto propHash16 = str2int16(prop); switch (propHash16) { case str2int16("name"): @@ -447,14 +543,14 @@ void Player::setProperty(const std::string& prop, const Variable& val) } } -const Queryable* Player::getQueryable(const std::string& prop) const +const Queryable* Player::getQueryable(const std::string_view prop) const { if (prop.empty() == true) { return this; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); const Queryable* queryable = nullptr; switch (propHash) { @@ -475,6 +571,14 @@ const Queryable* Player::getQueryable(const std::string& prop) const } } break; + case str2int16("selectedSpell"): + { + queryable = selectedSpell; + break; + } + break; + case str2int16("spell"): + return getSpell(std::string(props.second)); default: break; } @@ -488,25 +592,15 @@ const Queryable* Player::getQueryable(const std::string& prop) const bool Player::hasIntByHash(uint16_t propHash) const noexcept { - if (customPropsSize > 0) - { - for (size_t i = 0; i < customPropsSize; i++) - { - if (customProperties[i].first == propHash) - { - return true; - } - } - } - return false; + return customProperties.hasValue(propHash); } -bool Player::hasInt(const char* prop) const noexcept +bool Player::hasInt(const std::string_view prop) const noexcept { return hasIntByHash(str2int16(prop)); } -bool Player::getNumberProp(const char* prop, Number32& value) const noexcept +bool Player::getNumberProp(const std::string_view prop, Number32& value) const noexcept { return getNumberByHash(str2int16(prop), value); } @@ -530,19 +624,10 @@ bool Player::getNumberByHash(uint16_t propHash, Number32& value) const noexcept bool Player::getCustomIntByHash(uint16_t propHash, Number32& value) const noexcept { - for (size_t i = 0; i < customPropsSize; i++) - { - const auto& customProp = customProperties[i]; - if (customProp.first == propHash) - { - value = customProp.second; - return true; - } - } - return false; + return customProperties.getValue(propHash, value); } -bool Player::getCustomInt(const char* prop, Number32& value) const noexcept +bool Player::getCustomInt(const std::string_view prop, Number32& value) const noexcept { return getCustomIntByHash(str2int16(prop), value); } @@ -686,7 +771,7 @@ bool Player::getIntByHash(uint16_t propHash, LevelObjValue& value) const noexcep return true; } -bool Player::getInt(const char* prop, LevelObjValue& value) const noexcept +bool Player::getInt(const std::string_view prop, LevelObjValue& value) const noexcept { return getIntByHash(str2int16(prop), value); } @@ -707,16 +792,13 @@ bool Player::getUIntByHash(uint16_t propHash, uint32_t& value) const noexcept case str2int16("points"): value = points; break; - case str2int16("gold"): - value = gold; - break; default: return false; } return true; } -bool Player::getUInt(const char* prop, uint32_t& value) const noexcept +bool Player::getUInt(const std::string_view prop, uint32_t& value) const noexcept { return getUIntByHash(str2int16(prop), value); } @@ -746,10 +828,11 @@ bool Player::setIntByHash(uint16_t propHash, LevelObjValue value, const Level* l default: return false; } + updateNameAndDescr = true; return true; } -bool Player::setInt(const char* prop, LevelObjValue value, const Level* level) noexcept +bool Player::setInt(const std::string_view prop, LevelObjValue value, const Level* level) noexcept { return setIntByHash(str2int16(prop), value, level); } @@ -763,7 +846,7 @@ bool Player::setUIntByHash(uint16_t propHash, uint32_t value, const Level* level experience = value; if (level != nullptr) { - updateExperience(*level); + updateLevelFromExperience(*level, true); } break; } @@ -773,10 +856,11 @@ bool Player::setUIntByHash(uint16_t propHash, uint32_t value, const Level* level default: return false; } + updateNameAndDescr = true; return true; } -bool Player::setUInt(const char* prop, uint32_t value, const Level* level) noexcept +bool Player::setUInt(const std::string_view prop, uint32_t value, const Level* level) noexcept { return setUIntByHash(str2int16(prop), value, level); } @@ -790,12 +874,12 @@ bool Player::setNumberByHash(uint16_t propHash, LevelObjValue value, const Level return true; } -bool Player::setNumber(const char* prop, LevelObjValue value, const Level* level) noexcept +bool Player::setNumber(const std::string_view prop, LevelObjValue value, const Level* level) noexcept { return setNumberByHash(str2int16(prop), value, level); } -bool Player::setNumber(const char* prop, const Number32& value, const Level* level) noexcept +bool Player::setNumber(const std::string_view prop, const Number32& value, const Level* level) noexcept { return setNumberByHash(str2int16(prop), value, level); } @@ -849,29 +933,31 @@ bool Player::setNumberByHash(uint16_t propHash, const Number32& value, const Lev return false; default: { - size_t i = 0; - for (; i < customPropsSize; i++) + updateNameAndDescr = true; + return customProperties.setValue(propHash, value); + } + } +} + +void Player::updateNameAndDescriptions() const +{ + if (updateNameAndDescr == true) + { + updateNameAndDescr = false; + if (class_->getFullName(*this, name) == false && + name.empty() == true) { - auto& elem = customProperties[i]; - if (elem.first == propHash) - { - elem.second = value; - return true; - } + name = SimpleName(); } - if (i < customProperties.size()) + for (size_t i = 0; i < descriptions.size(); i++) { - customProperties[i] = std::make_pair(propHash, value); - customPropsSize++; - return true; + class_->getDescription(i, *this, descriptions[i]); } - return false; - } } } -bool Player::parseInventoryAndItem(const std::string& str, - std::string& props, size_t& invIdx, size_t& itemIdx) const +bool Player::parseInventoryAndItem(const std::string_view str, + std::string_view& props, size_t& invIdx, size_t& itemIdx) const { auto strPair = Utils::splitStringIn2(str, '.'); invIdx = GameUtils::getPlayerInventoryIndex(strPair.first); @@ -882,8 +968,8 @@ bool Player::parseInventoryAndItem(const std::string& str, itemIdx = 0; if (strPair3.second.empty() == false) { - size_t x = std::strtoul(strPair3.first.c_str(), NULL, 10); - size_t y = std::strtoul(strPair3.second.c_str(), NULL, 10); + size_t x = Utils::strtou(strPair3.first); + size_t y = Utils::strtou(strPair3.second); itemIdx = inventories[invIdx].getIndex(x, y); } else @@ -894,7 +980,7 @@ bool Player::parseInventoryAndItem(const std::string& str, } else { - itemIdx = std::strtoul(strPair2.first.c_str(), NULL, 10); + itemIdx = Utils::strtou(strPair2.first); } } if (itemIdx < inventories[invIdx].Size()) @@ -906,226 +992,49 @@ bool Player::parseInventoryAndItem(const std::string& str, return false; } -bool Player::addGold(const Level& level, LevelObjValue amount) +LevelObjValue Player::addItemQuantity(const ItemClass& itemClass, + const LevelObjValue amount, InventoryPosition invPos) { - if (amount == 0) - { - return false; - } - bool remove = amount < 0; - amount = std::abs(amount); - size_t invIdx = 0; - size_t itemIdx = 0; - Item* item; - while (findItem(ItemTypes::Gold, invIdx, itemIdx, item) == true) - { - auto itemGold = item->getIntByHash(ItemProp::Gold); - auto itemMaxGold = item->getIntByHash(ItemProp::GoldMax); - - if (remove == true) - { - if (amount < itemGold) - { - item->setIntByHash(ItemProp::Gold, itemGold - amount); - gold -= amount; - return true; - } - else - { - amount -= itemGold; - gold -= itemGold; - std::unique_ptr nullItem; - inventories[invIdx].set(itemIdx, nullItem); - } - } - else - { - LevelObjValue freeGoldSlots = itemMaxGold - itemGold; - if (freeGoldSlots > 0) - { - if (amount <= freeGoldSlots) - { - item->setIntByHash(ItemProp::Gold, itemGold + amount); - gold += amount; - return true; - } - else - { - item->setIntByHash(ItemProp::Gold, itemMaxGold); - amount -= freeGoldSlots; - gold += freeGoldSlots; - } - } - } - itemIdx++; - if (itemIdx >= inventories[invIdx].Size()) - { - invIdx++; - } - } - if (remove == false) + auto remaining = inventories.addQuantity(itemClass, amount, invPos); + if (amount != 0) { - auto goldClass = level.getItemClass("gold"); - if (goldClass == nullptr) - { - return false; - } - while (true) - { - if (amount <= 0) - { - return true; - } - auto newItem = std::make_unique(goldClass); - auto itemMaxGold = newItem->getIntByHash(ItemProp::GoldMax); - if (itemMaxGold <= 0) - { - return false; - } - LevelObjValue goldVal = itemMaxGold; - if (amount <= itemMaxGold) - { - goldVal = amount; - } - newItem->setIntByHash(ItemProp::Gold, goldVal); - - size_t invIdx2 = 0; - size_t itemIdx2 = 0; - if (getFreeItemSlot(*newItem, invIdx2, itemIdx2) == true) - { - inventories[invIdx2].set(itemIdx2, newItem); - amount -= goldVal; - gold += goldVal; - } - else - { - break; - } - } + updateItemQuantityCache(itemClass.IdHash16(), amount - remaining); } - return false; + return remaining; } -void Player::updateGoldAdd(const Item* item) +void Player::updateItemQuantityCache(uint16_t classIdHash16, LevelObjValue amount) noexcept { - if (item != nullptr && - item->Class()->TypeHash16() == ItemTypes::Gold) + auto quantity = itemQuantityCache.getValue(classIdHash16); + if (quantity != nullptr) { - gold += item->getIntByHash(ItemProp::Gold); + (*quantity) += amount; } } -void Player::updateGoldRemove(const Item* item) +void Player::updateItemQuantityCache(uint16_t classIdHash16) noexcept { - if (item != nullptr && - item->Class()->TypeHash16() == ItemTypes::Gold) + auto quantity = itemQuantityCache.getValue(classIdHash16); + if (quantity != nullptr) { - auto val = item->getIntByHash(ItemProp::Gold); - if (val > 0) - { - gold -= val; - } - else - { - gold += val; - } + (*quantity) = inventories.getQuantity(classIdHash16); } } -uint32_t Player::getMaxGoldCapacity(const Level& level) const +uint32_t Player::getMaxItemCapacity(const ItemClass& itemClass) const { - uint64_t maxGold = 0; - size_t invIdx = 0; - size_t itemIdx = 0; - Item* item; - while (findItem(ItemTypes::Gold, invIdx, itemIdx, item) == true) - { - auto itemGold = item->getIntByHash(ItemProp::Gold); - auto itemMaxGold = item->getIntByHash(ItemProp::GoldMax); - - if (itemGold < itemMaxGold) - { - maxGold += itemMaxGold - itemGold; - if (maxGold >= std::numeric_limits::max()) - { - return std::numeric_limits::max(); - } - } - - itemIdx++; - if (itemIdx >= inventories[invIdx].Size()) - { - invIdx++; - } - } - auto goldClass = level.getItemClass("gold"); - if (goldClass != nullptr) - { - auto freeSlots = countFreeSlots(*goldClass); - if (freeSlots > 0) - { - auto defaultMaxGold = goldClass->getDefaultByHash(ItemProp::GoldMax); - maxGold += defaultMaxGold * freeSlots; - if (maxGold >= std::numeric_limits::max()) - { - return std::numeric_limits::max(); - } - } - } - return (uint32_t)maxGold; + return inventories.getMaxCapacity(itemClass); } bool Player::getFreeItemSlot(const Item& item, size_t& invIdx, size_t& itemIdx, InventoryPosition invPos) const { - for (size_t i = 0; i < inventories.size(); i++) - { - if (inventories[i].getFreeItemSlot(item, itemIdx, invPos) == true) - { - invIdx = i; - return true; - } - } - return false; + return inventories.getFreeSlot(item, invIdx, itemIdx, invPos); } bool Player::hasFreeItemSlot(const Item& item) const { - size_t invIdx; - size_t itemIdx; - return getFreeItemSlot(item, invIdx, itemIdx); -} - -bool Player::findItem(uint16_t itemTypeHash16, size_t& invIdx, - size_t& itemIdx, Item*& item) const -{ - auto size = inventories.size(); - if (invIdx < size) - { - for (size_t i = invIdx; i < size; i++) - { - size_t itemIdx2 = itemIdx; - if (inventories[i].find(itemTypeHash16, itemIdx2, item) == true) - { - invIdx = i; - itemIdx = itemIdx2; - return true; - } - } - } - invIdx = size; - itemIdx = 0; - return false; -} - -unsigned Player::countFreeSlots(const ItemClass& itemClass) const -{ - unsigned count = 0; - for (const auto& inv : inventories) - { - count += inv.countFreeSlots(itemClass); - } - return count; + return inventories.hasFreeSlot(item); } std::unique_ptr Player::SelectedItem(std::unique_ptr item) noexcept @@ -1139,6 +1048,11 @@ std::unique_ptr Player::SelectedItem(std::unique_ptr item) noexcept return old; } +void Player::SelectedSpell(const std::string& id) noexcept +{ + selectedSpell = getSpell(id); +} + bool Player::setItem(size_t invIdx, size_t itemIdx, std::unique_ptr& item) { std::unique_ptr oldItem; @@ -1157,8 +1071,14 @@ bool Player::setItem(size_t invIdx, size_t itemIdx, std::unique_ptr& item, auto ret = inventory.set(itemIdx, item, oldItem); if (ret == true) { - updateGoldRemove(oldItem.get()); - updateGoldAdd(itemPtr); + if (itemPtr != nullptr) + { + updateItemQuantityCache(itemPtr->Class()->IdHash16()); + } + else if (oldItem != nullptr) + { + updateItemQuantityCache(oldItem->Class()->IdHash16()); + } if (bodyInventoryIdx == invIdx) { updateProperties(); @@ -1167,14 +1087,56 @@ bool Player::setItem(size_t invIdx, size_t itemIdx, std::unique_ptr& item, return ret; } -bool Player::setItemInFreeSlot(size_t invIdx, - std::unique_ptr& item, InventoryPosition invPos) +bool Player::setItemInFreeSlot(size_t invIdx, std::unique_ptr& item, + InventoryPosition invPos, bool splitIntoMultiple) { if (invIdx < inventories.size()) { auto& inventory = inventories[invIdx]; + + // if item has the quantity/capacity peoperties + if (item != nullptr && + item->hasIntByHash(ItemProp::Capacity) == true) + { + // first, try and fit the item into the smallest existing item of the same class + auto quantityNeeded = item->getIntByHash(ItemProp::Quantity); + Item* quantItem; + if (inventory.findBiggestFreeQuantity( + item->Class()->IdHash16(), quantItem, quantityNeeded) > 0) + { + LevelObjValue transferedQuantity; + if (Inventory::updateQuantities( + quantItem, item.get(), transferedQuantity, true) == true) + { + updateItemQuantityCache(item->Class()->IdHash16(), transferedQuantity); + return true; + } + } + + // if SplitIntoMultiple is true, try and add to all free items + // and create new items, if possible (should not create more then 1 item) + if (splitIntoMultiple == true) + { + // add full quantity + LevelObjValue itemSlots; + auto freeSlots = inventory.getMaxCapacity(*item->Class()); + if (item->getIntByHash(ItemProp::Quantity, itemSlots) == true && + itemSlots >= 0 && + (unsigned)itemSlots <= freeSlots) + { + inventory.addQuantity(*item->Class(), itemSlots, invPos); + updateItemQuantityCache(item->Class()->IdHash16(), itemSlots); + return true; + } + // if you can't add all of it, add none and return. + return false; + } + // if it doesn't fit into the smallest, try and add it in a free slot + } + + // try and add item to free slot size_t itemIdx = 0; - if (inventory.getFreeItemSlot(*item, itemIdx, invPos) == true) + if (inventory.getFreeSlot(*item, itemIdx, invPos) == true) { return setItem(invIdx, itemIdx, item); } @@ -1305,10 +1267,10 @@ void Player::updateProperties() { updateBodyItemValues(); - life = class_->getActualLife(*this, 0); - mana = class_->getActualMana(*this, 0); + life = class_->getActualLife(*this, life); + mana = class_->getActualMana(*this, mana); armor += class_->getActualArmor(*this, 0); - toHit = class_->getActualToHit(*this, 0); + toHit = class_->getActualToHit(*this, toHit); resistMagic = class_->getActualResistMagic(*this, resistMagicItems); resistMagic = std::clamp(resistMagic, 0, class_->MaxResistMagic()); @@ -1328,11 +1290,11 @@ void Player::applyDefaults(const Level& level) noexcept { setNumberByHash(prop.first, prop.second, &level); } - attackSound = class_->getDefaultAttackSound(); - defendSound = class_->getDefaultDefendSound(); - dieSound = class_->getDefaultDieSound(); - hitSound = class_->getDefaultHitSound(); - walkSound = class_->getDefaultWalkSound(); + attackSound = class_->getAttackSound(); + defendSound = class_->getDefendSound(); + dieSound = class_->getDieSound(); + hitSound = class_->getHitSound(); + walkSound = class_->getWalkSound(); } bool Player::canUseItem(const Item& item) const @@ -1343,7 +1305,7 @@ bool Player::canUseItem(const Item& item) const item.getIntByHash(ItemProp::RequiredVitality) <= VitalityNow()); } -bool Player::hasEquipedItemType(const std::string& type) const +bool Player::hasEquipedItemType(const std::string_view type) const { if (bodyInventoryIdx < inventories.size()) { @@ -1358,7 +1320,7 @@ bool Player::hasEquipedItemType(const std::string& type) const return false; } -bool Player::hasEquipedItemSubType(const std::string& type) const +bool Player::hasEquipedItemSubType(const std::string_view type) const { if (bodyInventoryIdx >= inventories.size()) { @@ -1388,12 +1350,13 @@ void Player::playSound(int16_t soundIdx) currentSound.play(); } -void Player::updateExperience(const Level& level) +void Player::updateLevelFromExperience(const Level& level, bool updatePoints) { auto oldLevel = currentLevel; currentLevel = level.getLevelFromExperience(experience); expNextLevel = level.getExperienceFromLevel(currentLevel); - if (currentLevel > oldLevel && + if (updatePoints == true && + currentLevel > oldLevel && oldLevel != 0) { lifeDamage = 0; @@ -1401,7 +1364,7 @@ void Player::updateExperience(const Level& level) Number32 levelUp; if (getNumberByHash(ItemProp::LevelUp, levelUp) == true) { - points += levelUp.getUInt32(); + points += levelUp.getUInt32() * (currentLevel - oldLevel); base.queueAction(*class_, str2int16("levelChange")); } } diff --git a/src/Game/Player.h b/src/Game/Player.h index 2e5eef45..4f6a8883 100755 --- a/src/Game/Player.h +++ b/src/Game/Player.h @@ -2,10 +2,14 @@ #include "Actions/Action.h" #include "BaseLevelObject.h" -#include "ItemCollection.h" +#include "Inventories.h" #include "PlayerClass.h" #include "Save/SavePlayer.h" +#include "Spell.h" #include +#include +#include "Utils/FixedMap.h" +#include "Utils/LRUCache.h" class Player : public LevelObject { @@ -20,7 +24,7 @@ class Player : public LevelObject std::vector walkPath; - PlayerAction playerAction{ PlayerAction::Stand }; + PlayerStatus playerStatus{ PlayerStatus::Stand }; PlayerDirection direction{ PlayerDirection::All }; PlayerAnimation animation{ PlayerAnimation::Size }; @@ -39,18 +43,23 @@ class Player : public LevelObject bool useAI{ false }; std::unique_ptr selectedItem; + Spell* selectedSpell{ nullptr }; - std::array inventories; + Inventories<(size_t)PlayerInventory::Size> inventories; size_t bodyInventoryIdx{ (size_t)PlayerInventory::Size }; + std::unordered_map> spells; + std::string id; - std::string name; + mutable std::string name; + mutable std::array descriptions; + + mutable bool updateNameAndDescr{ true }; uint32_t currentLevel{ 0 }; uint32_t experience{ 0 }; uint32_t expNextLevel{ 0 }; uint32_t points{ 0 }; - uint32_t gold{ 0 }; LevelObjValue strength{ 0 }; LevelObjValue strengthItems{ 0 }; @@ -61,7 +70,7 @@ class Player : public LevelObject LevelObjValue vitality{ 0 }; LevelObjValue vitalityItems{ 0 }; - LevelObjValue life{ 0 }; + LevelObjValue life{ 1 }; LevelObjValue lifeItems{ 0 }; LevelObjValue lifeDamage{ 0 }; LevelObjValue mana{ 0 }; @@ -86,8 +95,9 @@ class Player : public LevelObject LevelObjValue resistLightning{ 0 }; LevelObjValue resistLightningItems{ 0 }; - std::array, 8> customProperties; - size_t customPropsSize{ 0 }; + FixedMap customProperties; + + mutable LRUCache itemQuantityCache; sf::Sound currentSound; @@ -101,16 +111,15 @@ class Player : public LevelObject void updateAI(Level& level); + void updateNameAndDescriptions() const; + void updateSpeed(); void updateWalkPathStep(sf::Vector2f& newDrawPos); void updateWalkPath(Game& game, Level& level); - bool parseInventoryAndItem(const std::string& str, - std::string& props, size_t& invIdx, size_t& itemIdx) const; - - void updateGoldAdd(const Item* item); - void updateGoldRemove(const Item* item); + bool parseInventoryAndItem(const std::string_view str, + std::string_view& props, size_t& invIdx, size_t& itemIdx) const; void updateBodyItemValues(); @@ -120,19 +129,13 @@ class Player : public LevelObject void updateAttack(Game& game, Level& level); void updateDead(Game& game, Level& level); - void updateExperience(const Level& level); - bool getCustomIntByHash(uint16_t propHash, Number32& value) const noexcept; - bool getCustomInt(const char* prop, Number32& value) const noexcept; - bool getCustomInt(const std::string& prop, Number32& value) const noexcept - { - return getCustomInt(prop.c_str(), value); - } + bool getCustomInt(const std::string_view prop, Number32& value) const noexcept; void playSound(int16_t soundIdx); - friend void Save::serialize(void* serializeObj, const Level& level, - const Player& player, bool skipDefaults); + friend void Save::serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const Player& player); public: Player(const PlayerClass* class__, const Level& level); @@ -150,10 +153,11 @@ class Player : public LevelObject const MapCoord& MapPositionMoveTo() const noexcept { return mapPositionMoveTo; } + virtual bool getTexture(size_t textureNumber, TextureInfo& ti) const; + virtual void executeAction(Game& game) const; - virtual bool getNumberProp(const char* prop, Number32& value) const noexcept; + virtual bool getNumberProp(const std::string_view prop, Number32& value) const noexcept; virtual bool Passable() const noexcept { return false; } - virtual void setAction(const std::shared_ptr& action_) noexcept { action = action_; } virtual void setColor(const sf::Color& color) { base.sprite.setColor(color); } virtual void setOutline(const sf::Color& outline, const sf::Color& ignore) noexcept { @@ -166,9 +170,10 @@ class Player : public LevelObject virtual bool Hoverable() const noexcept { return base.enableHover; } virtual void Hoverable(bool hoverable) noexcept { base.enableHover = hoverable; } - virtual void serialize(void* serializeObj, const Level& level, bool skipDefaults) const + virtual void serialize(void* serializeObj, Save::Properties& props, + const Game& game, const Level& level) const { - Save::serialize(serializeObj, level, *this, skipDefaults); + Save::serialize(serializeObj, props, game, level, *this); } virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const @@ -177,54 +182,29 @@ class Player : public LevelObject } virtual void update(Game& game, Level& level); - virtual bool getProperty(const std::string& prop, Variable& var) const; - virtual void setProperty(const std::string& prop, const Variable& val); - virtual const Queryable* getQueryable(const std::string& prop) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; + virtual void setProperty(const std::string_view prop, const Variable& val); + virtual const Queryable* getQueryable(const std::string_view prop) const; + + virtual std::string_view getId() const { return id; } + virtual std::string_view getClassId() const { return class_->Id(); } bool hasIntByHash(uint16_t propHash) const noexcept; - bool hasInt(const char* prop) const noexcept; - bool hasInt(const std::string& prop) const noexcept - { - return hasInt(prop.c_str()); - } + bool hasInt(const std::string_view prop) const noexcept; bool getIntByHash(uint16_t propHash, LevelObjValue& value) const noexcept; - bool getInt(const char* prop, LevelObjValue& value) const noexcept; - bool getInt(const std::string& prop, LevelObjValue& value) const noexcept - { - return getInt(prop.c_str(), value); - } + bool getInt(const std::string_view prop, LevelObjValue& value) const noexcept; bool getUIntByHash(uint16_t propHash, uint32_t& value) const noexcept; - bool getUInt(const char* prop, uint32_t& value) const noexcept; - bool getUInt(const std::string& prop, uint32_t& value) const noexcept - { - return getUInt(prop.c_str(), value); - } + bool getUInt(const std::string_view prop, uint32_t& value) const noexcept; bool setIntByHash(uint16_t propHash, LevelObjValue value, const Level* level) noexcept; - bool setInt(const char* prop, LevelObjValue value, const Level* level) noexcept; - bool setInt(const std::string& prop, LevelObjValue value, const Level* level) noexcept - { - return setInt(prop.c_str(), value, level); - } + bool setInt(const std::string_view prop, LevelObjValue value, const Level* level) noexcept; bool setUIntByHash(uint16_t propHash, uint32_t value, const Level* level) noexcept; - bool setUInt(const char* prop, uint32_t value, const Level* level) noexcept; - bool setUInt(const std::string& prop, uint32_t value, const Level* level) noexcept - { - return setUInt(prop.c_str(), value, level); - } + bool setUInt(const std::string_view prop, uint32_t value, const Level* level) noexcept; bool getNumberByHash(uint16_t propHash, Number32& value) const noexcept; bool setNumberByHash(uint16_t propHash, LevelObjValue value, const Level* level) noexcept; bool setNumberByHash(uint16_t propHash, const Number32& value, const Level* level) noexcept; - bool setNumber(const char* prop, LevelObjValue value, const Level* level) noexcept; - bool setNumber(const char* prop, const Number32& value, const Level* level) noexcept; - bool setNumber(const std::string& prop, LevelObjValue value, const Level* level) noexcept - { - return setNumber(prop.c_str(), value, level); - } - bool setNumber(const std::string& prop, const Number32& value, const Level* level) noexcept - { - return setNumber(prop.c_str(), value, level); - } + bool setNumber(const std::string_view prop, LevelObjValue value, const Level* level) noexcept; + bool setNumber(const std::string_view prop, const Number32& value, const Level* level) noexcept; void updateDrawPosition(const Level& level) { base.updateDrawPosition(level, drawPosA); } @@ -241,6 +221,8 @@ class Player : public LevelObject updateSpeed(); } + PlayerDirection getDirection() const noexcept { return direction; } + void setDirection(PlayerDirection direction_) { if (direction != direction_) @@ -269,10 +251,9 @@ class Player : public LevelObject } } - void setRestStatus(uint16_t restStatus_) noexcept - { - restStatus = std::min(restStatus_, (uint16_t)1); - } + void setRestStatus(uint16_t restStatus_) noexcept; + + void setStatus(PlayerStatus status_) noexcept; void setStandAnimation() { @@ -292,11 +273,14 @@ class Player : public LevelObject Item* SelectedItem() const noexcept { return selectedItem.get(); } std::unique_ptr SelectedItem(std::unique_ptr item) noexcept; - ItemCollection& getInventory(PlayerInventory inv) noexcept { return inventories[(size_t)inv]; } - const ItemCollection& getInventory(PlayerInventory inv) const noexcept { return inventories[(size_t)inv]; } + Spell* SelectedSpell() const noexcept { return selectedSpell; } + void SelectedSpell(const std::string& id) noexcept; - ItemCollection& getInventory(size_t idx) noexcept { return inventories[idx]; } - const ItemCollection& getInventory(size_t idx) const noexcept { return inventories[idx]; } + Inventory& getInventory(PlayerInventory inv) noexcept { return inventories[(size_t)inv]; } + const Inventory& getInventory(PlayerInventory inv) const noexcept { return inventories[(size_t)inv]; } + + Inventory& getInventory(size_t idx) noexcept { return inventories[idx]; } + const Inventory& getInventory(size_t idx) const noexcept { return inventories[idx]; } size_t getInventorySize() const noexcept { return inventories.size(); } @@ -305,18 +289,33 @@ class Player : public LevelObject bodyInventoryIdx = std::min(idx, (size_t)PlayerInventory::Size); } - bool hasEquipedItemType(const std::string& type) const; - bool hasEquipedItemSubType(const std::string& type) const; + bool hasSpell(const std::string& key) const + { + return spells.find(key) != spells.end(); + } - bool getFreeItemSlot(const Item& item, size_t& invIdx, size_t& itemIdx, - InventoryPosition invPos = InventoryPosition::TopLeft) const; + void addSpell(const std::string key, std::unique_ptr obj) + { + spells.insert(std::make_pair(key, std::move(obj))); + } - bool hasFreeItemSlot(const Item& item) const; + Spell* getSpell(const std::string& key) const + { + auto it = spells.find(key); + if (it != spells.end()) + { + return it->second.get(); + } + return nullptr; + } - bool findItem(uint16_t itemTypeHash16, size_t& invIdx, - size_t& itemIdx, Item*& item) const; + bool hasEquipedItemType(const std::string_view type) const; + bool hasEquipedItemSubType(const std::string_view type) const; - unsigned countFreeSlots(const ItemClass& itemClass) const; + bool getFreeItemSlot(const Item& item, size_t& invIdx, + size_t& itemIdx, InventoryPosition invPos) const; + + bool hasFreeItemSlot(const Item& item) const; bool setItem(PlayerInventory inv, size_t itemIdx, std::unique_ptr& item) { @@ -332,12 +331,20 @@ class Player : public LevelObject std::unique_ptr& oldItem); bool setItemInFreeSlot(PlayerInventory inv, std::unique_ptr& item, - InventoryPosition invPos = InventoryPosition::TopLeft) + InventoryPosition invPos, bool splitIntoMultipleQuantities) { - return setItemInFreeSlot((size_t)inv, item, invPos); + return setItemInFreeSlot((size_t)inv, item, invPos, splitIntoMultipleQuantities); } + + // sets an item in a free slot. If the item has quantity/capacity + // it tries to fit into the smallest quantity item of the same class first + // if splitIntoMultiple is true, it tries to fit into all items of the same class. bool setItemInFreeSlot(size_t invIdx, std::unique_ptr& item, - InventoryPosition invPos = InventoryPosition::TopLeft); + InventoryPosition invPos, bool splitIntoMultiple); + + // updates the player's current level, experience required for the + // next level and points added for having advanced n levels. + void updateLevelFromExperience(const Level& level, bool updatePoints); void updateProperties(); @@ -345,9 +352,14 @@ class Player : public LevelObject bool canUseItem(const Item& item) const; - bool addGold(const Level& level, LevelObjValue amount); + // returns the remaining quantity to add/remove. 0 if all quantity was added. + LevelObjValue addItemQuantity(const ItemClass& itemClass, + const LevelObjValue amount, InventoryPosition invPos); + + void updateItemQuantityCache(uint16_t classIdHash16, LevelObjValue amount) noexcept; + void updateItemQuantityCache(uint16_t classIdHash16) noexcept; - uint32_t getMaxGoldCapacity(const Level& level) const; + uint32_t getMaxItemCapacity(const ItemClass& itemClass) const; const PlayerClass* getPlayerClass() const noexcept { return class_; } @@ -363,8 +375,9 @@ class Player : public LevelObject void setWalkSounds(int16_t soundIdx) noexcept { walkSound = soundIdx; } const std::string& Id() const noexcept { return id; } - const std::string& Name() const noexcept { return name; } - const std::string& Class() const noexcept { return class_->Name(); } + const std::string& Name() const; + const std::string& SimpleName() const noexcept { return class_->Name(); } + const std::string& Class() const noexcept { return class_->Id(); } LevelObjValue StrengthNow() const noexcept { return strength + strengthItems; } LevelObjValue MagicNow() const noexcept { return magic + magicItems; } @@ -374,8 +387,8 @@ class Player : public LevelObject LevelObjValue LifeNow() const noexcept { return life + lifeItems - lifeDamage; } LevelObjValue ManaNow() const noexcept { return mana + manaItems - manaDamage; } - void Id(const std::string& id_) { id = id_; } - void Name(const std::string& name_) { name = name_; } + void Id(const std::string_view id_) { id = id_; } + void Name(const std::string_view name_) { name = name_; } void CurrentLevel(uint32_t level_) noexcept { currentLevel = level_; } void Experience(uint32_t experience_) noexcept { experience = experience_; } diff --git a/src/Game/PlayerClass.cpp b/src/Game/PlayerClass.cpp index ab2ccfc9..fbdfa76a 100755 --- a/src/Game/PlayerClass.cpp +++ b/src/Game/PlayerClass.cpp @@ -53,28 +53,6 @@ void PlayerClass::getTextureAnimationRange(size_t idx, baseAnim.backDirection = false; } -void PlayerClass::setDefault(const char* prop, const Number32& val) -{ - setDefaultByHash(str2int16(prop), val); -} - -void PlayerClass::setDefaultByHash(uint16_t propHash, const Number32& val) -{ - if (propHash == str2int16("")) - { - return; - } - for (auto& elem : defaults) - { - if (elem.first == propHash) - { - elem.second = val; - return; - } - } - defaults.push_back(std::make_pair(propHash, val)); -} - AnimationSpeed PlayerClass::getSpeed(PlayerAnimation animation) const noexcept { for (auto& elem : animationSpeeds) diff --git a/src/Game/PlayerClass.h b/src/Game/PlayerClass.h index 8c86b7bf..4517f0a2 100755 --- a/src/Game/PlayerClass.h +++ b/src/Game/PlayerClass.h @@ -2,7 +2,8 @@ #include "AnimationType.h" #include "BaseAnimation.h" -#include "BaseClass.h" +#include "BaseClassDefaults.h" +#include "Classifiers.h" #include "Formula.h" #include "GameProperties.h" #include @@ -15,7 +16,7 @@ struct PlayerAI int16_t sightRadius{ 0 }; }; -class PlayerClass : public BaseClass +class PlayerClass : public BaseClassDefaults { public: struct Range @@ -34,9 +35,8 @@ class PlayerClass : public BaseClass std::string id; std::string name; std::string type; - std::string description; - std::vector> defaults; + Classifiers<3> classifiers; LevelObjValue maxStrength{ 0 }; LevelObjValue maxMagic{ 0 }; @@ -55,14 +55,14 @@ class PlayerClass : public BaseClass std::array sounds{ {nullptr} }; - int16_t defaultAttackSound{ -1 }; - int16_t defaultDefendSound{ -1 }; - int16_t defaultDieSound{ -1 }; - int16_t defaultHitSound{ -1 }; - int16_t defaultWalkSound{ -1 }; + int16_t attackSound{ -1 }; + int16_t defendSound{ -1 }; + int16_t dieSound{ -1 }; + int16_t hitSound{ -1 }; + int16_t walkSound{ -1 }; - sf::Color defaultOutline{ sf::Color::Transparent }; - sf::Color defaultOutlineIgnore{ sf::Color::Transparent }; + sf::Color outline{ sf::Color::Transparent }; + sf::Color outlineIgnore{ sf::Color::Transparent }; LevelObjValue evalFormula(size_t idx, const LevelObject& query, LevelObjValue default_) const; @@ -102,10 +102,6 @@ class PlayerClass : public BaseClass } } - const std::vector>& Defaults() const noexcept { return defaults; } - void setDefault(const char* prop, const Number32& val); - void setDefaultByHash(uint16_t propHash, const Number32& val); - AnimationSpeed getSpeed(PlayerAnimation animation) const noexcept; void setSpeed(PlayerAnimation animation, const AnimationSpeed& speed); @@ -116,27 +112,40 @@ class PlayerClass : public BaseClass void setSound(size_t idx, const sf::SoundBuffer& snd) noexcept; - int16_t getDefaultAttackSound() const noexcept { return defaultAttackSound; } - int16_t getDefaultDefendSound() const noexcept { return defaultDefendSound; } - int16_t getDefaultDieSound() const noexcept { return defaultDieSound; } - int16_t getDefaultHitSound() const noexcept { return defaultHitSound; } - int16_t getDefaultWalkSound() const noexcept { return defaultWalkSound; } + int16_t getAttackSound() const noexcept { return attackSound; } + int16_t getDefendSound() const noexcept { return defendSound; } + int16_t getDieSound() const noexcept { return dieSound; } + int16_t getHitSound() const noexcept { return hitSound; } + int16_t getWalkSound() const noexcept { return walkSound; } - void setDefaultAttackSound(int16_t soundIdx) noexcept { defaultAttackSound = soundIdx; } - void setDefaultDefendSound(int16_t soundIdx) noexcept { defaultDefendSound = soundIdx; } - void setDefaultDieSound(int16_t soundIdx) noexcept { defaultDieSound = soundIdx; } - void setDefaultHitSound(int16_t soundIdx) noexcept { defaultHitSound = soundIdx; } - void setDefaultWalkSound(int16_t soundIdx) noexcept { defaultWalkSound = soundIdx; } + void setAttackSound(int16_t soundIdx) noexcept { attackSound = soundIdx; } + void setDefendSound(int16_t soundIdx) noexcept { defendSound = soundIdx; } + void setDieSound(int16_t soundIdx) noexcept { dieSound = soundIdx; } + void setHitSound(int16_t soundIdx) noexcept { hitSound = soundIdx; } + void setWalkSound(int16_t soundIdx) noexcept { walkSound = soundIdx; } const std::string& Id() const noexcept { return id; } const std::string& Name() const noexcept { return name; } const std::string& Type() const noexcept { return type; } - const std::string& Description() const noexcept { return description; } - void Id(const std::string& id_) { id = id_; } - void Name(const std::string& name_) { name = name_; } - void Type(const std::string& type_) { type = type_; } - void Description(const std::string& description_) { description = description_; } + void Id(const std::string_view id_) { id = id_; } + void Name(const std::string_view name_) { name = name_; } + void Type(const std::string_view type_) { type = type_; } + + bool getFullName(const Queryable& obj, std::string& fullName) const + { + return classifiers.getText(0, obj, fullName); + } + void setNameClassifier(Classifier* classifier) { classifiers.set(0, classifier, 0); } + + bool getDescription(size_t idx, const Queryable& obj, std::string& description) const + { + return classifiers.getText(idx + 1, obj, description); + } + void setDescription(size_t idx, Classifier* classifier, uint16_t skipFirst) + { + classifiers.set(idx + 1, classifier, skipFirst); + } LevelObjValue MaxStrength() const noexcept { return maxStrength; } LevelObjValue MaxMagic() const noexcept { return maxMagic; } @@ -149,8 +158,8 @@ class PlayerClass : public BaseClass uint32_t TotalKills() const noexcept { return totalKills; } - const sf::Color& DefaultOutline() const noexcept { return defaultOutline; } - const sf::Color& DefaultOutlineIgnore() const noexcept { return defaultOutlineIgnore; } + const sf::Color& Outline() const noexcept { return outline; } + const sf::Color& OutlineIgnore() const noexcept { return outlineIgnore; } void MaxStrength(LevelObjValue val) noexcept { maxStrength = val; } void MaxMagic(LevelObjValue val) noexcept { maxMagic = val; } @@ -164,8 +173,8 @@ class PlayerClass : public BaseClass void TotalKills(LevelObjValue val) noexcept { totalKills = val; } void addKill() noexcept { totalKills++; } - void DefaultOutline(const sf::Color& color) noexcept { defaultOutline = color; } - void DefaultOutlineIgnore(const sf::Color& color) noexcept { defaultOutlineIgnore = color; } + void Outline(const sf::Color& color) noexcept { outline = color; } + void OutlineIgnore(const sf::Color& color) noexcept { outlineIgnore = color; } void setLifeFormula(const Formula& formula) { formulas[0] = formula; } void setManaFormula(const Formula& formula) { formulas[1] = formula; } diff --git a/src/Game/Quest.cpp b/src/Game/Quest.cpp index 18870208..1e7615fe 100755 --- a/src/Game/Quest.cpp +++ b/src/Game/Quest.cpp @@ -1,13 +1,13 @@ #include "Quest.h" #include "Utils/Utils.h" -bool Quest::getProperty(const std::string& prop, Variable& var) const noexcept +bool Quest::getProperty(const std::string_view prop, Variable& var) const noexcept { if (prop.empty() == true) { return false; } - switch (str2int16(prop.c_str())) + switch (str2int16(prop)) { case str2int16("id"): var = Variable(id); diff --git a/src/Game/Quest.h b/src/Game/Quest.h index 532b695f..b67dc37c 100755 --- a/src/Game/Quest.h +++ b/src/Game/Quest.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "Queryable.h" class Quest : public Queryable @@ -11,16 +12,16 @@ class Quest : public Queryable int state{ 0 }; public: - Quest() noexcept {} - Quest(const std::string& id_, const std::string& name_, int state_) + Quest() noexcept = default; + Quest(const std::string_view id_, const std::string_view name_, int state_) : id(id_), name(name_), state(state_) {} const std::string& Id() const noexcept { return id; } - void Id(const std::string& id_) { id = id_; } + void Id(const std::string_view id_) { id = id_; } const std::string& Name() const noexcept { return name; } - void Name(const std::string& name_) { name = name_; } + void Name(const std::string_view name_) { name = name_; } int State() const noexcept { return state; } void State(int state_) noexcept { state = state_; } - virtual bool getProperty(const std::string& prop, Variable& var) const noexcept; + virtual bool getProperty(const std::string_view prop, Variable& var) const noexcept; }; diff --git a/src/Game/Save/SaveItem.cpp b/src/Game/Save/SaveItem.cpp index 8491d06b..404fcdf4 100755 --- a/src/Game/Save/SaveItem.cpp +++ b/src/Game/Save/SaveItem.cpp @@ -1,80 +1,81 @@ #include "SaveItem.h" +#include "Game/GameHashes.h" #include "Game/Level.h" -#include "Game/ItemProperties.h" #include "Json/JsonParser.h" +#include "SaveUtils.h" using namespace rapidjson; +using namespace SaveUtils; -void Save::serialize(void* serializeObj, const Level& level, - const Item& item, bool skipDefaults) +void Save::serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const Item& item) { auto& writer = *((PrettyWriter*)serializeObj); const auto& itemClass = *item.Class(); writer.StartObject(); - writer.Key("class"); - writer.String(itemClass.Id()); - - if (item.MapPosition().x >= 0) + if (props.customProperty != nullptr) { - writer.Key("mapPosition"); - writer.StartArray(); - writer.Int(item.MapPosition().x); - writer.Int(item.MapPosition().y); - writer.EndArray(); + writeUInt(writer, "index", *((size_t*)props.customProperty)); } - writer.Key("properties"); - writer.StartObject(); - if (skipDefaults == false || - itemClass.isDefault({ ItemProp::Identified, item.Identified() }) == false) + writeString(writer, "class", itemClass.Id()); + + if (item.MapPosition().x >= 0) { - writer.Key("identified"); - writer.Bool(item.Identified()); + writeVector2d(writer, "mapPosition", item.MapPosition()); } - for (const auto& prop : item) + + if (item.properties.empty() == false) { - if (skipDefaults == true && itemClass.isDefault(prop) == true) + writeKeyStringView(writer, "properties"); + writer.StartObject(); + if (props.saveDefaults == true || + itemClass.isDefault({ ItemProp::Identified, item.Identified() }) == false) { - continue; + writeBool(writer, "identified", item.Identified()); } - writer.Key(level.getPropertyName(prop.first)); - switch (prop.first) + for (const auto& prop : item) { - case ItemProp::UseOn: - case ItemProp::UseOp: - writer.String(level.getPropertyName(prop.second)); - break; - case ItemProp::Magical: - writer.Bool(prop.second != 0); - break; - default: - writer.Int(prop.second); - break; + if (props.saveDefaults == false && itemClass.isDefault(prop) == true) + { + continue; + } + writeKeyStringView(writer, level.getPropertyName(prop.first)); + switch (prop.first) + { + case ItemProp::UseOn: + case ItemProp::UseOp: + writeStringView(writer, level.getPropertyName(prop.second)); + break; + case ItemProp::Magical: + writer.Bool(prop.second != 0); + break; + default: + writer.Int(prop.second); + break; + } } + writer.EndObject(); } - writer.EndObject(); - if (skipDefaults == false || - item.base.sprite.getOutline() != itemClass.DefaultOutline()) + if (props.saveDefaults == true || + item.base.sprite.getOutline() != itemClass.Outline()) { - writer.Key("outline"); - writer.Uint(item.base.sprite.getOutline().toInteger()); + writeUInt(writer, "outline", item.base.sprite.getOutline().toInteger()); } - if (skipDefaults == false || - item.base.sprite.getOutlineIgnore() != itemClass.DefaultOutlineIgnore()) + if (props.saveDefaults == true || + item.base.sprite.getOutlineIgnore() != itemClass.OutlineIgnore()) { - writer.Key("outlineIgnore"); - writer.Uint(item.base.sprite.getOutlineIgnore().toInteger()); + writeUInt(writer, "outlineIgnore", item.base.sprite.getOutlineIgnore().toInteger()); } - if (skipDefaults == false || + if (props.saveDefaults == true || item.base.outlineOnHover != true) { - writer.Key("outlineOnHover"); - writer.Bool(item.base.outlineOnHover); + writeBool(writer, "outlineOnHover", item.base.outlineOnHover); } writer.EndObject(); diff --git a/src/Game/Save/SaveItem.h b/src/Game/Save/SaveItem.h index 7242329d..ed5bfb2c 100755 --- a/src/Game/Save/SaveItem.h +++ b/src/Game/Save/SaveItem.h @@ -1,10 +1,14 @@ #pragma once +#include "SaveProperties.h" + +class Game; class Level; class Item; namespace Save { - void serialize(void* serializeObj, const Level& level, - const Item& item, bool skipDefaults); + // if customProp is not null, it points to the inventory index of the item (size_t) + void serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const Item& item); } diff --git a/src/Game/Save/SaveLevel.cpp b/src/Game/Save/SaveLevel.cpp index 26af4477..e3b5e6a1 100755 --- a/src/Game/Save/SaveLevel.cpp +++ b/src/Game/Save/SaveLevel.cpp @@ -4,119 +4,131 @@ #include "Game/SimpleLevelObject.h" #include "Json/JsonParser.h" #include "SaveItem.h" +#include "SaveUtils.h" using namespace rapidjson; +using namespace SaveUtils; -void Save::save(const std::string& filePath, const Level& level, - bool skipDefaults, bool skipCurrentPlayer) +void Save::save(const std::string_view filePath, Properties& props, + const Game& game, const Level& level) { StringBuffer buffer(0, std::numeric_limits::max()); PrettyWriter writer(buffer); writer.SetIndent(' ', 2); - serialize(&writer, level, skipDefaults, skipCurrentPlayer); + serialize(&writer, props, game, level); - FileUtils::saveText(filePath.c_str(), buffer.GetString(), buffer.GetSize()); + FileUtils::saveText(filePath, { buffer.GetString(), buffer.GetSize() }); } -void Save::save(const std::string& filePath, const Level& level, - const LevelObject& obj, bool skipDefaults) +void Save::serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level) { - StringBuffer buffer(0, std::numeric_limits::max()); - PrettyWriter writer(buffer); - writer.SetIndent(' ', 2); + auto& writer = *((PrettyWriter*)serializeObj); + // root writer.StartObject(); - Variable var; - if (obj.getProperty("type", var) == true) - { - writer.Key(std::get(var)); - } - else - { - writer.Key("levelObject"); - } - obj.serialize(&writer, level, skipDefaults); - writer.EndObject(); - FileUtils::saveText(filePath.c_str(), buffer.GetString(), buffer.GetSize()); -} + writeKeyStringView(writer, "level"); + // level + writer.StartObject(); -void Save::serialize(void* serializeObj, const Level& level, - bool skipDefaults, bool skipCurrentPlayer) -{ - auto& writer = *((PrettyWriter*)serializeObj); + writeStringView(writer, "id", level.id); + writeStringView(writer, "name", level.name); + writeStringView(writer, "path", level.path); - writer.StartObject(); + writeVector2d(writer, "mapSize", level.map.MapSize()); - writer.Key("level"); + writeKeyStringView(writer, "map"); + // map writer.StartObject(); + writeKeyStringView(writer, "layers"); + writer.StartArray(); + for (size_t i = 0; i < LevelCell::NumberOfLayers; i++) + { + // layer + writer.StartObject(); - writer.Key("id"); - writer.String(level.id); - - writer.Key("name"); - writer.String(level.name); + writeInt(writer, "index", i); + writeInt(writer, "width", level.map.Width()); + writeInt(writer, "height", level.map.Height()); - writer.Key("path"); - writer.String(level.path); + writeKeyStringView(writer, "data"); + writer.SetFormatOptions(PrettyFormatOptions::kFormatSingleLineArray); + writer.StartArray(); + for (const auto& cell : level.map) + { + writer.Int(cell.getTileIndex(i)); + } + writer.EndArray(); + writer.SetFormatOptions(PrettyFormatOptions::kFormatDefault); - writer.Key("mapPosition"); - writer.StartArray(); - writer.Int(level.map.MapSize().x); - writer.Int(level.map.MapSize().y); + // layer + writer.EndObject(); + } writer.EndArray(); + // map + writer.EndObject(); - //writer.Key("map"); - //writer.StartArray(); - //for (const auto& cell : level.map) - //{ - // writer.Int(cell.TileIndexBack()); - //} - //writer.EndArray(); - + // level writer.EndObject(); - writer.Key("item"); + if (props.saveQuests == true) + { + writeKeyStringView(writer, "quest"); + writer.StartArray(); + for (const auto& quest : level.quests) + { + writer.StartObject(); + writeString(writer, "id", quest.Id()); + writeString(writer, "name", quest.Name()); + writeInt(writer, "state", quest.State()); + writer.EndObject(); + } + writer.EndArray(); + } + + writeKeyStringView(writer, "item"); writer.StartArray(); for (const auto& obj : level.levelObjects) { auto item = dynamic_cast(obj.get()); if (item != nullptr) { - serialize(serializeObj, level, *item, skipDefaults); + serialize(serializeObj, props, game, level, *item); } } writer.EndArray(); - writer.Key("levelObject"); + writeKeyStringView(writer, "levelObject"); writer.StartArray(); for (const auto& obj : level.levelObjects) { auto levelObj = dynamic_cast(obj.get()); if (levelObj != nullptr) { - serialize(serializeObj, level, *levelObj, skipDefaults); + serialize(serializeObj, props, game, level, *levelObj); } } writer.EndArray(); - writer.Key("player"); + writeKeyStringView(writer, "player"); writer.StartArray(); for (const auto& obj : level.players) { auto player = obj.get(); if (player != nullptr) { - if (skipCurrentPlayer == true && + if (props.saveCurrentPlayer == false && player == level.getCurrentPlayer()) { continue; } - serialize(serializeObj, level, *player, skipDefaults); + serialize(serializeObj, props, game, level, *player); } } writer.EndArray(); + // root writer.EndObject(); } diff --git a/src/Game/Save/SaveLevel.h b/src/Game/Save/SaveLevel.h index afbe54ec..f52bf31f 100755 --- a/src/Game/Save/SaveLevel.h +++ b/src/Game/Save/SaveLevel.h @@ -1,16 +1,17 @@ #pragma once -#include +#include "SaveProperties.h" +#include +class Game; class Level; class LevelObject; namespace Save { - void save(const std::string& filePath, const Level& level, - bool skipDefaults, bool skipCurrentPlayer); - void save(const std::string& filePath, const Level& level, - const LevelObject& obj, bool skipDefaults); - void serialize(void* serializeObj, const Level& level, - bool skipDefaults, bool skipCurrentPlayer); + void save(const std::string_view filePath, Properties& props, + const Game& game, const Level& level); + + void serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level); } diff --git a/src/Game/Save/SavePlayer.cpp b/src/Game/Save/SavePlayer.cpp index 9e635e4c..be738b6d 100755 --- a/src/Game/Save/SavePlayer.cpp +++ b/src/Game/Save/SavePlayer.cpp @@ -1,110 +1,289 @@ #include "SavePlayer.h" +#include "Game.h" #include "Game/Level.h" #include "Json/JsonParser.h" #include "SaveItem.h" +#include "SaveUtils.h" using namespace rapidjson; +using namespace SaveUtils; -void Save::serialize(void* serializeObj, const Level& level, - const Player& player, bool skipDefaults) +void Save::serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const Player& player) { auto& writer = *((PrettyWriter*)serializeObj); + const auto& playerClass = *player.getPlayerClass(); writer.StartObject(); - writer.Key("id"); - writer.String(player.Id()); + writeString(writer, "id", player.Id()); + writeString(writer, "class", playerClass.Id()); - writer.Key("class"); - writer.String(player.getPlayerClass()->Id()); - - writer.Key("name"); - writer.String(player.Name()); + // only save name if it's not equal to classfier's generated name + std::string nameFromClass; + if (playerClass.getFullName(player, nameFromClass) == false && + nameFromClass.empty() == true) + { + nameFromClass = player.SimpleName(); + } + if (props.saveDefaults == true || + nameFromClass != player.Name()) + { + writeString(writer, "name", player.Name()); + } if (level.getCurrentPlayer() == &player) { - writer.Key("currentPlayer"); - writer.Bool(true); + writeBool(writer, "currentPlayer", true); + } + + writeKeyStringView(writer, "status"); + switch (player.playerStatus) + { + default: + case PlayerStatus::Stand: + writeStringView(writer, "Stand"); + break; + case PlayerStatus::Walk: + writeStringView(writer, "Walk"); + break; + case PlayerStatus::Attack: + writeStringView(writer, "Attack"); + break; + case PlayerStatus::Dead: + writeStringView(writer, "Dead"); + break; } - writer.Key("direction"); + writeKeyStringView(writer, "direction"); switch (player.direction) { case PlayerDirection::Front: - writer.String("Front"); + writeStringView(writer, "Front"); break; case PlayerDirection::FrontLeft: - writer.String("FrontLeft"); + writeStringView(writer, "FrontLeft"); break; case PlayerDirection::Left: - writer.String("Left"); + writeStringView(writer, "Left"); break; case PlayerDirection::BackLeft: - writer.String("BackLeft"); + writeStringView(writer, "BackLeft"); break; case PlayerDirection::Back: - writer.String("Back"); + writeStringView(writer, "Back"); break; case PlayerDirection::BackRight: - writer.String("BackRight"); + writeStringView(writer, "BackRight"); break; case PlayerDirection::Right: - writer.String("Right"); + writeStringView(writer, "Right"); break; case PlayerDirection::FrontRight: - writer.String("FrontRight"); + writeStringView(writer, "FrontRight"); break; case PlayerDirection::All: default: - writer.String("All"); + writeStringView(writer, "All"); + break; + } + + writeKeyStringView(writer, "animation"); + switch (player.animation) + { + default: + case PlayerAnimation::Stand1: + writeStringView(writer, "Stand1"); + break; + case PlayerAnimation::Stand2: + writeStringView(writer, "Stand2"); + break; + case PlayerAnimation::Walk1: + writeStringView(writer, "Walk1"); + break; + case PlayerAnimation::Walk2: + writeStringView(writer, "Walk2"); + break; + case PlayerAnimation::Attack1: + writeStringView(writer, "Attack1"); + break; + case PlayerAnimation::Attack2: + writeStringView(writer, "Attack2"); + break; + case PlayerAnimation::Attack3: + writeStringView(writer, "Attack3"); + break; + case PlayerAnimation::Attack4: + writeStringView(writer, "Attack4"); + break; + case PlayerAnimation::Defend1: + writeStringView(writer, "Defend1"); + break; + case PlayerAnimation::Defend2: + writeStringView(writer, "Defend2"); + break; + case PlayerAnimation::Defend3: + writeStringView(writer, "Defend3"); + break; + case PlayerAnimation::Defend4: + writeStringView(writer, "Defend4"); + break; + case PlayerAnimation::Hit1: + writeStringView(writer, "Hit1"); + break; + case PlayerAnimation::Hit2: + writeStringView(writer, "Hit2"); + break; + case PlayerAnimation::Die1: + writeStringView(writer, "Die1"); + break; + case PlayerAnimation::Die2: + writeStringView(writer, "Die2"); break; } - writer.Key("mapPosition"); - writer.StartArray(); - writer.Int(player.MapPosition().x); - writer.Int(player.MapPosition().y); - writer.EndArray(); + writeVector2d(writer, "mapPosition", player.MapPosition()); - if (skipDefaults == false || + if (props.saveDefaults == true || player.base.enableHover == false) { - writer.Key("enableHover"); - writer.Bool(player.base.enableHover); + writeBool(writer, "enableHover", player.base.enableHover); + } + + if (props.saveDefaults == true || + player.useAI == true) + { + writeBool(writer, "AI", player.useAI); } - writer.Key("inventory"); - writer.StartArray(); - for (size_t i = 0; i < player.inventories.size(); i++) + writeKeyStringView(writer, "properties"); + writer.StartObject(); { - const auto& inv = player.inventories[i]; - if (inv.Size() == 0) + auto savePlayerProp = [&](const std::string_view prop) { - continue; - } + Number32 numVal; + uint16_t propHash = str2int16(prop); + if (player.getNumberByHash(propHash, numVal) == true) + { + if (props.saveDefaults == false && + (playerClass.isDefault(propHash, numVal) == true || + numVal.getInt32() == 0)) + { + return; + } + writeNumber32(writer, prop, numVal); + } + }; - writer.StartObject(); + savePlayerProp("experience"); + savePlayerProp("points"); - writer.Key("index"); - writer.Uint(i); + savePlayerProp("strength"); + savePlayerProp("strengthItems"); + savePlayerProp("magic"); + savePlayerProp("magicItems"); + savePlayerProp("dexterity"); + savePlayerProp("dexterityItems"); + savePlayerProp("vitality"); + savePlayerProp("vitalityItems"); + savePlayerProp("life"); + savePlayerProp("lifeItems"); + savePlayerProp("lifeDamage"); + savePlayerProp("mana"); + savePlayerProp("manaItems"); + savePlayerProp("manaDamage"); + savePlayerProp("armor"); + savePlayerProp("armorItems"); + savePlayerProp("toArmor"); + savePlayerProp("toHit"); + savePlayerProp("toHitItems"); + savePlayerProp("damageMin"); + savePlayerProp("damageMax"); + savePlayerProp("damageMinItems"); + savePlayerProp("damageMaxItems"); + savePlayerProp("toDamage"); + savePlayerProp("resistMagic"); + savePlayerProp("resistFire"); + savePlayerProp("resistLightning"); - if (i == player.bodyInventoryIdx) + for (const auto& prop : player.customProperties) { - writer.Key("bodyInventory"); - writer.Bool(true); + if (props.saveDefaults == false && playerClass.isDefault(prop) == true) + { + continue; + } + writeNumber32(writer, level.getPropertyName(prop.first), prop.second); } + } + writer.EndObject(); - writer.Key("item"); + if (player.inventories.empty() == false) + { + writeKeyStringView(writer, "inventory"); writer.StartArray(); - for (const auto& item : inv) + for (size_t i = 0; i < player.inventories.size(); i++) { - serialize(serializeObj, level, item, skipDefaults); + const auto& inv = player.inventories[i]; + if (inv.empty() == true) + { + continue; + } + + writer.StartObject(); + + writeUInt(writer, "index", i); + + if (inv.getXYSize().y != 1) + { + writeVector2d(writer, "size", inv.getXYSize()); + } + else + { + writeUInt(writer, "size", inv.Size()); + } + + if (inv.AllowedTypes().empty() == false) + { + writer.SetFormatOptions(PrettyFormatOptions::kFormatSingleLineArray); + writeKeyStringView(writer, "allowedClassTypes"); + writer.StartArray(); + for (const auto& typeHash16 : inv.AllowedTypes()) + { + auto prop = level.getPropertyName(typeHash16); + if (prop.empty() == false) + { + writeStringView(writer, prop); + } + } + writer.EndArray(); + writer.SetFormatOptions(PrettyFormatOptions::kFormatDefault); + } + + if (i == player.bodyInventoryIdx) + { + writeBool(writer, "bodyInventory", true); + } + + if (inv.getEnforceItemSize() == true) + { + writeBool(writer, "enforceItemSize", true); + } + + writeKeyStringView(writer, "item"); + writer.StartArray(); + auto oldCustomProp = props.customProperty; + for (auto it = inv.begin(); it != inv.end(); ++it) + { + props.customProperty = &it.state.idx; + serialize(serializeObj, props, game, level, *it); + } + props.customProperty = oldCustomProp; + writer.EndArray(); + + writer.EndObject(); } writer.EndArray(); - - writer.EndObject(); } - writer.EndArray(); writer.EndObject(); } diff --git a/src/Game/Save/SavePlayer.h b/src/Game/Save/SavePlayer.h index 651ce77f..024cf7aa 100755 --- a/src/Game/Save/SavePlayer.h +++ b/src/Game/Save/SavePlayer.h @@ -1,10 +1,13 @@ #pragma once +#include "SaveProperties.h" + +class Game; class Level; class Player; namespace Save { - void serialize(void* serializeObj, const Level& level, - const Player& player, bool skipDefaults); + void serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const Player& player); } diff --git a/src/Game/Save/SaveProperties.h b/src/Game/Save/SaveProperties.h new file mode 100755 index 00000000..85aba5f2 --- /dev/null +++ b/src/Game/Save/SaveProperties.h @@ -0,0 +1,12 @@ +#pragma once + +namespace Save +{ + struct Properties + { + bool saveDefaults{ false }; + bool saveCurrentPlayer{ false }; + bool saveQuests{ false }; + void* customProperty{ nullptr }; + }; +} diff --git a/src/Game/Save/SaveSimpleLevelObject.cpp b/src/Game/Save/SaveSimpleLevelObject.cpp index 5f1ef4c7..af69ebee 100755 --- a/src/Game/Save/SaveSimpleLevelObject.cpp +++ b/src/Game/Save/SaveSimpleLevelObject.cpp @@ -1,28 +1,64 @@ #include "SaveSimpleLevelObject.h" +#include "Game.h" #include "Game/Level.h" #include "Game/SimpleLevelObject.h" #include "Json/JsonParser.h" +#include "SaveUtils.h" using namespace rapidjson; +using namespace SaveUtils; -void Save::serialize(void* serializeObj, const Level& level, - const SimpleLevelObject& obj, bool skipDefaults) +void Save::serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const SimpleLevelObject& obj) { auto& writer = *((PrettyWriter*)serializeObj); + const auto& objClass = *obj.class_; writer.StartObject(); - writer.Key("id"); - writer.String(obj.Id()); + writeString(writer, "id", obj.Id()); + writeString(writer, "class", objClass.Id()); - writer.Key("name"); - writer.String(obj.Name()); + // only save name if it's not equal to classfier's generated name + std::string nameFromClass; + if (objClass.getFullName(obj, nameFromClass) == false && + nameFromClass.empty() == true) + { + nameFromClass = obj.SimpleName(); + } + if (props.saveDefaults == true || + nameFromClass != obj.Name()) + { + writeString(writer, "name", obj.Name()); + } - writer.Key("mapPosition"); - writer.StartArray(); - writer.Int(obj.MapPosition().x); - writer.Int(obj.MapPosition().y); - writer.EndArray(); + writeVector2d(writer, "mapPosition", obj.MapPosition()); + + if (props.saveDefaults == true || + (props.saveDefaults == false && obj.Text1() != objClass.Text1())) + { + writeString(writer, "text1", obj.Text1()); + } + if (props.saveDefaults == true || + (props.saveDefaults == false && obj.Text2() != objClass.Text2())) + { + writeString(writer, "text2", obj.Text2()); + } + + if (obj.properties.empty() == false) + { + writeKeyStringView(writer, "properties"); + writer.StartObject(); + for (const auto& prop : obj.properties) + { + if (props.saveDefaults == false && objClass.isDefault(prop) == true) + { + continue; + } + writeInt(writer, level.getPropertyName(prop.first), prop.second); + } + writer.EndObject(); + } writer.EndObject(); } diff --git a/src/Game/Save/SaveSimpleLevelObject.h b/src/Game/Save/SaveSimpleLevelObject.h index 105ee8bf..4dafeb05 100755 --- a/src/Game/Save/SaveSimpleLevelObject.h +++ b/src/Game/Save/SaveSimpleLevelObject.h @@ -1,10 +1,13 @@ #pragma once +#include "SaveProperties.h" + +class Game; class Level; class SimpleLevelObject; namespace Save { - void serialize(void* serializeObj, const Level& level, - const SimpleLevelObject& obj, bool skipDefaults); + void serialize(void* serializeObj, Properties& props, + const Game& game, const Level& level, const SimpleLevelObject& obj); } diff --git a/src/Game/Save/SaveUtils.cpp b/src/Game/Save/SaveUtils.cpp new file mode 100755 index 00000000..5146764a --- /dev/null +++ b/src/Game/Save/SaveUtils.cpp @@ -0,0 +1,83 @@ +#include "SaveUtils.h" + +namespace SaveUtils +{ + using namespace rapidjson; + + void writeBool(PrettyWriter& writer, + const std::string_view key, bool val) + { + writer.Key(key.data(), key.size()); + writer.Bool(val); + } + + void writeInt(PrettyWriter& writer, + const std::string_view key, int val) + { + writer.Key(key.data(), key.size()); + writer.Int(val); + } + + void writeUInt(PrettyWriter& writer, + const std::string_view key, unsigned val) + { + writer.Key(key.data(), key.size()); + writer.Uint(val); + } + + void writeNumber32(PrettyWriter& writer, + const std::string_view key, const Number32& val) + { + writer.Key(key.data(), key.size()); + if (val.isInt32() == true) + { + writer.Int(val.getInt32()); + } + else if (val.isUInt32() == true) + { + writer.Uint(val.getUInt32()); + } + else + { + writer.Double(val.getFloat()); + } + } + + void writeKey(PrettyWriter& writer, + const std::string& key) + { + writer.Key(key); + } + + void writeKeyStringView(PrettyWriter& writer, + const std::string_view key) + { + writer.Key(key.data(), key.size()); + } + + void writeString(PrettyWriter& writer, + const std::string_view key, const std::string& val) + { + writer.Key(key.data(), key.size()); + writer.String(val); + } + + void writeStringView(PrettyWriter& writer, + const std::string_view key, const std::string_view val) + { + writer.Key(key.data(), key.size()); + writer.String(val.data(), val.size()); + } + + void writeString(PrettyWriter& writer, + const std::string& val) + { + writer.String(val); + } + + void writeStringView(PrettyWriter& writer, + const std::string_view val) + { + writer.String(val.data(), val.size()); + } +} diff --git a/src/Game/Save/SaveUtils.h b/src/Game/Save/SaveUtils.h new file mode 100755 index 00000000..50ddcb65 --- /dev/null +++ b/src/Game/Save/SaveUtils.h @@ -0,0 +1,58 @@ +#pragma once + +#include "Game/MapCoord.h" +#include "Game/Number.h" +#include "Json/JsonParser.h" +#include +#include + +namespace SaveUtils +{ + void writeBool(rapidjson::PrettyWriter& writer, + const std::string_view key, bool val); + + void writeInt(rapidjson::PrettyWriter& writer, + const std::string_view key, int val); + + void writeUInt(rapidjson::PrettyWriter& writer, + const std::string_view key, unsigned val); + + void writeNumber32(rapidjson::PrettyWriter& writer, + const std::string_view key, const Number32& val); + + // same line formatted. + template + void writeVector2d(rapidjson::PrettyWriter& writer, + const std::string_view key, const T& val) + { + writer.SetFormatOptions(rapidjson::PrettyFormatOptions::kFormatSingleLineArray); + writer.Key(key.data(), key.size()); + writer.StartArray(); + writer.Int(val.x); + writer.Int(val.y); + writer.EndArray(); + writer.SetFormatOptions(rapidjson::PrettyFormatOptions::kFormatDefault); + } + + // write just the key + void writeKey(rapidjson::PrettyWriter& writer, + const std::string& key); + + // write just the key + void writeKeyStringView(rapidjson::PrettyWriter& writer, + const std::string_view key); + + void writeString(rapidjson::PrettyWriter& writer, + const std::string_view key, const std::string& val); + + void writeStringView(rapidjson::PrettyWriter& writer, + const std::string_view key, const std::string_view val); + + // write just the value (no key) + void writeString(rapidjson::PrettyWriter& writer, + const std::string& val); + + // write just the value (no key) + void writeStringView(rapidjson::PrettyWriter& writer, + const std::string_view val); +} diff --git a/src/Game/SimpleLevelObject.cpp b/src/Game/SimpleLevelObject.cpp index c5f80412..5e5e8301 100755 --- a/src/Game/SimpleLevelObject.cpp +++ b/src/Game/SimpleLevelObject.cpp @@ -2,6 +2,41 @@ #include "Game.h" #include "Game/Level.h" +SimpleLevelObject::SimpleLevelObject(const LevelObjectClass* class__) : class_(class__) +{ + if (class__->getTexture() != nullptr) + { + base.sprite.setTexture(*class__->getTexture()); + base.sprite.setTextureRect(class__->getTextureRect()); + } + else + { + base.texturePack = class__->getTexturePack(); + base.animation.textureIndexRange = class__->getTextureIndexRange(); + base.animation.frameTime = class__->getFrameTime(); + base.animation.animType = class__->getAnimationType(); + base.hoverCellSize = 1; + base.updateTexture(); + } + action = class__->getAction(str2int16("action")); + + for (const auto& prop : class_->Defaults()) + { + setIntByHash(prop.first, prop.second); + } +} + +bool SimpleLevelObject::getTexture(size_t textureNumber, TextureInfo& ti) const +{ + switch (textureNumber) + { + case 0: + return base.getTexture(ti); + default: + return false; + } +} + void SimpleLevelObject::executeAction(Game& game) const { if (action != nullptr) @@ -25,13 +60,21 @@ void SimpleLevelObject::update(Game& game, Level& level) } } -bool SimpleLevelObject::getProperty(const std::string& prop, Variable& var) const +const std::string& SimpleLevelObject::Name() const +{ + updateNameAndDescriptions(); + return name; +} + +bool SimpleLevelObject::getProperty(const std::string_view prop, Variable& var) const { if (prop.empty() == true) { return false; } - switch (str2int16(prop.c_str())) + auto props = Utils::splitStringIn2(prop, '.'); + auto propHash = str2int16(props.first); + switch (propHash) { case str2int16("type"): var = Variable(std::string("levelObject")); @@ -40,10 +83,104 @@ bool SimpleLevelObject::getProperty(const std::string& prop, Variable& var) cons var = Variable(id); break; case str2int16("name"): - var = Variable(name); + var = Variable(Name()); + break; + case str2int16("simpleName"): + var = Variable(SimpleName()); + break; + case str2int16("text1"): + var = Variable(text1); break; + case str2int16("text2"): + var = Variable(text2); + break; + case str2int16("d"): + case str2int16("description"): + { + updateNameAndDescriptions(); + size_t idx = Utils::strtou(props.second); + if (idx >= descriptions.size()) + { + idx = 0; + } + var = Variable(descriptions[idx]); + break; + } default: - return false; + { + LevelObjValue value; + if (getIntByHash(propHash, value) == true) + { + var = Variable((int64_t)value); + break; + } + else + { + return false; + } + } } return true; } + +bool SimpleLevelObject::hasIntByHash(uint16_t propHash) const noexcept +{ + return properties.hasValue(propHash); +} + +bool SimpleLevelObject::hasInt(const std::string_view prop) const noexcept +{ + return hasIntByHash(str2int16(prop)); +} + +LevelObjValue SimpleLevelObject::getIntByHash(uint16_t propHash) const +{ + LevelObjValue value = 0; + getIntByHash(propHash, value); + return value; +} + +LevelObjValue SimpleLevelObject::getInt(const std::string_view prop) const +{ + LevelObjValue value = 0; + getInt(prop, value); + return value; +} + +bool SimpleLevelObject::getIntByHash(uint16_t propHash, LevelObjValue& value) const +{ + return properties.getValue(propHash, value); +} + +bool SimpleLevelObject::getInt(const std::string_view prop, LevelObjValue& value) const +{ + return getIntByHash(str2int16(prop), value); +} + +void SimpleLevelObject::setIntByHash(uint16_t propHash, LevelObjValue value) +{ + properties.setValue(propHash, value); + updateNameAndDescr = true; +} + +void SimpleLevelObject::setInt(const std::string_view prop, LevelObjValue value) +{ + setIntByHash(str2int16(prop), value); +} + +void SimpleLevelObject::updateNameAndDescriptions() const +{ + if (updateNameAndDescr == true) + { + updateNameAndDescr = false; + if (class_->getFullName(*this, name) == false && + name.empty() == true) + { + name = SimpleName(); + } + for (size_t i = 0; i < descriptions.size(); i++) + { + class_->getDescription(i, *this, descriptions[i]); + } + } +} diff --git a/src/Game/SimpleLevelObject.h b/src/Game/SimpleLevelObject.h index 6228ed73..fe632dd9 100755 --- a/src/Game/SimpleLevelObject.h +++ b/src/Game/SimpleLevelObject.h @@ -2,32 +2,40 @@ #include "Actions/Action.h" #include "BaseLevelObject.h" +#include "LevelObjectClass.h" #include #include "Save/SaveSimpleLevelObject.h" +#include "Utils/FixedMap.h" class SimpleLevelObject : public LevelObject { private: + typedef FixedMap LevelObjectProperties; + + const LevelObjectClass* class_; + BaseLevelObject base; std::shared_ptr action; std::string id; - std::string name; + mutable std::string name; + mutable std::array descriptions; + + std::string text1; + std::string text2; + + mutable bool updateNameAndDescr{ true }; - friend void Save::serialize(void* serializeObj, const Level& level, - const SimpleLevelObject& obj, bool skipDefaults); + LevelObjectProperties properties; + + void updateNameAndDescriptions() const; + + friend void Save::serialize(void* serializeObj, Save::Properties& props, + const Game& game, const Level& level, const SimpleLevelObject& obj); public: - SimpleLevelObject() noexcept {} - SimpleLevelObject(const sf::Texture& texture) : base(texture) {} - SimpleLevelObject(const TexturePack& texturePack, - const std::pair& textureIndexRange, - const sf::Time& frameTime, AnimationType animType) - : base(texturePack, textureIndexRange, frameTime, animType) - { - base.updateTexture(); - } + SimpleLevelObject(const LevelObjectClass* class__); virtual const sf::Vector2f& Position() const { return base.sprite.getPosition(); } virtual sf::Vector2f Size() const { return base.getSize(); } @@ -35,10 +43,11 @@ class SimpleLevelObject : public LevelObject virtual const MapCoord& MapPosition() const noexcept { return base.mapPosition; } virtual void MapPosition(const MapCoord& pos) noexcept { base.mapPosition = pos; } + virtual bool getTexture(size_t textureNumber, TextureInfo& ti) const; + virtual void executeAction(Game& game) const; - virtual bool getNumberProp(const char* prop, Number32& value) const noexcept { return false; } + virtual bool getNumberProp(const std::string_view prop, Number32& value) const noexcept { return false; } virtual bool Passable() const noexcept { return true; } - virtual void setAction(const std::shared_ptr& action_) noexcept { action = action_; } virtual void setColor(const sf::Color& color) { base.sprite.setColor(color); } virtual void setOutline(const sf::Color& outline, const sf::Color& ignore) noexcept { @@ -51,22 +60,37 @@ class SimpleLevelObject : public LevelObject virtual bool Hoverable() const noexcept { return base.enableHover; } virtual void Hoverable(bool hoverable) noexcept { base.enableHover = hoverable; } - virtual void serialize(void* serializeObj, const Level& level, bool skipDefaults) const + virtual void serialize(void* serializeObj, Save::Properties& props, + const Game& game, const Level& level) const { - Save::serialize(serializeObj, level, *this, skipDefaults); + Save::serialize(serializeObj, props, game, level, *this); } virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const { - if (base.sprite.getTexture() != NULL) + if (base.sprite.getTexture() != nullptr) { target.draw(base.sprite, states); } } virtual void update(Game& game, Level& level); - virtual bool getProperty(const std::string& prop, Variable& var) const; - virtual void setProperty(const std::string& prop, const Variable& val) noexcept {} + virtual bool getProperty(const std::string_view prop, Variable& var) const; + virtual void setProperty(const std::string_view prop, const Variable& val) noexcept {} + + virtual std::string_view getId() const { return id; } + virtual std::string_view getClassId() const { return class_->Id(); } + + bool hasIntByHash(uint16_t propHash) const noexcept; + bool hasInt(const std::string_view prop) const noexcept; + + LevelObjValue getIntByHash(uint16_t propHash) const; + LevelObjValue getInt(const std::string_view prop) const; + + bool getIntByHash(uint16_t propHash, LevelObjValue& value) const; + bool getInt(const std::string_view prop, LevelObjValue& value) const; + void setIntByHash(uint16_t propHash, LevelObjValue value); + void setInt(const std::string_view prop, LevelObjValue value); sf::Time getFrameTime() const noexcept { return base.animation.frameTime; } void setFrameTime(sf::Time time) noexcept { base.animation.frameTime = time; } @@ -74,7 +98,12 @@ class SimpleLevelObject : public LevelObject void setTextureRect(const sf::IntRect& rectangle) { base.sprite.setTextureRect(rectangle); } const std::string& Id() const noexcept { return id; } - const std::string& Name() const noexcept { return name; } - void Id(const std::string& id_) { id = id_; } - void Name(const std::string& name_) { name = name_; } + const std::string& Name() const; + const std::string& SimpleName() const noexcept { return class_->Name(); } + const std::string& Text1() const noexcept { return text1; } + const std::string& Text2() const noexcept { return text2; } + void Id(const std::string_view id_) { id = id_; } + void Name(const std::string_view name_) { name = name_; } + void Text1(const std::string_view text1_) { text1 = text1_; } + void Text2(const std::string_view text2_) { text2 = text2_; } }; diff --git a/src/Game/Spell.cpp b/src/Game/Spell.cpp new file mode 100755 index 00000000..c0ed5821 --- /dev/null +++ b/src/Game/Spell.cpp @@ -0,0 +1,159 @@ +#include "Spell.h" +#include "Utils/Utils.h" + +Spell::Spell(const SpellClass* class__) : class_(class__) +{ + applyDefaults(); +} + +bool Spell::getProperty(const std::string_view prop, Variable& var) const +{ + if (prop.empty() == true) + { + return false; + } + auto props = Utils::splitStringIn2(prop, '.'); + auto propHash = str2int16(props.first); + switch (propHash) + { + case str2int16("class"): + case str2int16("classId"): + var = Variable(class_->Id()); + break; + case str2int16("name"): + var = Variable(Name()); + break; + case str2int16("d"): + case str2int16("description"): + { + updateDescriptions(); + size_t idx = Utils::strtou(props.second); + if (idx >= descriptions.size()) + { + idx = 0; + } + var = Variable(descriptions[idx]); + break; + } + case str2int16("hasDescription"): + { + updateDescriptions(); + bool hasDescr = false; + size_t idx = Utils::strtou(props.second); + if (idx < descriptions.size()) + { + hasDescr = descriptions[idx].empty() == false; + } + var = Variable(hasDescr); + break; + } + case str2int16("type"): + var = Variable(std::string("spell")); + break; + case str2int16("spellType"): + var = Variable(SpellType()); + break; + case str2int16("propertyCount"): + var = Variable((int64_t)properties.size()); + break; + case str2int16("hasProperty"): + var = Variable(hasInt(props.second)); + break; + default: + { + LevelObjValue value; + if (getIntByHash(propHash, value) == true) + { + var = Variable((int64_t)value); + break; + } + else + { + return false; + } + } + } + return true; +} + +bool Spell::getTexture(size_t textureNumber, TextureInfo& ti) const +{ + switch (textureNumber) + { + case 0: + case 1: + return class_->getTexture1(ti); + case 2: + return class_->getTexture2(ti); + default: + return false; + } +} + +bool Spell::hasIntByHash(uint16_t propHash) const noexcept +{ + return properties.hasValue(propHash); +} + +bool Spell::hasInt(const std::string_view prop) const noexcept +{ + return hasIntByHash(str2int16(prop)); +} + +LevelObjValue Spell::getIntByHash(uint16_t propHash) const +{ + LevelObjValue value = 0; + getIntByHash(propHash, value); + return value; +} + +LevelObjValue Spell::getInt(const std::string_view prop) const +{ + LevelObjValue value = 0; + getInt(prop, value); + return value; +} + +bool Spell::getIntByHash(uint16_t propHash, LevelObjValue& value) const +{ + return properties.getValue(propHash, value); +} + +bool Spell::getInt(const std::string_view prop, LevelObjValue& value) const +{ + return getIntByHash(str2int16(prop), value); +} + +void Spell::setIntByHash(uint16_t propHash, LevelObjValue value) +{ + if (properties.setValue(propHash, value) == false) + { + return; + } + updateDescr = true; +} + +void Spell::setInt(const std::string_view prop, LevelObjValue value) +{ + setIntByHash(str2int16(prop), value); +} + +void Spell::updateDescriptions() const +{ + if (updateDescr == true) + { + updateDescr = false; + for (size_t i = 0; i < descriptions.size(); i++) + { + class_->getDescription(i, *this, descriptions[i]); + } + } +} + +void Spell::applyDefaults() +{ + for (const auto& prop : class_->Defaults()) + { + setIntByHash(prop.first, prop.second); + } +} diff --git a/src/Game/Spell.h b/src/Game/Spell.h new file mode 100755 index 00000000..c5e4bdca --- /dev/null +++ b/src/Game/Spell.h @@ -0,0 +1,67 @@ +#pragma once + +#include "Actions/Action.h" +#include "Queryable.h" +#include "Save/SaveItem.h" +#include "SpellClass.h" +#include "Utils/FixedMap.h" + +class Player; + +class Spell : public Queryable +{ +private: + typedef FixedMap SpellProperties; + + const SpellClass* class_; + + mutable bool updateDescr{ true }; + + mutable std::array descriptions; + + SpellProperties properties; + + void updateDescriptions() const; + +public: + using iterator = SpellProperties::iterator; + using const_iterator = SpellProperties::const_iterator; + using reverse_iterator = SpellProperties::reverse_iterator; + using const_reverse_iterator = SpellProperties::const_reverse_iterator; + + iterator begin() noexcept { return properties.begin(); } + iterator end() noexcept { return properties.end(); } + const_iterator begin() const noexcept { return properties.begin(); } + const_iterator end() const noexcept { return properties.end(); } + const_iterator cbegin() const noexcept { return properties.cbegin(); } + const_iterator cend() const noexcept { return properties.cend(); } + reverse_iterator rbegin() noexcept { return properties.rbegin(); } + reverse_iterator rend() noexcept { return properties.rend(); } + const_reverse_iterator rbegin() const noexcept { return properties.rbegin(); } + const_reverse_iterator rend() const noexcept { return properties.rend(); } + const_reverse_iterator crbegin() const noexcept { return properties.crbegin(); } + const_reverse_iterator crend() const noexcept { return properties.crend(); } + + Spell(const SpellClass* class__); + + virtual bool getProperty(const std::string_view prop, Variable& var) const; + virtual bool getTexture(size_t textureNumber, TextureInfo& ti) const; + + const SpellClass* Class() const noexcept { return class_; } + + bool hasIntByHash(uint16_t propHash) const noexcept; + bool hasInt(const std::string_view prop) const noexcept; + + LevelObjValue getIntByHash(uint16_t propHash) const; + LevelObjValue getInt(const std::string_view prop) const; + + bool getIntByHash(uint16_t propHash, LevelObjValue& value) const; + bool getInt(const std::string_view prop, LevelObjValue& value) const; + void setIntByHash(uint16_t propHash, LevelObjValue value); + void setInt(const std::string_view prop, LevelObjValue value); + + void applyDefaults(); + + const std::string& Name() const noexcept { return class_->Name(); } + const std::string& SpellType() const noexcept { return class_->Type(); } +}; diff --git a/src/Game/SpellClass.cpp b/src/Game/SpellClass.cpp new file mode 100755 index 00000000..bba4d89f --- /dev/null +++ b/src/Game/SpellClass.cpp @@ -0,0 +1,29 @@ +#include "SpellClass.h" +#include "GameUtils.h" + +void SpellClass::setDescription(size_t idx, Classifier* classifier, uint16_t skipFirst) +{ + if (idx < descriptions.size()) + { + descriptions[idx] = std::make_pair(classifier, skipFirst); + } +} + +bool SpellClass::getDescription(size_t idx, const Queryable& item, std::string& description) const +{ + if (idx >= descriptions.size()) + { + return false; + } + auto classifier = descriptions[idx].first; + if (classifier == nullptr) + { + return false; + } + description = VarUtils::toString(classifier->get(item, descriptions[idx].second)); + if (description.empty() == false) + { + description = GameUtils::replaceStringWithQueryable(description, item); + } + return true; +} diff --git a/src/Game/SpellClass.h b/src/Game/SpellClass.h new file mode 100755 index 00000000..f19dfca0 --- /dev/null +++ b/src/Game/SpellClass.h @@ -0,0 +1,74 @@ +#pragma once + +#include "BaseClassDefaults.h" +#include "Classifier.h" +#include "Queryable.h" +#include +#include "TexturePacks/TexturePack.h" +#include "Utils/Utils.h" + +class SpellClass : public BaseClassDefaults +{ +private: + std::shared_ptr texturePack1; + std::shared_ptr texturePack2; + size_t textureIdx1; + size_t textureIdx2; + + std::string id; + std::string name; + std::string type; + uint16_t idHash16{ 0 }; + uint16_t typeHash16{ 0 }; + + std::array, 5> descriptions; + +public: + SpellClass(const std::shared_ptr& texturePack1_, + const std::shared_ptr& texturePack2_, + size_t textureIdx1_, size_t textureIdx2_) : texturePack1(texturePack1_), + texturePack2(texturePack2_), textureIdx1(textureIdx1_), textureIdx2(textureIdx2_) {} + + void setTexturePack1(const std::shared_ptr& texturePack_) noexcept + { + texturePack1 = texturePack_; + } + void setTexturePack2(const std::shared_ptr& texturePack_) noexcept + { + texturePack2 = texturePack_; + } + + void setTextureIndex1(size_t idx_) noexcept { textureIdx1 = idx_; } + void setTextureIndex2(size_t idx_) noexcept { textureIdx2 = idx_; } + + bool getTexture1(TextureInfo& ti) const + { + return texturePack1->get(textureIdx1, ti); + } + bool getTexture2(TextureInfo& ti) const + { + return texturePack2->get(textureIdx2, ti); + } + + const std::string& Id() const noexcept { return id; } + const std::string& Name() const noexcept { return name; } + const std::string& Type() const noexcept { return type; } + uint16_t IdHash16() const noexcept { return idHash16; } + uint16_t TypeHash16() const noexcept { return typeHash16; } + + void Id(const std::string id_) + { + id = id_; + idHash16 = str2int16(id_); + } + void Name(const std::string name_) { name = name_; } + void Type(const std::string type_) + { + type = type_; + typeHash16 = str2int16(Utils::toLower(type_)); + } + + void setDescription(size_t idx, Classifier* classifier, uint16_t skipFirst); + + bool getDescription(size_t idx, const Queryable& item, std::string& description) const; +}; diff --git a/src/GameUtils.cpp b/src/GameUtils.cpp index 26b9e95c..d7a195d7 100755 --- a/src/GameUtils.cpp +++ b/src/GameUtils.cpp @@ -1,15 +1,19 @@ #include "GameUtils.h" +#if ((_MSC_VER >= 1914) || (__GNUC__ >= 8)) +#include +#else +#include +#endif #include "Game.h" -#include #include "Utils/Utils.h" namespace GameUtils { using namespace Utils; - AnimationType getAnimationType(const std::string& str, AnimationType val) + AnimationType getAnimationType(const std::string_view str, AnimationType val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("playonce"): return AnimationType::PlayOnce; @@ -134,43 +138,43 @@ namespace GameUtils { if (((int)anchor & (int)Anchor::Bottom) != 0) { - size.y += std::round((float)newWindowSize.y - (float)oldWindowSize.y); + size.y = std::round(size.y + (float)newWindowSize.y - (float)oldWindowSize.y); } } else { if (((int)anchor & (int)Anchor::Bottom) != 0) { - pos.y += std::round((float)newWindowSize.y - (float)oldWindowSize.y); + pos.y = std::round(pos.y + (float)newWindowSize.y - (float)oldWindowSize.y); } else { - pos.y += std::round(((float)newWindowSize.y - (float)oldWindowSize.y) / 2.f); + pos.y = std::round(pos.y + ((float)newWindowSize.y - (float)oldWindowSize.y) / 2.f); } } if (((int)anchor & (int)Anchor::Left) != 0) { if (((int)anchor & (int)Anchor::Right) != 0) { - size.x += std::round((float)newWindowSize.x - (float)oldWindowSize.x); + size.x = std::round(size.x + (float)newWindowSize.x - (float)oldWindowSize.x); } } else { if (((int)anchor & (int)Anchor::Right) != 0) { - pos.x += std::round((float)newWindowSize.x - (float)oldWindowSize.x); + pos.x = std::round(pos.x + (float)newWindowSize.x - (float)oldWindowSize.x); } else { - pos.x += std::round(((float)newWindowSize.x - (float)oldWindowSize.x) / 2.f); + pos.x = std::round(pos.x + ((float)newWindowSize.x - (float)oldWindowSize.x) / 2.f); } } } - Anchor getAnchor(const std::string& str, Anchor val) + Anchor getAnchor(const std::string_view str, Anchor val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("none"): return Anchor::None; @@ -197,9 +201,9 @@ namespace GameUtils } } - HorizontalAlign getHorizontalAlignment(const std::string& str, HorizontalAlign val) + HorizontalAlign getHorizontalAlignment(const std::string_view str, HorizontalAlign val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("left"): return HorizontalAlign::Left; @@ -212,9 +216,9 @@ namespace GameUtils } } - VerticalAlign getVerticalAlignment(const std::string& str, VerticalAlign val) + VerticalAlign getVerticalAlignment(const std::string_view str, VerticalAlign val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("top"): return VerticalAlign::Top; @@ -236,7 +240,7 @@ namespace GameUtils return val; } - sf::Keyboard::Key getKeyCode(const std::string& str, sf::Keyboard::Key val) + sf::Keyboard::Key getKeyCode(const std::string_view str, sf::Keyboard::Key val) { if (str.empty() == false) { @@ -247,26 +251,80 @@ namespace GameUtils { return static_cast(sf::Keyboard::A + ch - 'A'); } - if (ch >= 'a' && ch <= 'z') + else if (ch >= 'a' && ch <= 'z') { return static_cast(sf::Keyboard::A + ch - 'a'); } - if (ch >= '0' && ch <= '9') + else if (ch >= '0' && ch <= '9') { return static_cast(sf::Keyboard::Num0 + ch - '0'); } - if (ch == ' ') + switch (ch) { + case '[': + return sf::Keyboard::LBracket; + case ']': + return sf::Keyboard::RBracket; + case ';': + return sf::Keyboard::Semicolon; + case ',': + return sf::Keyboard::Comma; + case '.': + return sf::Keyboard::Period; + case '\'': + return sf::Keyboard::Quote; + case '\\': + return sf::Keyboard::Backslash; + case '~': + return sf::Keyboard::Tilde; + case '=': + return sf::Keyboard::Equal; + case ' ': return sf::Keyboard::Space; + case '+': + return sf::Keyboard::Add; + case '-': + return sf::Keyboard::Subtract; + case '*': + return sf::Keyboard::Multiply; + case '/': + return sf::Keyboard::Divide; + default: + return val; } } else { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { + case str2int16("all"): + case str2int16("any"): + return sf::Keyboard::KeyCount; case str2int16("esc"): case str2int16("escape"): return sf::Keyboard::Escape; + case str2int16("leftbracket"): + return sf::Keyboard::LBracket; + case str2int16("rightbracket"): + return sf::Keyboard::RBracket; + case str2int16("semicolon"): + return sf::Keyboard::Semicolon; + case str2int16("comma"): + return sf::Keyboard::Comma; + case str2int16("period"): + return sf::Keyboard::Period; + case str2int16("quote"): + return sf::Keyboard::Quote; + case str2int16("slash"): + return sf::Keyboard::Slash; + case str2int16("backslash"): + return sf::Keyboard::Backslash; + case str2int16("tilde"): + return sf::Keyboard::Tilde; + case str2int16("equal"): + return sf::Keyboard::Equal; + case str2int16("hyphen"): + return sf::Keyboard::Hyphen; case str2int16("space"): return sf::Keyboard::Space; case str2int16("enter"): @@ -288,6 +346,14 @@ namespace GameUtils return sf::Keyboard::Insert; case str2int16("delete"): return sf::Keyboard::Delete; + case str2int16("add"): + return sf::Keyboard::Add; + case str2int16("subtract"): + return sf::Keyboard::Subtract; + case str2int16("multiply"): + return sf::Keyboard::Multiply; + case str2int16("divide"): + return sf::Keyboard::Divide; case str2int16("left"): return sf::Keyboard::Left; case str2int16("right"): @@ -336,9 +402,9 @@ namespace GameUtils return val; } - IgnoreResource getIgnoreResource(const std::string& str, IgnoreResource val) + IgnoreResource getIgnoreResource(const std::string_view str, IgnoreResource val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("none"): return IgnoreResource::None; @@ -358,9 +424,51 @@ namespace GameUtils return val; } - InventoryPosition getInventoryPosition(const std::string& str, InventoryPosition val) + InputEvent getInputEvent(const std::string_view str, InputEvent val) + { + switch (str2int16(toLower(str))) + { + case str2int16("none"): + return InputEvent::None; + case str2int16("leftclick"): + return InputEvent::LeftClick; + case str2int16("middleclick"): + return InputEvent::MiddleClick; + case str2int16("rightclick"): + return InputEvent::RightClick; + case str2int16("mousepress"): + return InputEvent::MousePress; + case str2int16("mousemove"): + return InputEvent::MouseMove; + case str2int16("mouserelease"): + return InputEvent::MouseRelease; + case str2int16("mousescroll"): + return InputEvent::MouseScroll; + case str2int16("keypress"): + return InputEvent::KeyPress; + case str2int16("textenter"): + return InputEvent::TextEnter; + case str2int16("touchbegin"): + return InputEvent::TouchBegin; + case str2int16("touchmove"): + return InputEvent::TouchMove; + case str2int16("touchend"): + return InputEvent::TouchEnd; + case str2int16("allleftclick"): + return InputEvent::All ^ (InputEvent::MiddleClick | InputEvent::RightClick); + case str2int16("allmiddleclick"): + return InputEvent::All ^ (InputEvent::LeftClick | InputEvent::RightClick); + case str2int16("allrightclick"): + return InputEvent::All ^ (InputEvent::LeftClick | InputEvent::MiddleClick); + case str2int16("all"): + return InputEvent::All; + } + return val; + } + + InventoryPosition getInventoryPosition(const std::string_view str, InventoryPosition val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("topleft"): return InventoryPosition::TopLeft; @@ -374,9 +482,9 @@ namespace GameUtils return val; } - PlayerDirection getPlayerDirection(const std::string& str, PlayerDirection val) + PlayerDirection getPlayerDirection(const std::string_view str, PlayerDirection val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("all"): return PlayerDirection::All; @@ -401,9 +509,9 @@ namespace GameUtils } } - PlayerInventory getPlayerInventory(const std::string& str, PlayerInventory val) + PlayerInventory getPlayerInventory(const std::string_view str, PlayerInventory val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("body"): return PlayerInventory::Body; @@ -416,20 +524,42 @@ namespace GameUtils } } - size_t getPlayerInventoryIndex(const std::string& str, PlayerInventory val) + size_t getPlayerInventoryIndex(const std::string_view str, PlayerInventory val) { - try +#if ((_MSC_VER >= 1914) || (__GNUC__ >= 8)) + size_t num = (size_t)val; + auto err = std::from_chars(str.data(), str.data() + str.size(), num); + if (err.ec == std::errc() || + err.ec == std::errc::result_out_of_range) { - return std::stoul(str); + return num; } - catch (std::exception ex) {} - return (size_t)getPlayerInventory(str, val); +#else + int& errno_ref = errno; + const char* sPtr = str.data(); + char* ePtr; + errno_ref = 0; + size_t val2 = (size_t)std::strtoul(sPtr, &ePtr, 10); + + if (errno_ref == ERANGE) // out of range + { + return (size_t)val; + } + else if (sPtr == ePtr) // invalid argument + { + return (size_t)getPlayerInventory(str, val); + } + else + { + return val2; + } +#endif } - PlayerItemMount getPlayerItemMount(const std::string& str, PlayerItemMount val) + PlayerItemMount getPlayerItemMount(const std::string_view str, PlayerItemMount val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("lefthand"): return PlayerItemMount::LeftHand; @@ -450,21 +580,42 @@ namespace GameUtils } } - size_t getPlayerItemMountIndex(const std::string& str, - PlayerItemMount val) + size_t getPlayerItemMountIndex(const std::string_view str, PlayerItemMount val) { - try +#if ((_MSC_VER >= 1914) || (__GNUC__ >= 8)) + size_t num = (size_t)val; + auto err = std::from_chars(str.data(), str.data() + str.size(), num); + if (err.ec == std::errc() || + err.ec == std::errc::result_out_of_range) { - return std::stoul(str); + return num; } - catch (std::exception ex) {} - return (size_t)getPlayerItemMount(str, val); +#else + int& errno_ref = errno; + const char* sPtr = str.data(); + char* ePtr; + errno_ref = 0; + size_t val2 = (size_t)std::strtoul(sPtr, &ePtr, 10); + + if (errno_ref == ERANGE) // out of range + { + return (size_t)val; + } + else if (sPtr == ePtr) // invalid argument + { + return (size_t)getPlayerItemMount(str, val); + } + else + { + return val2; + } +#endif } - PlayerAnimation getPlayerAnimation(const std::string& str, PlayerAnimation val) + PlayerAnimation getPlayerAnimation(const std::string_view str, PlayerAnimation val) { - switch (str2int16(toLower(str).c_str())) + switch (str2int16(toLower(str))) { case str2int16("stand1"): return PlayerAnimation::Stand1; @@ -503,6 +654,23 @@ namespace GameUtils } } + PlayerStatus getPlayerStatus(const std::string_view str, PlayerStatus val) + { + switch (str2int16(toLower(str))) + { + case str2int16("stand"): + return PlayerStatus::Stand; + case str2int16("walk"): + return PlayerStatus::Walk; + case str2int16("attack"): + return PlayerStatus::Attack; + case str2int16("dead"): + return PlayerStatus::Dead; + default: + return val; + } + } + sf::Time getTime(int fps) { fps = std::clamp(fps, 1, 1000); @@ -510,7 +678,7 @@ namespace GameUtils } bool getUIObjProp(const UIObject& uiObject, const uint16_t propHash16, - const std::string& prop, Variable& var) + const std::string_view prop, Variable& var) { switch (propHash16) { @@ -541,7 +709,7 @@ namespace GameUtils } break; case str2int16("visible"): - var = Variable((bool)uiObject.Visible()); + var = Variable(uiObject.Visible()); break; default: return false; @@ -549,14 +717,11 @@ namespace GameUtils return true; } - bool getObjectProperty(const Game& game, const std::string& str, Variable& var) + bool getObjectProperty(const Game& game, const std::string_view str, Variable& var) { - if ((str.size() > 3) - && (str.front() == '|') - && (str.back() == '|')) + if (str.size() > 1) { - auto propStr = str.substr(1, str.size() - 2); - auto props = splitStringIn2(propStr, '|'); + auto props = splitStringIn2(str, '.'); const auto& id = props.first; const auto& uiElemProps = props.second; @@ -564,7 +729,7 @@ namespace GameUtils { return game.getProperty(uiElemProps, var); } - const UIObject* uiObject = game.Resources().getDrawable(id); + const UIObject* uiObject = game.Resources().getDrawable(std::string(id)); if (uiObject == nullptr) { if (id == "focus") @@ -584,23 +749,62 @@ namespace GameUtils return false; } - std::regex regexPercent(R"((\%[\w.]+\%))"); - - std::string replaceStringWithQueryable(const std::string& str, const Queryable& obj) + std::string replaceStringWithQueryable(const std::string_view str, const Queryable& obj) { - std::string str1(str); - std::string str2(str1); - std::smatch match; - while (std::regex_search(str1, match, regexPercent) == true) + std::string str2(str); + size_t firstTokenStart = 0; + while (true) { - auto strProp = match[1].str(); + firstTokenStart = str.find('%', firstTokenStart); + if (firstTokenStart == std::string_view::npos) + { + break; + } + size_t firstTokenStop = firstTokenStart + 1; + size_t secondTokenStart = str.find_first_of('%', firstTokenStop); + if (secondTokenStart == std::string_view::npos) + { + break; + } + size_t secondTokenStop = secondTokenStart + 1; + + std::string_view strProp(str.data() + firstTokenStart, secondTokenStop - firstTokenStart); Variable var; if (obj.getProperty(strProp.substr(1, strProp.size() - 2), var) == true) { - Utils::replaceStringInPlace( - str2, strProp, VarUtils::toString(var)); + Utils::replaceStringInPlace(str2, strProp, VarUtils::toString(var)); + } + firstTokenStart = secondTokenStop; + } + return str2; + } + + std::string replaceStringWithVarOrProp(const std::string_view str, const Game& obj) + { + std::string str2(str); + size_t firstTokenStart = 0; + while (true) + { + firstTokenStart = str.find('%', firstTokenStart); + if (firstTokenStart == std::string_view::npos) + { + break; + } + size_t firstTokenStop = firstTokenStart + 1; + size_t secondTokenStart = str.find_first_of('%', firstTokenStop); + if (secondTokenStart == std::string_view::npos) + { + break; + } + size_t secondTokenStop = secondTokenStart + 1; + + std::string_view strProp(str.data() + firstTokenStart, secondTokenStop - firstTokenStart); + Variable var; + if (obj.getVarOrProp(strProp, var) == true) + { + Utils::replaceStringInPlace(str2, strProp, VarUtils::toString(var)); } - str1 = match.suffix().str(); + firstTokenStart = secondTokenStop; } return str2; } diff --git a/src/GameUtils.h b/src/GameUtils.h index fa0fd9da..2b3d7ef0 100755 --- a/src/GameUtils.h +++ b/src/GameUtils.h @@ -5,8 +5,10 @@ #include "AnimationType.h" #include "Game/GameProperties.h" #include "IgnoreResource.h" +#include "InputEvent.h" #include #include +#include #include #include "UIObject.h" @@ -16,7 +18,7 @@ namespace GameUtils { const int DoubleClickDelay = 500; - AnimationType getAnimationType(const std::string& str, + AnimationType getAnimationType(const std::string_view str, AnimationType val = AnimationType::Looped); sf::Vector2f getAlignmentPosition(const sf::Vector2f& position, const sf::Vector2f& size, @@ -28,45 +30,54 @@ namespace GameUtils void setAnchorPosSize(Anchor anchor, sf::Vector2f& pos, sf::Vector2f& size, const sf::Vector2u& oldWindowSize, const sf::Vector2u& newWindowSize) noexcept; - Anchor getAnchor(const std::string& str, Anchor val); + Anchor getAnchor(const std::string_view str, Anchor val); - HorizontalAlign getHorizontalAlignment(const std::string& str, + HorizontalAlign getHorizontalAlignment(const std::string_view str, HorizontalAlign val = HorizontalAlign::Left); - VerticalAlign getVerticalAlignment(const std::string& str, + VerticalAlign getVerticalAlignment(const std::string_view str, VerticalAlign val = VerticalAlign::Top); sf::Keyboard::Key getKeyCode(int num, sf::Keyboard::Key val) noexcept; - sf::Keyboard::Key getKeyCode(const std::string& str, sf::Keyboard::Key val); + sf::Keyboard::Key getKeyCode(const std::string_view str, sf::Keyboard::Key val); - IgnoreResource getIgnoreResource(const std::string& str, IgnoreResource val); + IgnoreResource getIgnoreResource(const std::string_view str, IgnoreResource val); - InventoryPosition getInventoryPosition(const std::string& str, + InputEvent getInputEvent(const std::string_view str, InputEvent val); + + InventoryPosition getInventoryPosition(const std::string_view str, InventoryPosition val = InventoryPosition::TopLeft); - PlayerDirection getPlayerDirection(const std::string& str, PlayerDirection val); + PlayerDirection getPlayerDirection(const std::string_view str, PlayerDirection val); - PlayerInventory getPlayerInventory(const std::string& str, + PlayerInventory getPlayerInventory(const std::string_view str, PlayerInventory val = PlayerInventory::Body); - size_t getPlayerInventoryIndex(const std::string& str, + size_t getPlayerInventoryIndex(const std::string_view str, PlayerInventory val = PlayerInventory::Body); - PlayerItemMount getPlayerItemMount(const std::string& str, + PlayerItemMount getPlayerItemMount(const std::string_view str, PlayerItemMount val = PlayerItemMount::LeftHand); - size_t getPlayerItemMountIndex(const std::string& str, + size_t getPlayerItemMountIndex(const std::string_view str, PlayerItemMount val = PlayerItemMount::LeftHand); - PlayerAnimation getPlayerAnimation(const std::string& str, PlayerAnimation val); + PlayerAnimation getPlayerAnimation(const std::string_view str, PlayerAnimation val); + + PlayerStatus getPlayerStatus(const std::string_view str, PlayerStatus val); sf::Time getTime(int fps); bool getUIObjProp(const UIObject& uiObject, const uint16_t propHash16, - const std::string& prop, Variable& var); + const std::string_view prop, Variable& var); + + // gets game's UIObject property. str has no tokens. ex: "game.title" + bool getObjectProperty(const Game& game, const std::string_view str, Variable& var); - bool getObjectProperty(const Game& game, const std::string& str, Variable& var); + // replaces "%str%" with obj.getProperty("str") + std::string replaceStringWithQueryable(const std::string_view str, const Queryable& obj); - std::string replaceStringWithQueryable(const std::string& str, const Queryable& obj); + // replaces "%str%" with game.getVarOrProp("str") + std::string replaceStringWithVarOrProp(const std::string_view str, const Game& obj); } diff --git a/src/IfCondition.cpp b/src/IfCondition.cpp new file mode 100755 index 00000000..d8c963d6 --- /dev/null +++ b/src/IfCondition.cpp @@ -0,0 +1,131 @@ +#include "IfCondition.h" +#include "Game.h" +#include +#include "Utils/Utils.h" + +Variable IfCondition::getVariable(const Game& game, const VarOrPredicate& varOrPred) +{ + if (holdsVariable(varOrPred) == true) + { + return game.getVarOrProp(std::get(varOrPred)); + } + else + { + auto predicate = std::get>(varOrPred).get(); + if (predicate != nullptr) + { + return predicate->getResult(game); + } + return {}; + } +} + +bool IfCondition::evalCondition(uint16_t conditionHash16, + const Variable& var1, const Variable& var2) +{ + switch (conditionHash16) + { + default: + case str2int16("=="): + return var1 == var2; + case str2int16("!="): + return var1 != var2; + case str2int16(">"): + return var1 > var2; + case str2int16(">="): + return var1 >= var2; + case str2int16("<"): + return var1 < var2; + case str2int16("<="): + return var1 <= var2; + case str2int16("regex"): + { + bool regexMatch = false; + try + { + if (std::holds_alternative(var1) == true) + { + auto var2str = VarUtils::toString(var2); + std::smatch match; + std::regex regex(std::get(var1)); + regexMatch = std::regex_match(var2str, match, regex); + } + } + catch (std::exception ex) {} + return regexMatch; + } + } +} + +void IfCondition::addCondition(ConditionOp op) +{ + elements.push_back(op); +} + +void IfCondition::addCondition(uint16_t conditionHash16, + const VarOrPredicate& param1, const VarOrPredicate& param2) +{ + Condition c; + c.conditionHash16 = conditionHash16; + c.param1 = param1; + c.param2 = param2; + elements.push_back(c); +} + +bool IfCondition::eval(size_t& idx, const Game& game) const +{ + bool val = false; + bool firstIteration = (idx == 0); + ConditionOp currOp = ConditionOp::Or; + + while (idx < elements.size()) + { + const auto& elem = elements[idx]; + idx++; + bool val2 = false; + if (std::holds_alternative(elem) == true) + { + const auto& c = std::get(elem); + auto param1 = getVariable(game, c.param1); + auto param2 = getVariable(game, c.param2); + val2 = evalCondition(c.conditionHash16, param1, param2); + } + else + { + auto currOp2 = std::get(elem); + switch (currOp2) + { + case ConditionOp::And: + case ConditionOp::Or: + currOp = currOp2; + continue; + case ConditionOp::LeftBracket: + val2 = eval(idx, game); + break; + case ConditionOp::RightBracket: + return val; + default: + continue; + } + } + if (currOp == ConditionOp::And) + { + val = val & val2; + if (firstIteration == true && val == false) + { + return false; + } + } + else if (currOp == ConditionOp::Or) + { + val = val | val2; + } + } + return val; +} + +bool IfCondition::eval(const Game& game) const +{ + size_t idx = 0; + return eval(idx, game); +} diff --git a/src/IfCondition.h b/src/IfCondition.h new file mode 100755 index 00000000..a30a71ef --- /dev/null +++ b/src/IfCondition.h @@ -0,0 +1,48 @@ +#pragma once + +#include "VarOrPredicate.h" +#include + +class Game; + +// use brackets to force order +// ex: var1 == 2 and (var2 == 3 or var2 = 4) +class IfCondition +{ +public: + enum class ConditionOp + { + And, + Or, + LeftBracket, + RightBracket, + }; + +private: + struct Condition + { + uint16_t conditionHash16{ 0 }; + VarOrPredicate param1; + VarOrPredicate param2; + }; + + typedef std::variant ConditionElement; + + std::vector elements; + + bool eval(size_t& idx, const Game& game) const; + +public: + static Variable getVariable(const Game& game, const VarOrPredicate& varOrPred); + + static bool evalCondition(uint16_t conditionHash16, + const Variable& var1, const Variable& var2); + + void addCondition(ConditionOp op); + void addCondition(uint16_t conditionHash16, + const VarOrPredicate& param1, const VarOrPredicate& param2); + + bool empty() const noexcept { return elements.empty(); } + + bool eval(const Game& game) const; +}; diff --git a/src/IgnoreResource.h b/src/IgnoreResource.h index e3eab329..66fe807e 100755 --- a/src/IgnoreResource.h +++ b/src/IgnoreResource.h @@ -10,10 +10,10 @@ enum class IgnoreResource : int using T = std::underlying_type_t; -inline IgnoreResource operator~ (IgnoreResource a) noexcept { return (IgnoreResource)~static_cast(a); } -inline IgnoreResource operator| (IgnoreResource a, IgnoreResource b) noexcept { return (IgnoreResource)(static_cast(a) | static_cast(b)); } -inline IgnoreResource operator& (IgnoreResource a, IgnoreResource b) noexcept { return (IgnoreResource)(static_cast(a) & static_cast(b)); } -inline IgnoreResource operator^ (IgnoreResource a, IgnoreResource b) noexcept { return (IgnoreResource)(static_cast(a) ^ static_cast(b)); } -inline IgnoreResource& operator|= (IgnoreResource& a, IgnoreResource b) noexcept { a = (IgnoreResource)(static_cast(a) | static_cast(b)); return a; } -inline IgnoreResource& operator&= (IgnoreResource& a, IgnoreResource b) noexcept { a = (IgnoreResource)(static_cast(a) & static_cast(b)); return a; } -inline IgnoreResource& operator^= (IgnoreResource& a, IgnoreResource b) noexcept { a = (IgnoreResource)(static_cast(a) ^ static_cast(b)); return a; } +constexpr IgnoreResource operator~ (IgnoreResource a) noexcept { return (IgnoreResource)~static_cast(a); } +constexpr IgnoreResource operator| (IgnoreResource a, IgnoreResource b) noexcept { return (IgnoreResource)(static_cast(a) | static_cast(b)); } +constexpr IgnoreResource operator& (IgnoreResource a, IgnoreResource b) noexcept { return (IgnoreResource)(static_cast(a) & static_cast(b)); } +constexpr IgnoreResource operator^ (IgnoreResource a, IgnoreResource b) noexcept { return (IgnoreResource)(static_cast(a) ^ static_cast(b)); } +constexpr IgnoreResource& operator|= (IgnoreResource& a, IgnoreResource b) noexcept { a = (IgnoreResource)(static_cast(a) | static_cast(b)); return a; } +constexpr IgnoreResource& operator&= (IgnoreResource& a, IgnoreResource b) noexcept { a = (IgnoreResource)(static_cast(a) & static_cast(b)); return a; } +constexpr IgnoreResource& operator^= (IgnoreResource& a, IgnoreResource b) noexcept { a = (IgnoreResource)(static_cast(a) ^ static_cast(b)); return a; } diff --git a/src/Image.cpp b/src/Image.cpp index 73cb845e..b3d1928a 100755 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -1,7 +1,7 @@ #include "Image.h" #include "Game.h" #include "GameUtils.h" -#include "SFMLUtils.h" +#include "SFML/SFMLUtils.h" #include "Utils/Utils.h" void Image::setOrigin() @@ -27,12 +27,12 @@ void Image::updateSize(const Game& game) sprite.setPosition(pos); } -bool Image::getProperty(const std::string& prop, Variable& var) const +bool Image::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - return GameUtils::getUIObjProp(*this, str2int16(props.first.c_str()), props.second, var); + return GameUtils::getUIObjProp(*this, str2int16(props.first), props.second, var); } diff --git a/src/Image.h b/src/Image.h index 2442043c..94f3e56f 100755 --- a/src/Image.h +++ b/src/Image.h @@ -1,6 +1,6 @@ #pragma once -#include "Sprite2.h" +#include "SFML/Sprite2.h" #include "UIObject.h" class Image : public virtual UIObject @@ -41,6 +41,7 @@ class Image : public virtual UIObject } bool isOutlineEnabled() const noexcept { return sprite.isOutlineEnabled(); } + const std::shared_ptr& getPalette() const noexcept { return sprite.getPalette(); } void setPalette(const std::shared_ptr& pal) noexcept { sprite.setPalette(pal); } bool hasPalette() const noexcept { return sprite.hasPalette(); } @@ -48,6 +49,7 @@ class Image : public virtual UIObject const sf::IntRect& getTextureRect() const { return sprite.getTextureRect(); } + void setTexture(const TextureInfo& ti, bool resetRect = false) { sprite.setTexture(ti, resetRect); } void setTexture(const sf::Texture& texture, bool resetRect = false) { sprite.setTexture(texture, resetRect); } void setTextureRect(const sf::IntRect& rectangle) { sprite.setTextureRect(rectangle); } @@ -79,5 +81,5 @@ class Image : public virtual UIObject } } - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/ImageContainers/CelImageContainer.cpp b/src/ImageContainers/CelImageContainer.cpp index 29c8ff40..955f040b 100755 --- a/src/ImageContainers/CelImageContainer.cpp +++ b/src/ImageContainers/CelImageContainer.cpp @@ -633,7 +633,7 @@ sf::Image2 CelImageContainer::decode(const gsl::span frameData, } } -CelImageContainer::CelImageContainer(const char* fileName) +CelImageContainer::CelImageContainer(const std::string_view fileName) { type = CelType::V1Regular; @@ -650,7 +650,7 @@ CelImageContainer::CelImageContainer(const char* fileName) uint32_t celFrameSize = 0; { - sf::PhysFSStream file(fileName); + sf::PhysFSStream file(fileName.data()); // Opening CL2 file with a QBuffer to load it in RAM if (file.hasError() == true) { @@ -660,7 +660,7 @@ CelImageContainer::CelImageContainer(const char* fileName) file.read(fileData.data(), file.getSize()); } - LittleEndianStreamReader fileStream(fileData); + LittleEndianStreamReader fileStream(fileData.data(), fileData.size()); // CEL HEADER CHECKS @@ -668,12 +668,12 @@ CelImageContainer::CelImageContainer(const char* fileName) fileStream.read(firstDword); // Trying to find file size in CEL header - if (fileData.size() < (4 + firstDword * 4 + 4)) + if (fileData.size() < ((uint64_t)firstDword * 4 + 4 + 4)) { return; } - fileStream.seek(firstDword * 4 + 4); + fileStream.seek((uint64_t)firstDword * 4 + 4); fileStream.read(fileSizeDword); // If the dword is not equal to the file size then @@ -696,12 +696,12 @@ CelImageContainer::CelImageContainer(const char* fileName) fileStream.read(lastCelFrameCount); // Read the last CEL size - if (fileData.size() < (lastCelOffset + 4 + lastCelFrameCount * 4 + 4)) + if (fileData.size() < ((uint64_t)lastCelOffset + 4 + (uint64_t)lastCelFrameCount * 4 + 4)) { return; } - fileStream.seek(lastCelOffset + 4 + lastCelFrameCount * 4); + fileStream.seek((uint64_t)lastCelOffset + 4 + (uint64_t)lastCelFrameCount * 4); fileStream.read(lastCelSize); // If the last CEL size plus the last CEL offset is equal to @@ -729,7 +729,7 @@ CelImageContainer::CelImageContainer(const char* fileName) // Going through all CELs for (size_t i = 0; i * 4 < firstDword; i++) { - fileStream.seek(i * 4); + fileStream.seek((uint64_t)i * 4); fileStream.read(celOffset); fileStream.seek(celOffset); @@ -745,7 +745,7 @@ CelImageContainer::CelImageContainer(const char* fileName) celFrameStartOffset = 0; celFrameEndOffset = 0; - fileStream.seek(celOffset + j * 4); + fileStream.seek((uint64_t)celOffset + (uint64_t)j * 4); fileStream.read(celFrameStartOffset); fileStream.read(celFrameEndOffset); @@ -767,7 +767,7 @@ CelImageContainer::CelImageContainer(const char* fileName) celFrameStartOffset = 0; celFrameEndOffset = 0; - fileStream.seek(i * 4); + fileStream.seek((uint64_t)i * 4); fileStream.read(celFrameStartOffset); fileStream.read(celFrameEndOffset); diff --git a/src/ImageContainers/CelImageContainer.h b/src/ImageContainers/CelImageContainer.h index 75811a0e..fd99666a 100755 --- a/src/ImageContainers/CelImageContainer.h +++ b/src/ImageContainers/CelImageContainer.h @@ -2,6 +2,7 @@ #include "CelBaseImageContainer.h" #include "gsl/gsl" +#include class CelImageContainer : public CelBaseImageContainer { @@ -42,7 +43,7 @@ class CelImageContainer : public CelBaseImageContainer const PaletteArray* palette); public: - CelImageContainer(const char* fileName); + CelImageContainer(const std::string_view fileName); virtual sf::Image2 get(size_t index, const PaletteArray * palette) const; }; diff --git a/src/ImageContainers/Cl2ImageContainer.cpp b/src/ImageContainers/Cl2ImageContainer.cpp index 7e1f0da5..0d4da735 100755 --- a/src/ImageContainers/Cl2ImageContainer.cpp +++ b/src/ImageContainers/Cl2ImageContainer.cpp @@ -140,14 +140,14 @@ sf::Image2 Cl2ImageContainer::decode(const gsl::span frameData, return img; } -Cl2ImageContainer::Cl2ImageContainer(const char* fileName) +Cl2ImageContainer::Cl2ImageContainer(const std::string_view fileName) { type = CelType::V2MultipleGroups; uint32_t firstDword = 0; uint32_t fileSizeDword = 0; { - sf::PhysFSStream file(fileName); + sf::PhysFSStream file(fileName.data()); // Opening CL2 file with a QBuffer to load it in RAM if (file.hasError() == true) { @@ -157,7 +157,7 @@ Cl2ImageContainer::Cl2ImageContainer(const char* fileName) file.read(fileData.data(), file.getSize()); } - LittleEndianStreamReader fileStream(fileData); + LittleEndianStreamReader fileStream(fileData.data(), fileData.size()); // CL2 HEADER CHECKS @@ -165,12 +165,12 @@ Cl2ImageContainer::Cl2ImageContainer(const char* fileName) fileStream.read(firstDword); // Trying to find file size in CL2 header - if (fileData.size() < (firstDword * 4 + 4 + 4)) + if (fileData.size() < ((uint64_t)firstDword * 4 + 4 + 4)) { return; } - fileStream.seek(firstDword * 4 + 4); + fileStream.seek((uint64_t)firstDword * 4 + 4); fileStream.read(fileSizeDword); // If the dword is not equal to the file size then @@ -198,7 +198,7 @@ Cl2ImageContainer::Cl2ImageContainer(const char* fileName) return; } - fileStream.seek(lastGroupHeaderOffset + lastGroupFrameCount * 4 + 4); + fileStream.seek((uint64_t)lastGroupHeaderOffset + (uint64_t)lastGroupFrameCount * 4 + 4); fileStream.read(fileSizeDword); // The offset is from the beginning of the last group header // so we need to add the offset of the lasr group header @@ -232,7 +232,7 @@ Cl2ImageContainer::Cl2ImageContainer(const char* fileName) uint32_t groupOffset; uint32_t groupFrameCount; - fileStream.seek(i * 4); + fileStream.seek((uint64_t)i * 4); fileStream.read(groupOffset); fileStream.seek(groupOffset); @@ -248,7 +248,7 @@ Cl2ImageContainer::Cl2ImageContainer(const char* fileName) uint32_t frameStartOffset = 0; uint32_t frameEndOffset = 0; - fileStream.seek(groupOffset + j * 4); + fileStream.seek((uint64_t)groupOffset + (uint64_t)j * 4); fileStream.read(frameStartOffset); fileStream.read(frameEndOffset); @@ -266,7 +266,7 @@ Cl2ImageContainer::Cl2ImageContainer(const char* fileName) uint32_t frameStartOffset; uint32_t frameEndOffset; - fileStream.seek(i * 4); + fileStream.seek((uint64_t)i * 4); fileStream.read(frameStartOffset); fileStream.read(frameEndOffset); diff --git a/src/ImageContainers/Cl2ImageContainer.h b/src/ImageContainers/Cl2ImageContainer.h index 819d0537..ffbce048 100755 --- a/src/ImageContainers/Cl2ImageContainer.h +++ b/src/ImageContainers/Cl2ImageContainer.h @@ -2,6 +2,7 @@ #include "CelBaseImageContainer.h" #include "gsl/gsl" +#include class Cl2ImageContainer : public CelBaseImageContainer { @@ -12,7 +13,7 @@ class Cl2ImageContainer : public CelBaseImageContainer const PaletteArray* palette); public: - Cl2ImageContainer(const char* fileName); + Cl2ImageContainer(const std::string_view fileName); virtual sf::Image2 get(size_t index, const PaletteArray * palette) const; }; diff --git a/src/ImageContainers/ImageContainer.h b/src/ImageContainers/ImageContainer.h index 4d45c203..ec04be0b 100755 --- a/src/ImageContainers/ImageContainer.h +++ b/src/ImageContainers/ImageContainer.h @@ -1,12 +1,12 @@ #pragma once -#include "Image2.h" #include "Palette.h" +#include "SFML/Image2.h" class ImageContainer { public: - virtual ~ImageContainer() {}; + virtual ~ImageContainer() = default; virtual sf::Image2 get(size_t index, const PaletteArray* palette) const = 0; virtual size_t size() const noexcept = 0; }; diff --git a/src/ImageContainers/SimpleImageContainer.cpp b/src/ImageContainers/SimpleImageContainer.cpp index 07a963a9..299d0051 100755 --- a/src/ImageContainers/SimpleImageContainer.cpp +++ b/src/ImageContainers/SimpleImageContainer.cpp @@ -1,7 +1,7 @@ #include "SimpleImageContainer.h" #include "ImageUtils.h" -SimpleImageContainer::SimpleImageContainer(const std::string& fileName, size_t xFrames_, +SimpleImageContainer::SimpleImageContainer(const std::string_view fileName, size_t xFrames_, size_t yFrames_, bool horizontalDirection_, const sf::Color& transparencyMask) : horizontalDirection(horizontalDirection_) { diff --git a/src/ImageContainers/SimpleImageContainer.h b/src/ImageContainers/SimpleImageContainer.h index 946b0a73..d043a656 100755 --- a/src/ImageContainers/SimpleImageContainer.h +++ b/src/ImageContainers/SimpleImageContainer.h @@ -1,7 +1,7 @@ #pragma once #include "ImageContainer.h" -#include +#include class SimpleImageContainer : public ImageContainer { @@ -14,7 +14,7 @@ class SimpleImageContainer : public ImageContainer bool horizontalDirection{ false }; public: - SimpleImageContainer(const std::string& fileName, size_t xFrames_, + SimpleImageContainer(const std::string_view fileName, size_t xFrames_, size_t yFrames_, bool horizontalDirection_ = false, const sf::Color& transparencyMask = sf::Color::Transparent); diff --git a/src/ImageUtils.cpp b/src/ImageUtils.cpp index 13848bb3..296302e8 100755 --- a/src/ImageUtils.cpp +++ b/src/ImageUtils.cpp @@ -32,17 +32,17 @@ namespace ImageUtils } } - sf::Image loadImage(const std::string& fileName, const sf::Color& transparencyMask) + sf::Image loadImage(const std::string_view fileName, const sf::Color& transparencyMask) { sf::Image image; if (Utils::endsWith(Utils::toLower(fileName), ".pcx")) { - image = LoadImagePCX(fileName.c_str()); + image = LoadImagePCX(fileName.data()); } else { - sf::PhysFSStream file(fileName); + sf::PhysFSStream file(fileName.data()); if (file.hasError() == true) { return image; @@ -58,7 +58,7 @@ namespace ImageUtils { if (imgContainer.size() == 1) { - return imgContainer.get(0, &pal->palette); + return imgContainer.get(0, (pal == nullptr ? nullptr : &pal->palette)); } CachedImagePack imgCache(&imgContainer, pal); @@ -96,13 +96,13 @@ namespace ImageUtils } sf::Image loadImageFrame(const ImageContainer& imgContainer, - const Palette& pal, size_t frameIdx) + const PaletteArray* pal, size_t frameIdx) { if (imgContainer.size() > 0 && frameIdx < imgContainer.size()) { - return imgContainer.get(frameIdx, &pal.palette); + return imgContainer.get(frameIdx, pal); } - return sf::Image(); + return {}; } sf::Image loadBitmapFontImage(const ImageContainer& imgContainer, @@ -113,7 +113,7 @@ namespace ImageUtils auto cacheSize = imgCache.size(); if (cacheSize == 0) { - return sf::Image(); + return {}; } auto firstImgSize = imgCache[0].getSize(); diff --git a/src/ImageUtils.h b/src/ImageUtils.h index c78d818b..d3d86185 100755 --- a/src/ImageUtils.h +++ b/src/ImageUtils.h @@ -9,14 +9,14 @@ namespace ImageUtils void applyMask(sf::Image& image, const sf::Color& transparencyMask = sf::Color::Transparent); - sf::Image loadImage(const std::string& fileName, + sf::Image loadImage(const std::string_view fileName, const sf::Color& transparencyMask = sf::Color::Transparent); sf::Image loadImage(const ImageContainer& imgContainer, const std::shared_ptr& pal); sf::Image loadImageFrame(const ImageContainer& imgContainer, - const Palette& pal, size_t frameIdx); + const PaletteArray* pal, size_t frameIdx); sf::Image loadBitmapFontImage(const ImageContainer& imgContainer, const char* fileNameBin, const std::shared_ptr& pal); diff --git a/src/InputEvent.h b/src/InputEvent.h new file mode 100755 index 00000000..bb519aa0 --- /dev/null +++ b/src/InputEvent.h @@ -0,0 +1,31 @@ +#pragma once + +#include + +enum class InputEvent : int +{ + None = 0, + LeftClick = 1, + MiddleClick = 2, + RightClick = 4, + MousePress = 8, + MouseMove = 16, + MouseRelease = 32, + MouseScroll = 64, + KeyPress = 128, + TextEnter = 256, + TouchBegin = 512, + TouchMove = 1024, + TouchEnd = 2048, + All = 0xFFF +}; + +using T = std::underlying_type_t; + +constexpr InputEvent operator~ (InputEvent a) noexcept { return (InputEvent)~static_cast(a); } +constexpr InputEvent operator| (InputEvent a, InputEvent b) noexcept { return (InputEvent)(static_cast(a) | static_cast(b)); } +constexpr InputEvent operator& (InputEvent a, InputEvent b) noexcept { return (InputEvent)(static_cast(a) & static_cast(b)); } +constexpr InputEvent operator^ (InputEvent a, InputEvent b) noexcept { return (InputEvent)(static_cast(a) ^ static_cast(b)); } +constexpr InputEvent& operator|= (InputEvent& a, InputEvent b) noexcept { a = (InputEvent)(static_cast(a) | static_cast(b)); return a; } +constexpr InputEvent& operator&= (InputEvent& a, InputEvent b) noexcept { a = (InputEvent)(static_cast(a) & static_cast(b)); return a; } +constexpr InputEvent& operator^= (InputEvent& a, InputEvent b) noexcept { a = (InputEvent)(static_cast(a) ^ static_cast(b)); return a; } diff --git a/src/InputText.cpp b/src/InputText.cpp index 959e2794..fe7a5dea 100755 --- a/src/InputText.cpp +++ b/src/InputText.cpp @@ -12,8 +12,8 @@ std::shared_ptr InputText::getAction(uint16_t nameHash16) const noexcept case str2int16("click"): case str2int16("enter"): return actionEnter; - case str2int16("minSize"): - return actionMinSize; + case str2int16("minLength"): + return actionMinLength; default: return nullptr; } @@ -30,8 +30,8 @@ bool InputText::setAction(uint16_t nameHash16, const std::shared_ptr& ac case str2int16("enter"): actionEnter = action; break; - case str2int16("minSize"): - actionMinSize = action; + case str2int16("minLength"): + actionMinLength = action; break; default: return false; @@ -39,14 +39,78 @@ bool InputText::setAction(uint16_t nameHash16, const std::shared_ptr& ac return true; } +void InputText::setRegex(const std::string& regex_) +{ + regex.reset(); + if (regex_.size() > 0) + { + try + { + regex = std::make_optional(regex_, std::regex::ECMAScript); + } + catch (std::exception ex) {} + } +} + +bool InputText::isValidMin(const std::string& str) const noexcept +{ + if (str.size() < minLength) + { + return false; + } + if (minValue.has_value() == true) + { + if (std::holds_alternative(*minValue) == true) + { + return std::get(*minValue) <= str; + } + else if (std::holds_alternative(*minValue) == true) + { + return std::get(*minValue) <= Utils::strtoll(str); + } + else if (std::holds_alternative(*minValue) == true) + { + return std::get(*minValue) <= Utils::strtod(str); + } + } + return true; +} + +bool InputText::isValidMax(const std::string& str) const noexcept +{ + if (maxLength > 0 && str.size() > maxLength) + { + return false; + } + if (maxValue.has_value() == true) + { + if (std::holds_alternative(*maxValue) == true) + { + return std::get(*maxValue) >= str; + } + else if (std::holds_alternative(*maxValue) == true) + { + return std::get(*maxValue) >= Utils::strtoll(str); + } + else if (std::holds_alternative(*maxValue) == true) + { + return std::get(*maxValue) >= Utils::strtod(str); + } + } + return true; +} + void InputText::click(Game& game) { - auto txt = text->getText(); - if (txt.size() < minSize && actionMinSize != nullptr) + if (isValidMin(text->getText()) == false) { - game.Events().addBack(actionMinSize); + if (actionMinLength != nullptr) + { + game.Events().addBack(actionMinLength); + } + return; } - else if (actionEnter != nullptr) + if (actionEnter != nullptr) { game.Events().addBack(actionEnter); } @@ -74,13 +138,14 @@ void InputText::update(Game& game) } else if (ch < 0 || ch >= 32) { - if (maxSize > 0 && txt.size() >= maxSize) + txt.push_back(ch); + + if (isValidMax(txt) == false) { break; } - - txt.push_back(ch); - if (hasRegex == true && std::regex_match(txt, regex) == false) + if (regex.has_value() == true && + std::regex_match(txt, *regex) == false) { break; } @@ -96,21 +161,24 @@ void InputText::update(Game& game) text->update(game); } -bool InputText::getProperty(const std::string& prop, Variable& var) const +bool InputText::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); switch (propHash) { - case str2int16("text"): - var = Variable(this->getText()); + case str2int16("number"): + var = Variable((int64_t)std::strtoll(text->getText().c_str(), nullptr, 10)); + break; + case str2int16("double"): + var = Variable((int64_t)std::strtod(text->getText().c_str(), nullptr)); break; default: - return GameUtils::getUIObjProp(*this, propHash, props.second, var); + return text->getProperty(prop, var); } return true; } diff --git a/src/InputText.h b/src/InputText.h index a4b88c37..a87858c6 100755 --- a/src/InputText.h +++ b/src/InputText.h @@ -3,6 +3,7 @@ #include "Actions/Action.h" #include "DrawableText.h" #include +#include #include #include #include "UIObject.h" @@ -13,15 +14,18 @@ class InputText : public UIObject std::unique_ptr text; std::shared_ptr actionChange; std::shared_ptr actionEnter; - std::shared_ptr actionMinSize; - unsigned minSize; - unsigned maxSize; - bool hasRegex{ false }; - std::regex regex; + std::shared_ptr actionMinLength; + size_t minLength{ 0 }; + size_t maxLength{ 0 }; + std::optional minValue; + std::optional maxValue; + std::optional regex; + + bool isValidMin(const std::string& str) const noexcept; + bool isValidMax(const std::string& str) const noexcept; public: - InputText(std::unique_ptr text_, unsigned minSize_, unsigned maxSize_) - : text(std::move(text_)), minSize(minSize_), maxSize(maxSize_) {} + InputText(std::unique_ptr text_) : text(std::move(text_)) {} void setText(const std::string& string) { text->setText(string); } void setColor(const sf::Color& color) { text->setColor(color); } @@ -41,15 +45,11 @@ class InputText : public UIObject virtual sf::Vector2f Size() const { return text->Size(); } virtual void Size(const sf::Vector2f& size) noexcept {} - void setRegex(const std::string& regex_) - { - hasRegex = false; - if (regex_.size() > 0) - { - regex.assign(regex_, std::regex::ECMAScript); - hasRegex = true; - } - } + void setMinLength(size_t length) noexcept { minLength = length; } + void setMaxLength(size_t length) noexcept { maxLength = length; } + void setMinValue(const Variable& var) { minValue = var; } + void setMaxValue(const Variable& var) { maxValue = var; } + void setRegex(const std::string& regex_); void click(Game& game); @@ -63,5 +63,5 @@ class InputText : public UIObject virtual void update(Game& game); - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/Json/JsonUtils.cpp b/src/Json/JsonUtils.cpp index 312fe587..472153d5 100755 --- a/src/Json/JsonUtils.cpp +++ b/src/Json/JsonUtils.cpp @@ -29,10 +29,8 @@ namespace JsonUtils } } - std::regex regexPercent(R"((\%[\w.]+\%))"); - void replaceStringWithVariable(Value& elem, - Value::AllocatorType& allocator, const std::string& str, + Value::AllocatorType& allocator, const std::string_view str, const Variable& var, bool changeValueType) { if (elem.IsString() == false || @@ -40,7 +38,7 @@ namespace JsonUtils { return; } - std::string str1(elem.GetString()); + std::string str1(elem.GetString(), elem.GetStringLength()); if (changeValueType == true && str1 == str) @@ -61,18 +59,36 @@ namespace JsonUtils const Queryable& obj, bool changeValueType) { if (elem.IsString() == false || - elem.GetStringLength() == 0) + elem.GetStringLength() <= 2) { return; } - std::string str1(elem.GetString()); - std::string str2(str1); - std::smatch match; + + std::string_view str(elem.GetString(), elem.GetStringLength()); + std::string str2; + size_t firstTokenStart = 0; bool hadMatch = false; - while (std::regex_search(str1, match, regexPercent) == true) + while (true) { - hadMatch = true; - auto strProp = match[1].str(); + firstTokenStart = str.find('%', firstTokenStart); + if (firstTokenStart == std::string_view::npos) + { + break; + } + size_t firstTokenStop = firstTokenStart + 1; + size_t secondTokenStart = str.find_first_of('%', firstTokenStop); + if (secondTokenStart == std::string_view::npos) + { + break; + } + size_t secondTokenStop = secondTokenStart + 1; + if (hadMatch == false) + { + hadMatch = true; + str2 = str; + } + + std::string_view strProp(str.data() + firstTokenStart, secondTokenStop - firstTokenStart); Variable var; if (obj.getProperty(strProp.substr(1, strProp.size() - 2), var) == true) { @@ -82,25 +98,24 @@ namespace JsonUtils replaceValueWithVariable(elem, allocator, var); return; } - Utils::replaceStringInPlace( - str2, strProp, VarUtils::toString(var)); + Utils::replaceStringInPlace(str2, strProp, VarUtils::toString(var)); } - str1 = match.suffix().str(); + firstTokenStart = secondTokenStop; } if (hadMatch == true && - elem.GetString() != str2) + str != str2) { elem.SetString(str2, allocator); } } void replaceValueWithString(Value& elem, Value::AllocatorType& allocator, - const std::string& oldStr, const std::string& newStr) + const std::string_view oldStr, const std::string_view newStr) { if (elem.IsString() == true) { - std::string str1(elem.GetString()); - auto str2(str1); + std::string_view str1(elem.GetString(), elem.GetStringLength()); + std::string str2(str1); Utils::replaceStringInPlace(str2, oldStr, newStr); if (str1 != str2) { @@ -151,24 +166,45 @@ namespace JsonUtils } } - std::regex regexPercent2(R"((\%\w+\%))"); - void replaceValueWithGameVar(Value& elem, Value::AllocatorType& allocator, - const Game& game, bool changeValueType) + const Game& game, bool changeValueType, char token) { if (elem.IsString() == true) { - std::string str1(elem.GetString()); - std::string str2(str1); - std::smatch match; + if (elem.IsString() == false || + elem.GetStringLength() <= 2) + { + return; + } + + std::string_view str(elem.GetString(), elem.GetStringLength()); + std::string str2; + size_t firstTokenStart = 0; bool hadMatch = false; - while (std::regex_search(str1, match, regexPercent2) == true) + while (true) { - hadMatch = true; - auto strProp = match[1].str(); + firstTokenStart = str.find(token, firstTokenStart); + if (firstTokenStart == std::string_view::npos) + { + break; + } + size_t firstTokenStop = firstTokenStart + 1; + size_t secondTokenStart = str.find_first_of(token, firstTokenStop); + if (secondTokenStart == std::string_view::npos) + { + break; + } + size_t secondTokenStop = secondTokenStart + 1; + if (hadMatch == false) + { + hadMatch = true; + str2 = str; + } + std::string_view strProp(str.data() + firstTokenStart, secondTokenStop - firstTokenStart); + std::string strProp2(strProp.substr(1, strProp.size() - 2)); Variable var; - if (game.getVariable(strProp, var) == true) + if (game.getVarOrPropNoToken(strProp2, var) == true) { if (changeValueType == true && strProp == str2) @@ -176,13 +212,12 @@ namespace JsonUtils replaceValueWithVariable(elem, allocator, var); return; } - Utils::replaceStringInPlace( - str2, strProp, VarUtils::toString(var)); + Utils::replaceStringInPlace(str2, strProp, VarUtils::toString(var)); } - str1 = match.suffix().str(); + firstTokenStart = secondTokenStop; } if (hadMatch == true && - elem.GetString() != str2) + str != str2) { elem.SetString(str2, allocator); } @@ -191,14 +226,14 @@ namespace JsonUtils { for (auto it = elem.MemberBegin(); it != elem.MemberEnd(); ++it) { - replaceValueWithGameVar(it->value, allocator, game); + replaceValueWithGameVar(it->value, allocator, game, changeValueType, token); } } else if (elem.IsArray() == true) { for (auto it = elem.Begin(); it != elem.End(); ++it) { - replaceValueWithGameVar(*it, allocator, game); + replaceValueWithGameVar(*it, allocator, game, changeValueType, token); } } } @@ -207,11 +242,11 @@ namespace JsonUtils { if (elem.IsString() == true) { - return elem.GetString(); + return { elem.GetString(), elem.GetStringLength() }; } else if (elem.IsInt64() == true) { - return std::to_string(elem.GetInt64()); + return Utils::toString(elem.GetInt64()); } else if (elem.IsDouble() == true) { @@ -234,7 +269,7 @@ namespace JsonUtils } else if (elem.IsUint64() == true) { - return std::to_string(elem.GetUint64()); + return Utils::toString(elem.GetUint64()); } return jsonToString(elem); } @@ -244,30 +279,30 @@ namespace JsonUtils StringBuffer buffer; Writer writer(buffer); elem.Accept(writer); - return std::string(buffer.GetString()); + return std::string(buffer.GetString(), buffer.GetSize()); } - bool loadFile(const std::string& file, Document& doc) + bool loadFile(const std::string_view file, Document& doc) { if (file.empty() == true) { return false; } - return loadJson(FileUtils::readText(file.c_str()), doc); + return loadJson(FileUtils::readText(file.data()), doc); } - bool loadJson(const std::string& json, Document& doc) + bool loadJson(const std::string_view json, Document& doc) { if (json.empty() == true) { return false; } // Default template parameter uses UTF8 and MemoryPoolAllocator. - return (doc.Parse(json.c_str()).HasParseError() == false); + return (doc.Parse(json.data(), json.size()).HasParseError() == false); } - void saveToFile(const std::string& file, const Value& elem) + void saveToFile(const std::string_view file, const Value& elem) { - FileUtils::saveText(file.c_str(), jsonToString(elem)); + FileUtils::saveText(file, jsonToString(elem)); } } diff --git a/src/Json/JsonUtils.h b/src/Json/JsonUtils.h index 7f34a0d9..124da52f 100755 --- a/src/Json/JsonUtils.h +++ b/src/Json/JsonUtils.h @@ -4,20 +4,21 @@ #include #include "JsonParser.h" #include "Queryable.h" -#include +#include #include "Variable.h" class Game; namespace JsonUtils { + // replaces "%str%" with obj.getProperty("str") void replaceStringWithQueryable(rapidjson::Value& elem, rapidjson::Value::AllocatorType& allocator, const Queryable& obj, bool changeValueType = false); void replaceStringWithVariable(rapidjson::Value& elem, rapidjson::Value::AllocatorType& allocator, - const std::string& str, const Variable& var, bool changeValueType = false); + const std::string_view str, const Variable& var, bool changeValueType = false); void replaceValueWithVariable(rapidjson::Value& elem, rapidjson::Value::AllocatorType& allocator, const Variable& var); @@ -28,22 +29,23 @@ namespace JsonUtils void replaceValueWithString(rapidjson::Value& elem, rapidjson::Value::AllocatorType& allocator, - const std::string& oldStr, const std::string& newStr); + const std::string_view oldStr, const std::string_view newStr); + // replaces "%str%" with game.getVarOrProp("str") void replaceValueWithGameVar(rapidjson::Value& elem, rapidjson::Value::AllocatorType& allocator, - const Game& obj, bool changeValueType = false); + const Game& obj, bool changeValueType, char token = '%'); std::string toString(const rapidjson::Value& elem); std::string jsonToString(const rapidjson::Value& elem); - bool loadFile(const std::string& file, rapidjson::Document& doc); - bool loadJson(const std::string& json, rapidjson::Document& doc); + bool loadFile(const std::string_view file, rapidjson::Document& doc); + bool loadJson(const std::string_view json, rapidjson::Document& doc); - void saveToFile(const std::string& file, const rapidjson::Value& elem); + void saveToFile(const std::string_view file, const rapidjson::Value& elem); template - void saveToFile(const std::string& file, const char* key, const T& container) + void saveToFile(const std::string_view file, const char* key, const T& container) { rapidjson::StringBuffer buffer; rapidjson::PrettyWriter writer(buffer); @@ -79,6 +81,6 @@ namespace JsonUtils writer.EndObject(); writer.EndObject(); - FileUtils::saveText(file.c_str(), buffer.GetString(), buffer.GetSize()); + FileUtils::saveText(file, { buffer.GetString(), buffer.GetSize() }); } } diff --git a/src/Main.cpp b/src/Main.cpp index 3b931386..a772fa9a 100755 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -3,7 +3,7 @@ int main(int argc, char *argv[]) { - PHYSFS_init(NULL); + PHYSFS_init(nullptr); PHYSFS_permitSymbolicLinks(1); try diff --git a/src/Menu.cpp b/src/Menu.cpp index a2e683a5..a860db4f 100755 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -215,14 +215,14 @@ void Menu::update(Game& game) } } -bool Menu::getProperty(const std::string& prop, Variable& var) const +bool Menu::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); switch (propHash) { case str2int16("itemCount"): @@ -237,7 +237,7 @@ bool Menu::getProperty(const std::string& prop, Variable& var) const case str2int16("item"): { auto props2 = Utils::splitStringIn2(props.second, '.'); - auto btnIdx = std::strtoul(props2.first.c_str(), NULL, 10); + auto btnIdx = Utils::strtou(props2.first); if (btnIdx < items.size()) { auto button = items[btnIdx].get(); diff --git a/src/Menu.h b/src/Menu.h index ac646b04..f3bc48ec 100755 --- a/src/Menu.h +++ b/src/Menu.h @@ -160,5 +160,5 @@ class Menu : public UIObject virtual void update(Game& game); - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/Min.cpp b/src/Min.cpp index 869aa0ef..dd536f03 100755 --- a/src/Min.cpp +++ b/src/Min.cpp @@ -2,29 +2,40 @@ #include "PhysFSStream.h" #include "StreamReader.h" -Min::Min(const std::string& fileName, size_t minSize) +Min::Min(const std::string_view fileName, size_t minSize) { - sf::PhysFSStream file(fileName); + sf::PhysFSStream file(fileName.data()); if (file.hasError() == true) { return; } - std::vector fileData((size_t)file.getSize()); - file.read(fileData.data(), file.getSize()); - LittleEndianStreamReader fileStream(fileData); + auto fileSize = (size_t)file.getSize(); + numPillars = fileSize / (minSize * 2); + pillarHeight = minSize / 2; - auto numPillars = fileData.size() / (minSize * 2); - auto pillarHeight = minSize / 2; + pillars.resize(numPillars * pillarHeight); + file.read(pillars.data(), file.getSize()); - pillars.resize(numPillars); + LittleEndianStreamReader fileStream((const uint8_t*)pillars.data(), fileSize); + + MinPillar minPillar(pillars.data(), pillarHeight); + size_t count = 0; for (auto& pillar : pillars) { - pillar.resize(pillarHeight); - for (auto& tile : pillar) + std::pair temp; + fileStream.read(temp.first); + fileStream.read(temp.second); + pillar = temp; + count++; + if (count == pillarHeight) { - fileStream.read(tile.first); - fileStream.read(tile.second); + if (minPillar.isTopBlank() == true) + { + numBlankTopPillars++; + } + count = 0; + minPillar = MinPillar(&pillar + 1, pillarHeight); } } } diff --git a/src/Min.h b/src/Min.h index 75b046bf..9c54a589 100755 --- a/src/Min.h +++ b/src/Min.h @@ -1,12 +1,17 @@ #pragma once #include -#include +#include "gsl/gsl" +#include #include -class MinPillar : public std::vector> +// a read only view of a min pillar. Pillar data is referenced, not copied. +class MinPillar : public gsl::span> { public: + MinPillar(const std::pair* dataPtr, size_t size_) + : gsl::span>(dataPtr, size_) {} + int16_t getLeftTile(size_t index) const noexcept { return (int16_t((*this)[index].first) & 0x0FFF) - 1; @@ -15,19 +20,51 @@ class MinPillar : public std::vector> { return (int16_t((*this)[index].second) & 0x0FFF) - 1; } + + static bool isBlank(const std::pair& tile) noexcept + { + if (((int16_t(tile.first) & 0x0FFF) - 1) != -1 || + ((int16_t(tile.second) & 0x0FFF) - 1) != -1) + { + return false; + } + return true; + } + + // top is stored in the first elements except the last. + bool isTopBlank() const noexcept + { + size_t size2 = size(); + if (size2 > 0) + { + size2--; + } + for (size_t i = 0; i < size2; i++) + { + if (isBlank((*this)[i]) == false) + { + return false; + } + } + return true; + } }; class Min { private: - std::vector pillars; + std::vector> pillars; + size_t numPillars{ 0 }; + size_t pillarHeight{ 0 }; + size_t numBlankTopPillars{ 0 }; public: - Min(const std::string& fileName, size_t minSize); + Min(const std::string_view fileName, size_t minSize); - const MinPillar& operator[] (size_t index) const + const MinPillar operator[] (size_t index) const { - return pillars[index]; + return MinPillar(pillars.data() + (index * pillarHeight), pillarHeight); } - size_t size() const noexcept { return pillars.size(); } + size_t size() const noexcept { return numPillars; } + size_t blankTopPillars() const noexcept { return numBlankTopPillars; } }; diff --git a/src/Movie2.cpp b/src/Movie2.cpp index f55d286b..41579ed3 100755 --- a/src/Movie2.cpp +++ b/src/Movie2.cpp @@ -3,7 +3,25 @@ #include "GameUtils.h" #include "Utils/Utils.h" -std::shared_ptr Movie2::getAction(uint16_t nameHash16) const noexcept +bool Movie::load() +{ +#ifndef USE_SFML_MOVIE_STUB + if (file == nullptr || file->hasError() == true) + { + return false; + } + bool ret = movie.openFromStream(*file); + if (ret == true) + { + size = movie.getSize(); + } + return ret; +#else + return true; +#endif +} + +std::shared_ptr Movie::getAction(uint16_t nameHash16) const noexcept { switch (nameHash16) { @@ -14,7 +32,7 @@ std::shared_ptr Movie2::getAction(uint16_t nameHash16) const noexcept } } -bool Movie2::setAction(uint16_t nameHash16, const std::shared_ptr& action) noexcept +bool Movie::setAction(uint16_t nameHash16, const std::shared_ptr& action) noexcept { switch (nameHash16) { @@ -27,7 +45,7 @@ bool Movie2::setAction(uint16_t nameHash16, const std::shared_ptr& actio return true; } -void Movie2::draw(sf::RenderTarget& target, sf::RenderStates states) const +void Movie::draw(sf::RenderTarget& target, sf::RenderStates states) const { if (visible == true) { @@ -35,7 +53,7 @@ void Movie2::draw(sf::RenderTarget& target, sf::RenderStates states) const } } -void Movie2::updateSize(const Game& game) +void Movie::updateSize(const Game& game) { if (game.StretchToFit() == true) { @@ -59,7 +77,7 @@ void Movie2::updateSize(const Game& game) #endif } -void Movie2::update(Game& game) +void Movie::update(Game& game) { if (visible == false) { @@ -78,12 +96,12 @@ void Movie2::update(Game& game) #endif } -bool Movie2::getProperty(const std::string& prop, Variable& var) const +bool Movie::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - return GameUtils::getUIObjProp(*this, str2int16(props.first.c_str()), props.second, var); + return GameUtils::getUIObjProp(*this, str2int16(props.first), props.second, var); } diff --git a/src/Movie2.h b/src/Movie2.h index f4abf862..a1d56a3c 100755 --- a/src/Movie2.h +++ b/src/Movie2.h @@ -8,7 +8,7 @@ #include "sfeMovie/Movie.hpp" #endif -class Movie2 : public UIObject +class Movie : public UIObject { private: #ifndef USE_SFML_MOVIE_STUB @@ -23,30 +23,17 @@ class Movie2 : public UIObject std::shared_ptr actionComplete; public: - Movie2(const std::string& file_) : Movie2(file_.c_str()) {} #ifndef USE_SFML_MOVIE_STUB - Movie2(const char* file_) : file(std::make_unique(file_)) {} + Movie(const std::string_view file_) : file(std::make_unique(file_.data())) {} - bool load() - { - if (file == nullptr || file->hasError() == true) - { - return false; - } - bool ret = movie.openFromStream(*file); - if (ret == true) - { - size = movie.getSize(); - } - return ret; - } + bool load(); void play() { movie.play(); } void pause() { movie.pause(); } void setVolume(float volume) { movie.setVolume(volume); } #else - Movie2(const char* file_) { movie.setFillColor(sf::Color::Black); } + Movie(const std::string_view file_) { movie.setFillColor(sf::Color::Black); } - bool load() noexcept { return true; } + bool load(); void play() noexcept {} void pause() noexcept {} void setVolume(float volume) noexcept {} @@ -78,5 +65,5 @@ class Movie2 : public UIObject virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; virtual void update(Game& game); - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/Palette.cpp b/src/Palette.cpp index ad7f0a6d..5d007817 100755 --- a/src/Palette.cpp +++ b/src/Palette.cpp @@ -3,13 +3,13 @@ #include "PhysFSStream.h" #include "Shaders.h" -Palette::Palette(const char* file) +Palette::Palette(const std::string_view file) { - sf::PhysFSStream stream(file); + sf::PhysFSStream stream(file.data()); if (stream.hasError() == true || stream.getSize() < 768) { - return; + throw std::exception(); } for (auto& color : palette) @@ -41,6 +41,10 @@ void Palette::loadTexture() void Palette::updateTexture() { + if (Shaders::supportsPalettes() == false) + { + return; + } texture.update((const sf::Uint8*)&palette, palette.size(), 1, 0, 0); } @@ -73,3 +77,18 @@ bool Palette::shiftRight(size_t shift, size_t startIdx, size_t stopIdx) } return false; } + +bool Palette::replaceRange(const Palette& srcPal, size_t srcStartIdx, + size_t size, size_t dstStartIdx) +{ + if (srcStartIdx + size <= srcPal.palette.size() && + dstStartIdx + size <= palette.size()) + { + std::copy_n(srcPal.palette.begin() + srcStartIdx, + size, + palette.begin() + dstStartIdx); + updateTexture(); + return true; + } + return false; +} diff --git a/src/Palette.h b/src/Palette.h index 5a4f804c..db004550 100755 --- a/src/Palette.h +++ b/src/Palette.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include typedef std::array PaletteArray; @@ -18,12 +18,14 @@ class Palette PaletteArray palette; Palette() noexcept {} - Palette(const std::string& file) : Palette(file.c_str()) {} - Palette(const char* file); + Palette(const std::string_view file); Palette(const Palette& pal, const std::vector trn); const sf::Color& operator[](size_t index) const noexcept { return palette[index]; } bool shiftLeft(size_t shift, size_t startIdx, size_t stopIdx); bool shiftRight(size_t shift, size_t startIdx, size_t stopIdx); + + bool replaceRange(const Palette& srcPal, size_t srcStartIdx, + size_t size, size_t dstStartIdx); }; diff --git a/src/Parser/Game/ParseClassifier.cpp b/src/Parser/Game/ParseClassifier.cpp new file mode 100755 index 00000000..ec57b927 --- /dev/null +++ b/src/Parser/Game/ParseClassifier.cpp @@ -0,0 +1,140 @@ +#include "ParseClassifier.h" +#include "Game/Classifier.h" +#include "Parser/Utils/ParseUtils.h" + +namespace Parser +{ + using namespace rapidjson; + + ClassifierValue parseClassifierValue(const Value& elem) + { + ClassifierValue classifierVal; + if (isValidString(elem, "text") == true) + { + classifierVal.compare = getStringVal(elem["text"]); + } + else + { + classifierVal.compare = std::make_pair( + getMinMaxIntKey(elem, "min", + std::numeric_limits::min()), + getMinMaxIntKey(elem, "max", + std::numeric_limits::max()) + ); + } + classifierVal.value = getVariableKey(elem, "value"); + return classifierVal; + } + + bool parseClassifierValueInterval(const Value& elem, ClassifierValueInterval& valueInterval) + { + if (isValidString(elem, "property") == false) + { + if (elem.HasMember("value") == true) + { + const auto& elemValues = elem["value"]; + if (elemValues.IsObject() == true) + { + ClassifierValue classifierVal; + classifierVal.compare = std::make_pair( + std::numeric_limits::min(), + std::numeric_limits::max() + ); + classifierVal.value = getVariableKey(elemValues, "value"); + valueInterval.values.push_back(classifierVal); + return true; + } + } + return false; + } + if (elem.HasMember("value") == false) + { + return false; + } + const auto& elemValues = elem["value"]; + if (elemValues.IsObject() == true) + { + ClassifierValue classifierVal = parseClassifierValue(elemValues); + valueInterval.values.push_back(classifierVal); + } + else if (elemValues.IsArray() == true) + { + for (const auto& val : elemValues) + { + ClassifierValue classifierVal = parseClassifierValue(val); + valueInterval.values.push_back(classifierVal); + } + } + if (valueInterval.values.empty() == true) + { + return false; + } + valueInterval.property = elem["property"].GetString(); + return true; + } + + std::vector parseClassifierValueIntervals(const Value& elem) + { + std::vector valueIntervals; + if (elem.IsObject() == true) + { + ClassifierValueInterval value; + if (parseClassifierValueInterval(elem, value) == true) + { + valueIntervals.push_back(value); + } + } + else if (elem.IsArray() == true) + { + for (const auto& val : elem) + { + ClassifierValueInterval value; + if (parseClassifierValueInterval(val, value) == true) + { + valueIntervals.push_back(value); + } + } + } + else if (elem.IsString() == true) + { + ClassifierValueInterval valueInterval; + ClassifierValue classifierVal; + classifierVal.compare = std::make_pair( + std::numeric_limits::min(), + std::numeric_limits::max() + ); + classifierVal.value = std::string(elem.GetString()); + valueInterval.values.push_back(classifierVal); + valueIntervals.push_back(valueInterval); + } + return valueIntervals; + } + + void parseClassifier(Game& game, const Value& elem) + { + if (isValidString(elem, "id") == false) + { + return; + } + std::string id = elem["id"].GetString(); + if (isValidId(id) == false) + { + return; + } + auto level = game.Resources().getLevel(getStringKey(elem, "level")); + if (level == nullptr) + { + return; + } + if (elem.HasMember("values") == false) + { + return; + } + auto classifier = parseClassifierValueIntervals(elem["values"]); + if (classifier.empty() == true) + { + return; + } + level->addClassifier(id, std::make_unique(std::move(classifier))); + } +} diff --git a/src/Parser/Game/ParseNamer.h b/src/Parser/Game/ParseClassifier.h similarity index 56% rename from src/Parser/Game/ParseNamer.h rename to src/Parser/Game/ParseClassifier.h index af61b5ca..e087bec3 100755 --- a/src/Parser/Game/ParseNamer.h +++ b/src/Parser/Game/ParseClassifier.h @@ -5,5 +5,5 @@ namespace Parser { - void parseNamer(Game& game, const rapidjson::Value& elem); + void parseClassifier(Game& game, const rapidjson::Value& elem); } diff --git a/src/Parser/Game/ParseItem.cpp b/src/Parser/Game/ParseItem.cpp index af2290a6..2fd37bdd 100755 --- a/src/Parser/Game/ParseItem.cpp +++ b/src/Parser/Game/ParseItem.cpp @@ -32,8 +32,9 @@ namespace Parser { if (it->name.GetStringLength() > 0) { - auto nameHash = str2int16(it->name.GetString()); - level.setPropertyName(nameHash, it->name.GetString()); + auto name = getStringViewVal(it->name); + auto nameHash = str2int16(name); + level.setPropertyName(nameHash, name); item->setIntByHash(nameHash, getMinMaxIntVal(it->value)); } @@ -41,8 +42,8 @@ namespace Parser } } - auto outline = getColorKey(elem, "outline", class_->DefaultOutline()); - auto outlineIgnore = getColorKey(elem, "outlineIgnore", class_->DefaultOutlineIgnore()); + auto outline = getColorKey(elem, "outline", class_->Outline()); + auto outlineIgnore = getColorKey(elem, "outlineIgnore", class_->OutlineIgnore()); item->setOutline(outline, outlineIgnore); item->setOutlineOnHover(getBoolKey(elem, "outlineOnHover", true)); diff --git a/src/Parser/Game/ParseItemClass.cpp b/src/Parser/Game/ParseItemClass.cpp index f104e425..68568352 100755 --- a/src/Parser/Game/ParseItemClass.cpp +++ b/src/Parser/Game/ParseItemClass.cpp @@ -1,5 +1,5 @@ #include "ParseItemClass.h" -#include "Game/ItemProperties.h" +#include "Game/GameHashes.h" #include "Game/ItemClass.h" #include "Parser/ParseAction.h" #include "Parser/Utils/ParseUtils.h" @@ -13,7 +13,7 @@ namespace Parser { itemClass.setDescription( getUIntKey(elem, "index"), - level.getNamer(getStringKey(elem, "name")), + level.getClassifier(getStringKey(elem, "name")), (uint16_t)getUIntKey(elem, "skip")); } @@ -108,35 +108,35 @@ namespace Parser if (elem.HasMember("name") == true) { - itemClass->Name(getStringVal(elem["name"])); + itemClass->Name(getStringViewVal(elem["name"])); } if (elem.HasMember("shortName") == true) { - itemClass->ShortName(getStringVal(elem["shortName"])); + itemClass->ShortName(getStringViewVal(elem["shortName"])); } if (elem.HasMember("type") == true) { - itemClass->Type(getStringVal(elem["type"])); + itemClass->Type(getStringViewVal(elem["type"])); } if (elem.HasMember("subType") == true) { - itemClass->SubType(getStringVal(elem["subType"])); + itemClass->SubType(getStringViewVal(elem["subType"])); } if (elem.HasMember("inventorySize") == true) { itemClass->InventorySize(getItemXYVal(elem["inventorySize"], ItemXY(1, 1))); } - if (elem.HasMember("defaultAnimationSpeed") == true) + if (elem.HasMember("animationSpeed") == true) { - itemClass->DefaultAnimationSpeed(getTimeVal(elem["defaultAnimationSpeed"], sf::milliseconds(40))); + itemClass->AnimationSpeed(getTimeVal(elem["animationSpeed"], sf::milliseconds(40))); } - if (elem.HasMember("defaultOutline") == true) + if (elem.HasMember("outline") == true) { - itemClass->DefaultOutline(getColorVal(elem["defaultOutline"], sf::Color::Transparent)); + itemClass->Outline(getColorVal(elem["outline"], sf::Color::Transparent)); } - if (elem.HasMember("defaultOutlineIgnore") == true) + if (elem.HasMember("outlineIgnore") == true) { - itemClass->DefaultOutlineIgnore(getColorVal(elem["defaultOutlineIgnore"], sf::Color::Transparent)); + itemClass->OutlineIgnore(getColorVal(elem["outlineIgnore"], sf::Color::Transparent)); } if (elem.HasMember("defaults") == true) @@ -148,7 +148,7 @@ namespace Parser { if (it->name.GetStringLength() > 0) { - auto nameStr = it->name.GetString(); + auto nameStr = std::string(it->name.GetString(), it->name.GetStringLength()); auto nameHash = str2int16(nameStr); level->setPropertyName(nameHash, nameStr); LevelObjValue val; @@ -157,7 +157,7 @@ namespace Parser case ItemProp::UseOn: case ItemProp::UseOp: { - auto opStr = getStringCharVal(it->value); + auto opStr = getStringViewVal(it->value); val = str2int16(opStr); level->setPropertyName(val, opStr); break; @@ -184,13 +184,13 @@ namespace Parser std::shared_ptr action; if (it->value.IsString() == true) { - action = itemClass->getAction(str2int16(it->value.GetString())); + action = itemClass->getAction(str2int16(getStringViewVal(it->value))); } if (action == nullptr) { action = parseAction(game, it->value); } - itemClass->setAction(str2int16(it->name.GetString()), action); + itemClass->setAction(str2int16(getStringViewVal(it->name)), action); } } } @@ -203,7 +203,7 @@ namespace Parser { for (auto it = formulas.MemberBegin(); it != formulas.MemberEnd(); ++it) { - auto nameHash = str2int16(it->name.GetString()); + auto nameHash = str2int16(getStringViewVal(it->name)); if (nameHash != str2int16("")) { if (it->value.IsNull() == true) @@ -212,7 +212,7 @@ namespace Parser } else { - itemClass->setFormula(nameHash, getStringVal(it->value)); + itemClass->setFormula(nameHash, getStringViewVal(it->value)); } } } @@ -235,15 +235,20 @@ namespace Parser } } + if (elem.HasMember("inventoryTexture") == true) + { + auto classifier = level->getClassifier(getStringVal(elem["inventoryTexture"])); + itemClass->setInventoryTexture(classifier); + } if (elem.HasMember("prefix") == true) { - auto namer = level->getNamer(getStringVal(elem["prefix"])); - itemClass->setPrefix(namer); + auto classifier = level->getClassifier(getStringVal(elem["prefix"])); + itemClass->setPrefix(classifier); } if (elem.HasMember("suffix") == true) { - auto namer = level->getNamer(getStringVal(elem["suffix"])); - itemClass->setSuffix(namer); + auto classifier = level->getClassifier(getStringVal(elem["suffix"])); + itemClass->setSuffix(classifier); } level->addItemClass(id, std::move(itemClass)); diff --git a/src/Parser/Game/ParseLevel.cpp b/src/Parser/Game/ParseLevel.cpp index 6a219ae3..d1c8083d 100755 --- a/src/Parser/Game/ParseLevel.cpp +++ b/src/Parser/Game/ParseLevel.cpp @@ -30,24 +30,46 @@ namespace Parser return dun; } - void parseTiledMap(const Value& elem, LevelMap& map, - const std::string& file, int16_t defaultTile, bool resizeToFit) + void parseLayerIndexName(const Value& elem, + std::vector>& layerNameIndexes) { - Document doc; - if (JsonUtils::loadFile(file, doc) == false || - isValidArray(doc, "layers") == false || - doc["layers"].Empty() == true) + layerNameIndexes.push_back( + std::make_pair(getStringKey(elem, "name"), getUIntKey(elem, "index")) + ); + } + + void parseMapLayers(const Value& elem, const Value& elemLayers, + LevelMap& map, int16_t defaultTile, bool resizeToFit, bool mapToNames) + { + std::vector> layerNameIndexes; + + if (mapToNames == true) { - return; + // if the layer data comes from a different file (Tiled map), + // get a map of names to indexes + if (elem.HasMember("layers") == true) + { + const auto& namesElem = elem["layers"]; + if (namesElem.IsArray() == true) + { + for (const auto& val : namesElem) + { + parseLayerIndexName(val, layerNameIndexes); + } + } + else if (namesElem.IsObject() == true) + { + parseLayerIndexName(namesElem, layerNameIndexes); + } + } } - auto backName = getStringKey(elem, "back"); - auto frontName = getStringKey(elem, "front"); - auto solName = getStringKey(elem, "sol"); + auto automapName = getStringViewKey(elem, "automap"); + auto solName = getStringViewKey(elem, "sol"); auto pos = getVector2iKey(elem, "position"); bool wasResized = false; - for (const auto& elemLayer : doc["layers"]) + for (const auto& elemLayer : elemLayers) { Dun dun = getDunFromLayer(elemLayer, (int16_t)getIntKey(elem, "indexOffset"), @@ -64,38 +86,79 @@ namespace Parser map.resize((Coord)(pos2.x + dun.Width()), (Coord)(pos2.y + dun.Height())); wasResized = true; } - if (doc["layers"].Size() == 1) + if (elemLayers.Size() == 1) { map.setSimpleArea(pos2.x, pos2.y, dun); continue; } - auto name = getStringKey(elemLayer, "name"); - if (backName == name) - { - map.setSimpleArea(pos2.x, pos2.y, 0, dun); - } - if (frontName == name) + + if (mapToNames == false) { - map.setSimpleArea(pos2.x, pos2.y, 1, dun); + auto index = getUIntKey(elemLayer, "index"); + if (index < LevelCell::NumberOfLayers) + { + map.setSimpleArea(pos2.x, pos2.y, index, dun, false); + } } - if (solName == name) + else { - map.setSimpleArea(pos2.x, pos2.y, 2, dun); + auto name = getStringViewKey(elemLayer, "name"); + + for (const auto& layerNameIndex : layerNameIndexes) + { + if (layerNameIndex.first == name && + layerNameIndex.second < LevelCell::NumberOfLayers) + { + map.setSimpleArea(pos2.x, pos2.y, layerNameIndex.second, dun); + } + } + if (automapName == name) + { + map.setSimpleArea(pos2.x, pos2.y, Level::AutomapLayer, dun); + } + if (solName == name) + { + map.setSimpleArea(pos2.x, pos2.y, LevelCell::SolLayer, dun); + } } } } } + void parseTiledMap(const Value& elem, LevelMap& map, + const std::string_view file, int16_t defaultTile, bool resizeToFit) + { + Document doc; + if (JsonUtils::loadFile(file, doc) == false || + isValidArray(doc, "layers") == false || + doc["layers"].Empty() == true) + { + return; + } + + parseMapLayers(elem, doc["layers"], map, defaultTile, resizeToFit, true); + } + void parseMap(const Value& elem, LevelMap& map, int16_t defaultTile, bool resizeToFit) { - auto file = getStringKey(elem, "file"); + defaultTile = (int16_t)getIntKey(elem, "defaultTile", defaultTile); + if (elem.HasMember("file") == false) + { + if (elem.HasMember("layers") == true) + { + parseMapLayers(elem, elem["layers"], map, defaultTile, resizeToFit, false); + } + return; + } + + auto file = getStringViewVal(elem["file"]); if (Utils::endsWith(Utils::toLower(file), ".json") == true) { parseTiledMap(elem, map, file, defaultTile, resizeToFit); return; } - defaultTile = (int16_t)getIntKey(elem, "defaultTile", defaultTile); + Dun dun(file, defaultTile); if (dun.Width() > 0 && dun.Height() > 0) { @@ -110,45 +173,109 @@ namespace Parser void parseLevelMap(Game& game, const Value& elem, Level& level) { - auto til = getStringKey(elem, "til"); - auto sol = getStringKey(elem, "sol"); - auto mapSize = getVector2uKey(elem, "mapSize", MapCoord(96, 96)); + auto mapPtr = &level.Map(); auto defaultTile = (int16_t)getIntKey(elem, "defaultTile", -1); - LevelMap map(til, sol, mapSize.x, mapSize.y, defaultTile); + MapCoord mapSize = getVector2uKey(elem, "mapSize", mapPtr->MapSize()); + + if (isValidString(elem, "til") == true && + isValidString(elem, "sol") == true) + { + auto til = getStringViewVal(elem["til"]); + auto sol = getStringViewVal(elem["sol"]); + *mapPtr = LevelMap(til, sol, mapSize.x, mapSize.y, defaultTile); + } + else + { + if (mapSize != mapPtr->MapSize()) + { + mapPtr->resize(mapSize.x, mapSize.y, defaultTile); + } + } - if (elem.HasMember("outOfBoundsTileBottom") == true) + if (elem.HasMember("outOfBoundsTileLayer1") == true) + { + mapPtr->setOutOfBoundsTileIndex(0, (int16_t)getIntVal(elem["outOfBoundsTileLayer1"], -1)); + } + if (elem.HasMember("outOfBoundsTileLayer2") == true) + { + mapPtr->setOutOfBoundsTileIndex(1, (int16_t)getIntVal(elem["outOfBoundsTileLayer2"], -1)); + } + if (elem.HasMember("outOfBoundsTileLayer3") == true) { - map.setOutOfBoundsTileBack((int16_t)getIntVal(elem["outOfBoundsTileBottom"], -1)); + mapPtr->setOutOfBoundsTileIndex(2, (int16_t)getIntVal(elem["outOfBoundsTileLayer3"], -1)); } - if (elem.HasMember("outOfBoundsTileTop") == true) + if (elem.HasMember("outOfBoundsTileAutomap") == true) { - map.setOutOfBoundsTileFront((int16_t)getIntVal(elem["outOfBoundsTileTop"], -1)); + mapPtr->setOutOfBoundsTileIndex(3, (int16_t)getIntVal(elem["outOfBoundsTileAutomap"], -1)); } if (elem.HasMember("map") == true) { const auto& mapElem = elem["map"]; if (mapElem.IsArray() == true) { + bool resizeToFit = getBoolKey(elem, "resizeToFit", false); for (const auto& val : mapElem) { - parseMap(val, map, defaultTile, false); + parseMap(val, *mapPtr, defaultTile, resizeToFit); } } else if (mapElem.IsObject() == true) { - bool resizeToFit = elem.HasMember("mapSize") == false; - parseMap(mapElem, map, defaultTile, resizeToFit); + bool resizeToFit = getBoolKey(elem, "resizeToFit", true); + parseMap(mapElem, *mapPtr, defaultTile, resizeToFit); } } - std::shared_ptr tilesBottom; - std::shared_ptr tilesTop; + std::vector> texturePackLayers; std::pair tileSize; - getOrParseLevelTexturePack(game, elem, - "texturePackBottom", "texturePackTop", tilesBottom, tilesTop, tileSize); + if (getOrParseLevelTexturePack(game, elem, "layers", texturePackLayers, tileSize) == true) + { + level.Init(std::move(*mapPtr), texturePackLayers, tileSize.first, tileSize.second); + } + else + { + level.Init(); + } + } - level.Init(std::move(map), tilesBottom, tilesTop, tileSize.first, tileSize.second); + void parseLevelAutomap(Game& game, const Value& elem, Level& level) + { + if (isValidString(elem, "automap") == true) + { + auto automap = game.Resources().getTexturePack(elem["automap"].GetString()); + if (automap != nullptr) + { + auto automapTileSize = getVector2uKey>( + elem, "automapTileSize", std::make_pair(64u, 32u)); + + level.setAutomap(automap, automapTileSize.first, automapTileSize.second); + } + } + if (elem.HasMember("automapBackground") == true) + { + auto color = getColorVal(elem["automapBackground"], sf::Color::Transparent); + level.setAutomapBackgroundColor(color); + } + if (elem.HasMember("automapPosition") == true) + { + auto pos = getVector2iVal(elem["automapPosition"]); + level.setAutomapRelativePosition(pos); + } + if (elem.HasMember("automapSize") == true) + { + auto size = getVector2iVal(elem["automapSize"], { 100, 100 }); + level.setAutomapRelativeSize(size); + } + if (elem.HasMember("automapPlayerDirectionIndex") == true) + { + auto index = getIntVal(elem["automapPlayerDirectionIndex"], -1); + level.setAutomapPlayerDirectionBaseIndex(index); + } + if (elem.HasMember("showAutomap") == true) + { + level.ShowAutomap(getBoolVal(elem["showAutomap"])); + } } void parsePosSize(const Game& game, const Value& elem, Level& level) @@ -183,33 +310,31 @@ namespace Parser return; } auto levelPtr = std::make_shared(); - game.Resources().addDrawable(id, levelPtr); - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, levelPtr); - } - else - { - game.Resources().addDrawable(id, levelPtr); - } + game.Resources().addDrawable(id, levelPtr, getStringViewKey(elem, "resource")); level = levelPtr.get(); game.Resources().setCurrentLevel(level); level->Id(id); } - parseLevelMap(game, elem, *level); + if (existingLevel == false) + { + parsePosSize(game, elem, *level); + } - level->Name(getStringKey(elem, "name")); - level->Path(getStringKey(elem, "path")); + parseLevelMap(game, elem, *level); + parseLevelAutomap(game, elem, *level); - if (elem.HasMember("followCurrentPlayer") == true) + if (elem.HasMember("name") == true) { - level->FollowCurrentPlayer(getBoolVal(elem["followCurrentPlayer"])); + level->Name(getStringVal(elem["name"])); } - - if (existingLevel == false) + if (elem.HasMember("path") == true) { - parsePosSize(game, elem, *level); + level->Path(getStringVal(elem["path"])); + } + if (elem.HasMember("followCurrentPlayer") == true) + { + level->FollowCurrentPlayer(getBoolVal(elem["followCurrentPlayer"])); } level->resetView(); @@ -217,7 +342,7 @@ namespace Parser if (elem.HasMember("captureInputEvents")) { - level->setCaptureInputEvents(getBoolVal(elem["captureInputEvents"])); + level->setCaptureInputEvents(getInputEventVal(elem["captureInputEvents"])); } if (elem.HasMember("onLeftClick")) { diff --git a/src/Parser/Game/ParseLevelObject.cpp b/src/Parser/Game/ParseLevelObject.cpp index dd04ea21..662b450e 100755 --- a/src/Parser/Game/ParseLevelObject.cpp +++ b/src/Parser/Game/ParseLevelObject.cpp @@ -9,18 +9,17 @@ namespace Parser void parseLevelObject(Game& game, const Value& elem) { - if (isValidString(elem, "id") == false) + auto level = game.Resources().getLevel(getStringKey(elem, "level")); + if (level == nullptr) { return; } - std::string id(elem["id"].GetString()); - if (isValidId(id) == false) + if (isValidString(elem, "class") == false) { return; } - - auto level = game.Resources().getLevel(getStringKey(elem, "level")); - if (level == nullptr) + auto class_ = level->getLevelObjectClass(elem["class"].GetString()); + if (class_ == nullptr) { return; } @@ -38,51 +37,38 @@ namespace Parser return; } - std::unique_ptr levelObj; - - if (isValidString(elem, "texture") == true) - { - auto texture = game.Resources().getTexture(elem["texture"].GetString()); - if (texture == nullptr) - { - return; - } - levelObj = std::make_unique(*texture); - - if (elem.HasMember("textureRect") == true) - { - sf::IntRect rect(0, 0, 32, 32); - levelObj->setTextureRect(getIntRectKey(elem, "textureRect", rect)); - } - } - else if (isValidString(elem, "texturePack") == true) - { - auto texPack = game.Resources().getTexturePack(elem["texturePack"].GetString()); - if (texPack == nullptr) - { - return; - } - auto frames = std::make_pair(0u, texPack->size() - 1); - frames = getFramesKey(elem, "frames", frames); - auto refresh = getTimeKey(elem, "refresh", sf::milliseconds(50)); - levelObj = std::make_unique( - *texPack, frames, refresh, AnimationType::Looped); - } - else - { - levelObj = std::make_unique(); - } + auto levelObj = std::make_unique(class_); levelObj->MapPosition(mapPos); - levelObj->Hoverable(getBoolKey(elem, "enableHover", true)); + auto id = getStringViewKey(elem, "id"); + if (isValidId(id) == false) + { + id = {}; + } levelObj->Id(id); - levelObj->Name(getStringKey(elem, "name")); + levelObj->Name(getStringViewKey(elem, "name")); + levelObj->Text1(getStringViewKey(elem, "text1", class_->Text1())); + levelObj->Text2(getStringViewKey(elem, "text2", class_->Text2())); - if (elem.HasMember("action") == true) + if (elem.HasMember("properties") == true) { - levelObj->setAction(parseAction(game, elem["action"])); + const auto& props = elem["properties"]; + if (props.IsObject() == true) + { + for (auto it = props.MemberBegin(); it != props.MemberEnd(); ++it) + { + if (it->name.GetStringLength() > 0) + { + auto name = std::string(it->name.GetString(), it->name.GetStringLength()); + auto nameHash = str2int16(name); + level->setPropertyName(nameHash, name); + levelObj->setIntByHash(nameHash, + getMinMaxIntVal(it->value)); + } + } + } } level->addLevelObject(std::move(levelObj), true); diff --git a/src/Parser/Game/ParseLevelObjectClass.cpp b/src/Parser/Game/ParseLevelObjectClass.cpp new file mode 100755 index 00000000..1158ce9b --- /dev/null +++ b/src/Parser/Game/ParseLevelObjectClass.cpp @@ -0,0 +1,180 @@ +#include "ParseLevelObjectClass.h" +#include "Game/LevelObjectClass.h" +#include "Parser/ParseAction.h" +#include "Parser/Utils/ParseUtils.h" + +namespace Parser +{ + using namespace rapidjson; + + std::unique_ptr parseLevelObjectClassHelper(const Game& game, + const Level& level, const Value& elem, std::string& id) + { + if (isValidString(elem, "id") == false) + { + return nullptr; + } + id = std::string(elem["id"].GetString()); + if (isValidId(id) == false) + { + return nullptr; + } + if (level.hasLevelObjectClass(id) == true) + { + return nullptr; + } + + if (isValidString(elem, "fromId") == true) + { + std::string fromId(elem["fromId"].GetString()); + if (fromId != id) + { + auto obj = level.getLevelObjectClass(fromId); + if (obj == nullptr) + { + return nullptr; + } + return std::make_unique(*obj); + } + } + + std::unique_ptr levelObjClass; + + if (isValidString(elem, "texture") == true) + { + auto texture = game.Resources().getTexture(elem["texture"].GetString()); + if (texture == nullptr) + { + return nullptr; + } + levelObjClass = std::make_unique(*texture); + + if (elem.HasMember("textureRect") == true) + { + auto texSize = texture->getSize(); + sf::IntRect rect(0, 0, (int)texSize.x, (int)texSize.y); + levelObjClass->setTextureRect(getIntRectKey(elem, "textureRect", rect)); + } + } + else if (isValidString(elem, "texturePack") == true) + { + auto texPack = game.Resources().getTexturePack(elem["texturePack"].GetString()); + if (texPack == nullptr) + { + return nullptr; + } + auto frames = std::make_pair(0u, texPack->size() - 1); + frames = getFramesKey(elem, "frames", frames); + auto refresh = getTimeKey(elem, "refresh", sf::milliseconds(50)); + levelObjClass = std::make_unique( + texPack, frames, refresh, AnimationType::Looped); + } + return levelObjClass; + } + + void parseDescriptionValue(LevelObjectClass& levelObjClass, + const Level& level, const Value& elem) + { + levelObjClass.setDescription( + getUIntKey(elem, "index"), + level.getClassifier(getStringKey(elem, "name")), + (uint16_t)getUIntKey(elem, "skip")); + } + + void parseLevelObjectClass(Game& game, const Value& elem) + { + auto level = game.Resources().getLevel(getStringKey(elem, "level")); + if (level == nullptr) + { + return; + } + std::string id; + auto levelObjClass = parseLevelObjectClassHelper(game, *level, elem, id); + if (levelObjClass == nullptr) + { + return; + } + + levelObjClass->Id(id); + + if (elem.HasMember("name") == true) + { + levelObjClass->Name(getStringViewVal(elem["name"])); + } + if (elem.HasMember("text1") == true) + { + levelObjClass->Text1(getStringViewVal(elem["text1"])); + } + if (elem.HasMember("text2") == true) + { + levelObjClass->Text2(getStringViewVal(elem["text2"])); + } + + if (elem.HasMember("nameClassifier") == true) + { + levelObjClass->setNameClassifier( + level->getClassifier(getStringKey(elem, "nameClassifier"))); + } + + if (elem.HasMember("defaults") == true) + { + const auto& defaults = elem["defaults"]; + if (defaults.IsObject() == true) + { + for (auto it = defaults.MemberBegin(); it != defaults.MemberEnd(); ++it) + { + if (it->name.GetStringLength() > 0) + { + auto name = std::string(it->name.GetString(), it->name.GetStringLength()); + auto nameHash = str2int16(name); + level->setPropertyName(nameHash, name); + levelObjClass->setDefaultByHash(nameHash, + getMinMaxIntVal(it->value)); + } + } + } + } + + if (elem.HasMember("actions") == true) + { + const auto& actions = elem["actions"]; + if (actions.IsObject() == true) + { + for (auto it = actions.MemberBegin(); it != actions.MemberEnd(); ++it) + { + if (it->name.GetStringLength() > 0) + { + std::shared_ptr action; + if (it->value.IsString() == true) + { + action = levelObjClass->getAction(str2int16(getStringViewVal(it->value))); + } + if (action == nullptr) + { + action = parseAction(game, it->value); + } + levelObjClass->setAction(str2int16(getStringViewVal(it->name)), action); + } + } + } + } + + if (elem.HasMember("descriptions") == true) + { + const auto& descriptions = elem["descriptions"]; + if (descriptions.IsObject() == true) + { + parseDescriptionValue(*levelObjClass, *level, descriptions); + } + else if (descriptions.IsArray() == true) + { + for (const auto& val : descriptions) + { + parseDescriptionValue(*levelObjClass, *level, val); + } + } + } + + level->addLevelObjectClass(id, std::move(levelObjClass)); + } +} diff --git a/src/Parser/Game/ParseLevelObjectClass.h b/src/Parser/Game/ParseLevelObjectClass.h new file mode 100755 index 00000000..5cd7f360 --- /dev/null +++ b/src/Parser/Game/ParseLevelObjectClass.h @@ -0,0 +1,9 @@ +#pragma once + +#include "Game.h" +#include "Json/JsonParser.h" + +namespace Parser +{ + void parseLevelObjectClass(Game& game, const rapidjson::Value& elem); +} diff --git a/src/Parser/Game/ParseNamer.cpp b/src/Parser/Game/ParseNamer.cpp deleted file mode 100755 index 8caa7df5..00000000 --- a/src/Parser/Game/ParseNamer.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "ParseNamer.h" -#include "Game/Namer.h" -#include "Parser/Utils/ParseUtils.h" - -namespace Parser -{ - using namespace rapidjson; - - NameValue parseNameValue(const Value& elem) - { - NameValue value; - value.min = getMinMaxIntKey(elem, "min", - std::numeric_limits::min()); - value.max = getMinMaxIntKey(elem, "max", - std::numeric_limits::max()); - value.text = getStringKey(elem, "text"); - return value; - } - - bool parseNameValueInterval(const Value& elem, NameValueInterval& value) - { - if (isValidString(elem, "property") == false) - { - if (elem.HasMember("value") == true) - { - const auto& elemValues = elem["value"]; - if (elemValues.IsObject() == true) - { - NameValue nameValue; - nameValue.min = std::numeric_limits::min(); - nameValue.max = std::numeric_limits::max(); - nameValue.text = getStringKey(elemValues, "text"); - value.values.push_back(nameValue); - return true; - } - } - return false; - } - if (elem.HasMember("value") == false) - { - return false; - } - const auto& elemValues = elem["value"]; - if (elemValues.IsObject() == true) - { - NameValue nameValue = parseNameValue(elemValues); - value.values.push_back(nameValue); - } - else if (elemValues.IsArray() == true) - { - for (const auto& val : elemValues) - { - NameValue nameValue = parseNameValue(val); - value.values.push_back(nameValue); - } - } - if (value.values.empty() == true) - { - return false; - } - value.property = elem["property"].GetString(); - return true; - } - - std::vector parseNameValueIntervals(const Value& elem) - { - std::vector values; - if (elem.IsObject() == true) - { - NameValueInterval value; - if (parseNameValueInterval(elem, value) == true) - { - values.push_back(value); - } - } - else if (elem.IsArray() == true) - { - for (const auto& val : elem) - { - NameValueInterval value; - if (parseNameValueInterval(val, value) == true) - { - values.push_back(value); - } - } - } - else if (elem.IsString() == true) - { - NameValueInterval value; - NameValue nameValue; - nameValue.min = std::numeric_limits::min(); - nameValue.max = std::numeric_limits::max(); - nameValue.text = elem.GetString(); - value.values.push_back(nameValue); - values.push_back(value); - } - return values; - } - - void parseNamer(Game& game, const Value& elem) - { - if (isValidString(elem, "id") == false) - { - return; - } - std::string id = elem["id"].GetString(); - if (isValidId(id) == false) - { - return; - } - auto level = game.Resources().getLevel(getStringKey(elem, "level")); - if (level == nullptr) - { - return; - } - if (elem.HasMember("names") == false) - { - return; - } - auto values = parseNameValueIntervals(elem["names"]); - if (values.empty() == true) - { - return; - } - level->addNamer(id, std::make_unique(std::move(values))); - } -} diff --git a/src/Parser/Game/ParsePlayer.cpp b/src/Parser/Game/ParsePlayer.cpp index b62e13d4..e4079e0c 100755 --- a/src/Parser/Game/ParsePlayer.cpp +++ b/src/Parser/Game/ParsePlayer.cpp @@ -2,7 +2,6 @@ #include "Game/Player.h" #include "GameUtils.h" #include "ParseItem.h" -#include "Parser/ParseAction.h" #include "Parser/Utils/ParseUtils.h" namespace Parser @@ -10,7 +9,7 @@ namespace Parser using namespace rapidjson; void parsePlayerItem(Game& game, Level& level, - const ItemCollection& inventory, Player& player, size_t invIdx, const Value& elem) + const Inventory& inventory, Player& player, size_t invIdx, const Value& elem) { if (elem.HasMember("index") == false) { @@ -101,13 +100,19 @@ namespace Parser const auto& classesElem = elem["allowedClassTypes"]; if (classesElem.IsString() == true) { - inventory.allowType(Utils::toLower(classesElem.GetString())); + auto name = Utils::toLower(getStringViewVal(classesElem)); + auto nameHash = str2int16(name); + level.setPropertyName(nameHash, name); + inventory.allowTypeByHash(nameHash); } else if (classesElem.IsArray() == true) { for (const auto& arrElem : classesElem) { - inventory.allowType(Utils::toLower(getStringVal(arrElem))); + auto name = Utils::toLower(getStringViewVal(arrElem)); + auto nameHash = str2int16(name); + level.setPropertyName(nameHash, name); + inventory.allowTypeByHash(nameHash); } } } @@ -128,6 +133,18 @@ namespace Parser } } + void parsePlayerSpell(Game& game, Level& level, + Player& player, const Value& elem) + { + auto id = getStringKey(elem, "class"); + auto spellClass = level.getSpellClass(id); + if (spellClass == nullptr) + { + return; + } + player.addSpell(id, std::make_unique(spellClass)); + } + void parsePlayer(Game& game, const Value& elem) { if (isValidString(elem, "class") == false) @@ -170,23 +187,24 @@ namespace Parser player->setDirection(getPlayerDirectionKey(elem, "direction")); player->setAnimation(getPlayerAnimationKey(elem, "animation")); - player->setRestStatus((uint8_t)getUIntKey(elem, "restStatus")); player->setTextureIdx(getUIntKey(elem, "textureIndex")); + player->setStatus(getPlayerStatusKey(elem, "status")); + player->setRestStatus((uint8_t)getUIntKey(elem, "restStatus")); - auto outline = getColorKey(elem, "outline", class_->DefaultOutline()); - auto outlineIgnore = getColorKey(elem, "outlineIgnore", class_->DefaultOutlineIgnore()); + auto outline = getColorKey(elem, "outline", class_->Outline()); + auto outlineIgnore = getColorKey(elem, "outlineIgnore", class_->OutlineIgnore()); player->setOutline(outline, outlineIgnore); player->setOutlineOnHover(getBoolKey(elem, "outlineOnHover", true)); player->setAI(getBoolKey(elem, "AI")); - auto id = getStringKey(elem, "id"); + auto id = getStringViewKey(elem, "id"); if (isValidId(id) == false) { - id.clear(); + id = {}; } player->Id(id); - player->Name(getStringKey(elem, "name", class_->Name())); + player->Name(getStringViewKey(elem, "name")); if (elem.HasMember("properties") == true) { @@ -197,20 +215,17 @@ namespace Parser { if (it->name.GetStringLength() > 0) { - auto nameHash = str2int16(it->name.GetString()); - level->setPropertyName(nameHash, it->name.GetString()); + auto name = getStringViewVal(it->name); + auto nameHash = str2int16(name); + level->setPropertyName(nameHash, name); player->setNumberByHash(nameHash, - getMinMaxNumber32Val(it->value), level); + getMinMaxNumber32Val(it->value), nullptr); } } + player->updateLevelFromExperience(*level, false); } } - if (elem.HasMember("action") == true) - { - player->setAction(parseAction(game, elem["action"])); - } - if (elem.HasMember("inventory") == true) { const auto& invElem = elem["inventory"]; @@ -227,6 +242,22 @@ namespace Parser } } + if (elem.HasMember("spell") == true) + { + const auto& spellElem = elem["spell"]; + if (spellElem.IsArray() == true) + { + for (const auto& val : spellElem) + { + parsePlayerSpell(game, *level, *player, val); + } + } + else if (spellElem.IsObject() == true) + { + parsePlayerSpell(game, *level, *player, spellElem); + } + } + player->updateProperties(); player->updateTexture(); diff --git a/src/Parser/Game/ParsePlayerClass.cpp b/src/Parser/Game/ParsePlayerClass.cpp index e1a978c1..cea897b2 100755 --- a/src/Parser/Game/ParsePlayerClass.cpp +++ b/src/Parser/Game/ParsePlayerClass.cpp @@ -101,6 +101,15 @@ namespace Parser playerClass.setSound((size_t)idx, *sndBuffer); } + void parseDescriptionValue(PlayerClass& playerClass, + const Level& level, const Value& elem) + { + playerClass.setDescription( + getUIntKey(elem, "index"), + level.getClassifier(getStringKey(elem, "name")), + (uint16_t)getUIntKey(elem, "skip")); + } + void parsePlayerClass(Game& game, const Value& elem) { if (isValidString(elem, "id") == false) @@ -183,9 +192,11 @@ namespace Parser { playerClass->Type(getStringVal(elem["type"])); } - if (elem.HasMember("description") == true) + + if (elem.HasMember("nameClassifier") == true) { - playerClass->Description(getStringVal(elem["description"])); + playerClass->setNameClassifier( + level->getClassifier(getStringKey(elem, "nameClassifier"))); } if (elem.HasMember("defaults") == true) @@ -197,8 +208,9 @@ namespace Parser { if (it->name.GetStringLength() > 0) { - auto nameHash = str2int16(it->name.GetString()); - level->setPropertyName(nameHash, it->name.GetString()); + auto name = getStringViewVal(it->name); + auto nameHash = str2int16(name); + level->setPropertyName(nameHash, name); playerClass->setDefaultByHash(nameHash, getMinMaxNumber32Val(it->value)); } @@ -218,18 +230,34 @@ namespace Parser std::shared_ptr action; if (it->value.IsString() == true) { - action = playerClass->getAction(str2int16(it->value.GetString())); + action = playerClass->getAction(str2int16(getStringViewVal(it->value))); } if (action == nullptr) { action = parseAction(game, it->value); } - playerClass->setAction(str2int16(it->name.GetString()), action); + playerClass->setAction(str2int16(getStringViewVal(it->name)), action); } } } } + if (elem.HasMember("descriptions") == true) + { + const auto& descriptions = elem["descriptions"]; + if (descriptions.IsObject() == true) + { + parseDescriptionValue(*playerClass, *level, descriptions); + } + else if (descriptions.IsArray() == true) + { + for (const auto& val : descriptions) + { + parseDescriptionValue(*playerClass, *level, val); + } + } + } + if (elem.HasMember("animationSpeeds") == true) { const auto& speeds = elem["animationSpeeds"]; @@ -262,25 +290,25 @@ namespace Parser } } - if (elem.HasMember("defaultAttackSound") == true) + if (elem.HasMember("aAttackSound") == true) { - playerClass->setDefaultAttackSound((int16_t)getIntVal(elem["defaultAttackSound"], -1)); + playerClass->setAttackSound((int16_t)getIntVal(elem["attackSound"], -1)); } - if (elem.HasMember("defaultDefendSound") == true) + if (elem.HasMember("defendSound") == true) { - playerClass->setDefaultDefendSound((int16_t)getIntVal(elem["defaultDefendSound"], -1)); + playerClass->setDefendSound((int16_t)getIntVal(elem["defendSound"], -1)); } - if (elem.HasMember("defaultDieSound") == true) + if (elem.HasMember("dieSound") == true) { - playerClass->setDefaultDieSound((int16_t)getIntVal(elem["defaultDieSound"], -1)); + playerClass->setDieSound((int16_t)getIntVal(elem["dieSound"], -1)); } - if (elem.HasMember("defaultHitSound") == true) + if (elem.HasMember("hitSound") == true) { - playerClass->setDefaultHitSound((int16_t)getIntVal(elem["defaultHitSound"], -1)); + playerClass->setHitSound((int16_t)getIntVal(elem["hitSound"], -1)); } - if (elem.HasMember("defaultWalkSound") == true) + if (elem.HasMember("walkSound") == true) { - playerClass->setDefaultWalkSound((int16_t)getIntVal(elem["defaultWalkSound"], -1)); + playerClass->setWalkSound((int16_t)getIntVal(elem["walkSound"], -1)); } if (elem.HasMember("maxStrength") == true) @@ -315,43 +343,43 @@ namespace Parser if (elem.HasMember("lifeFormula") == true) { - playerClass->setLifeFormula(getStringVal(elem["lifeFormula"])); + playerClass->setLifeFormula(getStringViewVal(elem["lifeFormula"])); } if (elem.HasMember("manaFormula") == true) { - playerClass->setManaFormula(getStringVal(elem["manaFormula"])); + playerClass->setManaFormula(getStringViewVal(elem["manaFormula"])); } if (elem.HasMember("armorFormula") == true) { - playerClass->setArmorFormula(getStringVal(elem["armorFormula"])); + playerClass->setArmorFormula(getStringViewVal(elem["armorFormula"])); } if (elem.HasMember("toHitFormula") == true) { - playerClass->setToHitFormula(getStringVal(elem["toHitFormula"])); + playerClass->setToHitFormula(getStringViewVal(elem["toHitFormula"])); } if (elem.HasMember("damageFormula") == true) { - playerClass->setDamageFormula(getStringVal(elem["damageFormula"])); + playerClass->setDamageFormula(getStringViewVal(elem["damageFormula"])); } if (elem.HasMember("resistMagicFormula") == true) { - playerClass->setResistMagicFormula(getStringVal(elem["resistMagicFormula"])); + playerClass->setResistMagicFormula(getStringViewVal(elem["resistMagicFormula"])); } if (elem.HasMember("resistFireFormula") == true) { - playerClass->setResistFireFormula(getStringVal(elem["resistFireFormula"])); + playerClass->setResistFireFormula(getStringViewVal(elem["resistFireFormula"])); } if (elem.HasMember("resistLightningFormula") == true) { - playerClass->setResistLightningFormula(getStringVal(elem["resistLightningFormula"])); + playerClass->setResistLightningFormula(getStringViewVal(elem["resistLightningFormula"])); } - if (elem.HasMember("defaultOutline") == true) + if (elem.HasMember("outline") == true) { - playerClass->DefaultOutline(getColorVal(elem["defaultOutline"], sf::Color::Transparent)); + playerClass->Outline(getColorVal(elem["outline"], sf::Color::Transparent)); } - if (elem.HasMember("defaultOutlineIgnore") == true) + if (elem.HasMember("outlineIgnore") == true) { - playerClass->DefaultOutlineIgnore(getColorVal(elem["defaultOutlineIgnore"], sf::Color::Transparent)); + playerClass->OutlineIgnore(getColorVal(elem["outlineIgnore"], sf::Color::Transparent)); } } } diff --git a/src/Parser/Game/ParseQuest.cpp b/src/Parser/Game/ParseQuest.cpp index d80a987d..23bfb67d 100755 --- a/src/Parser/Game/ParseQuest.cpp +++ b/src/Parser/Game/ParseQuest.cpp @@ -7,8 +7,8 @@ namespace Parser Quest parseQuestObj(Game& game, const Value& elem) { - return Quest(getStringKey(elem, "id"), - getStringKey(elem, "name"), getIntKey(elem, "state")); + return Quest(getStringViewKey(elem, "id"), + getStringViewKey(elem, "name"), getIntKey(elem, "state")); } void parseQuest(Game& game, const Value& elem) diff --git a/src/Parser/Game/ParseSpell.cpp b/src/Parser/Game/ParseSpell.cpp new file mode 100755 index 00000000..4e2af907 --- /dev/null +++ b/src/Parser/Game/ParseSpell.cpp @@ -0,0 +1,47 @@ +#include "ParseSpell.h" +#include "Game/Spell.h" +#include "Parser/ParseAction.h" +#include "Parser/Utils/ParseUtils.h" + +namespace Parser +{ + using namespace rapidjson; + + std::unique_ptr parseSpellObj(Game& game, + Level& level, const Value& elem) + { + if (isValidString(elem, "class") == false) + { + return nullptr; + } + + auto class_ = level.getSpellClass(elem["class"].GetString()); + if (class_ == nullptr) + { + return nullptr; + } + + auto spell = std::make_unique(class_); + + if (elem.HasMember("properties") == true) + { + const auto& props = elem["properties"]; + if (props.IsObject() == true) + { + for (auto it = props.MemberBegin(); it != props.MemberEnd(); ++it) + { + if (it->name.GetStringLength() > 0) + { + auto name = getStringViewVal(it->name); + auto nameHash = str2int16(name); + level.setPropertyName(nameHash, name); + spell->setIntByHash(nameHash, + getMinMaxIntVal(it->value)); + } + } + } + } + + return spell; + } +} diff --git a/src/Parser/Game/ParseSpell.h b/src/Parser/Game/ParseSpell.h new file mode 100755 index 00000000..0e2c23e6 --- /dev/null +++ b/src/Parser/Game/ParseSpell.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Game.h" +#include "Game/Spell.h" +#include "Json/JsonParser.h" + +namespace Parser +{ + std::unique_ptr parseSpellObj(Game& game, + Level& level, const rapidjson::Value& elem); +} diff --git a/src/Parser/Game/ParseSpellClass.cpp b/src/Parser/Game/ParseSpellClass.cpp new file mode 100755 index 00000000..a2255d02 --- /dev/null +++ b/src/Parser/Game/ParseSpellClass.cpp @@ -0,0 +1,168 @@ +#include "ParseSpellClass.h" +#include "Game/GameHashes.h" +#include "Game/ItemClass.h" +#include "Parser/ParseAction.h" +#include "Parser/Utils/ParseUtils.h" + +namespace Parser +{ + using namespace rapidjson; + + void parseDescriptionValue(SpellClass& spellClass, + const Level& level, const Value& elem) + { + spellClass.setDescription( + getUIntKey(elem, "index"), + level.getClassifier(getStringKey(elem, "name")), + (uint16_t)getUIntKey(elem, "skip")); + } + + std::unique_ptr parseSpellClassHelper(const Game& game, + const Level& level, const Value& elem, std::string& id) + { + if (isValidString(elem, "id") == false) + { + return nullptr; + } + id = std::string(elem["id"].GetString()); + if (isValidId(id) == false) + { + return nullptr; + } + if (level.hasSpellClass(id) == true) + { + return nullptr; + } + + std::unique_ptr spellClass; + + if (isValidString(elem, "fromId") == true) + { + std::string fromId(elem["fromId"].GetString()); + if (fromId != id) + { + auto obj = level.getSpellClass(fromId); + if (obj == nullptr) + { + return nullptr; + } + spellClass = std::make_unique(*obj); + } + } + + auto texturePack1 = game.Resources().getTexturePack( + getStringKey(elem, "texturePack1")); + auto texturePack2 = game.Resources().getTexturePack( + getStringKey(elem, "texturePack1")); + + auto textureIndex1 = (size_t)getUIntKey(elem, "textureIndex1"); + auto textureIndex2 = (size_t)getUIntKey(elem, "textureIndex2"); + + if (spellClass == nullptr) + { + if (texturePack1 != nullptr && + texturePack2 != nullptr) + { + spellClass = std::make_unique( + texturePack1, texturePack2, textureIndex1, textureIndex2); + } + } + else + { + if (texturePack1 != nullptr) + { + spellClass->setTexturePack1(texturePack1); + } + if (texturePack2 != nullptr) + { + spellClass->setTexturePack2(texturePack2); + } + if (elem.HasMember("textureIndex1") == true) + { + spellClass->setTextureIndex1(textureIndex1); + } + if (elem.HasMember("textureIndex2") == true) + { + spellClass->setTextureIndex2(textureIndex2); + } + } + return spellClass; + } + + void parseSpellClass(Game& game, const Value& elem) + { + auto level = game.Resources().getLevel(getStringKey(elem, "level")); + if (level == nullptr) + { + return; + } + std::string id; + auto spellClass = parseSpellClassHelper(game, *level, elem, id); + if (spellClass == nullptr) + { + return; + } + + spellClass->Id(id); + + if (elem.HasMember("name") == true) + { + spellClass->Name(getStringVal(elem["name"])); + } + if (elem.HasMember("type") == true) + { + spellClass->Type(getStringVal(elem["type"])); + } + + if (elem.HasMember("defaults") == true) + { + const auto& defaults = elem["defaults"]; + if (defaults.IsObject() == true) + { + for (auto it = defaults.MemberBegin(); it != defaults.MemberEnd(); ++it) + { + if (it->name.GetStringLength() > 0) + { + auto name = getStringViewVal(it->name); + auto nameHash = str2int16(name); + level->setPropertyName(nameHash, name); + LevelObjValue val; + switch (nameHash) + { + case ItemProp::UseOn: + case ItemProp::UseOp: + { + auto opStr = getStringViewVal(it->value); + val = str2int16(opStr); + level->setPropertyName(val, opStr); + break; + } + default: + val = getMinMaxIntVal(it->value); + break; + } + spellClass->setDefault(name, val); + } + } + } + } + + if (elem.HasMember("descriptions") == true) + { + const auto& descriptions = elem["descriptions"]; + if (descriptions.IsObject() == true) + { + parseDescriptionValue(*spellClass, *level, descriptions); + } + else if (descriptions.IsArray() == true) + { + for (const auto& val : descriptions) + { + parseDescriptionValue(*spellClass, *level, val); + } + } + } + + level->addSpellClass(id, std::move(spellClass)); + } +} diff --git a/src/Parser/Game/ParseSpellClass.h b/src/Parser/Game/ParseSpellClass.h new file mode 100755 index 00000000..c9bcb194 --- /dev/null +++ b/src/Parser/Game/ParseSpellClass.h @@ -0,0 +1,9 @@ +#pragma once + +#include "Game.h" +#include "Json/JsonParser.h" + +namespace Parser +{ + void parseSpellClass(Game& game, const rapidjson::Value& elem); +} diff --git a/src/Parser/ParseAction.cpp b/src/Parser/ParseAction.cpp index 14da64a1..85a63b72 100755 --- a/src/Parser/ParseAction.cpp +++ b/src/Parser/ParseAction.cpp @@ -8,6 +8,7 @@ #include "Actions/ActEvent.h" #include "Actions/ActFade.h" #include "Actions/ActFocus.h" +#include "Actions/ActFont.h" #include "Actions/ActGame.h" #include "Actions/ActImage.h" #include "Actions/ActInputText.h" @@ -140,7 +141,7 @@ namespace Parser { return nullptr; } - switch (str2int16(elem["name"].GetString())) + switch (str2int16(getStringViewVal(elem["name"]))) { case str2int16("=="): { @@ -184,6 +185,7 @@ namespace Parser { auto action = std::make_shared( getStringKey(elem, "id"), + getVariableKey(elem, "volume"), getBoolKey(elem, "clear")); if (elem.HasMember("loop") == true) @@ -237,7 +239,7 @@ namespace Parser case str2int16("condition"): { return getIfCondition( - str2int16(getStringKey(elem, "condition").c_str()), + str2int16(getStringViewKey(elem, "condition")), game, elem); } case str2int16("cursor.enableOutline"): @@ -270,6 +272,12 @@ namespace Parser { return std::make_shared(getBoolKey(elem, "show")); } + case str2int16("dir.copy"): + { + return std::make_shared( + getStringKey(elem, "source"), + getStringKey(elem, "destination")); + } case str2int16("dir.create"): { return std::make_shared(getStringKey(elem, "file")); @@ -348,7 +356,7 @@ namespace Parser { return std::make_shared( getStringKey(elem, "id"), - str2int16(getStringCharKey(elem, "action"))); + str2int16(getStringViewKey(elem, "action"))); } case str2int16("drawable.horizontalAnchorToFocused"): { @@ -363,6 +371,7 @@ namespace Parser getStringKey(elem, "idAnchorTo"), getUIntKey(elem, "range"), getVariableKey(elem, "position"), + getUIntKey(elem, "min"), getUIntKey(elem, "max"), getVariableKey(elem, "steps")); } @@ -373,6 +382,7 @@ namespace Parser getStringKey(elem, "idAnchorTo"), getUIntKey(elem, "range"), getVariableKey(elem, "position"), + getUIntKey(elem, "min"), getUIntKey(elem, "max"), getVariableKey(elem, "steps")); } @@ -444,7 +454,7 @@ namespace Parser { return std::make_shared( getStringKey(elem, "id"), - getStringCharKey(elem, "event"), + getStringViewKey(elem, "event"), getActionKey(game, elem, "action")); } case str2int16("drawable.setPosition"): @@ -552,6 +562,19 @@ namespace Parser getStringKey(elem, "id"), getBoolKey(elem, "focus", true)); } + case str2int16("font.setPalette"): + { + return std::make_shared( + getStringKey(elem, "id"), + getStringKey(elem, "palette"), + getColorKey(elem, "color", sf::Color::White)); + } + case str2int16("game.addToProperty"): + { + return std::make_shared( + getStringKey(elem, "property"), + getVariableKey(elem, "value")); + } case str2int16("game.clearPlayingSounds"): { return std::make_shared(); @@ -602,6 +625,10 @@ namespace Parser { return std::make_shared(getBoolKey(elem, "pause", true)); } + case str2int16("game.setGamma"): + { + return std::make_shared(getVariableKey(elem, "gamma")); + } case str2int16("game.setMusicVolume"): { return std::make_shared(getVariableKey(elem, "volume")); @@ -626,6 +653,10 @@ namespace Parser { return std::make_shared(getVariableKey(elem, "volume")); } + case str2int16("if"): + { + return getMultiIfCondition(game, elem); + } case str2int16("if.equal"): { return getIfCondition(str2int16("=="), game, elem); @@ -646,9 +677,9 @@ namespace Parser { return getIfCondition(str2int16("!="), game, elem); } - case str2int16("if.resourceExists"): + case str2int16("if.regex"): { - return getIfCondition(str2int16("resourceExists"), game, elem); + return getIfCondition(str2int16("regex"), game, elem); } case str2int16("image.centerTexture"): { @@ -713,10 +744,10 @@ namespace Parser } else { - return std::make_shared( + return std::make_shared( getStringKey(elem, "id"), - getStringKey(elem, "level"), - getItemLocationVal(elem), + getStringKey(elem, "query"), + getUIntKey(elem, "index", 1), getBoolKey(elem, "resetRect", true)); } } @@ -736,7 +767,23 @@ namespace Parser } case str2int16("io.deleteAll"): { - return std::make_shared(getStringKey(elem, "file")); + return std::make_shared( + getStringKey(elem, "file"), + getBoolKey(elem, "deleteRoot", true)); + } + case str2int16("item.addCursor"): + { + return std::make_shared( + getStringKey(elem, "level"), + getItemLocationVal(elem)); + } + case str2int16("item.addQuantity"): + { + return std::make_shared( + getStringKey(elem, "level"), + getItemLocationVal(elem), + getVariableKey(elem, "value"), + getBoolKey(elem, "remove")); } case str2int16("item.delete"): { @@ -750,17 +797,19 @@ namespace Parser getStringKey(elem, "level"), getItemCoordInventoryVal(elem)); } - case str2int16("item.executeDropAction"): + case str2int16("item.executeAction"): { - return std::make_shared( + return std::make_shared( getStringKey(elem, "level"), - getStringKey(elem, "player")); + getItemLocationVal(elem), + str2int16(getStringViewKey(elem, "action"))); } case str2int16("item.loadFromLevel"): { auto action = std::make_shared( getStringKey(elem, "level"), - getItemCoordInventoryVal(elem)); + getItemCoordInventoryVal(elem), + getBoolKey(elem, "splitIntoMultiple")); if (elem.HasMember("position") == true) { @@ -834,6 +883,11 @@ namespace Parser return std::make_shared( getStringKey(elem, "level")); } + case str2int16("level.clearQuests"): + { + return std::make_shared( + getStringKey(elem, "level")); + } case str2int16("level.move"): { return std::make_shared( @@ -861,8 +915,40 @@ namespace Parser return std::make_shared( getStringKey(elem, "level"), getStringKey(elem, "file"), - getBoolKey(elem, "skipDefaults"), - getBoolKey(elem, "skipCurrentPlayer")); + getBoolKey(elem, "saveDefaults"), + getBoolKey(elem, "saveCurrentPlayer"), + getBoolKey(elem, "saveQuests")); + } + case str2int16("level.setAutomap"): + { + return std::make_shared( + getStringKey(elem, "level"), + getStringKey(elem, "automap"), + getVector2uKey>(elem, "tileSize", { 64u, 32u })); + } + case str2int16("level.setAutomapBackground"): + { + return std::make_shared( + getStringKey(elem, "level"), + getColorKey(elem, "color", sf::Color::Transparent)); + } + case str2int16("level.setAutomapPosition"): + { + return std::make_shared( + getStringKey(elem, "level"), + getVector2iKey(elem, "position")); + } + case str2int16("level.setAutomapSize"): + { + return std::make_shared( + getStringKey(elem, "level"), + getVector2iKey(elem, "size", { 100, 100 })); + } + case str2int16("level.showAutomap"): + { + return std::make_shared( + getStringKey(elem, "level"), + getBoolKey(elem, "show", true)); } case str2int16("level.zoom"): { @@ -872,6 +958,24 @@ namespace Parser getBoolKey(elem, "relative"), getBoolKey(elem, "smooth")); } + case str2int16("levelObject.delete"): + { + return std::make_shared( + getStringKey(elem, "level"), + getStringKey(elem, "object")); + } + case str2int16("levelObject.deleteByClass"): + { + return std::make_shared( + getStringKey(elem, "level"), + getStringKey(elem, "class")); + } + case str2int16("levelObject.executeAction"): + { + return std::make_shared( + getStringKey(elem, "level"), + getStringKey(elem, "object")); + } case str2int16("levelObject.setOutline"): { return std::make_shared( @@ -956,7 +1060,7 @@ namespace Parser return std::make_shared( getStringKey(elem, "id"), getUIntKey(elem, "index"), - getStringKey(elem, "idFont")); + getStringKey(elem, "font")); } case str2int16("menu.setIndex"): { @@ -976,6 +1080,15 @@ namespace Parser { return std::make_shared(getStringKey(elem, "id")); } + case str2int16("palette.replace"): + { + return std::make_shared( + getStringKey(elem, "id"), + getStringKey(elem, "idSource"), + getUIntKey(elem, "srcStart", 0), + getUIntKey(elem, "size", 256), + getUIntKey(elem, "dstStart", 0)); + } case str2int16("palette.shiftLeft"): { return std::make_shared( @@ -988,14 +1101,16 @@ namespace Parser return std::make_shared( getStringKey(elem, "id"), getUIntKey(elem, "shift", 1), - getVector2uKey>(elem, "range", {0, 256})); + getVector2uKey>(elem, "range", { 0, 256 })); } - case str2int16("player.addGold"): + case str2int16("player.addItemQuantity"): { - return std::make_shared( + return std::make_shared( getStringKey(elem, "player"), getStringKey(elem, "level"), - getVariableKey(elem, "gold"), + getStringKey(elem, "itemClass"), + getInventoryPositionKey(elem, "position"), + getVariableKey(elem, "value"), getBoolKey(elem, "remove")); } case str2int16("player.addToProperty"): @@ -1021,13 +1136,22 @@ namespace Parser getStringKey(elem, "player"), getStringKey(elem, "level")); } - case str2int16("player.save"): + case str2int16("player.removeItemQuantity"): { - return std::make_shared( + return std::make_shared( getStringKey(elem, "player"), getStringKey(elem, "level"), - getStringKey(elem, "file"), - getBoolKey(elem, "skipDefaults")); + getStringKey(elem, "itemClass"), + getInventoryPositionKey(elem, "position"), + getVariableKey(elem, "value"), + true); + } + case str2int16("player.selectSpell"): + { + return std::make_shared( + getStringKey(elem, "player"), + getStringKey(elem, "level"), + getStringKey(elem, "spell")); } case str2int16("player.setDefaultSpeed"): { @@ -1045,14 +1169,6 @@ namespace Parser getStringKey(elem, "level"), speed); } - case str2int16("player.removeGold"): - { - return std::make_shared( - getStringKey(elem, "player"), - getStringKey(elem, "level"), - getVariableKey(elem, "gold"), - true); - } case str2int16("player.setDirection"): { return std::make_shared( @@ -1084,14 +1200,18 @@ namespace Parser } case str2int16("quest.add"): { - auto quest = parseQuestObj(game, elem); - if (isValidId(quest.Id()) == false) + if (elem.HasMember("quest") == true) { - return nullptr; + auto quest = parseQuestObj(game, elem["quest"]); + if (isValidId(quest.Id()) == false) + { + return nullptr; + } + return std::make_shared( + getStringKey(elem, "level"), + std::move(quest)); } - return std::make_shared( - getStringKey(elem, "level"), - std::move(quest)); + return nullptr; } case str2int16("quest.delete"): { @@ -1157,6 +1277,10 @@ namespace Parser getStringKey(elem, "id"), getIgnoreResourceKey(elem, "ignore", IgnoreResource::Draw | IgnoreResource::Update)); } + case str2int16("resource.moveToTop"): + { + return std::make_shared(getStringKey(elem, "id")); + } case str2int16("resource.pop"): { return std::make_shared( @@ -1202,7 +1326,7 @@ namespace Parser { return std::make_shared( getStringKey(elem, "id"), - getStringKey(elem, "idFont")); + getStringKey(elem, "font")); } case str2int16("text.setSpacing"): { @@ -1222,10 +1346,15 @@ namespace Parser { return parseSetTextHelper(game, elem); } + case str2int16("variable.add"): + { + return std::make_shared( + getStringKey(elem, "key"), + getVariableKey(elem, "value")); + } case str2int16("variable.clear"): { - return std::make_shared( - getStringKey(elem, "key")); + return std::make_shared(getStringKey(elem, "key")); } case str2int16("variable.save"): { @@ -1242,7 +1371,7 @@ namespace Parser } return std::make_shared( key, - getVariableKey(elem, "val")); + getVariableKey(elem, "value")); } case str2int16("variable.setId"): { @@ -1265,7 +1394,7 @@ namespace Parser } return std::make_shared( key, - getVariableKey(elem, "val")); + getVariableKey(elem, "value")); } default: return nullptr; diff --git a/src/Parser/ParseAnimation.cpp b/src/Parser/ParseAnimation.cpp index 7e552efa..d86063ce 100755 --- a/src/Parser/ParseAnimation.cpp +++ b/src/Parser/ParseAnimation.cpp @@ -102,13 +102,6 @@ namespace Parser { return; } - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, animation); - } - else - { - game.Resources().addDrawable(id, animation); - } + game.Resources().addDrawable(id, animation, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseAudio.cpp b/src/Parser/ParseAudio.cpp index ee218daa..cb12fda2 100755 --- a/src/Parser/ParseAudio.cpp +++ b/src/Parser/ParseAudio.cpp @@ -1,36 +1,35 @@ #include "ParseAudio.h" #include "ParseAudioCommon.h" -#include "MusicLoops.h" +#include "SFML/MusicLoops.h" #include "Utils/ParseUtils.h" namespace Parser { using namespace rapidjson; -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) bool openMusicFromBuffer(Game& game, std::shared_ptr& music, - sf::SoundBuffer& buffer, const std::string& id) + sf::SoundBuffer& buffer, const std::string& id, const std::string_view resource) { if (music->openFromSoundBuffer(buffer) == true) { - if (game.Resources().addSong(id, music) == true) + if (game.Resources().addSong(id, music, resource) == true) { return true; } } return false; } -#endif bool openMusicFromFile(Game& game, std::shared_ptr music, - sf::PhysFSStream& stream, const AudioSource audioSource, const std::string& id) + sf::PhysFSStream& stream, const AudioSource audioSource, + const std::string& id, const std::string_view resource) { if (music->openFromStream(stream) == true && game.Resources().hasSong(id, true) == false) { - if (game.Resources().addAudioSource(id, audioSource) == true) + if (game.Resources().addAudioSource(id, audioSource, resource) == true) { - game.Resources().addSong(id, music); + game.Resources().addSong(id, music, resource); return true; } } @@ -52,14 +51,14 @@ namespace Parser } auto music = std::make_shared(); + auto resource = getStringViewKey(elem, "resource"); - if (openMusicFromFile(game, music, *stream, stream, id) == true) + if (openMusicFromFile(game, music, *stream, stream, id, resource) == true) { return music.get(); } return nullptr; } -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) auto sndFile = std::make_shared(file); if (sndFile->file.hasError() == true) { @@ -68,9 +67,10 @@ namespace Parser auto music = std::make_shared(); auto music2 = std::dynamic_pointer_cast(music); + auto resource = getStringViewKey(elem, "resource"); if (openMusicFromFile(game, music2, - sndFile->file, sndFile, id) == true) + sndFile->file, sndFile, id, resource) == true) { if (hasLoopNames == true) { @@ -86,13 +86,12 @@ namespace Parser else if (isValidString(elem, "playText") == true) { updateAudioLoopString( - elem["playText"].GetString(), + getStringViewVal(elem["playText"]), sndFile->loops, *music); } return music.get(); } -#endif return nullptr; } @@ -106,7 +105,6 @@ namespace Parser } bool validId = isValidId(id); -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) if (isValidString(elem, "sourceId") == true && validId == true) { @@ -136,7 +134,8 @@ namespace Parser { music = std::make_shared(); } - if (openMusicFromBuffer(game, music, *sndBuffer, id) == true) + auto resource = getStringViewKey(elem, "resource"); + if (openMusicFromBuffer(game, music, *sndBuffer, id, resource) == true) { return music.get(); } @@ -152,9 +151,10 @@ namespace Parser auto music = std::make_shared(); auto music2 = std::dynamic_pointer_cast(music); + auto resource = getStringViewKey(elem, "resource"); if (openMusicFromBuffer(game, music2, - sndBuffer->soundBuffer, id) == true) + sndBuffer->soundBuffer, id, resource) == true) { if (isValidString(elem, "loopPoints") == true) { @@ -166,7 +166,7 @@ namespace Parser else if (isValidString(elem, "playText") == true) { updateAudioLoopString( - elem["playText"].GetString(), + getStringViewVal(elem["playText"]), sndBuffer->loops, *music); } @@ -175,9 +175,6 @@ namespace Parser } } else if (isValidString(elem, "file") == true) -#else - if (isValidString(elem, "file") == true) -#endif { std::string file(elem["file"].GetString()); @@ -210,7 +207,7 @@ namespace Parser auto obj = game.Resources().getSong(fromId); if (obj != nullptr) { - game.Resources().addSong(id, obj); + game.Resources().addSong(id, obj, getStringViewKey(elem, "resource")); } } } @@ -234,14 +231,12 @@ namespace Parser music->setLoop(getBoolKey(elem, "loop")); -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) auto musicLoop = dynamic_cast(music); if (musicLoop != nullptr) { musicLoop->setLoop(music->getLoop()); music->setLoop(true); } -#endif auto volume = getVariableKey(elem, "volume"); auto vol = game.getVarOrProp(volume, game.MusicVolume()); if (vol > 100) diff --git a/src/Parser/ParseAudioCommon.cpp b/src/Parser/ParseAudioCommon.cpp index efacbaef..7543df21 100755 --- a/src/Parser/ParseAudioCommon.cpp +++ b/src/Parser/ParseAudioCommon.cpp @@ -1,5 +1,4 @@ #include "ParseAudioCommon.h" -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) #include "Utils/ParseUtils.h" #include "Utils/Utils.h" @@ -69,7 +68,7 @@ namespace Parser music.setMultiLoopPoints(loopPoints); } - void updateAudioLoopString(const std::string& str, + void updateAudioLoopString(const std::string_view str, const std::unordered_map& loopNames, sf::MusicLoops& music) { @@ -118,4 +117,3 @@ namespace Parser music.setMultiLoopPoints(loopPoints); } } -#endif diff --git a/src/Parser/ParseAudioCommon.h b/src/Parser/ParseAudioCommon.h index 53636720..1a3f5379 100755 --- a/src/Parser/ParseAudioCommon.h +++ b/src/Parser/ParseAudioCommon.h @@ -1,8 +1,8 @@ #pragma once -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) #include "Json/JsonParser.h" -#include "MusicLoops.h" +#include "SFML/MusicLoops.h" #include +#include #include #include @@ -22,8 +22,7 @@ namespace Parser void parseAudioLoopPointsVal(const rapidjson::Value& elem, const char* key, sf::MusicLoops& music); - void updateAudioLoopString(const std::string& str, + void updateAudioLoopString(const std::string_view str, const std::unordered_map& loopNames, sf::MusicLoops& music); } -#endif diff --git a/src/Parser/ParseButton.cpp b/src/Parser/ParseButton.cpp index 4abacd52..df22378c 100755 --- a/src/Parser/ParseButton.cpp +++ b/src/Parser/ParseButton.cpp @@ -35,7 +35,6 @@ namespace Parser button->setTextureRect(getIntRectKey(elem, "textureRect", rect)); } button->setResizable(getBoolKey(elem, "resizable")); - button->setCaptureInputEvents(getBoolKey(elem, "captureInputEvents")); auto outline = getColorKey(elem, "outline", sf::Color::Transparent); auto outlineIgnore = getColorKey(elem, "outlineIgnore", sf::Color::Transparent); @@ -52,7 +51,6 @@ namespace Parser { return nullptr; } - button->setCaptureInputEvents(getBoolKey(elem, "captureInputEvents")); return button; } @@ -109,6 +107,7 @@ namespace Parser button->enable(getBoolKey(elem, "enable", true)); button->setClickUp(getBoolKey(elem, "clickUp")); + button->setCaptureInputEvents(getInputEventKey(elem, "captureInputEvents")); if (elem.HasMember("onChange")) { @@ -159,14 +158,7 @@ namespace Parser button->setFocusSound(game.Resources().getSoundBuffer(elem["focusSound"].GetString())); } - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, button); - } - else - { - game.Resources().addDrawable(id, button); - } + game.Resources().addDrawable(id, button, getStringViewKey(elem, "resource")); if (getBoolKey(elem, "focus") == true) { diff --git a/src/Parser/ParseCircle.cpp b/src/Parser/ParseCircle.cpp index 814a73dc..ca0e6b32 100755 --- a/src/Parser/ParseCircle.cpp +++ b/src/Parser/ParseCircle.cpp @@ -55,13 +55,6 @@ namespace Parser circle->setOutlineColor(getColorKey(elem, "outlineColor", sf::Color::White)); circle->setOutlineThickness((float)getUIntKey(elem, "outlineThickness")); - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, circle); - } - else - { - game.Resources().addDrawable(id, circle); - } + game.Resources().addDrawable(id, circle, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseCondition.cpp b/src/Parser/ParseCondition.cpp index fad3cab7..2e9cc96b 100755 --- a/src/Parser/ParseCondition.cpp +++ b/src/Parser/ParseCondition.cpp @@ -35,6 +35,79 @@ namespace Parser getActionKey(game, elem, "else")); } + void parseMultiIfCondition(Game& game, IfCondition& conditions, const Value& elem) + { + size_t step = 0; + uint16_t conditionHash16 = str2int16("=="); + VarOrPredicate param1; + VarOrPredicate param2; + for (const auto& val : elem) + { + // step 0 - param 1 - can be a new condition array + // step 1 - == != > >= < <= regex + // step 2 - param 2 - adds condition ex: (param 1 > param2) + // step 3 - and/or - ex: param1 == param2 and param3 == param4 + + if (step == 1) + { + conditionHash16 = str2int16(getStringViewVal(val)); + } + else if (step == 3) + { + switch (str2int16(getStringViewVal(val))) + { + default: + case str2int16("and"): + conditions.addCondition(IfCondition::ConditionOp::And); + break; + case str2int16("or"): + conditions.addCondition(IfCondition::ConditionOp::Or); + break; + } + step = 0; + continue; + } + else + { + if (val.IsArray() == true) + { + conditions.addCondition(IfCondition::ConditionOp::LeftBracket); + parseMultiIfCondition(game, conditions, val); + conditions.addCondition(IfCondition::ConditionOp::RightBracket); + step = 3; + continue; + } + if (step == 0) + { + param1 = getVarOrPredicateVal(game, val); + } + else if (step == 2) + { + param2 = getVarOrPredicateVal(game, val); + conditions.addCondition(conditionHash16, param1, param2); + conditionHash16 = str2int16("=="); + param1 = {}; + param2 = {}; + } + } + step++; + } + } + + std::shared_ptr getMultiIfCondition(Game& game, const Value& elem) + { + if (isValidArray(elem, "params") == false) + { + return nullptr; + } + auto action = std::make_shared( + getActionKey(game, elem, "then"), + getActionKey(game, elem, "else")); + + parseMultiIfCondition(game, action->Conditions(), elem["params"]); + return action; + } + std::shared_ptr getSwitchConditionHelper( Game& game, const Value& elem, const char* actionName, const std::vector>>& cases) diff --git a/src/Parser/ParseCondition.h b/src/Parser/ParseCondition.h index 689cb2a9..d7a307dd 100755 --- a/src/Parser/ParseCondition.h +++ b/src/Parser/ParseCondition.h @@ -12,5 +12,7 @@ namespace Parser std::shared_ptr getInListCondition(Game& game, const rapidjson::Value& elem); + std::shared_ptr getMultiIfCondition(Game& game, const rapidjson::Value& elem); + std::shared_ptr getSwitchCondition(Game& game, const rapidjson::Value& elem); } diff --git a/src/Parser/ParseEvent.cpp b/src/Parser/ParseEvent.cpp index 624d75b9..c502c340 100755 --- a/src/Parser/ParseEvent.cpp +++ b/src/Parser/ParseEvent.cpp @@ -19,13 +19,19 @@ namespace Parser if (isValidString(elem, "id") == true) { - std::string id(elem["id"].GetString()); + auto id = getStringViewVal(elem["id"]); if (isValidId(id) == true) { evt->setId(id); } } - - game.Events().addBack(evt); + if (getBoolKey(elem, "addToFront") == true) + { + game.Events().addFront(evt); + } + else + { + game.Events().addBack(evt); + } } } diff --git a/src/Parser/ParseFile.cpp b/src/Parser/ParseFile.cpp index dd198b7f..5e5f39f0 100755 --- a/src/Parser/ParseFile.cpp +++ b/src/Parser/ParseFile.cpp @@ -2,6 +2,7 @@ #include #include "FileUtils.h" +#include "GameUtils.h" #include "Json/JsonUtils.h" #include "ParseAction.h" #include "ParseAnimation.h" @@ -28,14 +29,16 @@ #include "ParseText.h" #include "ParseTexture.h" #include "ParseTexturePack.h" +#include "Parser/Game/ParseClassifier.h" #include "Parser/Game/ParseItem.h" #include "Parser/Game/ParseItemClass.h" #include "Parser/Game/ParseLevel.h" #include "Parser/Game/ParseLevelObject.h" -#include "Parser/Game/ParseNamer.h" +#include "Parser/Game/ParseLevelObjectClass.h" #include "Parser/Game/ParsePlayer.h" #include "Parser/Game/ParsePlayerClass.h" #include "Parser/Game/ParseQuest.h" +#include "Parser/Game/ParseSpellClass.h" #include "PhysFSStream.h" #include "Utils/ParseUtils.h" #include "Utils/Utils.h" @@ -50,14 +53,14 @@ namespace Parser void parseDocumentElemHelper(Game& game, uint16_t nameHash16, const Value& elem, ReplaceVars& replaceVars, MemoryPoolAllocator& allocator); - void parseFile(Game& game, const std::string& fileName) + void parseFile(Game& game, const std::string_view fileName) { if (fileName == "null") { return; } - parseJson(game, FileUtils::readText(fileName.c_str())); + parseJson(game, FileUtils::readText(fileName.data())); } void parseFile(Game& game, const std::vector& params) @@ -67,7 +70,7 @@ namespace Parser return; } - auto fileName = params[0]; + auto fileName = GameUtils::replaceStringWithVarOrProp(params[0], game); if (fileName == "null") { return; @@ -76,8 +79,8 @@ namespace Parser auto json = FileUtils::readText(fileName.c_str()); for (size_t i = 1; i < params.size(); i++) { - auto param = game.getVarOrPropString(params[i]); - Utils::replaceStringInPlace(json, "{" + std::to_string(i) + "}", param); + auto param = GameUtils::replaceStringWithVarOrProp(params[i], game); + Utils::replaceStringInPlace(json, "{" + Utils::toString(i) + "}", param); } parseJson(game, json); } @@ -93,7 +96,9 @@ namespace Parser return; } - auto fileName = getStringIdx(params, 0); + auto fileName = GameUtils::replaceStringWithVarOrProp( + getStringViewIdx(params, 0), game + ); if (fileName == "null") { return; @@ -102,13 +107,13 @@ namespace Parser auto json = FileUtils::readText(fileName.c_str()); for (size_t i = 1; i < params.Size(); i++) { - auto param = game.getVarOrPropString(getStringVal(params[i])); - Utils::replaceStringInPlace(json, "{" + std::to_string(i) + "}", param); + auto param = GameUtils::replaceStringWithVarOrProp(getStringVal(params[i]), game); + Utils::replaceStringInPlace(json, "{" + Utils::toString(i) + "}", param); } parseJson(game, json); } - void parseJson(Game& game, const std::string& json) + void parseJson(Game& game, const std::string_view json) { Document doc; // Default template parameter uses UTF8 and MemoryPoolAllocator. @@ -126,7 +131,7 @@ namespace Parser MemoryPoolAllocator allocator; for (auto it = doc.MemberBegin(); it != doc.MemberEnd(); ++it) { - parseDocumentElemHelper(game, str2int16(it->name.GetString()), + parseDocumentElemHelper(game, str2int16(getStringViewVal(it->name)), it->value, replaceVars, allocator); } } @@ -134,16 +139,19 @@ namespace Parser void parseDocumentElemHelper(Game& game, uint16_t nameHash16, const Value& elem, ReplaceVars& replaceVars, MemoryPoolAllocator& allocator) { - bool replaceVarsInElem = false; + auto replaceVarsInElem = replaceVars; + bool changeValueType = replaceVars == ReplaceVars::Value; if (elem.IsObject() == true) { - replaceVarsInElem = getBoolKey(elem, "replaceVars"); + replaceVarsInElem = getReplaceVarsKey(elem, "replaceVars", replaceVarsInElem); + changeValueType = replaceVarsInElem == ReplaceVars::Value; } - if (replaceVars != ReplaceVars::None || replaceVarsInElem == true) + if (replaceVarsInElem != ReplaceVars::None) { Value elemCopy(elem, allocator); + // if replaceVars is enabled, replace strings between | instead of % JsonUtils::replaceValueWithGameVar( - elemCopy, allocator, game, replaceVars == ReplaceVars::Value); + elemCopy, allocator, game, changeValueType, '|'); parseDocumentElem(game, nameHash16, elemCopy, replaceVars, allocator); } else @@ -360,6 +368,17 @@ namespace Parser } break; } + case str2int16("levelObjectClass"): { + if (elem.IsArray() == false) { + parseLevelObjectClass(game, elem); + } + else { + for (const auto& val : elem) { + parseDocumentElemHelper(game, nameHash16, val, replaceVars, allocator); + } + } + break; + } case str2int16("load"): { if (elem.IsString()) { parseFile(game, elem.GetString()); @@ -411,9 +430,9 @@ namespace Parser } break; } - case str2int16("namer"): { + case str2int16("classifier"): { if (elem.IsArray() == false) { - parseNamer(game, elem); + parseClassifier(game, elem); } else { for (const auto& val : elem) { @@ -490,7 +509,7 @@ namespace Parser auto saveDir = getStringVal(elem); if (saveDir.size() > 0 && FileUtils::setSaveDir(saveDir.c_str()) == true) { - PHYSFS_mount(PHYSFS_getWriteDir(), NULL, 0); + PHYSFS_mount(PHYSFS_getWriteDir(), nullptr, 0); } break; } @@ -520,6 +539,17 @@ namespace Parser } break; } + case str2int16("spellClass"): { + if (elem.IsArray() == false) { + parseSpellClass(game, elem); + } + else { + for (const auto& val : elem) { + parseDocumentElemHelper(game, nameHash16, val, replaceVars, allocator); + } + } + break; + } case str2int16("stretchToFit"): { game.StretchToFit(getBoolVal(elem)); break; diff --git a/src/Parser/ParseFile.h b/src/Parser/ParseFile.h index 54259499..40a78c83 100755 --- a/src/Parser/ParseFile.h +++ b/src/Parser/ParseFile.h @@ -6,9 +6,9 @@ namespace Parser { - void parseFile(Game& game, const std::string& fileName); + void parseFile(Game& game, const std::string_view fileName); void parseFile(Game& game, const std::vector& params); void parseDocument(Game& game, const rapidjson::Document& doc, ReplaceVars replaceVars_ = ReplaceVars::None); - void parseJson(Game& game, const std::string& json); + void parseJson(Game& game, const std::string_view json); } diff --git a/src/Parser/ParseFont.cpp b/src/Parser/ParseFont.cpp index 8916477c..9a9063d7 100755 --- a/src/Parser/ParseFont.cpp +++ b/src/Parser/ParseFont.cpp @@ -1,6 +1,6 @@ #include "ParseFont.h" -#include "FileUtils.h" -#include "ParseTexture.h" +#include "ParseTexturePack.h" +#include "Shaders.h" #include "Utils/ParseUtils.h" namespace Parser @@ -18,9 +18,9 @@ namespace Parser if (fromId != id && isValidId(id) == true) { auto obj = game.Resources().getFont(fromId); - if (hasNullFont(obj) == false) + if (holdsNullFont(obj) == false) { - game.Resources().addFont(id, obj); + game.Resources().addFont(id, obj, getStringViewKey(elem, "resource")); } } } @@ -29,74 +29,57 @@ namespace Parser return false; } - void parseBitmapFont(Game& game, const Value& elem) + bool parseBitmapFont(Game& game, const Value& elem) { if (isValidString(elem, "id") == false) { - return; + return false; } std::string id(elem["id"].GetString()); if (isValidId(id) == false) { - return; + return false; } - if (isValidString(elem, "texture") == false) + auto resource = getStringViewKey(elem, "resource"); + auto texturePackId = getStringKey(elem, "texturePack"); + auto texturePack_ = game.Resources().getTexturePack(texturePackId); + auto texturePack = std::dynamic_pointer_cast(texturePack_); + if (texturePack == nullptr) { - return; - } - - sf::Image img; - std::string textureId = elem["texture"].GetString(); - auto texture = game.Resources().getTexture(textureId); - if (texture == nullptr) - { - if (isValidId(textureId) == false) - { - return; - } - img = parseTextureImg(game, elem); - auto imgSize = img.getSize(); - if (imgSize.x == 0 || imgSize.y == 0) + texturePack = parseBitmapFontTexturePackObj(game, elem); + if (texturePack == nullptr) { - return; + return false; } - texture = parseTextureObj(game, elem, img); - if (texture == nullptr) + if (isValidId(texturePackId) == true) { - return; + game.Resources().addTexturePack(texturePackId, texturePack, resource); } - game.Resources().addTexture(textureId, texture); } - auto rows = getIntKey(elem, "rows", 16); - auto cols = getIntKey(elem, "cols", 16); auto padding = getIntKey(elem, "padding"); - bool isVertical = getStringKey(elem, "direction") == "vertical"; - - std::shared_ptr font; + auto font = std::make_shared(texturePack, padding); - if (elem.HasMember("charSizeFile")) + if (elem.HasMember("fontPalette") == true && + Shaders::supportsPalettes() == true) { - auto charSizes = FileUtils::readChar(elem["charSizeFile"].GetString(), 258); - font = std::make_shared(texture, rows, cols, padding, isVertical, charSizes); + auto palette = game.Resources().getPalette(getStringVal(elem["fontPalette"])); + font->setPalette(palette); } - else + if (elem.HasMember("fontColor") == true) { - if (img.getSize().x == 0) - { - img = texture->copyToImage(); - } - font = std::make_shared(texture, rows, cols, padding, isVertical, img); + font->setColor(getColorVal(elem["fontColor"])); } - game.Resources().addFont(id, font); + game.Resources().addFont(id, font, resource); + return true; } - void parseFreeTypeFont(Game& game, const Value& elem) + bool parseFreeTypeFont(Game& game, const Value& elem) { if (isValidString(elem, "file") == false) { - return; + return false; } std::string file(elem["file"].GetString()); @@ -108,20 +91,21 @@ namespace Parser } else if (getIdFromFile(file, id) == false) { - return; + return false; } if (isValidId(id) == false) { - return; + return false; } auto font = std::make_shared(std::make_shared(file)); if (font->load() == false) { - return; + return false; } - game.Resources().addFont(id, font); + game.Resources().addFont(id, font, getStringViewKey(elem, "resource")); + return true; } void parseFont(Game& game, const Value& elem) @@ -130,13 +114,10 @@ namespace Parser { return; } - if (elem.HasMember("texture") == true) - { - parseBitmapFont(game, elem); - } - else + if (parseBitmapFont(game, elem) == true) { - parseFreeTypeFont(game, elem); + return; } + parseFreeTypeFont(game, elem); } } diff --git a/src/Parser/ParseIcon.cpp b/src/Parser/ParseIcon.cpp index 48987eb1..2fb9abb7 100755 --- a/src/Parser/ParseIcon.cpp +++ b/src/Parser/ParseIcon.cpp @@ -13,7 +13,7 @@ namespace Parser return; } - auto icon = ImageUtils::loadImage(elem["file"].GetString()); + auto icon = ImageUtils::loadImage(getStringViewVal(elem["file"])); auto iconSize = icon.getSize(); if (iconSize.x == 0 || iconSize.y == 0) { diff --git a/src/Parser/ParseImage.cpp b/src/Parser/ParseImage.cpp index d16a6fc9..9de77528 100755 --- a/src/Parser/ParseImage.cpp +++ b/src/Parser/ParseImage.cpp @@ -58,13 +58,6 @@ namespace Parser image->setOutline(outline, outlineIgnore); image->setOutlineEnabled(getBoolKey(elem, "enableOutline")); - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, image); - } - else - { - game.Resources().addDrawable(id, image); - } + game.Resources().addDrawable(id, image, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseImageContainer.cpp b/src/Parser/ParseImageContainer.cpp index 4a1d58fe..d3822b70 100755 --- a/src/Parser/ParseImageContainer.cpp +++ b/src/Parser/ParseImageContainer.cpp @@ -9,19 +9,20 @@ namespace Parser { using namespace rapidjson; - std::shared_ptr parseImageContainerObj(Game& game, const Value& elem) + std::shared_ptr parseImageContainerObj(Game& game, + const Value& elem, const char* fileElem) { - if (isValidString(elem, "file") == false) + if (isValidString(elem, fileElem) == false) { return nullptr; } - std::string fileName = elem["file"].GetString(); + auto fileName = getStringViewVal(elem[fileElem]); auto fileNameLower = Utils::toLower(fileName); - if (Utils::endsWith(fileNameLower, "cel") == true) + if (Utils::endsWith(fileNameLower, ".cel") == true) { - auto imgContainer = std::make_shared(fileName.c_str()); + auto imgContainer = std::make_shared(fileName); if (imgContainer->size() == 0) { @@ -29,9 +30,9 @@ namespace Parser } return imgContainer; } - else if (Utils::endsWith(fileNameLower, "cl2") == true) + else if (Utils::endsWith(fileNameLower, ".cl2") == true) { - auto imgContainer = std::make_shared(fileName.c_str()); + auto imgContainer = std::make_shared(fileName); if (imgContainer->size() == 0) { @@ -67,7 +68,7 @@ namespace Parser auto obj = game.Resources().getImageContainer(fromId); if (obj != nullptr) { - game.Resources().addImageContainer(id, obj); + game.Resources().addImageContainer(id, obj, getStringViewKey(elem, "resource")); } } } @@ -93,7 +94,7 @@ namespace Parser { return; } - std::string file(elem["file"].GetString()); + auto file = getStringViewVal(elem["file"]); if (getIdFromFile(file, id) == false) { return; @@ -112,11 +113,12 @@ namespace Parser { return; } - game.Resources().addImageContainer(id, imgRes); + game.Resources().addImageContainer(id, imgRes, getStringViewKey(elem, "resource")); } bool getOrParseImageContainer(Game& game, const Value& elem, - const char* idKey, std::shared_ptr& imgContainer) + const char* idKey, std::shared_ptr& imgContainer, + const char* fileElem) { if (isValidString(elem, idKey) == true) { @@ -126,17 +128,17 @@ namespace Parser { return true; } - imgContainer = parseImageContainerObj(game, elem); + imgContainer = parseImageContainerObj(game, elem, fileElem); if (isValidId(id) == true && imgContainer != nullptr) { - game.Resources().addImageContainer(id, imgContainer); + game.Resources().addImageContainer(id, imgContainer, getStringViewKey(elem, "resource")); return true; } } else { - imgContainer = parseImageContainerObj(game, elem); + imgContainer = parseImageContainerObj(game, elem, fileElem); } return false; } diff --git a/src/Parser/ParseImageContainer.h b/src/Parser/ParseImageContainer.h index 76d5543b..cbb5ddfd 100755 --- a/src/Parser/ParseImageContainer.h +++ b/src/Parser/ParseImageContainer.h @@ -6,9 +6,11 @@ namespace Parser { std::shared_ptr parseImageContainerObj(Game& game, - const rapidjson::Value& elem); + const rapidjson::Value& elem, const char* fileElem = "file"); + void parseImageContainer(Game& game, const rapidjson::Value& elem); bool getOrParseImageContainer(Game& game, const rapidjson::Value& elem, - const char* idKey, std::shared_ptr& imgContainer); + const char* idKey, std::shared_ptr& imgContainer, + const char* fileElem = "file"); } diff --git a/src/Parser/ParseInputText.cpp b/src/Parser/ParseInputText.cpp index 786a8125..47845e28 100755 --- a/src/Parser/ParseInputText.cpp +++ b/src/Parser/ParseInputText.cpp @@ -21,34 +21,42 @@ namespace Parser } auto text = parseDrawableTextObj(game, elem); - auto inputText = std::make_shared(std::move(text), - getUIntKey(elem, "minSize"), getUIntKey(elem, "maxSize")); + auto inputText = std::make_shared(std::move(text)); - if (elem.HasMember("onClick")) + if (elem.HasMember("minLength") == true) { - inputText->setAction(str2int16("click"), parseAction(game, elem["onClick"])); + inputText->setMinLength(getUIntVal(elem["minLength"])); } - if (elem.HasMember("onChange")) + if (elem.HasMember("maxLength") == true) { - inputText->setAction(str2int16("change"), parseAction(game, elem["onChange"])); + inputText->setMaxLength(getUIntVal(elem["maxLength"])); } - if (elem.HasMember("onMinSize")) + if (elem.HasMember("minValue") == true) { - inputText->setAction(str2int16("minSize"), parseAction(game, elem["onMinSize"])); + inputText->setMinValue(getVariableVal(elem["minValue"])); + } + if (elem.HasMember("maxValue") == true) + { + inputText->setMaxValue(getVariableVal(elem["maxValue"])); } - if (isValidString(elem, "regex") == true) { inputText->setRegex(elem["regex"].GetString()); } - if (isValidString(elem, "resource") == true) + if (elem.HasMember("onClick")) { - game.Resources().addDrawable(elem["resource"].GetString(), id, inputText); + inputText->setAction(str2int16("click"), parseAction(game, elem["onClick"])); } - else + if (elem.HasMember("onChange")) { - game.Resources().addDrawable(id, inputText); + inputText->setAction(str2int16("change"), parseAction(game, elem["onChange"])); } + if (elem.HasMember("onMinLength")) + { + inputText->setAction(str2int16("minLength"), parseAction(game, elem["onMinLength"])); + } + + game.Resources().addDrawable(id, inputText, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseMenu.cpp b/src/Parser/ParseMenu.cpp index 66c86472..5a683783 100755 --- a/src/Parser/ParseMenu.cpp +++ b/src/Parser/ParseMenu.cpp @@ -23,7 +23,7 @@ namespace Parser } const auto& valElem = elem["value"]; - auto conditionHash = str2int16(getStringCharKey(elem, "if")); + auto conditionHash = str2int16(getStringViewKey(elem, "if")); auto property = getStringKey(elem, "property"); if (valElem.IsArray() == false) @@ -168,7 +168,7 @@ namespace Parser } auto font = game.Resources().getFont(getStringKey(elem, "font")); - if (hasNullFont(font) == true) + if (holdsNullFont(font) == true) { return; } @@ -195,7 +195,7 @@ namespace Parser { std::string prop(val["load"].GetString()); - auto props = Utils::splitStringIn2(prop, '|'); + auto props = Utils::splitStringIn2(prop, '.'); const auto& uiObjId = props.first; const auto& uiElemProps = props.second; @@ -304,14 +304,14 @@ namespace Parser if (invIdx < player->getInventorySize()) { MemoryPoolAllocator allocator; - const auto& itemCollection = player->getInventory(invIdx); - for (size_t i = 0; i < itemCollection.Size(); i++) + const auto& inventory = player->getInventory(invIdx); + for (size_t i = 0; i < inventory.Size(); i++) { - if (itemCollection.isItemSlotInUse(i) == false) + if (inventory.isSlotInUse(i) == false) { continue; } - const auto item = itemCollection.get(i); + const auto item = inventory.get(i); if (filterList.empty() == false && getFilterResult(filterList, *item, include) == true) @@ -393,13 +393,6 @@ namespace Parser menu->updateVisibleItems(); menu->calculatePositions(); - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, menu); - } - else - { - game.Resources().addDrawable(id, menu); - } + game.Resources().addDrawable(id, menu, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseMenuButton.cpp b/src/Parser/ParseMenuButton.cpp index f8ab01a5..8beedff9 100755 --- a/src/Parser/ParseMenuButton.cpp +++ b/src/Parser/ParseMenuButton.cpp @@ -31,7 +31,7 @@ namespace Parser { auto button = std::make_shared(); std::unique_ptr drawableText; - if (hasFreeTypeFont(font) == true) + if (holdsFreeTypeFont(font) == true) { drawableText = std::make_unique("", *std::get>(font), fontSize); @@ -108,5 +108,5 @@ namespace Parser button->focusEnabled(focusOnClick); game.Resources().addFocused(button); } - }; + } } diff --git a/src/Parser/ParseMountFile.cpp b/src/Parser/ParseMountFile.cpp index b1bcbd90..f30e26ee 100755 --- a/src/Parser/ParseMountFile.cpp +++ b/src/Parser/ParseMountFile.cpp @@ -14,35 +14,82 @@ namespace Parser { return; } + file = game.getPath() + file; - auto mount = getStringCharKey(elem, "mount"); - int append = (int)getBoolKey(elem, "append", true); - if (PHYSFS_mount(file.c_str(), mount, append) != 0) + + if (getBoolKey(elem, "prependSaveDir") == true) { - return; + std::string saveDir = FileUtils::getSaveDir(); + + if (Utils::endsWith(saveDir, "\\") == false && + Utils::endsWith(saveDir, "/") == false) + { + saveDir += PHYSFS_getDirSeparator(); + } + file = saveDir + file; } - auto fileNoExt = FileUtils::getFileWithoutExt(file); - if (fileNoExt.length() != file.length()) + if (getBoolKey(elem, "unmount") == false) { - if (PHYSFS_mount(fileNoExt.c_str(), mount, append) != 0) + auto mount = getStringCharKey(elem, "mount"); + int append = (int)getBoolKey(elem, "append", true); + + if (PHYSFS_mount(file.c_str(), mount, append) != 0) + { + return; + } + auto fileNoExt = FileUtils::getFileWithoutExt(file); + if (fileNoExt.length() != file.length()) + { + if (PHYSFS_mount(fileNoExt.c_str(), mount, append) != 0) + { + return; + } + } + auto fileMPQ = fileNoExt + ".mpq"; + if (PHYSFS_mount(fileMPQ.c_str(), mount, append) != 0) + { + return; + } + auto fileZip = fileNoExt + ".zip"; + if (PHYSFS_mount(fileZip.c_str(), mount, append) != 0) + { + return; + } + auto file7Zip = fileNoExt + ".7z"; + if (PHYSFS_mount(file7Zip.c_str(), mount, append) != 0) { return; } } - auto fileMPQ = fileNoExt + ".mpq"; - if (PHYSFS_mount(fileMPQ.c_str(), mount, append) != 0) - { - return; - } - auto fileZip = fileNoExt + ".zip"; - if (PHYSFS_mount(fileZip.c_str(), mount, append) != 0) - { - return; - } - auto file7Zip = fileNoExt + ".7z"; - if (PHYSFS_mount(file7Zip.c_str(), mount, append) != 0) + else { - return; + if (PHYSFS_unmount(file.c_str()) != 0) + { + return; + } + auto fileNoExt = FileUtils::getFileWithoutExt(file); + if (fileNoExt.length() != file.length()) + { + if (PHYSFS_unmount(fileNoExt.c_str()) != 0) + { + return; + } + } + auto fileMPQ = fileNoExt + ".mpq"; + if (PHYSFS_unmount(fileMPQ.c_str()) != 0) + { + return; + } + auto fileZip = fileNoExt + ".zip"; + if (PHYSFS_unmount(fileZip.c_str()) != 0) + { + return; + } + auto file7Zip = fileNoExt + ".7z"; + if (PHYSFS_unmount(file7Zip.c_str()) != 0) + { + return; + } } } } diff --git a/src/Parser/ParseMovie.cpp b/src/Parser/ParseMovie.cpp index e5a4115d..f5fa0e68 100755 --- a/src/Parser/ParseMovie.cpp +++ b/src/Parser/ParseMovie.cpp @@ -16,7 +16,7 @@ namespace Parser return; } - std::string file(elem["file"].GetString()); + auto file = getStringViewVal(elem["file"]); std::string id; if (isValidString(elem, "id") == true) @@ -37,7 +37,7 @@ namespace Parser { action = parseAction(game, elem["onComplete"]); } - auto movie = std::make_shared(file); + auto movie = std::make_shared(file); if (movie->load() == false) { if (action != nullptr) @@ -79,22 +79,8 @@ namespace Parser movie->Visible(getBoolKey(elem, "visible", true)); - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, movie); - } - else - { - game.Resources().addDrawable(id, movie); - } + game.Resources().addDrawable(id, movie, getStringViewKey(elem, "resource")); - try - { - movie->play(); - } - catch (std::exception ex) - { - std::cerr << ex.what(); - } + movie->play(); } } diff --git a/src/Parser/ParsePalette.cpp b/src/Parser/ParsePalette.cpp index b71de530..55fe4f1b 100755 --- a/src/Parser/ParsePalette.cpp +++ b/src/Parser/ParsePalette.cpp @@ -1,6 +1,7 @@ #include "ParseFont.h" #include "FileUtils.h" #include "Palette.h" +#include "ParseAction.h" #include "Utils/ParseUtils.h" namespace Parser @@ -20,7 +21,7 @@ namespace Parser auto obj = game.Resources().getPalette(fromId); if (obj != nullptr) { - game.Resources().addPalette(id, obj); + game.Resources().addPalette(id, obj, getStringViewKey(elem, "resource")); } } } @@ -36,66 +37,94 @@ namespace Parser return; } - if (isValidString(elem, "file") == true) + try { - std::string file(elem["file"].GetString()); std::string id; + std::shared_ptr palette; - if (isValidString(elem, "id") == true) - { - id = elem["id"].GetString(); - } - else if (getIdFromFile(file, id) == false) - { - return; - } - if (isValidId(id) == false) + if (isValidString(elem, "file") == true) { - return; - } - if (game.Resources().hasPalette(id) == true) - { - return; - } + auto file = getStringViewVal(elem["file"]); - auto palette = std::make_shared(file); - game.Resources().addPalette(id, palette); - } - else if (isValidString(elem, "palette") == true - && isValidString(elem, "trnFile") == true) - { - std::string file(elem["trnFile"].GetString()); - std::string id; + if (isValidString(elem, "id") == true) + { + id = elem["id"].GetString(); + } + else if (getIdFromFile(file, id) == false) + { + return; + } + if (isValidId(id) == false) + { + return; + } + if (game.Resources().hasPalette(id) == true) + { + return; + } - if (isValidString(elem, "id") == true) - { - id = elem["id"].GetString(); + palette = std::make_shared(file); } - else if (getIdFromFile(file, id) == false) + else if (isValidString(elem, "palette") == true + && isValidString(elem, "trnFile") == true) { - return; + auto file = getStringViewVal(elem["trnFile"]); + + if (isValidString(elem, "id") == true) + { + id = elem["id"].GetString(); + } + else if (getIdFromFile(file, id) == false) + { + return; + } + if (isValidId(id) == false) + { + return; + } + if (game.Resources().hasPalette(id) == true) + { + return; + } + + auto refPalette = game.Resources().getPalette(elem["palette"].GetString()); + if (refPalette == nullptr) + { + return; + } + auto trnFile = FileUtils::readChar(file.data()); + if (trnFile.size() < 256) + { + return; + } + palette = std::make_shared(*refPalette.get(), trnFile); } - if (isValidId(id) == false) + else if (isValidString(elem, "clone") == true) { - return; + if (isValidString(elem, "id") == false) + { + return; + } + std::string clone(elem["clone"].GetString()); + id = elem["id"].GetString(); + if (clone == id || isValidId(id) == false) + { + return; + } + auto obj = game.Resources().getPalette(clone); + if (obj == nullptr) + { + return; + } + palette = std::make_shared(*obj); } - if (game.Resources().hasPalette(id) == true) + else { return; } - auto refPalette = game.Resources().getPalette(elem["palette"].GetString()); - if (refPalette == nullptr) - { - return; - } - auto trnFile = FileUtils::readChar(file.c_str()); - if (trnFile.size() < 256) - { - return; - } - auto palette = std::make_shared(*refPalette.get(), trnFile); - game.Resources().addPalette(id, palette); + game.Resources().addPalette(id, palette, getStringViewKey(elem, "resource")); } + catch (std::exception ex) {} } } diff --git a/src/Parser/ParsePredicate.cpp b/src/Parser/ParsePredicate.cpp index 9851d6fe..a36b00ef 100755 --- a/src/Parser/ParsePredicate.cpp +++ b/src/Parser/ParsePredicate.cpp @@ -1,6 +1,7 @@ #include "ParsePredicate.h" #include "Predicates/PredIO.h" #include "Predicates/PredItem.h" +#include "Predicates/PredLevelObject.h" #include "Predicates/PredPlayer.h" #include "Utils/ParseUtils.h" #include "Utils/Utils.h" @@ -16,7 +17,7 @@ namespace Parser { return nullptr; } - switch (str2int16(elem["name"].GetString())) + switch (str2int16(getStringViewVal(elem["name"]))) { case str2int16("file.exists"): { @@ -28,6 +29,20 @@ namespace Parser getStringKey(elem, "level"), getItemLocationKey(elem, "item")); } + case str2int16("levelObject.isInRange"): + { + return std::make_shared( + getStringKey(elem, "level"), + getStringKey(elem, "object"), + getIntRectKey(elem, "range")); + } + case str2int16("levelObject.isInRangeByClass"): + { + return std::make_shared( + getStringKey(elem, "level"), + getStringKey(elem, "class"), + getIntRectKey(elem, "range")); + } case str2int16("player.canUseItem"): { return std::make_shared( @@ -35,11 +50,12 @@ namespace Parser getStringKey(elem, "player"), getItemLocationKey(elem, "item")); } - case str2int16("player.getMaxGoldCapacity"): + case str2int16("player.getMaxItemCapacity"): { - return std::make_shared( + return std::make_shared( getStringKey(elem, "level"), - getStringKey(elem, "player")); + getStringKey(elem, "player"), + getStringKey(elem, "itemClass")); } case str2int16("player.hasFreeItemSlot"): { diff --git a/src/Parser/ParseRectangle.cpp b/src/Parser/ParseRectangle.cpp index 90d0b703..a6170319 100755 --- a/src/Parser/ParseRectangle.cpp +++ b/src/Parser/ParseRectangle.cpp @@ -56,13 +56,6 @@ namespace Parser rectangle->setOutlineColor(getColorKey(elem, "outlineColor", sf::Color::White)); rectangle->setOutlineThickness((float)getUIntKey(elem, "outlineThickness")); - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, rectangle); - } - else - { - game.Resources().addDrawable(id, rectangle); - } + game.Resources().addDrawable(id, rectangle, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseScrollableText.cpp b/src/Parser/ParseScrollableText.cpp index 8a629951..d900c401 100755 --- a/src/Parser/ParseScrollableText.cpp +++ b/src/Parser/ParseScrollableText.cpp @@ -40,8 +40,8 @@ namespace Parser auto anchor = getAnchorKey(elem, "anchor"); scrollable->setAnchor(anchor); - auto pos = getVector2fKey(elem, "position"); auto size = getVector2fKey(elem, "size"); + auto pos = getPositionKey(elem, "position", size, game.RefSize()); if (getBoolKey(elem, "relativeCoords", true) == true) { GameUtils::setAnchorPosSize(anchor, pos, size, game.RefSize(), game.MinSize()); @@ -65,13 +65,6 @@ namespace Parser scrollable->setAction(str2int16("complete"), parseAction(game, elem["onComplete"])); } - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, scrollable); - } - else - { - game.Resources().addDrawable(id, scrollable); - } + game.Resources().addDrawable(id, scrollable, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseSound.cpp b/src/Parser/ParseSound.cpp index 74a79ac7..0de10f25 100755 --- a/src/Parser/ParseSound.cpp +++ b/src/Parser/ParseSound.cpp @@ -6,8 +6,8 @@ namespace Parser { using namespace rapidjson; - sf::SoundBuffer* parseSoundObj(Game& game, - const std::string& id, const std::string& file) + sf::SoundBuffer* parseSoundObj(Game& game, const std::string& id, + const std::string& file, const std::string_view resource) { sf::PhysFSStream stream(file); if (stream.hasError() == true) @@ -21,14 +21,13 @@ namespace Parser { return nullptr; } - if (game.Resources().addAudioSource(id, sndBuffer) == true) + if (game.Resources().addAudioSource(id, sndBuffer, resource) == true) { return sndBuffer.get(); } return nullptr; } -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) sf::SoundBuffer* parseSoundLoopsObj(Game& game, const Value& elem, const std::string& id, const std::string& file) { @@ -44,7 +43,8 @@ namespace Parser { return nullptr; } - if (game.Resources().addAudioSource(id, sndBuffer) == true) + auto resource = getStringViewKey(elem, "resource"); + if (game.Resources().addAudioSource(id, sndBuffer, resource) == true) { parseAudioLoopNamesVal(elem, "loopNames", sndBuffer->loops); @@ -52,7 +52,6 @@ namespace Parser } return nullptr; } -#endif sf::SoundBuffer* parseSingleSoundObj(Game& game, const Value& elem) { @@ -71,18 +70,15 @@ namespace Parser { return nullptr; } -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) if (elem.HasMember("loopNames") == true) { return parseSoundLoopsObj(game, elem, id, file); } -#endif - return parseSoundObj(game, id, file); + return parseSoundObj(game, id, file, getStringViewKey(elem, "resource")); } -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) - sf::SoundBuffer* parseMultiSoundObj(Game& game, - const std::string& id, const sf::Int16* samples, + sf::SoundBuffer* parseMultiSoundObj(Game& game, const std::string& id, + const std::string_view resource, const sf::Int16* samples, sf::Uint64 sampleCount, unsigned channelCount, unsigned sampleRate) { auto sndBuffer = std::make_shared(); @@ -92,7 +88,7 @@ namespace Parser { return nullptr; } - if (game.Resources().addAudioSource(id, sndBuffer) == true) + if (game.Resources().addAudioSource(id, sndBuffer, resource) == true) { return sndBuffer.get(); } @@ -110,7 +106,8 @@ namespace Parser { return nullptr; } - if (game.Resources().addAudioSource(id, sndBuffer) == true) + auto resource = getStringViewKey(elem, "resource"); + if (game.Resources().addAudioSource(id, sndBuffer, resource) == true) { parseAudioLoopNamesVal(elem, "loopNames", sndBuffer->loops); @@ -272,13 +269,12 @@ namespace Parser if (elem.HasMember("loopNames") == false) { - return parseMultiSoundObj(game, id, samplesBuffer.data(), - samplesBuffer.size(), channelCount, sampleRate); + return parseMultiSoundObj(game, id, getStringViewKey(elem, "resource"), + samplesBuffer.data(), samplesBuffer.size(), channelCount, sampleRate); } return parseMultiSoundLoopsObj(game, elem, id, samplesBuffer.data(), samplesBuffer.size(), channelCount, sampleRate); } -#endif bool parseSoundFromId(Game& game, const Value& elem) { @@ -293,7 +289,7 @@ namespace Parser auto obj = game.Resources().getAudioSource(fromId); if (std::holds_alternative>(obj) == true) { - game.Resources().addAudioSource(id, obj); + game.Resources().addAudioSource(id, obj, getStringViewKey(elem, "resource")); } } } @@ -315,12 +311,10 @@ namespace Parser { sndBuffer = parseSingleSoundObj(game, elem); } -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) else if (isValidArray(elem, "file") == true) { sndBuffer = parseMultiSoundObj(game, elem); } -#endif if (sndBuffer == nullptr) { return; diff --git a/src/Parser/ParseSound.h b/src/Parser/ParseSound.h index 54b9183c..b8b405fd 100755 --- a/src/Parser/ParseSound.h +++ b/src/Parser/ParseSound.h @@ -5,7 +5,7 @@ namespace Parser { - sf::SoundBuffer* parseSoundObj(Game& game, - const std::string& id, const std::string& file); + sf::SoundBuffer* parseSoundObj(Game& game, const std::string& id, + const std::string& file, const std::string_view resource); void parseSound(Game& game, const rapidjson::Value& elem); } diff --git a/src/Parser/ParseText.cpp b/src/Parser/ParseText.cpp index 60a85d22..a0df6d74 100755 --- a/src/Parser/ParseText.cpp +++ b/src/Parser/ParseText.cpp @@ -10,90 +10,70 @@ namespace Parser { using namespace rapidjson; - std::unique_ptr parseDrawableTextObj(Game& game, const rapidjson::Value& elem) + std::unique_ptr parseDrawableTextObj(Game& game, const Value& elem) { - if (isValidString(elem, "font") == false) + auto font = game.Resources().getFont(getStringKey(elem, "font")); + if (holdsNullFont(font) == true) { return nullptr; } std::string displayText; - if (elem.HasMember("text")) + if (elem.HasMember("text") == true) { displayText = getStringVal(elem["text"]); } - else if (elem.HasMember("file")) + else if (elem.HasMember("file") == true) { displayText = FileUtils::readText(getStringCharVal(elem["file"])); } - auto font = game.Resources().getFont(elem["font"].GetString()); - if (hasNullFont(font) == true) - { - return nullptr; - } + std::unique_ptr text; - if (hasFreeTypeFont(font) == true) + auto horizSpaceOffset = getIntKey(elem, "horizontalSpaceOffset"); + auto vertSpaceOffset = getIntKey(elem, "verticalSpaceOffset"); + + if (holdsFreeTypeFont(font) == true) { auto fontSize = getUIntKey(elem, "fontSize", 12); - auto text = std::make_unique(displayText, + text = std::make_unique(displayText, *std::get>(font), fontSize); - text->setColor(getColorKey(elem, "color", sf::Color::White)); - text->setHorizontalAlign(GameUtils::getHorizontalAlignment(getStringKey(elem, "horizontalAlign"))); - text->setVerticalAlign(GameUtils::getVerticalAlignment(getStringKey(elem, "verticalAlign"), VerticalAlign::Bottom)); - - auto anchor = getAnchorKey(elem, "anchor"); - text->setAnchor(anchor); - auto size = text->Size(); - auto pos = getPositionKey(elem, "position", size, game.RefSize()); - if (getBoolKey(elem, "relativeCoords", true) == true) - { - GameUtils::setAnchorPosSize(anchor, pos, size, game.RefSize(), game.MinSize()); - if (game.StretchToFit() == false) - { - GameUtils::setAnchorPosSize(anchor, pos, size, game.MinSize(), game.WindowSize()); - } - } - text->Position(pos); - text->Visible(getBoolKey(elem, "visible", true)); - return std::move(text); + text->setHorizontalSpaceOffset(horizSpaceOffset); + text->setVerticalSpaceOffset(vertSpaceOffset); } else { - auto horizSpaceOffset = getIntKey(elem, "horizontalSpaceOffset"); - auto vertSpaceOffset = getIntKey(elem, "verticalSpaceOffset"); - - auto text = std::make_unique(displayText, + text = std::make_unique(displayText, std::get>(font), horizSpaceOffset, vertSpaceOffset); - text->setColor(getColorKey(elem, "color", sf::Color::White)); - text->setHorizontalAlign(GameUtils::getHorizontalAlignment(getStringKey(elem, "horizontalAlign"))); - text->setVerticalAlign(GameUtils::getVerticalAlignment(getStringKey(elem, "verticalAlign"), VerticalAlign::Bottom)); - - auto anchor = getAnchorKey(elem, "anchor"); - text->setAnchor(anchor); - auto pos = getVector2fKey(elem, "position"); - if (getBoolKey(elem, "relativeCoords", true) == true) + } + + text->setColor(getColorKey(elem, "color", sf::Color::White)); + text->setHorizontalAlign(GameUtils::getHorizontalAlignment(getStringKey(elem, "horizontalAlign"))); + text->setVerticalAlign(GameUtils::getVerticalAlignment(getStringKey(elem, "verticalAlign"), VerticalAlign::Bottom)); + + auto anchor = getAnchorKey(elem, "anchor"); + text->setAnchor(anchor); + auto size = text->Size(); + auto pos = getPositionKey(elem, "position", size, game.RefSize()); + if (getBoolKey(elem, "relativeCoords", true) == true) + { + GameUtils::setAnchorPosSize(anchor, pos, size, game.RefSize(), game.MinSize()); + if (game.StretchToFit() == false) { - auto size = text->Size(); - GameUtils::setAnchorPosSize(anchor, pos, size, game.RefSize(), game.MinSize()); - if (game.StretchToFit() == false) - { - GameUtils::setAnchorPosSize(anchor, pos, size, game.MinSize(), game.WindowSize()); - } + GameUtils::setAnchorPosSize(anchor, pos, size, game.MinSize(), game.WindowSize()); } - text->Position(pos); - text->Visible(getBoolKey(elem, "visible", true)); - - return std::move(text); } - return nullptr; + text->Position(pos); + text->Visible(getBoolKey(elem, "visible", true)); + + return text; } - std::unique_ptr parseText2Obj(Game& game, const rapidjson::Value& elem) + std::unique_ptr parseText2Obj(Game& game, const Value& elem) { - auto text = std::make_unique(); + auto text = std::make_unique(); if (parseText2Obj(game, elem, *text) == false) { return nullptr; @@ -101,7 +81,7 @@ namespace Parser return text; } - bool parseText2Obj(Game& game, const Value& elem, Text2& text) + bool parseText2Obj(Game& game, const Value& elem, Text& text) { auto drawableText = parseDrawableTextObj(game, elem); if (drawableText == nullptr) @@ -113,9 +93,9 @@ namespace Parser auto hasBinding = elem.HasMember("binding") == true; if (hasBinding == true) { - text.setBinding(std::move(getStringVectorKey(elem, "binding"))); + text.setBinding(getStringVectorKey(elem, "binding")); } - text.setFormat(getStringKey(elem, "format", "[1]")); + text.setFormat(getStringViewKey(elem, "format", "[1]")); if (elem.HasMember("onChange")) { @@ -139,18 +119,11 @@ namespace Parser { return; } - std::shared_ptr text(std::move(parseText2Obj(game, elem))); + std::shared_ptr text(parseText2Obj(game, elem)); if (text == nullptr) { return; } - if (isValidString(elem, "resource") == true) - { - game.Resources().addDrawable(elem["resource"].GetString(), id, text); - } - else - { - game.Resources().addDrawable(id, text); - } + game.Resources().addDrawable(id, text, getStringViewKey(elem, "resource")); } } diff --git a/src/Parser/ParseText.h b/src/Parser/ParseText.h index 8a97b4b3..47a595a4 100755 --- a/src/Parser/ParseText.h +++ b/src/Parser/ParseText.h @@ -3,12 +3,12 @@ #include "Game.h" #include "DrawableText.h" #include "Json/JsonParser.h" -#include "Text2.h" +#include "Text.h" namespace Parser { std::unique_ptr parseDrawableTextObj(Game& game, const rapidjson::Value& elem); - std::unique_ptr parseText2Obj(Game& game, const rapidjson::Value& elem); - bool parseText2Obj(Game& game, const rapidjson::Value& elem, Text2& text); + std::unique_ptr parseText2Obj(Game& game, const rapidjson::Value& elem); + bool parseText2Obj(Game& game, const rapidjson::Value& elem, Text& text); void parseText(Game& game, const rapidjson::Value& elem); } diff --git a/src/Parser/ParseTexture.cpp b/src/Parser/ParseTexture.cpp index 8bfd8ba7..0bfc6e91 100755 --- a/src/Parser/ParseTexture.cpp +++ b/src/Parser/ParseTexture.cpp @@ -1,6 +1,7 @@ #include "ParseTexture.h" #include "ParseImageContainer.h" #include "ImageUtils.h" +#include "Shaders.h" #include "Utils/ParseUtils.h" #include "Utils/Utils.h" @@ -47,12 +48,23 @@ namespace Parser { return false; } - if (elem.HasMember("palette")) + + auto path = getStringViewVal(elem["file"]); + auto pathLower = Utils::toLower(path); + + if (Utils::endsWith(pathLower, ".cel") == true || + Utils::endsWith(pathLower, ".cl2") == true) { - auto pal = game.Resources().getPalette(getStringVal(elem["palette"])); - if (pal == nullptr) + auto pal = game.Resources().getPalette(getStringKey(elem, "palette")); + PaletteArray* palArray = nullptr; + if (getBoolKey(elem, "indexed") == true && + Shaders::supportsPalettes() == true) { - return false; + pal = nullptr; + } + if (pal != nullptr) + { + palArray = &pal->palette; } auto imgContainer = parseImageContainerObj(game, elem); if (imgContainer == nullptr) @@ -67,7 +79,7 @@ namespace Parser else if (elem.HasMember("frame") == true) { auto frameIdx = getUIntVal(elem["frame"]); - img = ImageUtils::loadImageFrame(*imgContainer, *pal, frameIdx); + img = ImageUtils::loadImageFrame(*imgContainer, palArray, frameIdx); } else { @@ -76,7 +88,6 @@ namespace Parser } else { - auto path = getStringCharVal(elem["file"]); auto mask = getColorKey(elem, "mask", sf::Color::Transparent); if (cache != nullptr) { @@ -91,16 +102,17 @@ namespace Parser { img = ImageUtils::loadImage(path, mask); } - if (elem.HasMember("split") == true) + if (isValidString(elem, "split") == true) { + auto split = getStringViewVal(elem["split"]); auto piecesX = getUIntKey(elem, "pieces", 1); - if (elem["split"].GetString() == std::string("horizontal")) + if (split == "horizontal") { img = ImageUtils::splitImageHorizontal(*imgPtr, piecesX); imgPtr = &img; } - else if (elem["split"].GetString() == std::string("vertical")) + else if (split == "vertical") { img = ImageUtils::splitImageVertical(*imgPtr, piecesX); imgPtr = &img; @@ -146,7 +158,7 @@ namespace Parser auto obj = game.Resources().getTexture(fromId); if (obj != nullptr) { - game.Resources().addTexture(id, obj); + game.Resources().addTexture(id, obj, getStringViewKey(elem, "resource")); } } } @@ -217,7 +229,7 @@ namespace Parser { return; } - std::string file(elem["file"].GetString()); + auto file = getStringViewVal(elem["file"]); if (getIdFromFile(file, id) == false) { return; @@ -232,7 +244,7 @@ namespace Parser { return; } - game.Resources().addTexture(id, texture); + game.Resources().addTexture(id, texture, getStringViewKey(elem, "resource")); } bool getOrParseTexture(Game& game, const Value& elem, const char* idKey, @@ -256,7 +268,7 @@ namespace Parser if (isValidId(id) == true && texture != nullptr) { - game.Resources().addTexture(id, texture); + game.Resources().addTexture(id, texture, getStringViewKey(elem, "resource")); return true; } } diff --git a/src/Parser/ParseTexturePack.cpp b/src/Parser/ParseTexturePack.cpp index 3340d321..e7b0a404 100755 --- a/src/Parser/ParseTexturePack.cpp +++ b/src/Parser/ParseTexturePack.cpp @@ -1,9 +1,12 @@ #include "ParseTexturePack.h" +#include "FileUtils.h" #include "Game/LevelHelper.h" #include "ImageContainers/CelImageContainer.h" #include "Min.h" #include "ParseImageContainer.h" #include "ParseTexture.h" +#include "Shaders.h" +#include "TexturePacks/BitmapFontTexturePack.h" #include "TexturePacks/CachedTexturePack.h" #include "TexturePacks/IndexedTexturePack.h" #include "TexturePacks/RectTexturePack.h" @@ -27,7 +30,7 @@ namespace Parser auto obj = game.Resources().getTexturePack(fromId); if (obj != nullptr) { - game.Resources().addTexturePack(id, obj); + game.Resources().addTexturePack(id, obj, getStringViewKey(elem, "resource")); } } } @@ -173,36 +176,60 @@ namespace Parser return texturePack; } - void parseTexturePack(Game& game, const Value& elem) + std::shared_ptr parseBitmapFontTexturePackObj( + Game& game, const Value& elem) { - if (parseTexturePackFromId(game, elem) == true) + sf::Image img; + auto textureId = getStringKey(elem, "texture"); + auto texture = game.Resources().getTexture(textureId); + if (texture == nullptr) { - return; + img = parseTextureImg(game, elem); + auto imgSize = img.getSize(); + if (imgSize.x == 0 || imgSize.y == 0) + { + return nullptr; + } + texture = parseTextureObj(game, elem, img); + if (texture == nullptr) + { + return nullptr; + } + if (isValidId(textureId) == true) + { + game.Resources().addTexture(textureId, texture, getStringViewKey(elem, "resource")); + } } - std::string id; - if (isValidString(elem, "id") == true) + + auto rows = getIntKey(elem, "rows", 16); + auto cols = getIntKey(elem, "cols", 16); + bool isVertical = getStringKey(elem, "direction") == "vertical"; + + std::shared_ptr texturePack; + + if (elem.HasMember("charSizeFile") == true) { - id = elem["id"].GetString(); + auto charSizes = FileUtils::readChar(elem["charSizeFile"].GetString(), 258); + texturePack = std::make_shared( + texture, rows, cols, isVertical, charSizes); } else { - if (isValidString(elem, "file") == false) + if (img.getSize().x == 0) { - return; - } - std::string file(elem["file"].GetString()); - if (getIdFromFile(file, id) == false) - { - return; + img = texture->copyToImage(); } + texturePack = std::make_shared( + texture, rows, cols, isVertical, img); } - if (isValidId(id) == false) - { - return; - } - if (game.Resources().hasTexturePack(id) == true) + return texturePack; + } + + std::shared_ptr parseTexturePackObj(Game& game, const Value& elem) + { + if (getBoolKey(elem, "font") == true) { - return; + return parseBitmapFontTexturePackObj(game, elem); } std::unique_ptr texturePack; @@ -228,7 +255,7 @@ namespace Parser } if (texturePack == nullptr) { - return; + return nullptr; } if (isValidArray(elem, "rects") == true) { @@ -288,15 +315,66 @@ namespace Parser } texturePack = std::move(texturePack2); } - game.Resources().addTexturePack(id, std::move(texturePack)); + return texturePack; } - void getOrParseLevelTexturePack(Game& game, const Value& elem, - const char* idKeyBottom, const char* idKeyTop, - std::shared_ptr& texturePackBottom, - std::shared_ptr& texturePackTop, + void parseTexturePack(Game& game, const Value& elem) + { + if (parseTexturePackFromId(game, elem) == true) + { + return; + } + std::string id; + if (isValidString(elem, "id") == true) + { + id = elem["id"].GetString(); + } + else + { + if (isValidString(elem, "file") == false) + { + return; + } + std::string file(elem["file"].GetString()); + if (getIdFromFile(file, id) == false) + { + return; + } + } + if (isValidId(id) == false) + { + return; + } + if (game.Resources().hasTexturePack(id) == true) + { + return; + } + auto texturePack = parseTexturePackObj(game, elem); + if (texturePack == nullptr) + { + return; + } + game.Resources().addTexturePack(id, std::move(texturePack), getStringViewKey(elem, "resource")); + } + + void parseLevelLayer(Game& game, const Value& elem, + std::vector>& texturePackLayers) + { + size_t index = getUIntKey(elem, "index"); + if (index < texturePackLayers.size()) + { + texturePackLayers[index] = game.Resources().getTexturePack( + getStringKey(elem, "texturePack")); + } + } + + bool getOrParseLevelTexturePack(Game& game, const Value& elem, + const char* idKeyLayers, std::vector>& texturePackLayers, std::pair& tileSize) { + texturePackLayers.resize(Level::NumberOfLayers - 1); + bool success = false; + if (isValidString(elem, "min") == true) { // l4.min and town.min contain 16 blocks, all others 10. @@ -305,47 +383,57 @@ namespace Parser { minBlocks = 10; } - Min min(elem["min"].GetString(), minBlocks); + Min min(getStringViewVal(elem["min"]), minBlocks); if (min.size() == 0) { - return; + return false; } auto pal = game.Resources().getPalette(elem["palette"].GetString()); if (pal == nullptr) { - return; + return false; } std::shared_ptr imgCont; getOrParseImageContainer(game, elem, "imageContainer", imgCont); if (imgCont == nullptr) { - return; + return false; } bool useIndexedImages = Shaders::supportsPalettes(); CachedImagePack imgPack(imgCont.get(), pal, useIndexedImages); - texturePackBottom = LevelHelper::loadTilesetSprite(imgPack, min, false, false, true); - texturePackTop = LevelHelper::loadTilesetSprite(imgPack, min, true, true, true); + texturePackLayers[0] = LevelHelper::loadTilesetSprite(imgPack, min, false, false, true); + texturePackLayers[1] = LevelHelper::loadTilesetSprite(imgPack, min, true, true, true); tileSize.first = 64; tileSize.second = 32; + success = true; } else { - if (isValidString(elem, idKeyBottom) == true) + tileSize = getVector2uKey>( + elem, "tileSize", std::make_pair(64u, 32u)); + } + + if (elem.HasMember(idKeyLayers) == true) + { + const auto& layersElem = elem[idKeyLayers]; + if (layersElem.IsArray() == true) { - texturePackBottom = game.Resources().getTexturePack(elem[idKeyBottom].GetString()); + for (const auto& val : layersElem) + { + parseLevelLayer(game, val, texturePackLayers); + } } - if (isValidString(elem, idKeyTop) == true) + else if (layersElem.IsObject() == true) { - texturePackTop = game.Resources().getTexturePack(elem[idKeyTop].GetString()); + parseLevelLayer(game, layersElem, texturePackLayers); } - - tileSize = getVector2uKey>( - elem, "tileSize", std::make_pair(64u, 32u)); + success = true; } + return success; } } diff --git a/src/Parser/ParseTexturePack.h b/src/Parser/ParseTexturePack.h index 72102c66..8ddec425 100755 --- a/src/Parser/ParseTexturePack.h +++ b/src/Parser/ParseTexturePack.h @@ -5,11 +5,14 @@ namespace Parser { + std::shared_ptr parseBitmapFontTexturePackObj( + Game& game, const rapidjson::Value& elem); + + std::shared_ptr parseTexturePackObj(Game& game, const rapidjson::Value& elem); + void parseTexturePack(Game& game, const rapidjson::Value& elem); - void getOrParseLevelTexturePack(Game& game, const rapidjson::Value& elem, - const char* idKeyBottom, const char* idKeyTop, - std::shared_ptr& texturePackBottom, - std::shared_ptr& texturePackTop, + bool getOrParseLevelTexturePack(Game& game, const rapidjson::Value& elem, + const char* idKeyLayers, std::vector>& texturePackLayers, std::pair& tileSize); } diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index e5c6bb42..44a10e74 100755 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -8,26 +8,18 @@ namespace Parser { using namespace rapidjson; - void parseGame(Game& game, std::string filePath, const std::string& fileName) + void parseGame(Game& game, std::string filePath, const std::string_view fileName) { - if (PHYSFS_mount(filePath.c_str(), NULL, 0) == 0) + if (PHYSFS_mount(filePath.c_str(), nullptr, 0) == 0) { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) throw std::runtime_error(PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode())); -#else - throw std::runtime_error(PHYSFS_getLastError()); -#endif } rapidjson::Document doc; // Default template parameter uses UTF8 and MemoryPoolAllocator. - - if (doc.Parse(FileUtils::readText(fileName.c_str()).c_str()).HasParseError()) + auto jsonText = FileUtils::readText(fileName.data()); + if (doc.Parse(jsonText.data(), jsonText.size()).HasParseError()) { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) PHYSFS_unmount(filePath.c_str()); -#else - PHYSFS_removeFromSearchPath(filePath.c_str()); -#endif return; } diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index 9bf038dc..ac440019 100755 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -5,5 +5,5 @@ namespace Parser { - void parseGame(Game& game, std::string filePath, const std::string& fileName); + void parseGame(Game& game, std::string filePath, const std::string_view fileName); } diff --git a/src/Parser/Utils/ParseUtils.cpp b/src/Parser/Utils/ParseUtils.cpp index 03f4f9fe..12c56a35 100755 --- a/src/Parser/Utils/ParseUtils.cpp +++ b/src/Parser/Utils/ParseUtils.cpp @@ -9,9 +9,9 @@ namespace Parser { using namespace rapidjson; - ReplaceVars getReplaceVars(const std::string& str, ReplaceVars val) + ReplaceVars getReplaceVars(const std::string_view str, ReplaceVars val) { - switch (str2int16(Utils::toLower(str).c_str())) + switch (str2int16(Utils::toLower(str))) { case str2int16("none"): return ReplaceVars::None; @@ -24,7 +24,7 @@ namespace Parser } } - bool getIdFromFile(const std::string& file, std::string& id) + bool getIdFromFile(const std::string_view file, std::string& id) { id = FileUtils::getFileWithoutExt(FileUtils::getFileFromPath(file)); return (id.empty() == false); @@ -37,7 +37,7 @@ namespace Parser && elem[key].Size() > 0); } - bool isValidId(const std::string& id) noexcept + bool isValidId(const std::string_view id) noexcept { if (id.empty() == true) { diff --git a/src/Parser/Utils/ParseUtils.h b/src/Parser/Utils/ParseUtils.h index f7bb1e7d..6b2473d8 100755 --- a/src/Parser/Utils/ParseUtils.h +++ b/src/Parser/Utils/ParseUtils.h @@ -6,16 +6,17 @@ #include "ParseUtilsKey.h" #include "ParseUtilsVal.h" #include +#include namespace Parser { - ReplaceVars getReplaceVars(const std::string& str, ReplaceVars val = ReplaceVars::None); + ReplaceVars getReplaceVars(const std::string_view str, ReplaceVars val = ReplaceVars::None); - bool getIdFromFile(const std::string& file, std::string& id); + bool getIdFromFile(const std::string_view file, std::string& id); bool isValidArray(const rapidjson::Value& elem, const char* key); - bool isValidId(const std::string& id) noexcept; + bool isValidId(const std::string_view id) noexcept; bool isValidString(const rapidjson::Value& elem, const char* key); } diff --git a/src/Parser/Utils/ParseUtilsIdx.cpp b/src/Parser/Utils/ParseUtilsIdx.cpp index 468b6795..4e258e2e 100755 --- a/src/Parser/Utils/ParseUtilsIdx.cpp +++ b/src/Parser/Utils/ParseUtilsIdx.cpp @@ -66,6 +66,16 @@ namespace Parser return val; } + std::string_view getStringViewIdx(const Value& elem, + SizeType idx, const std::string_view val) + { + if (idx < elem.Size()) + { + return getStringViewVal(elem[idx], val); + } + return val; + } + unsigned getUIntIdx(const Value& elem, SizeType idx, unsigned val) { if (idx < elem.Size() diff --git a/src/Parser/Utils/ParseUtilsIdx.h b/src/Parser/Utils/ParseUtilsIdx.h index 6ad445ea..6ac5e857 100755 --- a/src/Parser/Utils/ParseUtilsIdx.h +++ b/src/Parser/Utils/ParseUtilsIdx.h @@ -2,6 +2,7 @@ #include "Json/JsonParser.h" #include +#include namespace Parser { @@ -19,6 +20,9 @@ namespace Parser std::string getStringIdx(const rapidjson::Value& elem, rapidjson::SizeType idx, const std::string& val = ""); + std::string_view getStringViewIdx(const rapidjson::Value& elem, + rapidjson::SizeType idx, const std::string_view val = ""); + unsigned getUIntIdx(const rapidjson::Value& elem, rapidjson::SizeType idx, unsigned val = 0); diff --git a/src/Parser/Utils/ParseUtilsKey.cpp b/src/Parser/Utils/ParseUtilsKey.cpp index 8f4ee2f6..b9b1dcdb 100755 --- a/src/Parser/Utils/ParseUtilsKey.cpp +++ b/src/Parser/Utils/ParseUtilsKey.cpp @@ -4,7 +4,7 @@ #include "Json/JsonUtils.h" #include "Game.h" #include "GameUtils.h" -#include "SFMLUtils.h" +#include "SFML/SFMLUtils.h" #include "Utils/Utils.h" namespace Parser @@ -119,6 +119,16 @@ namespace Parser return val; } + std::string_view getStringViewKey(const Value& elem, + const char* key, const std::string_view val) + { + if (elem.HasMember(key) == true) + { + return getStringViewVal(elem[key], val); + } + return val; + } + unsigned getUIntKey(const Value& elem, const char* key, unsigned val) { if (elem.HasMember(key) == true @@ -222,7 +232,7 @@ namespace Parser } else if (elemVal.IsString() == true) { - vec.push_back(elemVal.GetString()); + vec.push_back({ elemVal.GetString(), elemVal.GetStringLength() }); } } return vec; @@ -238,6 +248,16 @@ namespace Parser return val; } + InputEvent getInputEventKey(const Value& elem, + const char* key, InputEvent val) + { + if (elem.HasMember(key) == true) + { + return getInputEventVal(elem[key], val); + } + return val; + } + size_t getInventoryItemIndexKey(const Value& elem, const char* key, PlayerInventory inv) { @@ -331,7 +351,23 @@ namespace Parser const auto& keyElem = elem[key]; if (keyElem.IsString() == true) { - return GameUtils::getPlayerAnimation(keyElem.GetString(), val); + return GameUtils::getPlayerAnimation( + { keyElem.GetString(), keyElem.GetStringLength() }, val); + } + } + return val; + } + + PlayerStatus getPlayerStatusKey(const Value& elem, + const char* key, PlayerStatus val) + { + if (elem.HasMember(key) == true) + { + const auto& keyElem = elem[key]; + if (keyElem.IsString() == true) + { + return GameUtils::getPlayerStatus( + { keyElem.GetString(), keyElem.GetStringLength() }, val); } } return val; diff --git a/src/Parser/Utils/ParseUtilsKey.h b/src/Parser/Utils/ParseUtilsKey.h index 79eb2b21..adf1fdd1 100755 --- a/src/Parser/Utils/ParseUtilsKey.h +++ b/src/Parser/Utils/ParseUtilsKey.h @@ -35,6 +35,9 @@ namespace Parser std::string getStringKey(const rapidjson::Value& elem, const char* key, const std::string& val = {}); + std::string_view getStringViewKey(const rapidjson::Value& elem, + const char* key, const std::string_view val = ""); + unsigned getUIntKey(const rapidjson::Value& elem, const char* key, unsigned val = {}); @@ -109,6 +112,9 @@ namespace Parser IgnoreResource getIgnoreResourceKey(const rapidjson::Value& elem, const char* key, IgnoreResource val = IgnoreResource::None); + InputEvent getInputEventKey(const rapidjson::Value& elem, + const char* key, InputEvent val = InputEvent::None); + size_t getInventoryItemIndexKey(const rapidjson::Value& elem, const char* key, PlayerInventory inv); @@ -143,6 +149,9 @@ namespace Parser PlayerAnimation getPlayerAnimationKey(const rapidjson::Value& elem, const char* key, PlayerAnimation val = PlayerAnimation::Stand1); + PlayerStatus getPlayerStatusKey(const rapidjson::Value& elem, + const char* key, PlayerStatus val = PlayerStatus::Stand); + ReplaceVars getReplaceVarsKey(const rapidjson::Value& elem, const char* key, ReplaceVars val = ReplaceVars::None); diff --git a/src/Parser/Utils/ParseUtilsVal.cpp b/src/Parser/Utils/ParseUtilsVal.cpp index d8b52661..4196bb5d 100755 --- a/src/Parser/Utils/ParseUtilsVal.cpp +++ b/src/Parser/Utils/ParseUtilsVal.cpp @@ -5,7 +5,7 @@ #include #include "FileUtils.h" #include "GameUtils.h" -#include "SFMLUtils.h" +#include "SFML/SFMLUtils.h" #include "Utils/Utils.h" namespace Parser @@ -71,11 +71,11 @@ namespace Parser { if (elem.IsString() == true) { - return elem.GetString(); + return { elem.GetString(), elem.GetStringLength() }; } else if (elem.IsInt64() == true) { - return std::to_string(elem.GetInt64()); + return Utils::toString(elem.GetInt64()); } else if (elem.IsDouble() == true) { @@ -84,6 +84,15 @@ namespace Parser return val; } + std::string_view getStringViewVal(const Value& elem, const std::string_view val) + { + if (elem.IsString() == true) + { + return { elem.GetString(), elem.GetStringLength() }; + } + return val; + } + unsigned getUIntVal(const Value& elem, unsigned val) { if (elem.IsUint() == true) @@ -145,7 +154,8 @@ namespace Parser } else if (elem[0].IsString() == true) { - switch (GameUtils::getHorizontalAlignment(elem[0].GetString())) + std::string_view strView(elem[0].GetString(), elem[0].GetStringLength()); + switch (GameUtils::getHorizontalAlignment(strView)) { case HorizontalAlign::Left: default: @@ -164,7 +174,8 @@ namespace Parser } else if (elem[1].IsString() == true) { - switch (GameUtils::getVerticalAlignment(elem[1].GetString())) + std::string_view strView(elem[1].GetString(), elem[1].GetStringLength()); + switch (GameUtils::getVerticalAlignment(strView)) { case VerticalAlign::Top: default: @@ -217,11 +228,7 @@ namespace Parser { if (elem.IsString() == true) { - try - { - return SFMLUtils::stringToColor(elem.GetString()); - } - catch (std::exception ex) {} + return SFMLUtils::stringToColor({ elem.GetString(), elem.GetStringLength() }); } else if (elem.IsUint() == true) { @@ -238,7 +245,7 @@ namespace Parser } else if (elem.IsString() == true) { - return GameUtils::getKeyCode(elem.GetString(), val); + return GameUtils::getKeyCode({ elem.GetString(), elem.GetStringLength() }, val); } return val; } @@ -256,8 +263,7 @@ namespace Parser return val; } - IgnoreResource getIgnoreResourceVal(const Value& elem, - IgnoreResource val) + IgnoreResource getIgnoreResourceVal(const Value& elem, IgnoreResource val) { if (elem.IsBool() == true) { @@ -272,13 +278,42 @@ namespace Parser } else if (elem.IsString() == true) { - return GameUtils::getIgnoreResource(elem.GetString(), val); + return GameUtils::getIgnoreResource({ elem.GetString(), elem.GetStringLength() }, val); + } + return val; + } + + InputEvent getInputEventVal(const Value& elem, InputEvent val) + { + if (elem.IsBool() == true) + { + if (elem.GetBool() == true) + { + return InputEvent::All; + } + else + { + return InputEvent::None; + } + } + else if (elem.IsString() == true) + { + return GameUtils::getInputEvent({ elem.GetString(), elem.GetStringLength() }, val); + } + else if (elem.IsArray() == true) + { + InputEvent ret = InputEvent::None; + for (const auto& arrElem : elem) + { + ret |= GameUtils::getInputEvent( + { arrElem.GetString(), arrElem.GetStringLength() }, val); + } + return ret; } return val; } - size_t getInventoryItemIndexVal(const Value& elem, - PlayerInventory inv) + size_t getInventoryItemIndexVal(const Value& elem, PlayerInventory inv) { size_t itemIdx = 0; if (elem.IsUint() == true) @@ -289,7 +324,7 @@ namespace Parser { if (inv == PlayerInventory::Body) { - itemIdx = (size_t)GameUtils::getPlayerItemMount(elem.GetString()); + itemIdx = (size_t)GameUtils::getPlayerItemMount({ elem.GetString(), elem.GetStringLength() }); } } return itemIdx; @@ -299,7 +334,7 @@ namespace Parser { if (elem.IsString() == true) { - return GameUtils::getInventoryPosition(elem.GetString(), val); + return GameUtils::getInventoryPosition({ elem.GetString(), elem.GetStringLength() }, val); } return val; } @@ -325,11 +360,11 @@ namespace Parser } else if (elem.IsString() == true) { - if (elem.GetString() == std::string("min")) + if (elem.GetString() == std::string_view("min")) { num.setInt32(std::numeric_limits::min()); } - else if (elem.GetString() == std::string("max")) + else if (elem.GetString() == std::string_view("max")) { num.setInt32(std::numeric_limits::max()); } @@ -357,11 +392,11 @@ namespace Parser ItemCoordInventory getItemCoordInventoryVal(const Value& elem) { - std::string playerId; + std::string_view playerId(""); if (elem.HasMember("player") == true && elem["player"].IsString() == true) { - playerId = elem["player"].GetString(); + playerId = { elem["player"].GetString(), elem["player"].GetStringLength() }; } PlayerInventory inv = PlayerInventory::Body; if (elem.HasMember("inventory") == true) @@ -421,7 +456,7 @@ namespace Parser } else if (elem.IsString() == true) { - return GameUtils::getPlayerInventory(elem.GetString(), val); + return GameUtils::getPlayerInventory({ elem.GetString(), elem.GetStringLength() }, val); } return val; } @@ -441,7 +476,7 @@ namespace Parser } else if (elem.IsString() == true) { - return getReplaceVars(elem.GetString(), val); + return getReplaceVars({ elem.GetString(), elem.GetStringLength() }, val); } return val; } @@ -451,7 +486,7 @@ namespace Parser Variable var; if (elem.IsString() == true) { - var.emplace(std::string(elem.GetString())); + var.emplace(std::string(elem.GetString(), elem.GetStringLength())); } else if (elem.IsInt64() == true) { diff --git a/src/Parser/Utils/ParseUtilsVal.h b/src/Parser/Utils/ParseUtilsVal.h index d12d2132..f4f80cb7 100755 --- a/src/Parser/Utils/ParseUtilsVal.h +++ b/src/Parser/Utils/ParseUtilsVal.h @@ -4,6 +4,7 @@ #include "Game/ItemLocation.h" #include "Game/Number.h" #include "IgnoreResource.h" +#include "InputEvent.h" #include "Json/JsonParser.h" #include "Parser/ParserProperties.h" #include @@ -27,6 +28,8 @@ namespace Parser std::string getStringVal(const rapidjson::Value& elem, const std::string& val = {}); + std::string_view getStringViewVal(const rapidjson::Value& elem, const std::string_view val = ""); + unsigned getUIntVal(const rapidjson::Value& elem, unsigned val = {}); uint64_t getUInt64Val(const rapidjson::Value& elem, uint64_t val = {}); @@ -97,6 +100,9 @@ namespace Parser IgnoreResource getIgnoreResourceVal(const rapidjson::Value& elem, IgnoreResource val = IgnoreResource::None); + InputEvent getInputEventVal(const rapidjson::Value& elem, + InputEvent val = InputEvent::None); + size_t getInventoryItemIndexVal(const rapidjson::Value& elem, PlayerInventory inv); diff --git a/src/PhysFSStream.cpp b/src/PhysFSStream.cpp index 515792d7..1fc8b301 100755 --- a/src/PhysFSStream.cpp +++ b/src/PhysFSStream.cpp @@ -28,7 +28,7 @@ sf::PhysFSStream::PhysFSStream(const char* fileName) sf::PhysFSStream::~PhysFSStream() { - if (file != NULL) + if (file != nullptr) { PHYSFS_close(file); } @@ -36,20 +36,16 @@ sf::PhysFSStream::~PhysFSStream() bool sf::PhysFSStream::load(const char* fileName) { - if (file == NULL) + if (file == nullptr) { file = PHYSFS_openRead(fileName); } - return (file != NULL); + return (file != nullptr); } sf::Int64 sf::PhysFSStream::read(void* data, sf::Int64 size) noexcept { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) return PHYSFS_readBytes(file, data, (PHYSFS_uint64)size); -#else - return PHYSFS_read(file, data, 1, (PHYSFS_uint32)size); -#endif } sf::Int64 sf::PhysFSStream::seek(sf::Int64 position) noexcept diff --git a/src/PhysFSStream.h b/src/PhysFSStream.h index fb8d758e..cebf0825 100755 --- a/src/PhysFSStream.h +++ b/src/PhysFSStream.h @@ -45,15 +45,11 @@ namespace sf virtual sf::Int64 tell() noexcept; virtual sf::Int64 getSize() noexcept; - bool hasError() const noexcept { return file == NULL; } + bool hasError() const noexcept { return file == nullptr; } const char* getLastError() const noexcept { -#if (PHYSFS_VER_MAJOR > 2 || (PHYSFS_VER_MAJOR == 2 && PHYSFS_VER_MINOR >= 1)) return PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode()); -#else - return PHYSFS_getLastError(); -#endif } }; } diff --git a/src/Predicates/PredIO.h b/src/Predicates/PredIO.h index a275b523..31b7399f 100755 --- a/src/Predicates/PredIO.h +++ b/src/Predicates/PredIO.h @@ -13,7 +13,7 @@ class PredFileExists : public Predicate virtual Variable getResult(const Game& game) const { - auto file2 = game.getVarOrPropString(file); + auto file2 = game.getVarOrPropStringS(file); if (file2.empty() == false) { return { FileUtils::exists(file2.c_str()) }; diff --git a/src/Predicates/PredItem.h b/src/Predicates/PredItem.h index b830d30e..cb509627 100755 --- a/src/Predicates/PredItem.h +++ b/src/Predicates/PredItem.h @@ -2,7 +2,7 @@ #include "Predicate.h" #include "Game.h" -#include "Game/ItemProperties.h" +#include "Game/GameHashes.h" class PredItemHasRequiredStats : public Predicate { diff --git a/src/Predicates/PredLevelObject.h b/src/Predicates/PredLevelObject.h new file mode 100755 index 00000000..c41e4614 --- /dev/null +++ b/src/Predicates/PredLevelObject.h @@ -0,0 +1,67 @@ +#pragma once + +#include "Predicate.h" +#include "Game.h" +#include "Game/GameHashes.h" + +class PredLevelObjIsInRange : public Predicate +{ +private: + std::string idLevel; + std::string idObject; + sf::IntRect mapLocationRange; + +public: + PredLevelObjIsInRange(const std::string& idLevel_, + const std::string& idObject_, const sf::IntRect& mapLocationRange_) + : idLevel(idLevel_), idObject(idObject_), mapLocationRange(mapLocationRange_) {} + + virtual Variable getResult(const Game& game) const + { + auto level = game.Resources().getLevel(idLevel); + if (level != nullptr) + { + auto obj = level->getLevelObject(idObject); + if (obj != nullptr) + { + const auto& mapPos = obj->MapPosition(); + if (mapLocationRange.contains(mapPos.x, mapPos.y) == true) + { + return { true }; + } + } + } + return { false }; + } +}; + +class PredLevelObjIsInRangeByClass : public Predicate +{ +private: + std::string idLevel; + std::string idClass; + sf::IntRect mapLocationRange; + +public: + PredLevelObjIsInRangeByClass(const std::string& idLevel_, + const std::string& idClass_, const sf::IntRect& mapLocationRange_) + : idLevel(idLevel_), idClass(idClass_), mapLocationRange(mapLocationRange_) {} + + virtual Variable getResult(const Game& game) const + { + auto level = game.Resources().getLevel(idLevel); + if (level != nullptr) + { + auto obj = level->getLevelObjectByClass(idClass); + if (obj != nullptr) + { + const auto& mapPos = obj->MapPosition(); + if (mapLocationRange.contains(mapPos.x, mapPos.y) == true) + { + return { true }; + } + } + } + return { false }; + } +}; diff --git a/src/Predicates/PredPlayer.h b/src/Predicates/PredPlayer.h index 63d4ba6b..f3f67426 100755 --- a/src/Predicates/PredPlayer.h +++ b/src/Predicates/PredPlayer.h @@ -34,26 +34,31 @@ class PredPlayerCanUse : public Predicate } }; -class PredPlayerGetMaxGoldCapacity : public Predicate +class PredPlayerGetMaxItemCapacity : public Predicate { private: std::string idLevel; std::string idPlayer; + std::string itemClass; public: - PredPlayerGetMaxGoldCapacity(const std::string& idLevel_, - const std::string& idPlayer_) - : idLevel(idLevel_), idPlayer(idPlayer_) {} + PredPlayerGetMaxItemCapacity(const std::string& idLevel_, + const std::string& idPlayer_, const std::string& itemClass_) + : idLevel(idLevel_), idPlayer(idPlayer_), itemClass(itemClass_) {} virtual Variable getResult(const Game& game) const { auto level = game.Resources().getLevel(idLevel); if (level != nullptr) { - auto player = level->getPlayerOrCurrent(idPlayer); - if (player != nullptr) + auto itemClassPtr = level->getItemClass(itemClass); + if (itemClassPtr != nullptr) { - return { (int64_t)player->getMaxGoldCapacity(*level) }; + auto player = level->getPlayerOrCurrent(idPlayer); + if (player != nullptr) + { + return { (int64_t)player->getMaxItemCapacity(*itemClassPtr) }; + } } } return { (int64_t)0 }; diff --git a/src/Predicates/Predicate.h b/src/Predicates/Predicate.h index 86fa9ef6..fe18dfdd 100755 --- a/src/Predicates/Predicate.h +++ b/src/Predicates/Predicate.h @@ -7,6 +7,6 @@ class Game; class Predicate { public: - virtual ~Predicate() {} + virtual ~Predicate() = default; virtual Variable getResult(const Game& game) const = 0; }; diff --git a/src/Queryable.h b/src/Queryable.h index a4aedf77..8e2ffa2c 100755 --- a/src/Queryable.h +++ b/src/Queryable.h @@ -1,11 +1,13 @@ #pragma once -#include +#include +#include "TextureInfo.h" #include "Variable.h" class Queryable { public: - virtual bool getProperty(const std::string& prop, Variable& var) const = 0; - virtual const Queryable* getQueryable(const std::string& prop) const { return nullptr; } + virtual bool getProperty(const std::string_view prop, Variable& var) const = 0; + virtual const Queryable* getQueryable(const std::string_view prop) const { return nullptr; } + virtual bool getTexture(size_t textureNumber, TextureInfo& ti) const { return false; } }; diff --git a/src/Rectangle.cpp b/src/Rectangle.cpp index d38c4fe5..31b72d3f 100755 --- a/src/Rectangle.cpp +++ b/src/Rectangle.cpp @@ -16,12 +16,12 @@ void Rectangle::updateSize(const Game& game) setSize(size); } -bool Rectangle::getProperty(const std::string& prop, Variable& var) const +bool Rectangle::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - return GameUtils::getUIObjProp(*this, str2int16(props.first.c_str()), props.second, var); + return GameUtils::getUIObjProp(*this, str2int16(props.first), props.second, var); } diff --git a/src/Rectangle.h b/src/Rectangle.h index ee19ae28..d826747f 100755 --- a/src/Rectangle.h +++ b/src/Rectangle.h @@ -32,5 +32,5 @@ class Rectangle : public sf::RectangleShape, public UIObject } } - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp index 073961d4..3eb58d9b 100755 --- a/src/ResourceManager.cpp +++ b/src/ResourceManager.cpp @@ -91,7 +91,7 @@ void ResourceManager::ignoreTopResource(IgnoreResource ignore) } } -bool ResourceManager::resourceExists(const std::string& id) const noexcept +bool ResourceManager::resourceExists(const std::string_view id) const noexcept { for (auto& res : resources) { @@ -103,6 +103,17 @@ bool ResourceManager::resourceExists(const std::string& id) const noexcept return false; } +void ResourceManager::moveResourceToTop(const std::string& id) +{ + auto it = std::find_if(resources.begin(), resources.end(), + [&id](const auto& res) -> bool { return res.id == id; } + ); + if (it != resources.end()) + { + std::rotate(it, it + 1, resources.end()); + } +} + Image* ResourceManager::getCursor() const { if (cursors.empty() == true) @@ -130,6 +141,11 @@ void ResourceManager::popCursor(bool popAll) void ResourceManager::setKeyboardAction(const sf::Event::KeyEvent& key, const std::shared_ptr& obj) { + if (key.code == sf::Keyboard::KeyCount) + { + resources.back().anyKeyAction = obj; + return; + } resources.back().keyboardActions[key] = obj; } @@ -149,6 +165,23 @@ bool ResourceManager::addFont(ResourceBundle& res, return false; } +bool ResourceManager::addFont(const std::string& key, + const Font& obj, const std::string_view resourceId) +{ + if (resourceId.empty() == true) + { + return addFont(resources.back(), key, obj); + } + for (auto& res : reverse(resources)) + { + if (res.id == resourceId) + { + return addFont(res, key, obj); + } + } + return false; +} + bool ResourceManager::addTexture(ResourceBundle& res, const std::string& key, const std::shared_ptr& obj) { @@ -160,6 +193,23 @@ bool ResourceManager::addTexture(ResourceBundle& res, return false; } +bool ResourceManager::addTexture(const std::string& key, + const std::shared_ptr& obj, const std::string_view resourceId) +{ + if (resourceId.empty() == true) + { + return addTexture(resources.back(), key, obj); + } + for (auto& res : reverse(resources)) + { + if (res.id == resourceId) + { + return addTexture(res, key, obj); + } + } + return false; +} + bool ResourceManager::addAudioSource(ResourceBundle& res, const std::string& key, const AudioSource& obj) { @@ -171,6 +221,23 @@ bool ResourceManager::addAudioSource(ResourceBundle& res, return false; } +bool ResourceManager::addAudioSource(const std::string& key, + const AudioSource& obj, const std::string_view resourceId) +{ + if (resourceId.empty() == true) + { + return addAudioSource(resources.back(), key, obj); + } + for (auto& res : reverse(resources)) + { + if (res.id == resourceId) + { + return addAudioSource(res, key, obj); + } + } + return false; +} + bool ResourceManager::addSong(ResourceBundle& res, const std::string& key, const std::shared_ptr& obj) { @@ -182,6 +249,23 @@ bool ResourceManager::addSong(ResourceBundle& res, return false; } +bool ResourceManager::addSong(const std::string& key, + const std::shared_ptr& obj, const std::string_view resourceId) +{ + if (resourceId.empty() == true) + { + return addSong(resources.back(), key, obj); + } + for (auto& res : reverse(resources)) + { + if (res.id == resourceId) + { + return addSong(res, key, obj); + } + } + return false; +} + bool ResourceManager::addPalette(ResourceBundle& res, const std::string& key, const std::shared_ptr& obj) { @@ -193,6 +277,23 @@ bool ResourceManager::addPalette(ResourceBundle& res, return false; } +bool ResourceManager::addPalette(const std::string& key, + const std::shared_ptr& obj, const std::string_view resourceId) +{ + if (resourceId.empty() == true) + { + return addPalette(resources.back(), key, obj); + } + for (auto& res : reverse(resources)) + { + if (res.id == resourceId) + { + return addPalette(res, key, obj); + } + } + return false; +} + bool ResourceManager::addImageContainer(ResourceBundle& res, const std::string& key, const std::shared_ptr& obj) { @@ -204,6 +305,23 @@ bool ResourceManager::addImageContainer(ResourceBundle& res, return false; } +bool ResourceManager::addImageContainer(const std::string& key, + const std::shared_ptr& obj, const std::string_view resourceId) +{ + if (resourceId.empty() == true) + { + return addImageContainer(resources.back(), key, obj); + } + for (auto& res : reverse(resources)) + { + if (res.id == resourceId) + { + return addImageContainer(res, key, obj); + } + } + return false; +} + bool ResourceManager::addTexturePack(ResourceBundle& res, const std::string& key, const std::shared_ptr& obj) { @@ -215,33 +333,53 @@ bool ResourceManager::addTexturePack(ResourceBundle& res, return false; } +bool ResourceManager::addTexturePack(const std::string& key, + const std::shared_ptr& obj, const std::string_view resourceId) +{ + if (resourceId.empty() == true) + { + return addTexturePack(resources.back(), key, obj); + } + for (auto& res : reverse(resources)) + { + if (res.id == resourceId) + { + return addTexturePack(res, key, obj); + } + } + return false; +} + void ResourceManager::addDrawable(ResourceBundle& res, const std::string& key, const std::shared_ptr& obj) { - if (res.drawableIds.find(key) != res.drawableIds.cend()) + auto it = res.drawableIds.find(key); + if (it != res.drawableIds.end()) { for (auto& drawable : res.drawables) { - if (drawable.first == key) + if (drawable == it->second.get()) { - drawable.second = obj; + it->second = obj; + drawable = obj.get(); break; } } } else { - res.drawableIds.insert(key); - res.drawables.push_back(std::make_pair(key, obj)); + res.drawableIds[key] = obj; + res.drawables.push_back(obj.get()); } clearCache(); } -void ResourceManager::addDrawable(const std::string& resourceId, - const std::string& key, const std::shared_ptr& obj) +void ResourceManager::addDrawable(const std::string& key, + const std::shared_ptr& obj, const std::string_view resourceId) { if (resourceId.empty() == true) { + addDrawable(resources.back(), key, obj); return; } for (auto& res : reverse(resources)) @@ -289,8 +427,11 @@ std::shared_ptr ResourceManager::getKeyboardAction(const sf::Event::KeyE { for (const auto& res : reverse(resources)) { + if (res.anyKeyAction != nullptr) + { + return res.anyKeyAction; + } const auto elem = res.keyboardActions.find(key); - if (elem != res.keyboardActions.cend()) { return elem->second; @@ -304,7 +445,6 @@ std::shared_ptr ResourceManager::getAction(const std::string& key) const for (const auto& res : reverse(resources)) { const auto elem = res.actions.find(key); - if (elem != res.actions.cend()) { return elem->second; @@ -318,7 +458,6 @@ Font ResourceManager::getFont(const std::string& key) const for (const auto& res : reverse(resources)) { const auto elem = res.fonts.find(key); - if (elem != res.fonts.cend()) { return elem->second; @@ -332,7 +471,6 @@ std::shared_ptr ResourceManager::getTexture(const std::string& key) for (const auto& res : reverse(resources)) { const auto elem = res.textures.find(key); - if (elem != res.textures.cend()) { return elem->second; @@ -346,7 +484,6 @@ AudioSource ResourceManager::getAudioSource(const std::string& key) const for (const auto& res : reverse(resources)) { const auto elem = res.audioSources.find(key); - if (elem != res.audioSources.cend()) { return elem->second; @@ -362,12 +499,10 @@ sf::SoundBuffer* ResourceManager::getSoundBuffer(const std::string& key) const { return std::get>(elem).get(); } -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) else if (std::holds_alternative>(elem) == true) { return &std::get>(elem)->soundBuffer; } -#endif return nullptr; } @@ -376,7 +511,6 @@ std::shared_ptr ResourceManager::getSong(const std::string& key) con for (const auto& res : reverse(resources)) { const auto elem = res.songs.find(key); - if (elem != res.songs.cend()) { return elem->second; @@ -390,7 +524,6 @@ std::shared_ptr ResourceManager::getPalette(const std::string& key) con for (const auto& res : reverse(resources)) { const auto elem = res.palettes.find(key); - if (elem != res.palettes.cend()) { return elem->second; @@ -404,7 +537,6 @@ std::shared_ptr ResourceManager::getImageContainer(const std::st for (const auto& res : reverse(resources)) { const auto elem = res.imageContainers.find(key); - if (elem != res.imageContainers.cend()) { return elem->second; @@ -418,7 +550,6 @@ std::shared_ptr ResourceManager::getTexturePack(const std::string& for (const auto& res : reverse(resources)) { const auto elem = res.texturePacks.find(key); - if (elem != res.texturePacks.cend()) { return elem->second; @@ -427,6 +558,42 @@ std::shared_ptr ResourceManager::getTexturePack(const std::string& return nullptr; } +bool ResourceManager::hasFont(const std::string& key) const +{ + for (const auto& resource : resources) + { + if (resource.fonts.find(key) != resource.fonts.cend()) + { + return true; + } + } + return false; +} + +bool ResourceManager::hasTexture(const std::string& key) const +{ + for (const auto& resource : resources) + { + if (resource.textures.find(key) != resource.textures.cend()) + { + return true; + } + } + return false; +} + +bool ResourceManager::hasAudioSource(const std::string& key) const +{ + for (const auto& resource : resources) + { + if (resource.audioSources.find(key) != resource.audioSources.cend()) + { + return true; + } + } + return false; +} + bool ResourceManager::hasSong(const std::string& key, bool checkTopOnly) const { for (const auto& resource : resources) @@ -499,14 +666,12 @@ UIObject* ResourceManager::getDrawable(const std::string& key) const } for (const auto& res : reverse(resources)) { - for (const auto& elem : res.drawables) + auto it = res.drawableIds.find(key); + if (it != res.drawableIds.end()) { - if (elem.first == key) - { - drawableCache.first = key; - drawableCache.second = elem.second.get(); - return drawableCache.second; - } + drawableCache.first = key; + drawableCache.second = it->second.get(); + return drawableCache.second; } } return nullptr; @@ -516,19 +681,20 @@ void ResourceManager::deleteDrawable(const std::string& id) { for (auto& res : reverse(resources)) { - if (res.drawableIds.find(id) != res.drawableIds.cend()) + auto it1 = res.drawableIds.find(id); + if (it1 != res.drawableIds.end()) { - res.drawableIds.erase(id); auto& drawables = res.drawables; - for (auto it = drawables.begin(); it != drawables.end(); ++it) + for (auto it2 = drawables.begin(); it2 != drawables.end(); ++it2) { - if (it->first == id) + if (*it2 == it1->second.get()) { if (drawableCache.first == id) { clearCache(); } - drawables.erase(it); + drawables.erase(it2); + res.drawableIds.erase(it1); return; } } diff --git a/src/ResourceManager.h b/src/ResourceManager.h index ff11b59f..cd2fbe7a 100755 --- a/src/ResourceManager.h +++ b/src/ResourceManager.h @@ -9,16 +9,15 @@ #include "ImageContainers/ImageContainer.h" #include #include -#include "Music2.h" -#include "MusicLoops.h" #include "Palette.h" #include #include +#include "SFML/Music2.h" +#include "SFML/MusicLoops.h" #include #include "TexturePacks/TexturePack.h" #include "UIObject.h" #include -#include #include "Utils/ReverseIterable.h" #include @@ -51,6 +50,7 @@ struct ResourceBundle IgnoreResource ignore{ IgnoreResource::None }; std::string id; + std::shared_ptr anyKeyAction; std::unordered_map> actions; std::unordered_map, CompareKeyEvent, CompareKeyEvent> keyboardActions; std::unordered_map fonts; @@ -61,8 +61,8 @@ struct ResourceBundle std::unordered_map> imageContainers; std::unordered_map> texturePacks; - std::unordered_set drawableIds; - std::vector>> drawables; + std::unordered_map> drawableIds; + std::vector drawables; std::vector> focusButtons; size_t focusIdx{ 0 }; }; @@ -143,7 +143,8 @@ class ResourceManager void popAllResources(bool popBaseResources); void ignoreResources(const std::string& id, IgnoreResource ignore) noexcept; void ignoreTopResource(IgnoreResource ignore); - bool resourceExists(const std::string& id) const noexcept; + bool resourceExists(const std::string_view id) const noexcept; + void moveResourceToTop(const std::string& id); Image* getCursor() const; Level* getCurrentLevel() const noexcept { return currentLevel; } @@ -163,47 +164,30 @@ class ResourceManager void setKeyboardAction(const sf::Event::KeyEvent& key, const std::shared_ptr& obj); void setAction(const std::string& key, const std::shared_ptr& obj); - bool addFont(const std::string& key, const Font& obj) - { - return addFont(resources.back(), key, obj); - } - bool addTexture(const std::string& key, const std::shared_ptr& obj) - { - return addTexture(resources.back(), key, obj); - } - bool addAudioSource(const std::string& key, const AudioSource& obj) - { - return addAudioSource(resources.back(), key, obj); - } - bool addSong(const std::string& key, const std::shared_ptr& obj) - { - return addSong(resources.back(), key, obj); - } - bool addPalette(const std::string& key, const std::shared_ptr& obj) - { - return addPalette(resources.back(), key, obj); - } - bool addImageContainer(const std::string& key, const std::shared_ptr& obj) - { - return addImageContainer(resources.back(), key, obj); - } - bool addTexturePack(const std::string& key, const std::shared_ptr& obj) - { - return addTexturePack(resources.back(), key, obj); - } - - void addDrawable(const std::string& key, const std::shared_ptr& obj) - { - return addDrawable(resources.back(), key, obj); - } - void addDrawable(const std::string& resourceId, - const std::string& key, const std::shared_ptr& obj); + bool addFont(const std::string& key, const Font& obj, + const std::string_view resourceId = {}); + bool addTexture(const std::string& key, const std::shared_ptr& obj, + const std::string_view resourceId = {}); + bool addAudioSource(const std::string& key, const AudioSource& obj, + const std::string_view resourceId = {}); + bool addSong(const std::string& key, const std::shared_ptr& obj, + const std::string_view resourceId = {}); + bool addPalette(const std::string& key, const std::shared_ptr& obj, + const std::string_view resourceId = {}); + bool addImageContainer(const std::string& key, const std::shared_ptr& obj, + const std::string_view resourceId = {}); + bool addTexturePack(const std::string& key, const std::shared_ptr& obj, + const std::string_view resourceId = {}); + + void addDrawable(const std::string& key, const std::shared_ptr& obj, + const std::string_view resourceId = {}); void addPlayingSound(const sf::Sound& obj, bool unique = false); void clearFinishedSounds(); void clearPlayingSounds() noexcept { playingSounds.clear(); } + // if a sf::Keyboard::KeyCount key exists, any key will return this action. std::shared_ptr getKeyboardAction(const sf::Event::KeyEvent& key) const; std::shared_ptr getAction(const std::string& key) const; Font getFont(const std::string& key) const; @@ -215,6 +199,9 @@ class ResourceManager std::shared_ptr getImageContainer(const std::string& key) const; std::shared_ptr getTexturePack(const std::string& key) const; + bool hasFont(const std::string& key) const; + bool hasTexture(const std::string& key) const; + bool hasAudioSource(const std::string& key) const; bool hasSong(const std::string& key, bool checkTopOnly = false) const; bool hasPalette(const std::string& key) const; bool hasImageContainer(const std::string& key) const; @@ -229,12 +216,10 @@ class ResourceManager { for (const auto& res : reverse(resources)) { - for (const auto& elem : res.drawables) + auto it = res.drawableIds.find(key); + if (it != res.drawableIds.cend()) { - if (elem.first == key) - { - return dynamic_cast(elem.second.get()); - } + return dynamic_cast(it->second.get()); } } return nullptr; @@ -245,12 +230,10 @@ class ResourceManager { for (const auto& res : reverse(resources)) { - for (const auto& elem : res.drawables) + auto it = res.drawableIds.find(key); + if (it != res.drawableIds.cend()) { - if (elem.first == key) - { - return std::dynamic_pointer_cast(elem.second); - } + return std::dynamic_pointer_cast(it->second); } } return nullptr; diff --git a/src/Image2.h b/src/SFML/Image2.h similarity index 100% rename from src/Image2.h rename to src/SFML/Image2.h diff --git a/src/Music2.cpp b/src/SFML/Music2.cpp similarity index 98% rename from src/Music2.cpp rename to src/SFML/Music2.cpp index ddd3a4ab..83924a6f 100755 --- a/src/Music2.cpp +++ b/src/SFML/Music2.cpp @@ -1,5 +1,4 @@ #include "Music2.h" -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) #include #include #include @@ -378,10 +377,9 @@ namespace sf // Make sure we don't divide by 0 if (sampleRate != 0 && channelCount != 0) { - position = microseconds((samples * 1000000) / (channelCount * sampleRate)); + position = microseconds((samples * 1000000) / ((Uint64)channelCount * sampleRate)); } return position; } } -#endif diff --git a/src/Music2.h b/src/SFML/Music2.h similarity index 93% rename from src/Music2.h rename to src/SFML/Music2.h index 21062a33..7ffbde96 100755 --- a/src/Music2.h +++ b/src/SFML/Music2.h @@ -12,7 +12,6 @@ namespace sf { -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) class InputStream; class Music2 : public SoundStream @@ -87,9 +86,4 @@ namespace sf static Time samplesToTime(Uint64 samples, unsigned sampleRate, unsigned channelCount); }; -#else - class Music2 : public Music - { - }; -#endif } diff --git a/src/MusicLoops.cpp b/src/SFML/MusicLoops.cpp similarity index 97% rename from src/MusicLoops.cpp rename to src/SFML/MusicLoops.cpp index 1fb8c83b..e163a9cd 100755 --- a/src/MusicLoops.cpp +++ b/src/SFML/MusicLoops.cpp @@ -1,5 +1,4 @@ #include "MusicLoops.h" -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) #include #include @@ -166,4 +165,3 @@ namespace sf } } } -#endif diff --git a/src/MusicLoops.h b/src/SFML/MusicLoops.h similarity index 84% rename from src/MusicLoops.h rename to src/SFML/MusicLoops.h index ac384089..eabb7237 100755 --- a/src/MusicLoops.h +++ b/src/SFML/MusicLoops.h @@ -1,5 +1,4 @@ #pragma once -#if (SFML_VERSION_MAJOR > 2 || (SFML_VERSION_MAJOR == 2 && SFML_VERSION_MINOR >= 5)) #include "Music2.h" namespace sf @@ -27,4 +26,3 @@ namespace sf virtual Int64 onLoop(); }; } -#endif diff --git a/src/SFMLUtils.cpp b/src/SFML/SFMLUtils.cpp similarity index 92% rename from src/SFMLUtils.cpp rename to src/SFML/SFMLUtils.cpp index 9640d13c..cf8bc120 100755 --- a/src/SFMLUtils.cpp +++ b/src/SFML/SFMLUtils.cpp @@ -1,5 +1,6 @@ #include "SFMLUtils.h" #include +#include namespace SFMLUtils { @@ -20,15 +21,16 @@ namespace SFMLUtils return sf::Color(r, g, b, a); } - sf::Color stringToColor(const std::string& str) + sf::Color stringToColor(const std::string_view str) { + auto num = (unsigned)std::strtoul(str.data(), nullptr, 16); if (str.length() >= 10) { - return rgbaToColor(std::stoul(str, 0, 16)); + return rgbaToColor(num); } else { - return rgbToColor(std::stoul(str, 0, 16)); + return rgbToColor(num); } } diff --git a/src/SFMLUtils.h b/src/SFML/SFMLUtils.h similarity index 82% rename from src/SFMLUtils.h rename to src/SFML/SFMLUtils.h index 7ac64aaf..93ce0a75 100755 --- a/src/SFMLUtils.h +++ b/src/SFML/SFMLUtils.h @@ -2,13 +2,13 @@ #include #include -#include +#include namespace SFMLUtils { sf::Color rgbToColor(unsigned val); sf::Color rgbaToColor(unsigned val); - sf::Color stringToColor(const std::string& str); + sf::Color stringToColor(const std::string_view str); void spriteCenterTexture(sf::Sprite& sprite); diff --git a/src/SFML/Sprite2.cpp b/src/SFML/Sprite2.cpp new file mode 100755 index 00000000..7e3d12b1 --- /dev/null +++ b/src/SFML/Sprite2.cpp @@ -0,0 +1,63 @@ +#include "Sprite2.h" +#include "Shaders.h" + +void Sprite2::setColor(const sf::Color& color) +{ + if (hasPalette() == false) + { + sf::Sprite::setColor(color); + } +} + +void Sprite2::setOutline(const sf::Color& outline_, const sf::Color& ignore_) noexcept +{ + outline = outline_; + ignore = ignore_; +} + +void Sprite2::setOutlineEnabled(bool enable) noexcept +{ + if (Shaders::supportsOutlines() == false) + { + return; + } + outlineEnabled = enable; +} + +void Sprite2::setTexture(const TextureInfo& ti, bool resetRect) +{ + sf::Sprite::setTexture(*ti.texture); + if (resetRect == true) + { + setTextureRect(ti.textureRect); + } + else + { + auto oldRect = getTextureRect(); + oldRect.left = ti.textureRect.left; + oldRect.top = ti.textureRect.top; + setTextureRect(oldRect); + } + setPalette(ti.palette); +} + +void Sprite2::draw(sf::RenderTarget& target, sf::RenderStates states) const +{ + if (outlineEnabled == true && + hasOutline() == true) + { + states.shader = &Shaders::Outline; + Shaders::Outline.setUniform("texWidth", 1.0f / (float)getTextureRect().width); + Shaders::Outline.setUniform("texHeight", 1.0f / (float)getTextureRect().height); + Shaders::Outline.setUniform("outline", sf::Glsl::Vec4(outline)); + Shaders::Outline.setUniform("ignore", sf::Glsl::Vec4(ignore)); + + target.draw(static_cast(*this), states); + } + if (hasPalette() == true) + { + states.shader = &Shaders::Palette; + Shaders::Palette.setUniform("palette", palette->texture); + } + target.draw(static_cast(*this), states); +} diff --git a/src/Sprite2.h b/src/SFML/Sprite2.h similarity index 51% rename from src/Sprite2.h rename to src/SFML/Sprite2.h index 61de5e58..acb029f8 100755 --- a/src/Sprite2.h +++ b/src/SFML/Sprite2.h @@ -4,7 +4,7 @@ #include "Palette.h" #include #include -#include "Shaders.h" +#include "TextureInfo.h" class Sprite2 : public sf::Sprite { @@ -20,53 +20,21 @@ class Sprite2 : public sf::Sprite const std::shared_ptr& palette_ = nullptr) : sf::Sprite(texture), palette(palette_) {} - void setColor(const sf::Color& color) - { - if (hasPalette() == false) - { - sf::Sprite::setColor(color); - } - } + void setColor(const sf::Color& color); + const std::shared_ptr& getPalette() const noexcept { return palette; } void setPalette(const std::shared_ptr& pal) noexcept { palette = pal; } bool hasPalette() const noexcept { return palette != nullptr; } const sf::Color& getOutline() const noexcept { return outline; } const sf::Color& getOutlineIgnore() const noexcept { return ignore; } - void setOutline(const sf::Color& outline_, const sf::Color& ignore_) noexcept - { - outline = outline_; - ignore = ignore_; - } + void setOutline(const sf::Color& outline_, const sf::Color& ignore_) noexcept; bool hasOutline() const noexcept { return outline.a > 0; } - void setOutlineEnabled(bool enable) noexcept - { - if (Shaders::supportsOutlines() == false) - { - return; - } - outlineEnabled = enable; - } + void setOutlineEnabled(bool enable) noexcept; bool isOutlineEnabled() const noexcept { return outlineEnabled; } - virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const - { - if (outlineEnabled == true && - hasOutline() == true) - { - states.shader = &Shaders::Outline; - Shaders::Outline.setUniform("texWidth", 1.0f / (float)getTextureRect().width); - Shaders::Outline.setUniform("texHeight", 1.0f / (float)getTextureRect().height); - Shaders::Outline.setUniform("outline", sf::Glsl::Vec4(outline)); - Shaders::Outline.setUniform("ignore", sf::Glsl::Vec4(ignore)); + void setTexture(const TextureInfo& ti, bool resetRect); + using sf::Sprite::setTexture; - target.draw(static_cast(*this), states); - } - if (hasPalette() == true) - { - states.shader = &Shaders::Palette; - Shaders::Palette.setUniform("palette", palette->texture); - } - target.draw(static_cast(*this), states); - } + virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; }; diff --git a/src/View2.cpp b/src/SFML/View2.cpp similarity index 61% rename from src/View2.cpp rename to src/SFML/View2.cpp index 31df7ce7..4674eb88 100755 --- a/src/View2.cpp +++ b/src/SFML/View2.cpp @@ -14,6 +14,37 @@ sf::Vector2f View2::getPosition(const sf::Vector2f& point) const return mousePosition; } +void View2::setSize(float width, float height) +{ + sizeNoZoom.x = width; + sizeNoZoom.y = height; + if (forceEvenSize == true) + { + roundedSizeNoZoom.x = ((float)((int)(width * 0.5f)) * 2); + roundedSizeNoZoom.y = ((float)((int)(height * 0.5f)) * 2); + } + else + { + roundedSizeNoZoom = sizeNoZoom; + } + view.setSize(roundedSizeNoZoom.x, roundedSizeNoZoom.y); +} + +void View2::setSize(sf::Vector2f size_) +{ + sizeNoZoom = size_; + if (forceEvenSize == true) + { + roundedSizeNoZoom.x = ((float)((int)(size_.x * 0.5f)) * 2); + roundedSizeNoZoom.y = ((float)((int)(size_.y * 0.5f)) * 2); + } + else + { + roundedSizeNoZoom = sizeNoZoom; + } + view.setSize(roundedSizeNoZoom.x, roundedSizeNoZoom.y); +} + void View2::setViewport(const Game& game) { const auto& windowSize = game.WindowTex().getSize(); @@ -31,8 +62,8 @@ void View2::setViewport(const Game& game) } y /= (float)windowSize.y; - auto w = sizeNoZoom.x / (float)windowSize.x; - auto h = sizeNoZoom.y / (float)windowSize.y; + auto w = roundedSizeNoZoom.x / (float)windowSize.x; + auto h = roundedSizeNoZoom.y / (float)windowSize.y; view.setViewport(sf::FloatRect(x, y, w, h)); } @@ -45,18 +76,17 @@ void View2::updateSize(const Game& game) return; } auto pos2 = getPosition(); - auto size2 = sizeNoZoom; + auto size2 = getSize(); GameUtils::setAnchorPosSize(anchor, pos2, size2, game.OldWindowSize(), game.WindowSize()); setPosition(pos2); - sizeNoZoom = size2; - view.setSize(size2); + setSize(size2); setViewport(game); view.zoom(zoomFactor); } void View2::updateViewport(const Game& game) { - view.setSize(sizeNoZoom); + setSize(sizeNoZoom); setViewport(game); view.zoom(zoomFactor); } diff --git a/src/View2.h b/src/SFML/View2.h similarity index 85% rename from src/View2.h rename to src/SFML/View2.h index 04d66484..cecf47ca 100755 --- a/src/View2.h +++ b/src/SFML/View2.h @@ -11,12 +11,16 @@ class View2 sf::View view; sf::Vector2f position; sf::Vector2f sizeNoZoom; + sf::Vector2f roundedSizeNoZoom; float zoomFactor{ 1.f }; Anchor anchor{ Anchor::Top | Anchor::Left }; + bool forceEvenSize{ false }; void setViewport(const Game& game); public: + View2(bool forceEvenSize_ = false) : forceEvenSize(forceEvenSize_) {} + void updateSize(const Game& game); void updateViewport(const Game& game); @@ -33,16 +37,8 @@ class View2 const sf::Vector2f& getVisibleSize() const noexcept { return view.getSize(); } const sf::Vector2f& getSize() const noexcept { return sizeNoZoom; } - void setSize(float width, float height) - { - view.setSize(width, height); - sizeNoZoom = getSize(); - } - void setSize(const sf::Vector2f& size_) - { - view.setSize(size_); - sizeNoZoom = size_; - } + void setSize(float width, float height); + void setSize(sf::Vector2f size_); const sf::View& getView() const noexcept { return view; } diff --git a/src/ScrollableText.cpp b/src/ScrollableText.cpp index d651355e..27513a18 100755 --- a/src/ScrollableText.cpp +++ b/src/ScrollableText.cpp @@ -3,6 +3,14 @@ #include "GameUtils.h" #include "Utils/Utils.h" +void ScrollableText::reset() +{ + text->Position(sf::Vector2f(0.f, 0.f)); + const auto& vSize = view.getVisibleSize(); + view.reset(sf::FloatRect(0, -vSize.y, vSize.x, vSize.y)); + height = vSize.y; +} + ScrollableText::ScrollableText(std::unique_ptr text_, const sf::Time& frameTime_) : text(std::move(text_)), frameTime(frameTime_) { @@ -58,14 +66,11 @@ void ScrollableText::update(Game& game) return; } - // add delta time currentTime += game.getElapsedTime(); - // if current time is bigger then the frame time advance one frame - if (currentTime >= frameTime) + while (currentTime >= frameTime) { - // reset time, but keep the remainder - currentTime = sf::microseconds(currentTime.asMicroseconds() % frameTime.asMicroseconds()); + currentTime -= frameTime; auto rect = view.getCenter(); auto yy = (int)text->Size().y; @@ -89,12 +94,12 @@ void ScrollableText::update(Game& game) } } -bool ScrollableText::getProperty(const std::string& prop, Variable& var) const +bool ScrollableText::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - return GameUtils::getUIObjProp(*this, str2int16(props.first.c_str()), props.second, var); + return GameUtils::getUIObjProp(*this, str2int16(props.first), props.second, var); } diff --git a/src/ScrollableText.h b/src/ScrollableText.h index 5831011e..f860b9dd 100755 --- a/src/ScrollableText.h +++ b/src/ScrollableText.h @@ -4,8 +4,8 @@ #include "DrawableText.h" #include #include +#include "SFML/View2.h" #include "UIObject.h" -#include "View2.h" class ScrollableText : public UIObject { @@ -24,13 +24,7 @@ class ScrollableText : public UIObject public: ScrollableText(std::unique_ptr text_, const sf::Time& frameTime_); - void reset() - { - text->Position(sf::Vector2f(0.f, 0.f)); - const auto& vSize = view.getSize(); - view.reset(sf::FloatRect(0, -vSize.y, vSize.x, vSize.y)); - height = vSize.y; - } + void reset(); void setLoop(bool loop_) noexcept { loop = loop_; } void setPause(bool pause_) noexcept { pause = pause_; } @@ -56,5 +50,5 @@ class ScrollableText : public UIObject virtual void updateViewPort(const Game& game) { view.updateViewport(game); } - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/Shaders.cpp b/src/Shaders.cpp index 515b0b0a..d0086f85 100755 --- a/src/Shaders.cpp +++ b/src/Shaders.cpp @@ -58,11 +58,30 @@ void main() } )" }; +const std::string Shaders::gammaText{ R"( +#version 110 +uniform sampler2D tex; +uniform float gamma; + +vec3 Gamma(vec3 value, float param) +{ + return vec3(pow(abs(value.r), param), pow(abs(value.g), param), pow(abs(value.b), param)); +} + +void main() +{ + vec4 pixel = texture2D(tex, gl_TexCoord[0].xy); + gl_FragColor = vec4(Gamma(pixel.rgb, gamma), pixel.a); +} +)" }; + bool Shaders::hasOutline{ false }; bool Shaders::hasPalette{ false }; +bool Shaders::hasGamma{ false }; sf::Shader Shaders::Outline; sf::Shader Shaders::Palette; +sf::Shader Shaders::Gamma; void Shaders::init() { @@ -85,4 +104,14 @@ void Shaders::init() } Palette.setUniform("tex", sf::Shader::CurrentTexture); } + + if (hasGamma == false) + { + if (Gamma.isAvailable() == true && + Gamma.loadFromMemory(gammaText, sf::Shader::Fragment) == true) + { + hasGamma = true; + } + Gamma.setUniform("tex", sf::Shader::CurrentTexture); + } } diff --git a/src/Shaders.h b/src/Shaders.h index 32281f10..1a026597 100755 --- a/src/Shaders.h +++ b/src/Shaders.h @@ -8,16 +8,20 @@ class Shaders private: static const std::string outlineText; static const std::string paletteText; + static const std::string gammaText; static bool hasOutline; static bool hasPalette; + static bool hasGamma; public: static sf::Shader Outline; static sf::Shader Palette; + static sf::Shader Gamma; static bool supportsOutlines() noexcept { return hasOutline; } static bool supportsPalettes() noexcept { return hasPalette; } + static bool supportsGamma() noexcept { return hasGamma; } static void init(); }; diff --git a/src/Sol.cpp b/src/Sol.cpp index 85178dfe..59c1f819 100755 --- a/src/Sol.cpp +++ b/src/Sol.cpp @@ -1,9 +1,9 @@ #include "Sol.h" #include "PhysFSStream.h" -Sol::Sol(const std::string& fileName) +Sol::Sol(const std::string_view fileName) { - sf::PhysFSStream file(fileName); + sf::PhysFSStream file(fileName.data()); if (file.hasError() == true) { return; diff --git a/src/Sol.h b/src/Sol.h index a870dcd3..6bce9995 100755 --- a/src/Sol.h +++ b/src/Sol.h @@ -11,7 +11,7 @@ class Sol public: Sol() {} - Sol(const std::string& fileName); + Sol(const std::string_view fileName); uint8_t get(size_t index) const; bool passable(size_t index) const; diff --git a/src/StringButton.cpp b/src/StringButton.cpp index 36a2eae5..c59f6927 100755 --- a/src/StringButton.cpp +++ b/src/StringButton.cpp @@ -6,7 +6,7 @@ std::shared_ptr StringButton::getAction(uint16_t nameHash16) const noexc auto action = Button::getAction(nameHash16); if (action == nullptr) { - action = Text2::getAction(nameHash16); + action = Text::getAction(nameHash16); } return action; } @@ -15,18 +15,18 @@ bool StringButton::setAction(uint16_t nameHash16, const std::shared_ptr& { if (Button::setAction(nameHash16, action) == false) { - return Text2::setAction(nameHash16, action); + return Text::setAction(nameHash16, action); } return true; } void StringButton::update(Game& game) { - if (Text2::Visible() == false) + if (Text::Visible() == false) { return; } - Text2::update(game); - auto contains = Text2::getGlobalBounds().contains(game.MousePositionf()); - Button::update(game, contains); + Text::update(game); + auto contains = Text::getGlobalBounds().contains(game.MousePositionf()); + Button::updateEvents(game, contains); } diff --git a/src/StringButton.h b/src/StringButton.h index 31afaece..d75c4959 100755 --- a/src/StringButton.h +++ b/src/StringButton.h @@ -1,15 +1,15 @@ #pragma once #include "Button.h" -#include "Text2.h" +#include "Text.h" -class StringButton : public Button, public Text2 +class StringButton : public Button, public Text { public: virtual std::shared_ptr getAction(uint16_t nameHash16) const noexcept; virtual bool setAction(uint16_t nameHash16, const std::shared_ptr& action) noexcept; - virtual void setColor(const sf::Color& color_) { Text2::setColor(color_); } + virtual void setColor(const sf::Color& color_) { Text::setColor(color_); } virtual void update(Game& game); }; diff --git a/src/StringText.cpp b/src/StringText.cpp index ef20437e..7e8c240a 100755 --- a/src/StringText.cpp +++ b/src/StringText.cpp @@ -2,9 +2,10 @@ #include #include "Game.h" #include "GameUtils.h" +#include #include "Utils/Utils.h" -void StringText::calcLineCount() +void StringText::calculateLineCount() { if (text.getString().isEmpty() == true) { @@ -34,16 +35,53 @@ void StringText::updateSize(const Game& game) calculateDrawPosition(); } -bool StringText::getProperty(const std::string& prop, Variable& var) const +bool StringText::setText(const std::string& str) +{ + if (text.getString() == str) + { + return false; + } + text.setString(str); + calculateLineCount(); + calculateDrawPosition(); + return true; +} + +void StringText::setHorizontalSpaceOffset(int offset) noexcept +{ + float factor = 1.f; + if (offset != 0) + { + factor = (float)(text.getCharacterSize() + offset) / (float)text.getCharacterSize(); + } + text.setLetterSpacing(factor); + calculateDrawPosition(); +} + +void StringText::setVerticalSpaceOffset(int offset) noexcept +{ + float factor = 1.f; + if (offset != 0) + { + factor = (float)(text.getCharacterSize() + offset) / (float)text.getCharacterSize(); + } + text.setLineSpacing(factor); + calculateDrawPosition(); +} + +bool StringText::getProperty(const std::string_view prop, Variable& var) const { if (prop.size() <= 1) { return false; } auto props = Utils::splitStringIn2(prop, '.'); - auto propHash = str2int16(props.first.c_str()); + auto propHash = str2int16(props.first); switch (propHash) { + case str2int16("length"): + var = Variable((int64_t)text.getString().getSize()); + break; case str2int16("lineCount"): var = Variable((int64_t)lineCount); break; diff --git a/src/StringText.h b/src/StringText.h index 1478f601..87fcc339 100755 --- a/src/StringText.h +++ b/src/StringText.h @@ -1,7 +1,7 @@ #pragma once -#include #include "DrawableText.h" +#include class StringText : public DrawableText { @@ -14,14 +14,14 @@ class StringText : public DrawableText unsigned lineCount{ 0 }; bool visible{ true }; - void calcLineCount(); + void calculateLineCount(); void calculateDrawPosition(); public: StringText(const sf::String& text_, const sf::Font& font, unsigned int characterSize = 30) : text(text_, font, characterSize) { - calcLineCount(); + calculateLineCount(); } virtual void setAnchor(const Anchor anchor_) @@ -34,17 +34,7 @@ class StringText : public DrawableText } virtual void updateSize(const Game& game); - virtual bool setText(const std::string& str) - { - if (text.getString() == str) - { - return false; - } - text.setString(str); - calcLineCount(); - calculateDrawPosition(); - return true; - } + virtual bool setText(const std::string& str); virtual unsigned getLineCount() const noexcept { return lineCount; } @@ -73,7 +63,11 @@ class StringText : public DrawableText pos = position; calculateDrawPosition(); } - virtual sf::Vector2f Size() const { return sf::Vector2f(text.getLocalBounds().width, text.getLocalBounds().height); } + virtual sf::Vector2f Size() const + { + auto bounds = text.getGlobalBounds(); + return sf::Vector2f(bounds.width, bounds.height); + } virtual void Size(const sf::Vector2f& size) noexcept {} virtual void setHorizontalAlign(const HorizontalAlign align) @@ -93,8 +87,8 @@ class StringText : public DrawableText } } - virtual void setHorizontalSpaceOffset(int offset) noexcept {} - virtual void setVerticalSpaceOffset(int offset) noexcept {} + virtual void setHorizontalSpaceOffset(int offset) noexcept; + virtual void setVerticalSpaceOffset(int offset) noexcept; void setRotation(float angle) { text.setRotation(angle); } void setScale(float factorX, float factorY) { text.setScale(factorX, factorY); } @@ -123,5 +117,5 @@ class StringText : public DrawableText } } - virtual bool getProperty(const std::string& prop, Variable& var) const; + virtual bool getProperty(const std::string_view prop, Variable& var) const; }; diff --git a/src/Text2.cpp b/src/Text.cpp similarity index 68% rename from src/Text2.cpp rename to src/Text.cpp index 564b429e..51f18544 100755 --- a/src/Text2.cpp +++ b/src/Text.cpp @@ -1,10 +1,10 @@ -#include "Text2.h" +#include "Text.h" #include "Game.h" #include "GameUtils.h" #include "TextUtils.h" #include "Utils/Utils.h" -std::shared_ptr Text2::getAction(uint16_t nameHash16) const noexcept +std::shared_ptr Text::getAction(uint16_t nameHash16) const noexcept { switch (nameHash16) { @@ -15,7 +15,7 @@ std::shared_ptr Text2::getAction(uint16_t nameHash16) const noexcept } } -bool Text2::setAction(uint16_t nameHash16, const std::shared_ptr& action) noexcept +bool Text::setAction(uint16_t nameHash16, const std::shared_ptr& action) noexcept { switch (nameHash16) { @@ -28,18 +28,18 @@ bool Text2::setAction(uint16_t nameHash16, const std::shared_ptr& action return true; } -void Text2::setBinding(const std::string& binding) +void Text::setBinding(const std::string& binding) { bindings.clear(); bindings.push_back(binding); } -void Text2::setBinding(std::vector bindings_) +void Text::setBinding(std::vector bindings_) { bindings = std::move(bindings_); } -void Text2::update(Game& game) +void Text::update(Game& game) { if (text->Visible() == false) { diff --git a/src/Text2.h b/src/Text.h similarity index 92% rename from src/Text2.h rename to src/Text.h index f83d11d8..08f4ff8c 100755 --- a/src/Text2.h +++ b/src/Text.h @@ -4,7 +4,7 @@ #include #include "UIObject.h" -class Text2 : public virtual UIObject +class Text : public virtual UIObject { private: std::unique_ptr text; @@ -26,7 +26,7 @@ class Text2 : public virtual UIObject void setBinding(const std::string& binding); void setBinding(std::vector bindings_); void setColor(const sf::Color& color) { text->setColor(color); } - void setFormat(const std::string& format_) { format = format_; } + void setFormat(const std::string_view format_) { format = format_; } void setHorizontalAlign(const HorizontalAlign align) { text->setHorizontalAlign(align); } void setVerticalAlign(const VerticalAlign align) { text->setVerticalAlign(align); } virtual void setHorizontalSpaceOffset(int offset) { text->setHorizontalSpaceOffset(offset); } @@ -54,7 +54,7 @@ class Text2 : public virtual UIObject virtual void update(Game& game); - virtual bool getProperty(const std::string& prop, Variable& var) const + virtual bool getProperty(const std::string_view prop, Variable& var) const { return text->getProperty(prop, var); } diff --git a/src/TextUtils.cpp b/src/TextUtils.cpp index a0959cda..587267c3 100755 --- a/src/TextUtils.cpp +++ b/src/TextUtils.cpp @@ -4,26 +4,26 @@ namespace TextUtils { - std::string getFormatString(const Game& game, const std::string& format, + std::string getFormatString(const Game& game, const std::string_view format, const std::vector& bindings) { if (bindings.size() > 0) { if (format == "[1]") { - return game.getVarOrPropString(bindings[0]); + return game.getVarOrPropStringS(bindings[0]); } else { - std::string displayText = format; + std::string displayText(format); if (format.size() > 2) { for (size_t i = 0; i < bindings.size(); i++) { - auto str = game.getVarOrPropString(bindings[i]); + auto str = game.getVarOrPropStringS(bindings[i]); Utils::replaceStringInPlace( displayText, - "[" + std::to_string(i + 1) + "]", + "[" + Utils::toString(i + 1) + "]", str); } } @@ -33,18 +33,18 @@ namespace TextUtils return ""; } - std::string getTextQueryable(const Game& game, const std::string& format, - const std::string& query) + std::string getTextQueryable(const Game& game, const std::string_view format, + const std::string_view query) { auto queryable = game.getQueryable(query); if (queryable != nullptr) { return GameUtils::replaceStringWithQueryable(format, *queryable); } - return format; + return std::string(format); } - std::string getText(const Game& game, TextOp textOp, const std::string& textOrformat, + std::string getText(const Game& game, TextOp textOp, const std::string_view textOrformat, const std::vector& bindings) { std::string str; @@ -53,7 +53,7 @@ namespace TextUtils } void appendText(const Game& game, TextOp textOp, std::string& str, - const std::string& textOrformat, const std::vector& bindings) + const std::string_view textOrformat, const std::vector& bindings) { switch (TextOp(((uint32_t)textOp) & 0x7u)) { @@ -62,10 +62,10 @@ namespace TextUtils str += textOrformat; break; case TextOp::Replace: - str += game.getVarOrPropString(textOrformat); + str += game.getVarOrPropStringS(textOrformat); break; case TextOp::ReplaceAll: - str += game.getVarOrPropString(textOrformat); + str += game.getVarOrPropStringS(textOrformat); break; case TextOp::Query: { diff --git a/src/TextUtils.h b/src/TextUtils.h index 6fad6d8f..f198e6bf 100755 --- a/src/TextUtils.h +++ b/src/TextUtils.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include class Game; @@ -20,23 +21,23 @@ namespace TextUtils using T = std::underlying_type_t; - inline TextOp operator~ (TextOp a) noexcept { return (TextOp)~static_cast(a); } - inline TextOp operator| (TextOp a, TextOp b) noexcept { return (TextOp)(static_cast(a) | static_cast(b)); } - inline TextOp operator& (TextOp a, TextOp b) noexcept { return (TextOp)(static_cast(a) & static_cast(b)); } - inline TextOp operator^ (TextOp a, TextOp b) noexcept { return (TextOp)(static_cast(a) ^ static_cast(b)); } - inline TextOp& operator|= (TextOp& a, TextOp b) noexcept { a = (TextOp)(static_cast(a) | static_cast(b)); return a; } - inline TextOp& operator&= (TextOp& a, TextOp b) noexcept { a = (TextOp)(static_cast(a) & static_cast(b)); return a; } - inline TextOp& operator^= (TextOp& a, TextOp b) noexcept { a = (TextOp)(static_cast(a) ^ static_cast(b)); return a; } + constexpr TextOp operator~ (TextOp a) noexcept { return (TextOp)~static_cast(a); } + constexpr TextOp operator| (TextOp a, TextOp b) noexcept { return (TextOp)(static_cast(a) | static_cast(b)); } + constexpr TextOp operator& (TextOp a, TextOp b) noexcept { return (TextOp)(static_cast(a) & static_cast(b)); } + constexpr TextOp operator^ (TextOp a, TextOp b) noexcept { return (TextOp)(static_cast(a) ^ static_cast(b)); } + constexpr TextOp& operator|= (TextOp& a, TextOp b) noexcept { a = (TextOp)(static_cast(a) | static_cast(b)); return a; } + constexpr TextOp& operator&= (TextOp& a, TextOp b) noexcept { a = (TextOp)(static_cast(a) & static_cast(b)); return a; } + constexpr TextOp& operator^= (TextOp& a, TextOp b) noexcept { a = (TextOp)(static_cast(a) ^ static_cast(b)); return a; } - std::string getFormatString(const Game& game, const std::string& format, + std::string getFormatString(const Game& game, const std::string_view format, const std::vector& bindings); - std::string getTextQueryable(const Game& game, const std::string& format, - const std::string& query); + std::string getTextQueryable(const Game& game, const std::string_view format, + const std::string_view query); - std::string getText(const Game& game, TextOp textOp, const std::string& textOrformat, + std::string getText(const Game& game, TextOp textOp, const std::string_view textOrformat, const std::vector& bindings); void appendText(const Game& game, TextOp textOp, std::string& str, - const std::string& textOrformat, const std::vector& bindings); + const std::string_view textOrformat, const std::vector& bindings); } diff --git a/src/TextureInfo.h b/src/TextureInfo.h new file mode 100755 index 00000000..a5a83873 --- /dev/null +++ b/src/TextureInfo.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include "Palette.h" +#include + +struct TextureInfo +{ + const sf::Texture* texture{ nullptr }; + sf::IntRect textureRect; + sf::Vector2f offset; + std::shared_ptr palette; +}; diff --git a/src/TexturePacks/BitmapFontTexturePack.cpp b/src/TexturePacks/BitmapFontTexturePack.cpp new file mode 100755 index 00000000..cd1a56a6 --- /dev/null +++ b/src/TexturePacks/BitmapFontTexturePack.cpp @@ -0,0 +1,256 @@ +#include "BitmapFontTexturePack.h" + +// This piece of code was originally from Lazy Foo' Productions (http://lazyfoo.net/) +void BitmapFontTexturePack::calculateCharSizes(const sf::Image& img, bool verticalDirection) +{ + //Set the background color + auto bgColor = img.getPixel(0, 0); + + //Set the cell dimensions + int cellW = img.getSize().x / columns; + int cellH = img.getSize().y / rows; + + //New line variables + int top = cellH; + int baseA = cellH; + + //The current character we're setting + int currentChar = 0; + + //Go through the cell rows + int iRow = 0; + int iCol = 0; + while (currentChar < 256) + { + //Set the character offset + chars[currentChar].left = cellW * iCol; + chars[currentChar].top = cellH * iRow; + + //Set the dimensions of the character + chars[currentChar].width = cellW; + chars[currentChar].height = cellH; + + //Find Left Side + //Go through pixel columns + for (int pCol = 0; pCol < cellW; pCol++) + { + //Go through pixel rows + for (int pRow = 0; pRow < cellH; pRow++) + { + //Get the pixel offsets + int pX = (cellW * iCol) + pCol; + int pY = (cellH * iRow) + pRow; + + //If a non colorkey pixel is found + if (img.getPixel(pX, pY) != bgColor) + { + //Set the x offset + chars[currentChar].left = pX; + + //Break the loops + pCol = cellW; + pRow = cellH; + } + } + } + + //Find Right Side + //Go through pixel columns + for (int pColW = cellW - 1; pColW >= 0; pColW--) + { + //Go through pixel rows + for (int pRowW = 0; pRowW < cellH; pRowW++) + { + //Get the pixel offsets + int pX = (cellW * iCol) + pColW; + int pY = (cellH * iRow) + pRowW; + + //If a non colorkey pixel is found + if (img.getPixel(pX, pY) != bgColor) + { + //Set the width + chars[currentChar].width = (pX - chars[currentChar].left) + 1; + + //Break the loops + pColW = -1; + pRowW = cellH; + } + } + } + + //Find Top + //Go through pixel rows + for (int pRow = 0; pRow < cellH; pRow++) + { + //Go through pixel columns + for (int pCol = 0; pCol < cellW; pCol++) + { + //Get the pixel offsets + int pX = (cellW * iCol) + pCol; + int pY = (cellH * iRow) + pRow; + + //If a non colorkey pixel is found + if (img.getPixel(pX, pY) != bgColor) + { + //If new top is found + if (pRow < top) + { + top = pRow; + } + + //Break the loops + pCol = cellW; + pRow = cellH; + } + } + } + + //Find Bottom of A + if (currentChar == 'A') + { + //Go through pixel rows + for (int pRow = cellH - 1; pRow >= 0; pRow--) + { + //Go through pixel columns + for (int pCol = 0; pCol < cellW; pCol++) + { + //Get the pixel offsets + int pX = (cellW * iCol) + pCol; + int pY = (cellH * iRow) + pRow; + + //If a non colorkey pixel is found + if (img.getPixel(pX, pY) != bgColor) + { + //Bottom of a is found + baseA = pRow; + + //Break the loops + pCol = cellW; + pRow = -1; + } + } + } + } + + //Go to the next character + currentChar++; + + if (verticalDirection == false) + { + iCol++; + if (iCol >= columns) + { + iCol = 0; + iRow++; + } + } + else + { + iRow++; + if (iRow >= rows) + { + iRow = 0; + iCol++; + } + } + } + + //Calculate space + chars[' '].width = cellW / 2; + + //Calculate new line + chars['\n'].width = baseA - top; + + //Lop off excess top pixels + for (auto& chrRect : chars) + { + chrRect.top += top; + chrRect.height -= top; + } +} + +BitmapFontTexturePack::BitmapFontTexturePack(const std::shared_ptr& tex, int rows_, + int columns_, bool verticalDirection, const sf::Image& img) + : texture(tex), rows(rows_), columns(columns_) +{ + this->calculateCharSizes(img, verticalDirection); +} + +BitmapFontTexturePack::BitmapFontTexturePack(const std::shared_ptr& tex, int rows_, + int columns_, bool verticalDirection, const std::vector& charSizes) + : texture(tex), rows(rows_), columns(columns_) +{ + size_t charStartIdx = 0; + if (charSizes.size() == 130 || charSizes.size() == 258) + { + charStartIdx = 2; + } + else if ((charSizes.size() == 128 || charSizes.size() == 256) == false) + { + this->calculateCharSizes(tex->copyToImage(), verticalDirection); + return; + } + + int cellW = tex->getSize().x / columns; + int cellH = tex->getSize().y / rows; + int iRow = 0; + int iCol = 0; + for (size_t i = 0; i < 256; i++) + { + chars[i].left = cellW * iCol; + chars[i].top = cellH * iRow; + auto charSizeIdx = i + charStartIdx; + if (charSizeIdx < charSizes.size()) + { + chars[i].width = charSizes[charSizeIdx]; + } + else + { + chars[i].width = 0; + } + chars[i].height = cellH; + + if (verticalDirection == false) + { + iCol++; + if (iCol >= columns) + { + iCol = 0; + iRow++; + } + } + else + { + iRow++; + if (iRow >= rows) + { + iRow = 0; + iCol++; + } + } + } + + if (charStartIdx > 0) + { + chars[' '].width = charSizes[0]; + chars['\n'].width = charSizes[1]; + } + else + { + chars[' '].width = charSizes[' ']; + chars['\n'].width = charSizes['\n']; + } +} + +bool BitmapFontTexturePack::get(size_t index, TextureInfo& ti) const +{ + if (index < chars.size()) + { + ti.texture = texture.get(); + ti.textureRect = chars[index]; + ti.offset = {}; + ti.palette = palette; + return true; + } + return false; +} diff --git a/src/TexturePacks/BitmapFontTexturePack.h b/src/TexturePacks/BitmapFontTexturePack.h new file mode 100755 index 00000000..cc1c575f --- /dev/null +++ b/src/TexturePacks/BitmapFontTexturePack.h @@ -0,0 +1,32 @@ +#pragma once + +#include "TexturePack.h" + +class BitmapFontTexturePack : public TexturePack +{ +private: + std::shared_ptr texture; + std::shared_ptr palette; + int rows{ 0 }; + int columns{ 0 }; + bool indexed{ false }; + std::array chars; + + void calculateCharSizes(const sf::Image& img, bool verticalDirection); + +public: + BitmapFontTexturePack(const std::shared_ptr& tex, int rows_, int columns_, + bool verticalDirection, const sf::Image& img); + BitmapFontTexturePack(const std::shared_ptr& tex, int rows_, int columns_, + bool verticalDirection, const std::vector& charSizes); + + int getCharWidth(char c) const noexcept { return chars[(unsigned char)c].width; } + + const sf::Texture& getTexture() const noexcept { return *texture.get(); } + + virtual bool get(size_t index, TextureInfo& ti) const; + + virtual const std::shared_ptr& getPalette() const noexcept { return palette; } + virtual bool isIndexed() const noexcept { return indexed; } + virtual size_t size() const noexcept { return chars.size(); } +}; diff --git a/src/TexturePacks/CachedTexturePack.cpp b/src/TexturePacks/CachedTexturePack.cpp index a9945f2e..60454557 100755 --- a/src/TexturePacks/CachedTexturePack.cpp +++ b/src/TexturePacks/CachedTexturePack.cpp @@ -20,6 +20,7 @@ bool CachedTexturePack::get(size_t index, TextureInfo& ti) const } ti.texture = &cache[index]; updateTextureInfo(ti); + ti.palette = palette; return true; } @@ -60,6 +61,7 @@ bool CachedMultiTexturePack::get(size_t index, TextureInfo& ti) const } ti.texture = &cache[index]; updateTextureInfo(ti); + ti.palette = palette; return true; } diff --git a/src/TexturePacks/IndexedTexturePack.h b/src/TexturePacks/IndexedTexturePack.h index 77dec445..97fefac1 100755 --- a/src/TexturePacks/IndexedTexturePack.h +++ b/src/TexturePacks/IndexedTexturePack.h @@ -15,6 +15,8 @@ class IndexedTexturePack : public TexturePack virtual bool get(size_t index, TextureInfo& ti) const; + TexturePack* getTexturePack() const noexcept { return texturePack.get(); } + void mapTextureIndex(size_t mapIndex); void mapTextureIndex(size_t mapIndex, size_t toIndex); diff --git a/src/TexturePacks/SimpleTexturePack.cpp b/src/TexturePacks/SimpleTexturePack.cpp index 703900f6..36e3ed41 100755 --- a/src/TexturePacks/SimpleTexturePack.cpp +++ b/src/TexturePacks/SimpleTexturePack.cpp @@ -82,6 +82,7 @@ bool SimpleTexturePack::get(size_t index, TextureInfo& ti) const noexcept return false; } getTexture(t, index, ti); + ti.palette = palette; return true; } @@ -96,7 +97,13 @@ bool SimpleMultiTexturePack::get(size_t index, TextureInfo& ti) const { size_t indexX = index % numFrames; size_t indexY = index / numFrames; + if (indexY >= texVec.size() || + indexX >= texVec[indexY].numFrames) + { + return false; + } getTexture(texVec[indexY], indexX, ti); + ti.palette = palette; return true; } size_t indexX; @@ -114,6 +121,7 @@ bool SimpleMultiTexturePack::get(size_t index, TextureInfo& ti) const } while (indexX >= texVec[indexY].numFrames); getTexture(texVec[indexY], indexX, ti); + ti.palette = palette; return true; } diff --git a/src/TexturePacks/TexturePack.h b/src/TexturePacks/TexturePack.h index c77c38a2..3658ece9 100755 --- a/src/TexturePacks/TexturePack.h +++ b/src/TexturePacks/TexturePack.h @@ -2,14 +2,7 @@ #include #include "Palette.h" -#include - -struct TextureInfo -{ - const sf::Texture* texture; - sf::IntRect textureRect; - sf::Vector2f offset; -}; +#include "TextureInfo.h" class TexturePack { @@ -17,6 +10,9 @@ class TexturePack static void updateTextureInfo(TextureInfo& ti); public: + virtual ~TexturePack() = default; + + // if texture is an index texture, sets the palette in TextureInfo virtual bool get(size_t index, TextureInfo& ti) const = 0; virtual const std::shared_ptr& getPalette() const noexcept = 0; diff --git a/src/TexturePacks/VectorTexturePack.cpp b/src/TexturePacks/VectorTexturePack.cpp index 16bf977d..fd2ae24d 100755 --- a/src/TexturePacks/VectorTexturePack.cpp +++ b/src/TexturePacks/VectorTexturePack.cpp @@ -10,6 +10,7 @@ bool VectorTexturePack::get(size_t index, TextureInfo& ti) const ti.texture = &textures[index]; updateTextureInfo(ti); ti.offset += offset; + ti.palette = palette; return true; } diff --git a/src/TileSet.cpp b/src/TileSet.cpp index 0cecddff..ff43d911 100755 --- a/src/TileSet.cpp +++ b/src/TileSet.cpp @@ -20,26 +20,29 @@ int16_t TileBlock::getTileIndex(int32_t xCoord, int32_t yCoord) const noexcept } } -TileSet::TileSet(const std::string& fileName) +TileSet::TileSet(const std::string_view fileName) { - sf::PhysFSStream file(fileName); + sf::PhysFSStream file(fileName.data()); if (file.hasError() == true) { return; } - std::vector fileData((size_t)file.getSize()); - file.read(fileData.data(), file.getSize()); - LittleEndianStreamReader fileStream(fileData); - - size_t numTiles = fileData.size() / (4 * 2); + auto fileSize = (size_t)file.getSize(); + size_t numTiles = fileSize / (4 * 2); tiles.resize(numTiles); + file.read(tiles.data(), file.getSize()); + + LittleEndianStreamReader fileStream((const uint8_t*)tiles.data(), fileSize); + for (auto& tile : tiles) { - fileStream.read(std::get<0>(tile)); - fileStream.read(std::get<1>(tile)); - fileStream.read(std::get<2>(tile)); - fileStream.read(std::get<3>(tile)); + TileBlock temp; + fileStream.read(std::get<0>(temp)); + fileStream.read(std::get<1>(temp)); + fileStream.read(std::get<2>(temp)); + fileStream.read(std::get<3>(temp)); + tile = temp; } } diff --git a/src/TileSet.h b/src/TileSet.h index 9c34b779..544e88af 100755 --- a/src/TileSet.h +++ b/src/TileSet.h @@ -11,6 +11,11 @@ class TileBlock : public std::tuple TileBlock() : std::tuple(-1, -1, -1, -1) {} TileBlock(int16_t tile) : std::tuple(tile, tile, tile, tile) {} + TileBlock& operator=(const TileBlock&) = default; + TileBlock& operator=(TileBlock&&) = default; + TileBlock(const TileBlock&) = default; + TileBlock(TileBlock&&) = default; + int16_t getTileIndex(int32_t xCoord, int32_t yCoord) const noexcept; }; @@ -21,7 +26,7 @@ class TileSet public: TileSet() {} - TileSet(const std::string& fileName); + TileSet(const std::string_view fileName); const TileBlock& operator[] (size_t index) const { return tiles[index]; } bool empty() const noexcept { return tiles.empty(); } size_t size() const noexcept { return tiles.size(); } diff --git a/src/Utils/FixedMap.h b/src/Utils/FixedMap.h new file mode 100755 index 00000000..376c92a5 --- /dev/null +++ b/src/Utils/FixedMap.h @@ -0,0 +1,124 @@ +#pragma once + +#include +#include +#include + +template +class FixedMap +{ +protected: + typedef std::array, Size_> Elements; + + size_t numElements{ 0 }; + Elements elements; + +public: + using iterator = typename Elements::iterator; + using const_iterator = typename Elements::const_iterator; + using reverse_iterator = typename Elements::reverse_iterator; + using const_reverse_iterator = typename Elements::const_reverse_iterator; + + iterator begin() noexcept { return elements.begin(); } + iterator end() noexcept { return elements.begin() + numElements; } + const_iterator begin() const noexcept { return elements.begin(); } + const_iterator end() const noexcept { return elements.begin() + numElements; } + const_iterator cbegin() const noexcept { return elements.cbegin(); } + const_iterator cend() const noexcept { return elements.cbegin() + numElements; } + reverse_iterator rbegin() noexcept { return elements.rend() - numElements; } + reverse_iterator rend() noexcept { return elements.rend(); } + const_reverse_iterator rbegin() const noexcept { return elements.rend() - numElements; } + const_reverse_iterator rend() const noexcept { return elements.rend(); } + const_reverse_iterator crbegin() const noexcept { return elements.crend() - numElements; } + const_reverse_iterator crend() const noexcept { return elements.crend(); } + + constexpr size_t empty() const noexcept { return numElements == 0; } + + constexpr size_t size() const noexcept { return numElements; } + + constexpr size_t max_size() const noexcept { return elements.size(); } + + bool hasValue(const Key_& key) const noexcept + { + if (numElements > 0) + { + for (size_t i = 0; i < numElements; i++) + { + if (elements[i].first == key) + { + return true; + } + } + } + return false; + } + + bool getValue(const Key_& key, Val_& value) const noexcept + { + for (size_t i = 0; i < numElements; i++) + { + const auto& elem = elements[i]; + if (elem.first == key) + { + value = elem.second; + return true; + } + } + return false; + } + + const Val_* getValue(const Key_& key) const noexcept + { + for (size_t i = 0; i < numElements; i++) + { + const auto& elem = elements[i]; + if (elem.first == key) + { + return &elem.second; + } + } + return nullptr; + } + + Val_* getValue(const Key_& key) noexcept + { + return const_cast(static_cast(this)->getValue(key)); + } + + bool setValue(const Key_& key, const Val_& value) + { + size_t i = 0; + for (; i < numElements; i++) + { + auto& elem = elements[i]; + if (elem.first == key) + { + elem.second = value; + return true; + } + } + if (i < elements.size()) + { + elements[i] = std::make_pair(key, value); + numElements++; + return true; + } + return false; + } + + void deleteValue(const Key_& key) + { + for (size_t i = 0; i < numElements; i++) + { + if (elements[i].first == key) + { + elements[i].second = {}; + std::move(elements.begin() + i + 1, + elements.begin() + numElements, + elements.begin() + i); + numElements--; + return; + } + } + } +}; diff --git a/src/Utils/LRUCache.h b/src/Utils/LRUCache.h new file mode 100755 index 00000000..a81960cf --- /dev/null +++ b/src/Utils/LRUCache.h @@ -0,0 +1,88 @@ +#pragma once + +#include "FixedMap.h" + +template +class LRUCache : protected FixedMap +{ +public: + // if value exists, it gets moved to the top. + // reference only valid until the next LRUCache call. + bool getValue(const Key_& key, Val_& value) noexcept + { + for (size_t i = 0; i < this->numElements; i++) + { + const auto& elem = this->elements[i]; + if (elem.first == key) + { + // update LRU + if (i > 0) + { + std::rotate(this->begin(), this->begin() + i, this->begin() + i + 1); + } + // return first element + value = this->elements[0].second; + return true; + } + } + return false; + } + + // if value exists, it gets moved to the top. + // pointer only valid until the next LRUCache call. + Val_* getValue(const Key_& key) noexcept + { + for (size_t i = 0; i < this->numElements; i++) + { + const auto& elem = this->elements[i]; + if (elem.first == key) + { + // update LRU + if (i > 0) + { + std::rotate(this->begin(), this->begin() + i, this->begin() + i + 1); + } + // return first element + return &this->elements[0].second; + } + } + return nullptr; + } + + // Updates a value and brings it to the top. Removes last accessed value if full. + void updateValue(const Key_& key, const Val_& value) noexcept + { + bool updated = false; + size_t i = 0; + for (; i < this->numElements; i++) + { + auto& elem = this->elements[i]; + if (elem.first == key) + { + elem.second = value; + updated = true; + break; + } + } + if (updated == false) + { + // insert element + if (i < this->elements.size()) + { + this->elements[i] = std::make_pair(key, value); + this->numElements++; + } + // override last element + else + { + i--; + this->elements[i] = std::make_pair(key, value); + } + } + // update LRU + if (i > 0) + { + std::rotate(this->begin(), this->begin() + i, this->begin() + i + 1); + } + } +}; diff --git a/src/Utils/Utils.cpp b/src/Utils/Utils.cpp index ff1e045c..be800cff 100755 --- a/src/Utils/Utils.cpp +++ b/src/Utils/Utils.cpp @@ -1,8 +1,16 @@ #include "Utils.h" #include +#include +#if (_MSC_VER >= 1914) +#include +#elif (__GNUC__ >= 8) +#include +#include +#else +#include +#endif #include #include -#include #include #include @@ -11,7 +19,7 @@ namespace Utils std::random_device Random::rd; std::mt19937 Random::mt(rd()); - bool endsWith(const std::string& value, const std::string& ending) + bool endsWith(const std::string_view value, const std::string_view ending) { if (ending.size() > value.size()) return false; return std::equal(ending.rbegin(), ending.rend(), value.rbegin()); @@ -39,7 +47,7 @@ namespace Utils return source; } - void replaceStringInPlace(std::string& subject, const std::string& search, const std::string& replace) + void replaceStringInPlace(std::string& subject, const std::string_view search, const std::string_view replace) { size_t pos = 0; while ((pos = subject.find(search, pos)) != std::string::npos) @@ -49,25 +57,19 @@ namespace Utils } } - std::vector getStringVector(const std::string& regexStr, const std::string& str) - { - std::regex reg(regexStr, std::regex_constants::ECMAScript); - return std::vector(std::sregex_token_iterator(str.begin(), str.end(), reg), std::sregex_token_iterator()); - } - - std::vector splitString(const std::string& str, char delimiter) + std::vector splitString(const std::string_view str, char delimiter) { std::vector strings; - std::string::size_type pos = 0; - std::string::size_type prev = 0; + std::string_view::size_type pos = 0; + std::string_view::size_type prev = 0; while ((pos = str.find(delimiter, prev)) != std::string::npos) { - strings.push_back(str.substr(prev, pos - prev)); + strings.push_back(std::string(str.substr(prev, pos - prev))); prev = pos + 1; } - strings.push_back(str.substr(prev)); + strings.push_back(std::string(str.substr(prev))); return strings; } @@ -82,23 +84,163 @@ namespace Utils return std::make_pair(str, ""); } - std::string toLower(const std::string& str) + std::pair splitStringIn2( + const std::string_view str, char delimiter) + { + auto pos = str.find(delimiter, 0); + if (pos != std::string::npos) + { + return std::make_pair(str.substr(0, pos), str.substr(pos + 1, str.size() - pos)); + } + return std::make_pair(str, ""); + } + +#if (_MSC_VER >= 1914) + float strtof(std::string_view str) noexcept + { + float val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } + + double strtod(std::string_view str) noexcept + { + double val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } + + long double strtold(std::string_view str) noexcept + { + long double val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } +#else + float strtof(std::string_view str) noexcept + { + return std::strtof(str.data(), nullptr); + } + + double strtod(std::string_view str) noexcept + { + return std::strtod(str.data(), nullptr); + } + + long double strtold(std::string_view str) noexcept + { + return std::strtold(str.data(), nullptr); + } +#endif + +#if ((_MSC_VER >= 1914) || (__GNUC__ >= 8)) + int strtoi(std::string_view str) noexcept + { + int val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } + + long strtol(std::string_view str) noexcept + { + long val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } + + long long strtoll(std::string_view str) noexcept + { + long long val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } + + unsigned strtou(std::string_view str) noexcept + { + unsigned val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } + + unsigned long strtoul(std::string_view str) noexcept + { + unsigned long val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } + + unsigned long long strtoull(std::string_view str) noexcept + { + unsigned long long val = 0; + std::from_chars(str.data(), str.data() + str.size(), val); + return val; + } +#else + int strtoi(std::string_view str) noexcept + { + return (int)std::strtol(str.data(), nullptr, 10); + } + + long strtol(std::string_view str) noexcept + { + return std::strtol(str.data(), nullptr, 10); + } + + long long strtoll(std::string_view str) noexcept + { + return std::strtoll(str.data(), nullptr, 10); + } + + unsigned strtou(std::string_view str) noexcept + { + return (unsigned)std::strtoul(str.data(), nullptr, 10); + } + + unsigned long strtoul(std::string_view str) noexcept + { + return std::strtoul(str.data(), nullptr, 10); + } + + unsigned long long strtoull(std::string_view str) noexcept + { + return std::strtoull(str.data(), nullptr, 10); + } +#endif + + std::string toLower(const std::string_view str) { - auto ret = str; + std::string ret(str); std::transform(ret.begin(), ret.end(), ret.begin(), ::tolower); return ret; } - std::string toUpper(const std::string& str) + std::string toUpper(const std::string_view str) { - auto ret = str; + std::string ret(str); std::transform(ret.begin(), ret.end(), ret.begin(), ::toupper); return ret; } - std::string toString(double d) +#if (_MSC_VER >= 1916) + std::string toString(double num) { - std::string str{ std::to_string(d) }; + std::array str; + auto err = std::to_chars(str.data(), str.data() + str.size(), num); + if (err.ec == std::errc()) + { + std::string ret(str.data(), err.ptr - str.data()); + if (ret.find('.') == std::string::npos) + { + ret += ".0"; + } + return ret; + } + return { "0.0" }; + } +#else + std::string toString(double num) + { + std::string str{ std::to_string(num) }; int offset{ 1 }; if (str.find_last_not_of('0') == str.find('.')) { @@ -107,27 +249,144 @@ namespace Utils str.erase(str.find_last_not_of('0') + offset, std::string::npos); return str; } +#endif +#if ((_MSC_VER >= 1914) || (__GNUC__ >= 8)) + std::string toString(int num) + { + if constexpr (sizeof(int) == 8) + { + return toString((long long)num); + } + std::array str; + auto err = std::to_chars(str.data(), str.data() + str.size(), num); + if (err.ec == std::errc()) + { + return std::string(str.data(), err.ptr - str.data()); + } + return { "0" }; + } + + std::string toString(long num) + { + if constexpr (sizeof(long) <= 4) + { + return toString((int)num); + } + else + { + return toString((long long)num); + } + } + + std::string toString(long long num) + { + if constexpr (sizeof(long long) == 4) + { + return toString((int)num); + } + std::array str; + auto err = std::to_chars(str.data(), str.data() + str.size(), num); + if (err.ec == std::errc()) + { + auto str2 = std::string(str.data(), err.ptr - str.data()); + return str2; + } + return { "0" }; + } + + std::string toString(unsigned int num) + { + if constexpr (sizeof(unsigned int) == 8) + { + return toString((unsigned long long)num); + } + std::array str; + auto err = std::to_chars(str.data(), str.data() + str.size(), num); + if (err.ec == std::errc()) + { + return std::string(str.data(), err.ptr - str.data()); + } + return { "0" }; + } + + std::string toString(unsigned long num) + { + if constexpr (sizeof(unsigned long) <= 4) + { + return toString((unsigned int)num); + } + else + { + return toString((unsigned long long)num); + } + } + + std::string toString(unsigned long long num) + { + if constexpr (sizeof(unsigned long long) == 4) + { + return toString((unsigned int)num); + } + std::array str; + auto err = std::to_chars(str.data(), str.data() + str.size(), num); + if (err.ec == std::errc()) + { + return std::string(str.data(), err.ptr - str.data()); + } + return { "0" }; + } +#else + std::string toString(int num) + { + return std::to_string(num); + } + + std::string toString(long num) + { + return std::to_string(num); + } + + std::string toString(long long num) + { + return std::to_string(num); + } + + std::string toString(unsigned int num) + { + return std::to_string(num); + } + + std::string toString(unsigned long num) + { + return std::to_string(num); + } + + std::string toString(unsigned long long num) + { + return std::to_string(num); + } +#endif - std::string trimStart(const std::string& str, const std::string& chars) + std::string trimStart(const std::string_view str, const std::string_view chars) { - auto ret(str); + std::string ret(str); ret.erase(ret.find_last_not_of(chars) + 1); return ret; } - std::string trimEnd(const std::string& str, const std::string& chars) + std::string trimEnd(const std::string_view str, const std::string_view chars) { - auto ret(str); + std::string ret(str); ret.erase(0, ret.find_first_not_of(chars)); return ret; } - std::string trim(const std::string& str, const std::string& chars) + std::string trim(const std::string_view str, const std::string_view chars) { return trimStart(trimEnd(str, chars), chars); } - std::string removeEmptyLines(const std::string& str) + std::string removeEmptyLines(const std::string_view str) { auto ret = trim(str, "\n"); ret.erase(std::unique(ret.begin(), ret.end(), diff --git a/src/Utils/Utils.h b/src/Utils/Utils.h index ac4d6912..932213c5 100755 --- a/src/Utils/Utils.h +++ b/src/Utils/Utils.h @@ -3,45 +3,83 @@ #include #include #include +#include #include namespace Utils { - bool endsWith(const std::string& value, const std::string& ending); + bool endsWith(const std::string_view value, const std::string_view ending); - std::vector getStringVector(const std::string& regexStr, const std::string& str); - - void replaceStringInPlace(std::string& subject, const std::string& search, const std::string& replace); + void replaceStringInPlace(std::string& subject, const std::string_view search, const std::string_view replace); std::string splitInLines(std::string source, std::size_t width, std::string whitespace = " \t\r"); - std::vector splitString(const std::string& str, char delimiter); + std::vector splitString(const std::string_view str, char delimiter); std::pair splitStringIn2(const std::string& str, char delimiter); + std::pair splitStringIn2( + const std::string_view str, char delimiter); template - constexpr T str2intT(const char* str) noexcept + constexpr T char2intT(const char* str, size_t length) noexcept { T hash = 5381; + size_t i = 0; char c = 0; - while ((c = *str++) != 0) + for (; i < length; i++) { + c = str[i]; hash = ((hash << 5) + hash) + c; } return hash; } - std::string toLower(const std::string& str); - std::string toUpper(const std::string& str); + template + constexpr T str2intT(const char(&str)[Length]) noexcept + { + return char2intT(str, Length - 1); + } - // removes trailing zeroes from doubles - std::string toString(double d); + template + T str2intT(const std::string& str) noexcept + { + return char2intT(str.data(), str.size()); + } - std::string trimStart(const std::string& str, const std::string& chars = " \t"); - std::string trimEnd(const std::string& str, const std::string& chars = " \t"); - std::string trim(const std::string& str, const std::string& chars = " \t"); + template + T str2intT(const std::string_view str) noexcept + { + return char2intT(str.data(), str.size()); + } - std::string removeEmptyLines(const std::string& str); + float strtof(const std::string_view str) noexcept; + double strtod(const std::string_view str) noexcept; + long double strtold(const std::string_view str) noexcept; + int strtoi(const std::string_view str) noexcept; + long strtol(const std::string_view str) noexcept; + long long strtoll(const std::string_view str) noexcept; + unsigned strtou(const std::string_view str) noexcept; + unsigned long strtoul(const std::string_view str) noexcept; + unsigned long long strtoull(const std::string_view str) noexcept; + + std::string toLower(const std::string_view str); + std::string toUpper(const std::string_view str); + + // removes trailing zeroes from doubles. + // always returns a decimal part (ex: 125.0 instead of 125) + std::string toString(double num); + std::string toString(int num); + std::string toString(long num); + std::string toString(long long num); + std::string toString(unsigned int num); + std::string toString(unsigned long num); + std::string toString(unsigned long long num); + + std::string trimStart(const std::string_view str, const std::string_view chars = " \t"); + std::string trimEnd(const std::string_view str, const std::string_view chars = " \t"); + std::string trim(const std::string_view str, const std::string_view chars = " \t"); + + std::string removeEmptyLines(const std::string_view str); template long normalizeNumber(long val, const T& inputRange, const T& outputRange) noexcept diff --git a/src/VarOrPredicate.h b/src/VarOrPredicate.h index 0789b559..7c614cd4 100755 --- a/src/VarOrPredicate.h +++ b/src/VarOrPredicate.h @@ -5,3 +5,6 @@ #include typedef std::variant> VarOrPredicate; + +#define holdsVariable std::holds_alternative +#define holdsPredicate std::holds_alternative> diff --git a/src/Variable.cpp b/src/Variable.cpp index 6c9d1586..7daec933 100755 --- a/src/Variable.cpp +++ b/src/Variable.cpp @@ -34,7 +34,7 @@ namespace VarUtils { return (std::get(var) ? 1.0 : 0.0); } - return std::atof(std::get(var).c_str()); + return Utils::strtod(std::get(var)); } int64_t toLong(const Variable& var) noexcept @@ -51,7 +51,7 @@ namespace VarUtils { return (std::get(var) ? 1 : 0); } - return std::atol(std::get(var).c_str()); + return Utils::strtoll(std::get(var)); } std::string toString(const Variable& var) @@ -62,7 +62,7 @@ namespace VarUtils } else if (std::holds_alternative(var)) { - return std::to_string(std::get(var)); + return Utils::toString(std::get(var)); } else if (std::holds_alternative(var)) { diff --git a/src/endian/big_endian.hpp b/src/endian/big_endian.hpp index 9c96b1fa..67489aed 100755 --- a/src/endian/big_endian.hpp +++ b/src/endian/big_endian.hpp @@ -10,7 +10,7 @@ #include #include -#include "helpers.hpp" +#include "detail/helpers.hpp" namespace endian { diff --git a/src/endian/helpers.hpp b/src/endian/detail/helpers.hpp similarity index 100% rename from src/endian/helpers.hpp rename to src/endian/detail/helpers.hpp diff --git a/src/endian/detail/stream.hpp b/src/endian/detail/stream.hpp new file mode 100755 index 00000000..dc99af10 --- /dev/null +++ b/src/endian/detail/stream.hpp @@ -0,0 +1,131 @@ +// Copyright (c) 2016 Steinwurf ApS +// All Rights Reserved +// +// Distributed under the "BSD License". See the accompanying LICENSE.rst file. + +#pragma once + +#include +#include +#include +#include +#include + +namespace endian +{ +namespace detail +{ + +/// @brief Base-class for the endian stream reader and writer. +template +class stream +{ +public: + + /// Type for holding the size of the data. + using size_type = uint64_t; + +private: + + using data_type = typename std::remove_pointer::type; + + using non_const_data_type = typename std::remove_const::type; + + static_assert(std::is_same::value, + "Only uint8_t allowed."); + + static_assert(std::is_pointer::value, + "The template type must be a pointer type"); + + static_assert( + std::numeric_limits::max() >= + std::numeric_limits::size_type>::max(), + "std::vector::size() can return a value we cannot hold in size_type"); + +public: + + /// Creates an endian stream used to track a buffer of the specified size. + /// + /// @param size the size of the buffer in bytes + stream(DataPointerType data, size_type size) noexcept : + m_data(data), m_size(size) + { + assert(data != nullptr && "Null pointer provided"); + assert(size > 0 && "Empty buffer provided"); + } + + /// Gets the size of the underlying buffer in bytes. + /// + /// @return the size of the buffer + size_type size() const noexcept + { + return m_size; + } + + /// Gets the current read/write position in the stream + /// + /// @return the current position. + size_type position() const noexcept + { + return m_position; + } + + /// The remaining number of bytes in the stream + /// + /// @return the remaining number of bytes. + size_type remaining_size() const noexcept + { + return m_size - m_position; + } + + /// Changes the current read/write position in the stream. The + /// position is absolute i.e. it is always relative to the + /// beginning of the buffer which is position 0. + /// + /// @param new_position the new position + void seek(size_type new_position) noexcept + { + assert(new_position <= m_size); + + m_position = new_position; + } + + /// Skips over a given number of bytes in the stream + /// + /// @param bytes_to_skip the bytes to skip + void skip(size_type bytes_to_skip) noexcept + { + assert(bytes_to_skip <= m_size - m_position); + + seek(m_position + bytes_to_skip); + } + + /// A pointer to the stream's data. + /// + /// @return pointer to the stream's data. + DataPointerType data() const noexcept + { + return m_data; + } + + /// A pointer to the stream's data at the current position. + /// + /// @return pointer to the stream's data at the current position. + DataPointerType remaining_data() const noexcept + { + return m_data + m_position; + } + +private: + + /// Data pointer to buffer + DataPointerType m_data; + + /// The size of the buffer in bytes + size_type m_size; + + /// The current position + size_type m_position = 0; +}; +} +} diff --git a/src/endian/little_endian.hpp b/src/endian/little_endian.hpp index 86922a4d..e934f6ac 100755 --- a/src/endian/little_endian.hpp +++ b/src/endian/little_endian.hpp @@ -10,7 +10,7 @@ #include #include -#include "helpers.hpp" +#include "detail/helpers.hpp" namespace endian { diff --git a/src/endian/stream.hpp b/src/endian/stream.hpp deleted file mode 100755 index e8d677e1..00000000 --- a/src/endian/stream.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2016 Steinwurf ApS -// All Rights Reserved -// -// Distributed under the "BSD License". See the accompanying LICENSE.rst file. - -#pragma once - -#include -#include -#include - -namespace endian -{ -/// @brief Base-class for the endian stream reader and writer. -class stream -{ -public: - - /// Creates an endian stream used to track a buffer of the specified size. - /// - /// @param size the size of the buffer in bytes - stream(uint64_t size) : - m_size(size) - { - assert(m_size <= std::numeric_limits::max() && - "Size is too large to be handled on this OS."); - } - - /// Gets the size of the underlying buffer in bytes. - /// - /// @return the size of the buffer - uint64_t size() const - { - return m_size; - } - - /// Gets the current read/write position in the stream - /// - /// @return the current position. - uint64_t position() const - { - return m_position; - } - - /// The remaining number of bytes in the stream - /// - /// @return the remaining number of bytes. - uint64_t remaining_size() const - { - assert(m_size >= m_position); - return m_size - m_position; - } - - /// Changes the current read/write position in the stream. The - /// position is absolute i.e. it is always relative to the - /// beginning of the buffer which is position 0. - /// - /// @param new_position the new position - void seek(uint64_t new_position) - { - assert(new_position <= m_size); - m_position = new_position; - } - - /// Skips over a given number of bytes in the stream - /// - /// @param bytes_to_skip the bytes to skip - void skip(uint64_t bytes_to_skip) - { - assert(bytes_to_skip + m_position <= m_size); - seek(m_position + bytes_to_skip); - } - -protected: - - /// The size of the buffer in bytes - uint64_t m_size; - - /// The current position - uint64_t m_position = 0; -}; -} diff --git a/src/endian/stream_reader.hpp b/src/endian/stream_reader.hpp index 3e89293d..4437376d 100755 --- a/src/endian/stream_reader.hpp +++ b/src/endian/stream_reader.hpp @@ -8,17 +8,15 @@ #include #include #include -#include -#include "stream.hpp" +#include "detail/stream.hpp" namespace endian { -/// The idea behind the stream_reader is to provide a stream-like -/// interface for accessing a fixed-size buffer. -/// All complexity regarding endianness is encapsulated. -template -class stream_reader : public stream +/// The stream_reader provides a stream-like interface for reading from a +/// fixed-size buffer. All complexity regarding endianness is encapsulated. +template +class stream_reader : public detail::stream { public: @@ -27,34 +25,24 @@ class stream_reader : public stream /// /// @param data a data pointer to the buffer /// @param size the size of the buffer in bytes - stream_reader(const uint8_t* data, uint64_t size) : - stream(size), - m_data(data) + stream_reader(const uint8_t* data, size_type size) noexcept : + stream(data, size) { - assert(m_data != nullptr && "Invalid buffer pointer provided"); + assert(data != nullptr && "Null pointer provided"); + assert(size > 0 && "Empty buffer provided"); } - /// Creates an endian stream on top of a pre-allocated buffer - /// - /// @param buffer a vector containing the buffer - stream_reader(const std::vector& buffer) : - stream_reader(buffer.data(), buffer.size()) - { } - /// Reads a Bytes-sized integer from the stream and moves the read position. /// /// @param value reference to the value to be read template - void read_bytes(ValueType& value) + void read_bytes(ValueType& value) noexcept { assert(Bytes <= remaining_size() && "Reading over the end of the underlying buffer"); - // Get the value at the current position peek_bytes(value); - - // Advance the current position - m_position += Bytes; + skip(Bytes); } /// Reads a ValueType-sized integer from the stream and moves the read @@ -62,7 +50,7 @@ class stream_reader : public stream /// /// @param value reference to the value to be read template - void read(ValueType& value) + void read(ValueType& value) noexcept { assert(sizeof(ValueType) <= remaining_size() && "Reading over the end of the underlying buffer"); @@ -75,7 +63,7 @@ class stream_reader : public stream /// /// @return the read value template - ValueType read() + ValueType read() noexcept { assert(sizeof(ValueType) <= remaining_size() && "Reading over the end of the underlying buffer"); @@ -93,16 +81,13 @@ class stream_reader : public stream /// /// @param data The data pointer to fill into /// @param size The number of bytes to fill. - void read(uint8_t* data, uint64_t size) + void read(uint8_t* data, size_type size) noexcept { assert(size <= remaining_size() && "Reading over the end of the underlying buffer"); - // Copy the data from the buffer to the storage std::copy_n(remaining_data(), (std::size_t)size, data); - - // Advance the current position - m_position += size; + skip(size); } /// Peek a Bytes-sized integer in the stream without moving the read @@ -111,14 +96,13 @@ class stream_reader : public stream /// @param value reference to the value to be read /// @param offset number of bytes to offset the peeking with template - void peek_bytes(ValueType& value, uint64_t offset=0) const + void peek_bytes(ValueType& value, size_type offset=0) const noexcept { assert(remaining_size() >= offset && "Offset too large"); assert(Bytes <= remaining_size() - offset && "Reading over the end of the underlying buffer"); const uint8_t* data_position = remaining_data() + offset; - // Get the value at the current position EndianType::template get_bytes(value, data_position); } @@ -128,7 +112,7 @@ class stream_reader : public stream /// @param value reference to the value to be read /// @param offset number of bytes to offset the peeking with template - void peek(ValueType& value, uint64_t offset=0) const + void peek(ValueType& value, size_type offset=0) const noexcept { assert(remaining_size() >= offset && "Offset too large"); assert(sizeof(ValueType) <= remaining_size() - offset && @@ -143,7 +127,7 @@ class stream_reader : public stream /// @param offset number of bytes to offset the peeking with /// @return the peeked value template - ValueType peek(uint64_t offset=0) const + ValueType peek(size_type offset=0) const noexcept { assert(remaining_size() >= offset && "Offset too large"); assert(sizeof(ValueType) <= remaining_size() - offset && @@ -153,26 +137,5 @@ class stream_reader : public stream peek(value, offset); return value; } - - /// A pointer to the stream's data. - /// - /// @return pointer to the stream's data. - const uint8_t* data() const - { - return m_data; - } - - /// A pointer to the stream's data at the current position. - /// - /// @return pointer to the stream's data at the current position. - const uint8_t* remaining_data() const - { - return m_data + m_position; - } - -private: - - /// Data pointer to buffer - const uint8_t* m_data; }; } diff --git a/src/endian/stream_writer.hpp b/src/endian/stream_writer.hpp index 51b96dc0..20bbe141 100755 --- a/src/endian/stream_writer.hpp +++ b/src/endian/stream_writer.hpp @@ -8,17 +8,15 @@ #include #include #include -#include -#include "stream.hpp" +#include "detail/stream.hpp" namespace endian { -/// The idea behind the stream_writer is to provide a stream-like -/// interface for accessing a fixed-size buffer. -/// All complexity regarding endianness is encapsulated. -template -class stream_writer : public stream +/// The stream_writer provides a stream-like interface for writing to a fixed +/// size buffer. All complexity regarding endianness is encapsulated. +template +class stream_writer : public detail::stream { public: @@ -27,45 +25,34 @@ class stream_writer : public stream /// /// @param data a data pointer to the buffer /// @param size the size of the buffer in bytes - stream_writer(uint8_t* data, uint64_t size) : - stream(size), - m_data(data) + stream_writer(uint8_t* data, size_type size) noexcept : + stream(data, size) { - assert(m_data != nullptr && "Invalid buffer pointer provided"); + assert(data != nullptr && "Null pointer provided"); + assert(size > 0 && "Empty buffer provided"); } - /// Creates an endian stream on top of a pre-allocated buffer - /// - /// @param buffer a vector containing the buffer - stream_writer(std::vector& buffer) : - stream_writer(buffer.data(), buffer.size()) - { } - /// Writes a Bytes-sized integer to the stream. /// /// @param value the value to write. template - void write_bytes(ValueType value) + void write_bytes(ValueType value) noexcept { - // Make sure there is enough space in the underlying buffer assert(Bytes <= remaining_size()); - // Write the value at the current position - EndianType::template put_bytes(value, remaining_data()); - - // Advance the current position - m_position += Bytes; + EndianType::template put_bytes(value, this->remaining_data()); + skip(Bytes); } /// Writes a Bytes-sized integer to the stream. /// /// @param value the value to write. template - void write(ValueType value) + void write(ValueType value) noexcept { - // Make sure there is enough space in the underlying buffer assert(sizeof(ValueType) <= remaining_size()); - write_bytes(value); + + write_bytes(value); } /// Writes the raw bytes represented by the storage::const_storage @@ -76,37 +63,12 @@ class stream_writer : public stream /// /// @param data Pointer to the data, to be written to the stream. /// @param size Number of bytes from the data pointer. - void write(const uint8_t* data, uint64_t size) + void write(const uint8_t* data, size_type size) noexcept { - // Make sure there is enough space in the underlying buffer assert(size <= remaining_size()); - // Copy the data to the buffer - std::copy_n(data, (std::size_t)size, remaining_data()); - - // Advance the current position - m_position += size; + std::copy_n(data, (std::size_t)size, this->remaining_data()); + skip(size); } - - /// A pointer to the stream's data. - /// - /// @return pointer to the stream's data. - uint8_t* data() const - { - return m_data; - } - - /// A pointer to the stream's data at the current position. - /// - /// @return pointer to the stream's data at the current position. - uint8_t* remaining_data() const - { - return m_data + m_position; - } - -private: - - /// Data pointer to buffer - uint8_t* m_data; }; } diff --git a/src/gsl/gsl_algorithm b/src/gsl/gsl_algorithm index 710792fb..c2ba31f3 100755 --- a/src/gsl/gsl_algorithm +++ b/src/gsl/gsl_algorithm @@ -31,15 +31,12 @@ #pragma warning(disable : 4127) // conditional expression is constant #pragma warning(disable : 4996) // unsafe use of std::copy_n -// blanket turn off warnings from CppCoreCheck for now -// so people aren't annoyed by them when running the tool. -// more targeted suppressions will be added in a future update to the GSL -#pragma warning(disable : 26481 26482 26483 26485 26490 26491 26492 26493 26495) #endif // _MSC_VER namespace gsl { - +// Note: this will generate faster code than std::copy using span iterator in older msvc+stl +// not necessary for msvc since VS2017 15.8 (_MSC_VER >= 1915) template void copy(span src, span dest) @@ -51,6 +48,7 @@ void copy(span src, span "Source range is longer than target range"); Expects(dest.size() >= src.size()); + GSL_SUPPRESS(stl.1) // NO-FORMAT: attribute std::copy_n(src.data(), src.size(), dest.data()); } diff --git a/src/gsl/gsl_assert b/src/gsl/gsl_assert index 2bda1493..3c952e6e 100755 --- a/src/gsl/gsl_assert +++ b/src/gsl/gsl_assert @@ -20,12 +20,28 @@ #include #include // for logic_error +// +// make suppress attributes parse for some compilers +// Hopefully temporary until suppresion standardization occurs +// +#if defined (_MSC_VER) +#define GSL_SUPPRESS(x) [[gsl::suppress(x)]] +#else +#if defined(__clang__) +#define GSL_SUPPRESS(x) [[gsl::suppress("x")]] +#else +#define GSL_SUPPRESS(x) +#endif // __clang__ +#endif // _MSC_VER + // // Temporary until MSVC STL supports no-exceptions mode. // Currently terminate is a no-op in this mode, so we add termination behavior back // #if defined(_MSC_VER) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS #define GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND +#include +#define RANGE_CHECKS_FAILURE 0 #endif // @@ -81,11 +97,17 @@ namespace details { #if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) - typedef void (*terminate_handler)(); + typedef void (__cdecl *terminate_handler)(); + + GSL_SUPPRESS(f.6) // NO-FORMAT: attribute + [[noreturn]] inline void __cdecl default_terminate_handler() + { + __fastfail(RANGE_CHECKS_FAILURE); + } inline gsl::details::terminate_handler& get_terminate_handler() noexcept { - static terminate_handler handler = &abort; + static terminate_handler handler = &default_terminate_handler; return handler; } @@ -103,7 +125,7 @@ namespace details #if defined(GSL_TERMINATE_ON_CONTRACT_VIOLATION) template - [[noreturn]] void throw_exception(Exception&&) + [[noreturn]] void throw_exception(Exception&&) noexcept { gsl::details::terminate(); } @@ -113,7 +135,7 @@ namespace details template [[noreturn]] void throw_exception(Exception&& exception) { - throw exception; + throw std::forward(exception); } #endif diff --git a/src/gsl/gsl_byte b/src/gsl/gsl_byte index 5da9a865..bc188860 100755 --- a/src/gsl/gsl_byte +++ b/src/gsl/gsl_byte @@ -17,14 +17,28 @@ #ifndef GSL_BYTE_H #define GSL_BYTE_H +// +// make suppress attributes work for some compilers +// Hopefully temporary until suppresion standardization occurs +// +#if defined(_MSC_VER) +#define GSL_SUPPRESS(x) [[gsl::suppress(x)]] +#else +#if defined(__clang__) +#define GSL_SUPPRESS(x) [[gsl::suppress("x")]] +#else +#define GSL_SUPPRESS(x) +#endif // __clang__ +#endif // _MSC_VER + #include #ifdef _MSC_VER #pragma warning(push) -// don't warn about function style casts in byte related operators -#pragma warning(disable : 26493) +// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. +#pragma warning(disable : 26493) // don't use c-style casts // TODO: MSVC suppression in templates does not always work #ifndef GSL_USE_STD_BYTE // this tests if we are under MSVC and the standard lib has std::byte and it is enabled @@ -43,25 +57,38 @@ #ifndef GSL_USE_STD_BYTE // this tests if we are under GCC or Clang with enough -std:c++1z power to get us std::byte -#if defined(__cplusplus) && (__cplusplus >= 201703L) +// also check if libc++ version is sufficient (> 5.0) or libstc++ actually contains std::byte +#if defined(__cplusplus) && (__cplusplus >= 201703L) && \ + (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603) || \ + defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000)) #define GSL_USE_STD_BYTE 1 #include -#else // defined(__cplusplus) && (__cplusplus >= 201703L) +#else // defined(__cplusplus) && (__cplusplus >= 201703L) && + // (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603) || + // defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000)) #define GSL_USE_STD_BYTE 0 -#endif //defined(__cplusplus) && (__cplusplus >= 201703L) +#endif //defined(__cplusplus) && (__cplusplus >= 201703L) && + // (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603) || + // defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000)) #endif // GSL_USE_STD_BYTE -#endif // _MSC_VER +#endif // _MSC_VER + +// Use __may_alias__ attribute on gcc and clang +#if defined __clang__ || (__GNUC__ > 5) +#define byte_may_alias __attribute__((__may_alias__)) +#else // defined __clang__ || defined __GNUC__ +#define byte_may_alias +#endif // defined __clang__ || defined __GNUC__ namespace gsl { #if GSL_USE_STD_BYTE - using std::byte; using std::to_integer; @@ -69,7 +96,7 @@ using std::to_integer; // This is a simple definition for now that allows // use of byte within span<> to be standards-compliant -enum class byte : unsigned char +enum class byte_may_alias byte : unsigned char { }; @@ -146,6 +173,8 @@ constexpr byte to_byte_impl(T t) noexcept return static_cast(t); } template <> +// NOTE: need suppression since c++14 does not allow "return {t}" +// GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: suppression does not work constexpr byte to_byte_impl(unsigned char t) noexcept { return byte(t); diff --git a/src/gsl/gsl_util b/src/gsl/gsl_util index 2ca171b6..542bbaa2 100755 --- a/src/gsl/gsl_util +++ b/src/gsl/gsl_util @@ -34,8 +34,8 @@ #if _MSC_VER < 1910 #pragma push_macro("constexpr") #define constexpr /*constexpr*/ -#endif // _MSC_VER < 1910 -#endif // _MSC_VER +#endif // _MSC_VER < 1910 +#endif // _MSC_VER namespace gsl { @@ -60,7 +60,9 @@ public: final_action(const final_action&) = delete; final_action& operator=(const final_action&) = delete; + final_action& operator=(final_action&&) = delete; + GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // terminate if throws ~final_action() noexcept { if (invoke_) f_(); @@ -68,12 +70,11 @@ public: private: F f_; - bool invoke_ {true}; + bool invoke_{true}; }; // finally() - convenience function to generate a final_action template - final_action finally(const F& f) noexcept { return final_action(f); @@ -87,6 +88,7 @@ final_action finally(F&& f) noexcept // narrow_cast(): a searchable way to do narrowing casts of values template +GSL_SUPPRESS(type.1) // NO-FORMAT: attribute constexpr T narrow_cast(U&& u) noexcept { return static_cast(std::forward(u)); @@ -103,11 +105,13 @@ namespace details : public std::integral_constant::value == std::is_signed::value> { }; -} +} // namespace details // narrow() : a checked version of narrow_cast() that throws if the cast changed the value template -T narrow(U u) +GSL_SUPPRESS(type.1) // NO-FORMAT: attribute +GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // TODO: MSVC /analyze does not recognise noexcept(false) +T narrow(U u) noexcept(false) { T t = narrow_cast(u); if (static_cast(t) != u) gsl::details::throw_exception(narrowing_error()); @@ -120,21 +124,26 @@ T narrow(U u) // at() - Bounds-checked way of accessing builtin arrays, std::array, std::vector // template +GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute +GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute constexpr T& at(T (&arr)[N], const index i) { Expects(i >= 0 && i < narrow_cast(N)); - return arr[static_cast(i)]; + return arr[narrow_cast(i)]; } template +GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute +GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute constexpr auto at(Cont& cont, const index i) -> decltype(cont[cont.size()]) { Expects(i >= 0 && i < narrow_cast(cont.size())); using size_type = decltype(cont.size()); - return cont[static_cast(i)]; + return cont[narrow_cast(i)]; } template +GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute constexpr T at(const std::initializer_list cont, const index i) { Expects(i >= 0 && i < narrow_cast(cont.size())); diff --git a/src/gsl/multi_span b/src/gsl/multi_span index 65e65a11..c8f4aae0 100755 --- a/src/gsl/multi_span +++ b/src/gsl/multi_span @@ -44,6 +44,12 @@ #pragma warning(disable : 4127) // conditional expression is constant #pragma warning(disable : 4702) // unreachable code +// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. +#pragma warning(disable : 26495) // uninitalized member when constructor calls constructor +#pragma warning(disable : 26473) // in some instantiations we cast to the same type +#pragma warning(disable : 26490) // TODO: bug in parser - attributes and templates +#pragma warning(disable : 26465) // TODO: bug - suppression does not work on template functions + #if _MSC_VER < 1910 #pragma push_macro("constexpr") #define constexpr /*constexpr*/ @@ -51,11 +57,15 @@ #endif // _MSC_VER < 1910 #endif // _MSC_VER -#ifdef GSL_THROW_ON_CONTRACT_VIOLATION -#define GSL_NOEXCEPT /*noexcept*/ -#else -#define GSL_NOEXCEPT noexcept -#endif // GSL_THROW_ON_CONTRACT_VIOLATION +// GCC 7 does not like the signed unsigned missmatch (size_t ptrdiff_t) +// While there is a conversion from signed to unsigned, it happens at +// compiletime, so the compiler wouldn't have to warn indiscriminently, but +// could check if the source value actually doesn't fit into the target type +// and only warn in those cases. +#if __GNUC__ > 6 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#endif namespace gsl { @@ -82,7 +92,7 @@ namespace details std::is_integral::value && are_integral::value> { }; -} +} // namespace details template class multi_span_index final @@ -99,24 +109,27 @@ public: using reference = std::add_lvalue_reference_t; using const_reference = std::add_lvalue_reference_t>; - constexpr multi_span_index() GSL_NOEXCEPT {} + constexpr multi_span_index() noexcept {} - constexpr multi_span_index(const value_type (&values)[Rank]) GSL_NOEXCEPT + constexpr multi_span_index(const value_type (&values)[Rank]) noexcept { + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute std::copy(values, values + Rank, elems); } template ::value>> - constexpr multi_span_index(Ts... ds) GSL_NOEXCEPT : elems{narrow_cast(ds)...} - { - } + constexpr multi_span_index(Ts... ds) noexcept : elems{narrow_cast(ds)...} + {} - constexpr multi_span_index(const multi_span_index& other) GSL_NOEXCEPT = default; + constexpr multi_span_index(const multi_span_index& other) noexcept = default; - constexpr multi_span_index& operator=(const multi_span_index& rhs) GSL_NOEXCEPT = default; + constexpr multi_span_index& operator=(const multi_span_index& rhs) noexcept = default; // Preconditions: component_idx < rank + GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute constexpr reference operator[](std::size_t component_idx) { Expects(component_idx < Rank); // Component index must be less than rank @@ -124,82 +137,98 @@ public: } // Preconditions: component_idx < rank - constexpr const_reference operator[](std::size_t component_idx) const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr const_reference operator[](std::size_t component_idx) const { Expects(component_idx < Rank); // Component index must be less than rank return elems[component_idx]; } - constexpr bool operator==(const multi_span_index& rhs) const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute + constexpr bool operator==(const multi_span_index& rhs) const { return std::equal(elems, elems + rank, rhs.elems); } - constexpr bool operator!=(const multi_span_index& rhs) const GSL_NOEXCEPT { return !(*this == rhs); } + constexpr bool operator!=(const multi_span_index& rhs) const + { + return !(*this == rhs); + } - constexpr multi_span_index operator+() const GSL_NOEXCEPT { return *this; } + constexpr multi_span_index operator+() const noexcept { return *this; } - constexpr multi_span_index operator-() const GSL_NOEXCEPT + constexpr multi_span_index operator-() const { multi_span_index ret = *this; std::transform(ret, ret + rank, ret, std::negate{}); return ret; } - constexpr multi_span_index operator+(const multi_span_index& rhs) const GSL_NOEXCEPT + constexpr multi_span_index operator+(const multi_span_index& rhs) const { multi_span_index ret = *this; ret += rhs; return ret; } - constexpr multi_span_index operator-(const multi_span_index& rhs) const GSL_NOEXCEPT + constexpr multi_span_index operator-(const multi_span_index& rhs) const { multi_span_index ret = *this; ret -= rhs; return ret; } - constexpr multi_span_index& operator+=(const multi_span_index& rhs) GSL_NOEXCEPT + constexpr multi_span_index& operator+=(const multi_span_index& rhs) { - std::transform(elems, elems + rank, rhs.elems, elems, std::plus{}); + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute + std::transform(elems, elems + rank, rhs.elems, elems, + std::plus{}); return *this; } - constexpr multi_span_index& operator-=(const multi_span_index& rhs) GSL_NOEXCEPT + constexpr multi_span_index& operator-=(const multi_span_index& rhs) { + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute std::transform(elems, elems + rank, rhs.elems, elems, std::minus{}); return *this; } - constexpr multi_span_index operator*(value_type v) const GSL_NOEXCEPT + constexpr multi_span_index operator*(value_type v) const { multi_span_index ret = *this; ret *= v; return ret; } - constexpr multi_span_index operator/(value_type v) const GSL_NOEXCEPT + constexpr multi_span_index operator/(value_type v) const { multi_span_index ret = *this; ret /= v; return ret; } - friend constexpr multi_span_index operator*(value_type v, const multi_span_index& rhs) GSL_NOEXCEPT + friend constexpr multi_span_index operator*(value_type v, const multi_span_index& rhs) { return rhs * v; } - constexpr multi_span_index& operator*=(value_type v) GSL_NOEXCEPT + constexpr multi_span_index& operator*=(value_type v) { + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute std::transform(elems, elems + rank, elems, [v](value_type x) { return std::multiplies{}(x, v); }); return *this; } - constexpr multi_span_index& operator/=(value_type v) GSL_NOEXCEPT + constexpr multi_span_index& operator/=(value_type v) { + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute std::transform(elems, elems + rank, elems, [v](value_type x) { return std::divides{}(x, v); }); return *this; @@ -214,42 +243,42 @@ private: struct static_bounds_dynamic_range_t { template ::value>> - constexpr operator T() const GSL_NOEXCEPT + constexpr operator T() const noexcept { return narrow_cast(-1); } }; -constexpr bool operator==(static_bounds_dynamic_range_t, static_bounds_dynamic_range_t) GSL_NOEXCEPT +constexpr bool operator==(static_bounds_dynamic_range_t, static_bounds_dynamic_range_t) noexcept { return true; } -constexpr bool operator!=(static_bounds_dynamic_range_t, static_bounds_dynamic_range_t) GSL_NOEXCEPT +constexpr bool operator!=(static_bounds_dynamic_range_t, static_bounds_dynamic_range_t) noexcept { return false; } template ::value>> -constexpr bool operator==(static_bounds_dynamic_range_t, T other) GSL_NOEXCEPT +constexpr bool operator==(static_bounds_dynamic_range_t, T other) noexcept { return narrow_cast(-1) == other; } template ::value>> -constexpr bool operator==(T left, static_bounds_dynamic_range_t right) GSL_NOEXCEPT +constexpr bool operator==(T left, static_bounds_dynamic_range_t right) noexcept { return right == left; } template ::value>> -constexpr bool operator!=(static_bounds_dynamic_range_t, T other) GSL_NOEXCEPT +constexpr bool operator!=(static_bounds_dynamic_range_t, T other) noexcept { return narrow_cast(-1) != other; } template ::value>> -constexpr bool operator!=(T left, static_bounds_dynamic_range_t right) GSL_NOEXCEPT +constexpr bool operator!=(T left, static_bounds_dynamic_range_t right) noexcept { return right != left; } @@ -287,16 +316,14 @@ namespace details // TODO : following signature is for work around VS bug template BoundsRanges(const OtherRange&, bool /* firstLevel */) - { - } + {} BoundsRanges(const std::ptrdiff_t* const) {} - BoundsRanges() = default; + BoundsRanges() noexcept = default; template void serialize(T&) const - { - } + {} template size_type linearize(const T&) const @@ -310,11 +337,11 @@ namespace details return -1; } - size_type elementNum(std::size_t) const GSL_NOEXCEPT { return 0; } + size_type elementNum(std::size_t) const noexcept { return 0; } - size_type totalSize() const GSL_NOEXCEPT { return TotalSize; } + size_type totalSize() const noexcept { return TotalSize; } - bool operator==(const BoundsRanges&) const GSL_NOEXCEPT { return true; } + bool operator==(const BoundsRanges&) const noexcept { return true; } }; template @@ -331,21 +358,22 @@ namespace details size_type m_bound; public: + GSL_SUPPRESS(f.23) // NO-FORMAT: attribute // this pointer type is cannot be assigned nullptr - issue in not_null + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute BoundsRanges(const std::ptrdiff_t* const arr) : Base(arr + 1), m_bound(*arr * this->Base::totalSize()) { Expects(0 <= *arr); } - BoundsRanges() : m_bound(0) {} + BoundsRanges() noexcept : m_bound(0) {} template BoundsRanges(const BoundsRanges& other, bool /* firstLevel */ = true) : Base(static_cast&>(other), false) , m_bound(other.totalSize()) - { - } + {} template void serialize(T& arr) const @@ -355,6 +383,7 @@ namespace details } template + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute size_type linearize(const T& arr) const { const size_type index = this->Base::totalSize() * arr[Dim]; @@ -371,11 +400,19 @@ namespace details return cur < m_bound ? cur + last : -1; } - size_type totalSize() const GSL_NOEXCEPT { return m_bound; } + GSL_SUPPRESS(c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used + size_type totalSize() const noexcept + { + return m_bound; + } - size_type elementNum() const GSL_NOEXCEPT { return totalSize() / this->Base::totalSize(); } + GSL_SUPPRESS(c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used + size_type elementNum() const noexcept + { + return totalSize() / this->Base::totalSize(); + } - size_type elementNum(std::size_t dim) const GSL_NOEXCEPT + size_type elementNum(std::size_t dim) const noexcept { if (dim > 0) return this->Base::elementNum(dim - 1); @@ -383,7 +420,7 @@ namespace details return elementNum(); } - bool operator==(const BoundsRanges& rhs) const GSL_NOEXCEPT + bool operator==(const BoundsRanges& rhs) const noexcept { return m_bound == rhs.m_bound && static_cast(*this) == static_cast(rhs); @@ -409,6 +446,7 @@ namespace details bool firstLevel = true) : Base(static_cast&>(other), false) { + GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: false positive (void) firstLevel; } @@ -422,7 +460,10 @@ namespace details template size_type linearize(const T& arr) const { + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute Expects(arr[Dim] >= 0 && arr[Dim] < CurrentRange); // Index is out of range + + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute return this->Base::totalSize() * arr[Dim] + this->Base::template linearize(arr); } @@ -436,11 +477,20 @@ namespace details return this->Base::totalSize() * arr[Dim] + last; } - size_type totalSize() const GSL_NOEXCEPT { return CurrentRange * this->Base::totalSize(); } + GSL_SUPPRESS(c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used + size_type totalSize() const noexcept + { + return CurrentRange * this->Base::totalSize(); + } - size_type elementNum() const GSL_NOEXCEPT { return CurrentRange; } + GSL_SUPPRESS(c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used + size_type elementNum() const noexcept + { + return CurrentRange; + } - size_type elementNum(std::size_t dim) const GSL_NOEXCEPT + GSL_SUPPRESS(c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used + size_type elementNum(std::size_t dim) const noexcept { if (dim > 0) return this->Base::elementNum(dim - 1); @@ -448,7 +498,7 @@ namespace details return elementNum(); } - bool operator==(const BoundsRanges& rhs) const GSL_NOEXCEPT + bool operator==(const BoundsRanges& rhs) const noexcept { return static_cast(*this) == static_cast(rhs); } @@ -498,15 +548,17 @@ namespace details template 1), typename Ret = std::enable_if_t>> - constexpr Ret shift_left(const multi_span_index& other) GSL_NOEXCEPT + constexpr Ret shift_left(const multi_span_index& other) noexcept { Ret ret{}; - for (std::size_t i = 0; i < Rank - 1; ++i) { - ret[i] = other[i + 1]; + for (std::size_t i = 0; i < Rank - 1; ++i) + { + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + ret[i] = other[i + 1]; } return ret; } -} +} // namespace details template class bounds_iterator; @@ -524,7 +576,7 @@ class static_bounds using MyRanges = details::BoundsRanges; MyRanges m_ranges; - constexpr static_bounds(const MyRanges& range) : m_ranges(range) {} + constexpr static_bounds(const MyRanges& range) noexcept : m_ranges(range) {} template friend class static_bounds; @@ -543,7 +595,8 @@ public: using sliced_type = static_bounds; using mapping_type = contiguous_mapping_tag; - constexpr static_bounds(const static_bounds&) = default; + constexpr static_bounds(const static_bounds&) noexcept = default; + constexpr static_bounds() /*noexcept*/ = default; template struct BoundsRangeConvertible2; @@ -601,8 +654,7 @@ public: MyRanges::DynamicNum > 0 || other.m_ranges.totalSize() >= m_ranges.totalSize()); } - constexpr static_bounds(std::initializer_list il) - : m_ranges(static_cast(il.begin())) + constexpr static_bounds(std::initializer_list il) : m_ranges(il.begin()) { // Size of the initializer list must match the rank of the array Expects((MyRanges::DynamicNum == 0 && il.size() == 1 && *il.begin() == static_size) || @@ -611,33 +663,31 @@ public: Expects(m_ranges.totalSize() <= PTRDIFF_MAX); } - constexpr static_bounds() = default; - - constexpr sliced_type slice() const GSL_NOEXCEPT + constexpr sliced_type slice() const noexcept { return sliced_type{static_cast&>(m_ranges)}; } - constexpr size_type stride() const GSL_NOEXCEPT { return rank > 1 ? slice().size() : 1; } + constexpr size_type stride() const noexcept { return rank > 1 ? slice().size() : 1; } - constexpr size_type size() const GSL_NOEXCEPT { return m_ranges.totalSize(); } + constexpr size_type size() const noexcept { return m_ranges.totalSize(); } - constexpr size_type total_size() const GSL_NOEXCEPT { return m_ranges.totalSize(); } + constexpr size_type total_size() const noexcept { return m_ranges.totalSize(); } constexpr size_type linearize(const index_type& idx) const { return m_ranges.linearize(idx); } - constexpr bool contains(const index_type& idx) const GSL_NOEXCEPT + constexpr bool contains(const index_type& idx) const noexcept { return m_ranges.contains(idx) != -1; } - constexpr size_type operator[](std::size_t idx) const GSL_NOEXCEPT + constexpr size_type operator[](std::size_t idx) const noexcept { return m_ranges.elementNum(idx); } template - constexpr size_type extent() const GSL_NOEXCEPT + constexpr size_type extent() const noexcept { static_assert(Dim < rank, "dimension should be less than rank (dimension count starts from 0)"); @@ -645,7 +695,7 @@ public: } template - constexpr size_type extent(IntType dim) const GSL_NOEXCEPT + constexpr size_type extent(IntType dim) const { static_assert(std::is_integral::value, "Dimension parameter must be supplied as an integral type."); @@ -655,7 +705,7 @@ public: return m_ranges.elementNum(real_dim); } - constexpr index_type index_bounds() const GSL_NOEXCEPT + constexpr index_type index_bounds() const noexcept { size_type extents[rank] = {}; m_ranges.serialize(extents); @@ -663,31 +713,30 @@ public: } template - constexpr bool operator==(const static_bounds& rhs) const GSL_NOEXCEPT + constexpr bool operator==(const static_bounds& rhs) const noexcept { return this->size() == rhs.size(); } template - constexpr bool operator!=(const static_bounds& rhs) const GSL_NOEXCEPT + constexpr bool operator!=(const static_bounds& rhs) const noexcept { return !(*this == rhs); } - constexpr const_iterator begin() const GSL_NOEXCEPT + constexpr const_iterator begin() const noexcept { return const_iterator(*this, index_type{}); } - constexpr const_iterator end() const GSL_NOEXCEPT + constexpr const_iterator end() const noexcept { return const_iterator(*this, this->index_bounds()); } }; template -class strided_bounds -{ +class strided_bounds { template friend class strided_bounds; @@ -707,60 +756,60 @@ public: using sliced_type = std::conditional_t, void>; using mapping_type = generalized_mapping_tag; - constexpr strided_bounds(const strided_bounds&) GSL_NOEXCEPT = default; + constexpr strided_bounds(const strided_bounds&) noexcept = default; - constexpr strided_bounds& operator=(const strided_bounds&) GSL_NOEXCEPT = default; + constexpr strided_bounds& operator=(const strided_bounds&) noexcept = default; constexpr strided_bounds(const value_type (&values)[rank], index_type strides) : m_extents(values), m_strides(std::move(strides)) - { - } + {} - constexpr strided_bounds(const index_type& extents, const index_type& strides) GSL_NOEXCEPT - : m_extents(extents), - m_strides(strides) + constexpr strided_bounds(const index_type& extents, const index_type& strides) noexcept + : m_extents(extents), m_strides(strides) { } - constexpr index_type strides() const GSL_NOEXCEPT { return m_strides; } + constexpr index_type strides() const noexcept { return m_strides; } - constexpr size_type total_size() const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr size_type total_size() const noexcept { size_type ret = 0; - for (std::size_t i = 0; i < rank; ++i) { - ret += (m_extents[i] - 1) * m_strides[i]; - } + for (std::size_t i = 0; i < rank; ++i) { ret += (m_extents[i] - 1) * m_strides[i]; } return ret + 1; } - constexpr size_type size() const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr size_type size() const noexcept { size_type ret = 1; - for (std::size_t i = 0; i < rank; ++i) { - ret *= m_extents[i]; - } + for (std::size_t i = 0; i < rank; ++i) { ret *= m_extents[i]; } return ret; } - constexpr bool contains(const index_type& idx) const GSL_NOEXCEPT + constexpr bool contains(const index_type& idx) const noexcept { - for (std::size_t i = 0; i < rank; ++i) { + for (std::size_t i = 0; i < rank; ++i) + { if (idx[i] < 0 || idx[i] >= m_extents[i]) return false; } return true; } - constexpr size_type linearize(const index_type& idx) const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr size_type linearize(const index_type& idx) const { size_type ret = 0; - for (std::size_t i = 0; i < rank; i++) { + for (std::size_t i = 0; i < rank; i++) + { Expects(idx[i] < m_extents[i]); // index is out of bounds of the array ret += idx[i] * m_strides[i]; } return ret; } - constexpr size_type stride() const GSL_NOEXCEPT { return m_strides[0]; } + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr size_type stride() const noexcept { return m_strides[0]; } template 1), typename Ret = std::enable_if_t> constexpr sliced_type slice() const @@ -769,23 +818,20 @@ public: } template - constexpr size_type extent() const GSL_NOEXCEPT + + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr size_type extent() const noexcept { static_assert(Dim < Rank, "dimension should be less than rank (dimension count starts from 0)"); return m_extents[Dim]; } - constexpr index_type index_bounds() const GSL_NOEXCEPT { return m_extents; } - constexpr const_iterator begin() const GSL_NOEXCEPT - { - return const_iterator{*this, index_type{}}; - } + constexpr index_type index_bounds() const noexcept { return m_extents; } - constexpr const_iterator end() const GSL_NOEXCEPT - { - return const_iterator{*this, index_bounds()}; - } + constexpr const_iterator begin() const noexcept { return const_iterator{*this, index_type{}}; } + + constexpr const_iterator end() const noexcept { return const_iterator{*this, index_bounds()}; } private: index_type m_extents; @@ -818,21 +864,25 @@ public: using index_type = value_type; using index_size_type = typename IndexType::value_type; template - explicit bounds_iterator(const Bounds& bnd, value_type curr) GSL_NOEXCEPT - : boundary_(bnd.index_bounds()), - curr_(std::move(curr)) + explicit bounds_iterator(const Bounds& bnd, value_type curr) noexcept + : boundary_(bnd.index_bounds()), curr_(std::move(curr)) { static_assert(is_bounds::value, "Bounds type must be provided"); } - constexpr reference operator*() const GSL_NOEXCEPT { return curr_; } + constexpr reference operator*() const noexcept { return curr_; } + + constexpr pointer operator->() const noexcept { return &curr_; } - constexpr pointer operator->() const GSL_NOEXCEPT { return &curr_; } + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute + constexpr bounds_iterator& operator++() noexcept - constexpr bounds_iterator& operator++() GSL_NOEXCEPT { - for (std::size_t i = rank; i-- > 0;) { - if (curr_[i] < boundary_[i] - 1) { + for (std::size_t i = rank; i-- > 0;) + { + if (curr_[i] < boundary_[i] - 1) + { curr_[i]++; return *this; } @@ -843,24 +893,26 @@ public: return *this; } - constexpr bounds_iterator operator++(int) GSL_NOEXCEPT + constexpr bounds_iterator operator++(int) noexcept { auto ret = *this; ++(*this); return ret; } - constexpr bounds_iterator& operator--() GSL_NOEXCEPT + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr bounds_iterator& operator--() { - if (!less(curr_, boundary_)) { + if (!less(curr_, boundary_)) + { // if at the past-the-end, set to last element - for (std::size_t i = 0; i < rank; ++i) { - curr_[i] = boundary_[i] - 1; - } + for (std::size_t i = 0; i < rank; ++i) { curr_[i] = boundary_[i] - 1; } return *this; } - for (std::size_t i = rank; i-- > 0;) { - if (curr_[i] >= 1) { + for (std::size_t i = rank; i-- > 0;) + { + if (curr_[i] >= 1) + { curr_[i]--; return *this; } @@ -872,28 +924,28 @@ public: return *this; } - constexpr bounds_iterator operator--(int) GSL_NOEXCEPT + constexpr bounds_iterator operator--(int) noexcept { auto ret = *this; --(*this); return ret; } - constexpr bounds_iterator operator+(difference_type n) const GSL_NOEXCEPT + constexpr bounds_iterator operator+(difference_type n) const noexcept { bounds_iterator ret{*this}; return ret += n; } - constexpr bounds_iterator& operator+=(difference_type n) GSL_NOEXCEPT + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr bounds_iterator& operator+=(difference_type n) { auto linear_idx = linearize(curr_) + n; std::remove_const_t stride = 0; stride[rank - 1] = 1; - for (std::size_t i = rank - 1; i-- > 0;) { - stride[i] = stride[i + 1] * boundary_[i + 1]; - } - for (std::size_t i = 0; i < rank; ++i) { + for (std::size_t i = rank - 1; i-- > 0;) { stride[i] = stride[i + 1] * boundary_[i + 1]; } + for (std::size_t i = 0; i < rank; ++i) + { curr_[i] = linear_idx / stride[i]; linear_idx = linear_idx % stride[i]; } @@ -902,79 +954,78 @@ public: return *this; } - constexpr bounds_iterator operator-(difference_type n) const GSL_NOEXCEPT + constexpr bounds_iterator operator-(difference_type n) const noexcept { bounds_iterator ret{*this}; return ret -= n; } - constexpr bounds_iterator& operator-=(difference_type n) GSL_NOEXCEPT { return *this += -n; } + constexpr bounds_iterator& operator-=(difference_type n) noexcept { return *this += -n; } - constexpr difference_type operator-(const bounds_iterator& rhs) const GSL_NOEXCEPT + constexpr difference_type operator-(const bounds_iterator& rhs) const noexcept { return linearize(curr_) - linearize(rhs.curr_); } - constexpr value_type operator[](difference_type n) const GSL_NOEXCEPT { return *(*this + n); } + constexpr value_type operator[](difference_type n) const noexcept { return *(*this + n); } - constexpr bool operator==(const bounds_iterator& rhs) const GSL_NOEXCEPT + constexpr bool operator==(const bounds_iterator& rhs) const noexcept { return curr_ == rhs.curr_; } - constexpr bool operator!=(const bounds_iterator& rhs) const GSL_NOEXCEPT - { - return !(*this == rhs); - } - constexpr bool operator<(const bounds_iterator& rhs) const GSL_NOEXCEPT + constexpr bool operator!=(const bounds_iterator& rhs) const noexcept { return !(*this == rhs); } + + constexpr bool operator<(const bounds_iterator& rhs) const noexcept { return less(curr_, rhs.curr_); } - constexpr bool operator<=(const bounds_iterator& rhs) const GSL_NOEXCEPT - { - return !(rhs < *this); - } + constexpr bool operator<=(const bounds_iterator& rhs) const noexcept { return !(rhs < *this); } - constexpr bool operator>(const bounds_iterator& rhs) const GSL_NOEXCEPT { return rhs < *this; } + constexpr bool operator>(const bounds_iterator& rhs) const noexcept { return rhs < *this; } - constexpr bool operator>=(const bounds_iterator& rhs) const GSL_NOEXCEPT - { - return !(rhs > *this); - } + constexpr bool operator>=(const bounds_iterator& rhs) const noexcept { return !(rhs > *this); } - void swap(bounds_iterator& rhs) GSL_NOEXCEPT + void swap(bounds_iterator& rhs) noexcept { std::swap(boundary_, rhs.boundary_); std::swap(curr_, rhs.curr_); } private: - constexpr bool less(index_type& one, index_type& other) const GSL_NOEXCEPT + + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr bool less(index_type& one, index_type& other) const noexcept { - for (std::size_t i = 0; i < rank; ++i) { + for (std::size_t i = 0; i < rank; ++i) + { if (one[i] < other[i]) return true; } return false; } - constexpr index_size_type linearize(const value_type& idx) const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + constexpr index_size_type linearize(const value_type& idx) const noexcept { // TODO: Smarter impl. // Check if past-the-end index_size_type multiplier = 1; index_size_type res = 0; - if (!less(idx, boundary_)) { + if (!less(idx, boundary_)) + { res = 1; - for (std::size_t i = rank; i-- > 0;) { + for (std::size_t i = rank; i-- > 0;) + { res += (idx[i] - 1) * multiplier; multiplier *= boundary_[i]; } } else { - for (std::size_t i = rank; i-- > 0;) { + for (std::size_t i = rank; i-- > 0;) + { res += idx[i] * multiplier; multiplier *= boundary_[i]; } @@ -988,7 +1039,7 @@ private: template bounds_iterator operator+(typename bounds_iterator::difference_type n, - const bounds_iterator& rhs) GSL_NOEXCEPT + const bounds_iterator& rhs) noexcept { return rhs + n; } @@ -999,7 +1050,7 @@ namespace details constexpr std::enable_if_t< std::is_same::value, typename Bounds::index_type> - make_stride(const Bounds& bnd) GSL_NOEXCEPT + make_stride(const Bounds& bnd) noexcept { return bnd.strides(); } @@ -1009,13 +1060,16 @@ namespace details constexpr std::enable_if_t< std::is_same::value, typename Bounds::index_type> - make_stride(const Bounds& bnd) GSL_NOEXCEPT + make_stride(const Bounds& bnd) noexcept { auto extents = bnd.index_bounds(); typename Bounds::size_type stride[Bounds::rank] = {}; stride[Bounds::rank - 1] = 1; - for (std::size_t i = 1; i < Bounds::rank; ++i) { + for (std::size_t i = 1; i < Bounds::rank; ++i) + { + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute stride[Bounds::rank - i - 1] = stride[Bounds::rank - i] * extents[Bounds::rank - i]; } return {stride}; @@ -1052,17 +1106,17 @@ struct dim_t { static const std::ptrdiff_t value = dynamic_range; const std::ptrdiff_t dvalue; - constexpr dim_t(std::ptrdiff_t size) GSL_NOEXCEPT : dvalue(size) {} + constexpr dim_t(std::ptrdiff_t size) noexcept : dvalue(size) {} }; template = 0)>> -constexpr dim_t dim() GSL_NOEXCEPT +constexpr dim_t dim() noexcept { return dim_t(); } template > -constexpr dim_t dim(std::ptrdiff_t n) GSL_NOEXCEPT +constexpr dim_t dim(std::ptrdiff_t n) noexcept { return dim_t<>(n); } @@ -1171,7 +1225,7 @@ namespace details struct is_multi_span : is_multi_span_oracle> { }; -} +} // namespace details template class multi_span @@ -1207,7 +1261,9 @@ private: public: // default constructor - same as constructing from nullptr_t - constexpr multi_span() GSL_NOEXCEPT : multi_span(nullptr, bounds_type{}) + GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive + constexpr multi_span() noexcept + : multi_span(nullptr, bounds_type{}) { static_assert(bounds_type::dynamic_rank != 0 || (bounds_type::dynamic_rank == 0 && bounds_type::static_size == 0), @@ -1216,7 +1272,9 @@ public: } // construct from nullptr - get an empty multi_span - constexpr multi_span(std::nullptr_t) GSL_NOEXCEPT : multi_span(nullptr, bounds_type{}) + GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive + constexpr multi_span(std::nullptr_t) noexcept + : multi_span(nullptr, bounds_type{}) { static_assert(bounds_type::dynamic_rank != 0 || (bounds_type::dynamic_rank == 0 && bounds_type::static_size == 0), @@ -1226,8 +1284,9 @@ public: // construct from nullptr with size of 0 (helps with template function calls) template ::value>> - constexpr multi_span(std::nullptr_t, IntType size) GSL_NOEXCEPT - : multi_span(nullptr, bounds_type{}) + + // GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive // TODO: parser bug + constexpr multi_span(std::nullptr_t, IntType size) : multi_span(nullptr, bounds_type{}) { static_assert(bounds_type::dynamic_rank != 0 || (bounds_type::dynamic_rank == 0 && bounds_type::static_size == 0), @@ -1237,7 +1296,10 @@ public: } // construct from a single element - constexpr multi_span(reference data) GSL_NOEXCEPT : multi_span(&data, bounds_type{1}) + + GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive + constexpr multi_span(reference data) noexcept + : multi_span(&data, bounds_type{1}) { static_assert(bounds_type::dynamic_rank > 0 || bounds_type::static_size == 0 || bounds_type::static_size == 1, @@ -1249,14 +1311,14 @@ public: constexpr multi_span(value_type&&) = delete; // construct from pointer + length - constexpr multi_span(pointer ptr, size_type size) GSL_NOEXCEPT + GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive + constexpr multi_span(pointer ptr, size_type size) : multi_span(ptr, bounds_type{size}) - { - } + {} // construct from pointer + length - multidimensional - constexpr multi_span(pointer data, bounds_type bounds) GSL_NOEXCEPT : data_(data), - bounds_(std::move(bounds)) + constexpr multi_span(pointer data, bounds_type bounds) + : data_(data), bounds_(std::move(bounds)) { Expects((bounds_.size() > 0 && data != nullptr) || bounds_.size() == 0); } @@ -1310,8 +1372,9 @@ public: constexpr multi_span(const std::array& arr) : multi_span(arr.data(), bounds_type{static_bounds{}}) { - static_assert(std::is_convertible(*)[]>::value, - "Cannot convert from source type to target multi_span type."); + static_assert( + std::is_convertible(*)[]>::value, + "Cannot convert from source type to target multi_span type."); static_assert(std::is_convertible, bounds_type>::value, "You cannot construct a multi_span from a std::array of smaller size."); } @@ -1333,8 +1396,7 @@ public: constexpr multi_span(Cont& cont) : multi_span(static_cast(cont.data()), details::newBoundsHelper(narrow_cast(cont.size()))) - { - } + {} // prevent constructing from temporary containers template , typename = std::enable_if_t::value && std::is_convertible::value>> - constexpr multi_span(multi_span other) GSL_NOEXCEPT - : data_(other.data_), - bounds_(other.bounds_) - { - } + constexpr multi_span(multi_span other) + : data_(other.data_), bounds_(other.bounds_) + {} // trivial copy and move constexpr multi_span(const multi_span&) = default; @@ -1367,7 +1427,8 @@ public: // first() - extract the first Count elements into a new multi_span template - constexpr multi_span first() const GSL_NOEXCEPT + + constexpr multi_span first() const { static_assert(Count >= 0, "Count must be >= 0."); static_assert(bounds_type::static_size == dynamic_range || @@ -1379,7 +1440,7 @@ public: } // first() - extract the first count elements into a new multi_span - constexpr multi_span first(size_type count) const GSL_NOEXCEPT + constexpr multi_span first(size_type count) const { Expects(count >= 0 && count <= this->size()); return {this->data(), count}; @@ -1387,7 +1448,7 @@ public: // last() - extract the last Count elements into a new multi_span template - constexpr multi_span last() const GSL_NOEXCEPT + constexpr multi_span last() const { static_assert(Count >= 0, "Count must be >= 0."); static_assert(bounds_type::static_size == dynamic_range || @@ -1399,7 +1460,7 @@ public: } // last() - extract the last count elements into a new multi_span - constexpr multi_span last(size_type count) const GSL_NOEXCEPT + constexpr multi_span last(size_type count) const { Expects(count >= 0 && count <= this->size()); return {this->data() + this->size() - count, count}; @@ -1407,7 +1468,7 @@ public: // subspan() - create a subview of Count elements starting at Offset template - constexpr multi_span subspan() const GSL_NOEXCEPT + constexpr multi_span subspan() const { static_assert(Count >= 0, "Count must be >= 0."); static_assert(Offset >= 0, "Offset must be >= 0."); @@ -1423,8 +1484,8 @@ public: // subspan() - create a subview of count elements starting at offset // supplying dynamic_range for count will consume all available elements from offset - constexpr multi_span - subspan(size_type offset, size_type count = dynamic_range) const GSL_NOEXCEPT + constexpr multi_span subspan(size_type offset, + size_type count = dynamic_range) const { Expects((offset >= 0 && offset <= this->size()) && (count == dynamic_range || (count <= this->size() - offset))); @@ -1433,34 +1494,34 @@ public: // section - creates a non-contiguous, strided multi_span from a contiguous one constexpr strided_span section(index_type origin, - index_type extents) const GSL_NOEXCEPT + index_type extents) const { - size_type size = this->bounds().total_size() - this->bounds().linearize(origin); + const size_type size = this->bounds().total_size() - this->bounds().linearize(origin); return {&this->operator[](origin), size, strided_bounds{extents, details::make_stride(bounds())}}; } // length of the multi_span in elements - constexpr size_type size() const GSL_NOEXCEPT { return bounds_.size(); } + constexpr size_type size() const noexcept { return bounds_.size(); } // length of the multi_span in elements - constexpr size_type length() const GSL_NOEXCEPT { return this->size(); } + constexpr size_type length() const noexcept { return this->size(); } // length of the multi_span in bytes - constexpr size_type size_bytes() const GSL_NOEXCEPT + constexpr size_type size_bytes() const noexcept { return narrow_cast(sizeof(value_type)) * this->size(); } // length of the multi_span in bytes - constexpr size_type length_bytes() const GSL_NOEXCEPT { return this->size_bytes(); } + constexpr size_type length_bytes() const noexcept { return this->size_bytes(); } - constexpr bool empty() const GSL_NOEXCEPT { return this->size() == 0; } + constexpr bool empty() const noexcept { return this->size() == 0; } static constexpr std::size_t rank() { return Rank; } template - constexpr size_type extent() const GSL_NOEXCEPT + constexpr size_type extent() const noexcept { static_assert(Dim < Rank, "Dimension should be less than rank (dimension count starts from 0)."); @@ -1468,14 +1529,14 @@ public: } template - constexpr size_type extent(IntType dim) const GSL_NOEXCEPT + constexpr size_type extent(IntType dim) const { return bounds_.extent(dim); } - constexpr bounds_type bounds() const GSL_NOEXCEPT { return bounds_; } + constexpr bounds_type bounds() const noexcept { return bounds_; } - constexpr pointer data() const GSL_NOEXCEPT { return data_; } + constexpr pointer data() const noexcept { return data_; } template constexpr reference operator()(FirstIndex idx) @@ -1486,18 +1547,21 @@ public: template constexpr reference operator()(FirstIndex firstIndex, OtherIndices... indices) { - index_type idx = {narrow_cast(firstIndex), - narrow_cast(indices)...}; + const index_type idx = {narrow_cast(firstIndex), + narrow_cast(indices)...}; return this->operator[](idx); } - constexpr reference operator[](const index_type& idx) const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + constexpr reference operator[](const index_type& idx) const { return data_[bounds_.linearize(idx)]; } template 1), typename Ret = std::enable_if_t> - constexpr Ret operator[](size_type idx) const GSL_NOEXCEPT + + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + constexpr Ret operator[](size_type idx) const { Expects(idx >= 0 && idx < bounds_.size()); // index is out of bounds of the array const size_type ridx = idx * bounds_.stride(); @@ -1507,85 +1571,81 @@ public: return Ret{data_ + ridx, bounds_.slice()}; } - constexpr iterator begin() const GSL_NOEXCEPT { return iterator{this, true}; } + constexpr iterator begin() const noexcept { return iterator{this, true}; } - constexpr iterator end() const GSL_NOEXCEPT { return iterator{this, false}; } + constexpr iterator end() const noexcept { return iterator{this, false}; } - constexpr const_iterator cbegin() const GSL_NOEXCEPT + GSL_SUPPRESS(type.1) // NO-FORMAT: attribute + constexpr const_iterator cbegin() const noexcept { return const_iterator{reinterpret_cast(this), true}; } - constexpr const_iterator cend() const GSL_NOEXCEPT + constexpr const_iterator cend() const noexcept { return const_iterator{reinterpret_cast(this), false}; } - constexpr reverse_iterator rbegin() const GSL_NOEXCEPT { return reverse_iterator{end()}; } + constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; } - constexpr reverse_iterator rend() const GSL_NOEXCEPT { return reverse_iterator{begin()}; } + constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; } - constexpr const_reverse_iterator crbegin() const GSL_NOEXCEPT + constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator{cend()}; } - constexpr const_reverse_iterator crend() const GSL_NOEXCEPT + constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator{cbegin()}; } template , std::remove_cv_t>::value>> - constexpr bool - operator==(const multi_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator==(const multi_span& other) const { return bounds_.size() == other.bounds_.size() && (data_ == other.data_ || std::equal(this->begin(), this->end(), other.begin())); } template , std::remove_cv_t>::value>> - constexpr bool - operator!=(const multi_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator!=(const multi_span& other) const { return !(*this == other); } template , std::remove_cv_t>::value>> - constexpr bool - operator<(const multi_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator<(const multi_span& other) const { return std::lexicographical_compare(this->begin(), this->end(), other.begin(), other.end()); } template , std::remove_cv_t>::value>> - constexpr bool - operator<=(const multi_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator<=(const multi_span& other) const { return !(other < *this); } template , std::remove_cv_t>::value>> - constexpr bool - operator>(const multi_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator>(const multi_span& other) const + noexcept { return (other < *this); } template , std::remove_cv_t>::value>> - constexpr bool - operator>=(const multi_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator>=(const multi_span& other) const { return !(*this < other); } @@ -1606,14 +1666,14 @@ constexpr auto as_multi_span(SpanType s, Dimensions2... dims) "Variadic as_multi_span() is for reshaping existing spans."); using BoundsType = typename multi_span::bounds_type; - auto tobounds = details::static_as_multi_span_helper(dims..., details::Sep{}); + const auto tobounds = details::static_as_multi_span_helper(dims..., details::Sep{}); details::verifyBoundsReshape(s.bounds(), tobounds); return {s.data(), tobounds}; } // convert a multi_span to a multi_span template -multi_span as_bytes(multi_span s) GSL_NOEXCEPT +multi_span as_bytes(multi_span s) noexcept { static_assert(std::is_trivial>::value, "The value_type of multi_span must be a trivial type."); @@ -1625,7 +1685,7 @@ multi_span as_bytes(multi_span s) G // on all implementations. It should be considered an experimental extension // to the standard GSL interface. template -multi_span as_writeable_bytes(multi_span s) GSL_NOEXCEPT +multi_span as_writeable_bytes(multi_span s) noexcept { static_assert(std::is_trivial>::value, "The value_type of multi_span must be a trivial type."); @@ -1637,8 +1697,7 @@ multi_span as_writeable_bytes(multi_span s) GSL_NOEXCEPT // on all implementations. It should be considered an experimental extension // to the standard GSL interface. template -constexpr auto -as_multi_span(multi_span s) GSL_NOEXCEPT -> multi_span< +constexpr auto as_multi_span(multi_span s) -> multi_span< const U, static_cast( multi_span::bounds_type::static_size != dynamic_range ? (static_cast( @@ -1664,7 +1723,7 @@ as_multi_span(multi_span s) GSL_NOEXCEPT -> multi_spa // on all implementations. It should be considered an experimental extension // to the standard GSL interface. template -constexpr auto as_multi_span(multi_span s) GSL_NOEXCEPT +constexpr auto as_multi_span(multi_span s) -> multi_span( multi_span::bounds_type::static_size != dynamic_range ? static_cast( @@ -1673,11 +1732,10 @@ constexpr auto as_multi_span(multi_span s) GSL_NOEXCEPT : dynamic_range)> { using ByteSpan = multi_span; - static_assert( - std::is_trivial>::value && - (ByteSpan::bounds_type::static_size == dynamic_range || - ByteSpan::bounds_type::static_size % static_cast(sizeof(U)) == 0), - "Target type must be a trivial type and its size must match the byte array size"); + static_assert(std::is_trivial>::value && + (ByteSpan::bounds_type::static_size == dynamic_range || + ByteSpan::bounds_type::static_size % sizeof(U) == 0), + "Target type must be a trivial type and its size must match the byte array size"); Expects((s.size_bytes() % sizeof(U)) == 0); return {reinterpret_cast(s.data()), @@ -1743,6 +1801,7 @@ constexpr auto as_multi_span(Cont&& arr) -> std::enable_if_t< // from basic_string which doesn't have nonconst .data() member like other contiguous containers template +GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute constexpr auto as_multi_span(std::basic_string& str) -> multi_span { @@ -1788,6 +1847,7 @@ public: Expects((bounds_.size() > 0 && ptr != nullptr) || bounds_.size() == 0); // Bounds cross data boundaries Expects(this->bounds().total_size() <= size); + GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: false positive (void) size; } @@ -1795,8 +1855,7 @@ public: template constexpr strided_span(value_type (&values)[N], bounds_type bounds) : strided_span(values, N, std::move(bounds)) - { - } + {} // from array view template > constexpr strided_span(multi_span av, bounds_type bounds) : strided_span(av.data(), av.bounds().total_size(), std::move(bounds)) - { - } + {} // convertible template ::value>> constexpr strided_span(const strided_span& other) : data_(other.data_), bounds_(other.bounds_) - { - } + {} // convert from bytes template @@ -1828,7 +1885,7 @@ public: "OtherValueType should have a size to contain a multiple of ValueTypes"); auto d = narrow_cast(sizeof(OtherValueType) / sizeof(value_type)); - size_type size = this->bounds().total_size() / d; + const size_type size = this->bounds().total_size() / d; return {const_cast(reinterpret_cast(this->data())), size, bounds_type{resize_extent(this->bounds().index_bounds(), d), @@ -1837,17 +1894,19 @@ public: constexpr strided_span section(index_type origin, index_type extents) const { - size_type size = this->bounds().total_size() - this->bounds().linearize(origin); + const size_type size = this->bounds().total_size() - this->bounds().linearize(origin); return {&this->operator[](origin), size, bounds_type{extents, details::make_stride(bounds())}}; } + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute constexpr reference operator[](const index_type& idx) const { return data_[bounds_.linearize(idx)]; } template 1), typename Ret = std::enable_if_t> + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute constexpr Ret operator[](size_type idx) const { Expects(idx < bounds_.size()); // index is out of bounds of the array @@ -1858,21 +1917,23 @@ public: return {data_ + ridx, bounds_.slice().total_size(), bounds_.slice()}; } - constexpr bounds_type bounds() const GSL_NOEXCEPT { return bounds_; } + constexpr bounds_type bounds() const noexcept { return bounds_; } template - constexpr size_type extent() const GSL_NOEXCEPT + constexpr size_type extent() const noexcept { static_assert(Dim < Rank, "dimension should be less than Rank (dimension count starts from 0)"); return bounds_.template extent(); } - constexpr size_type size() const GSL_NOEXCEPT { return bounds_.size(); } + constexpr size_type size() const noexcept { return bounds_.size(); } + + constexpr pointer data() const noexcept { return data_; } - constexpr pointer data() const GSL_NOEXCEPT { return data_; } + constexpr bool empty() const noexcept { return this->size() == 0; } - constexpr explicit operator bool() const GSL_NOEXCEPT { return data_ != nullptr; } + constexpr explicit operator bool() const noexcept { return data_ != nullptr; } constexpr iterator begin() const { return iterator{this, true}; } @@ -1897,56 +1958,50 @@ public: constexpr const_reverse_iterator crend() const { return const_reverse_iterator{cbegin()}; } template , std::remove_cv_t>::value>> - constexpr bool - operator==(const strided_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator==(const strided_span& other) const { return bounds_.size() == other.bounds_.size() && (data_ == other.data_ || std::equal(this->begin(), this->end(), other.begin())); } template , std::remove_cv_t>::value>> - constexpr bool - operator!=(const strided_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator!=(const strided_span& other) const { return !(*this == other); } template , std::remove_cv_t>::value>> - constexpr bool - operator<(const strided_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator<(const strided_span& other) const { return std::lexicographical_compare(this->begin(), this->end(), other.begin(), other.end()); } template , std::remove_cv_t>::value>> - constexpr bool - operator<=(const strided_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator<=(const strided_span& other) const { return !(other < *this); } template , std::remove_cv_t>::value>> - constexpr bool - operator>(const strided_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator>(const strided_span& other) const { return (other < *this); } template , std::remove_cv_t>::value>> - constexpr bool - operator>=(const strided_span& other) const GSL_NOEXCEPT + typename = std::enable_if_t, + std::remove_cv_t>::value>> + constexpr bool operator>=(const strided_span& other) const { return !(*this < other); } @@ -1955,6 +2010,7 @@ private: static index_type resize_extent(const index_type& extent, std::ptrdiff_t d) { // The last dimension of the array needs to contain a multiple of new type elements + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute Expects(extent[Rank - 1] >= d && (extent[Rank - 1] % d == 0)); index_type ret = extent; @@ -1967,12 +2023,14 @@ private: static index_type resize_stride(const index_type& strides, std::ptrdiff_t, void* = nullptr) { // Only strided arrays with regular strides can be resized + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute Expects(strides[Rank - 1] == 1); return strides; } template 1), typename = std::enable_if_t> + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute static index_type resize_stride(const index_type& strides, std::ptrdiff_t d) { // Only strided arrays with regular strides can be resized @@ -1981,7 +2039,8 @@ private: // memory that can contain a multiple of new type elements Expects(strides[Rank - 2] >= d && (strides[Rank - 2] % d == 0)); - for (std::size_t i = Rank - 1; i > 0; --i) { + for (std::size_t i = Rank - 1; i > 0; --i) + { // Only strided arrays with regular strides can be resized Expects((strides[i - 1] >= strides[i]) && (strides[i - 1] % strides[i] == 0)); } @@ -2009,96 +2068,98 @@ private: pointer data_; const Span* m_validator; - void validateThis() const - { + + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + void validateThis() const { // iterator is out of range of the array Expects(data_ >= m_validator->data_ && data_ < m_validator->data_ + m_validator->size()); } + + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute contiguous_span_iterator(const Span* container, bool isbegin) : data_(isbegin ? container->data_ : container->data_ + container->size()) , m_validator(container) - { - } + {} public: - reference operator*() const GSL_NOEXCEPT + reference operator*() const { validateThis(); return *data_; } - pointer operator->() const GSL_NOEXCEPT + pointer operator->() const { validateThis(); return data_; } - contiguous_span_iterator& operator++() GSL_NOEXCEPT + + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + contiguous_span_iterator& operator++() noexcept { ++data_; return *this; } - contiguous_span_iterator operator++(int) GSL_NOEXCEPT + contiguous_span_iterator operator++(int) noexcept { auto ret = *this; ++(*this); return ret; } - contiguous_span_iterator& operator--() GSL_NOEXCEPT + + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + contiguous_span_iterator& operator--() noexcept { --data_; return *this; } - contiguous_span_iterator operator--(int) GSL_NOEXCEPT + contiguous_span_iterator operator--(int) noexcept { auto ret = *this; --(*this); return ret; } - contiguous_span_iterator operator+(difference_type n) const GSL_NOEXCEPT + contiguous_span_iterator operator+(difference_type n) const noexcept { contiguous_span_iterator ret{*this}; return ret += n; } - contiguous_span_iterator& operator+=(difference_type n) GSL_NOEXCEPT + contiguous_span_iterator& operator+=(difference_type n) noexcept { data_ += n; return *this; } - contiguous_span_iterator operator-(difference_type n) const GSL_NOEXCEPT + contiguous_span_iterator operator-(difference_type n) const noexcept { contiguous_span_iterator ret{*this}; return ret -= n; } - contiguous_span_iterator& operator-=(difference_type n) GSL_NOEXCEPT { return *this += -n; } - difference_type operator-(const contiguous_span_iterator& rhs) const GSL_NOEXCEPT + + contiguous_span_iterator& operator-=(difference_type n) { return *this += -n; } + difference_type operator-(const contiguous_span_iterator& rhs) const { Expects(m_validator == rhs.m_validator); return data_ - rhs.data_; } - reference operator[](difference_type n) const GSL_NOEXCEPT { return *(*this + n); } - bool operator==(const contiguous_span_iterator& rhs) const GSL_NOEXCEPT + reference operator[](difference_type n) const { return *(*this + n); } + bool operator==(const contiguous_span_iterator& rhs) const { Expects(m_validator == rhs.m_validator); return data_ == rhs.data_; } - bool operator!=(const contiguous_span_iterator& rhs) const GSL_NOEXCEPT - { - return !(*this == rhs); - } - bool operator<(const contiguous_span_iterator& rhs) const GSL_NOEXCEPT + + bool operator!=(const contiguous_span_iterator& rhs) const { return !(*this == rhs); } + + bool operator<(const contiguous_span_iterator& rhs) const { Expects(m_validator == rhs.m_validator); return data_ < rhs.data_; } - bool operator<=(const contiguous_span_iterator& rhs) const GSL_NOEXCEPT - { - return !(rhs < *this); - } - bool operator>(const contiguous_span_iterator& rhs) const GSL_NOEXCEPT { return rhs < *this; } - bool operator>=(const contiguous_span_iterator& rhs) const GSL_NOEXCEPT - { - return !(rhs > *this); - } - void swap(contiguous_span_iterator& rhs) GSL_NOEXCEPT + + bool operator<=(const contiguous_span_iterator& rhs) const { return !(rhs < *this); } + bool operator>(const contiguous_span_iterator& rhs) const { return rhs < *this; } + bool operator>=(const contiguous_span_iterator& rhs) const { return !(rhs > *this); } + + void swap(contiguous_span_iterator& rhs) noexcept { std::swap(data_, rhs.data_); std::swap(m_validator, rhs.m_validator); @@ -2107,14 +2168,13 @@ public: template contiguous_span_iterator operator+(typename contiguous_span_iterator::difference_type n, - const contiguous_span_iterator& rhs) GSL_NOEXCEPT + const contiguous_span_iterator& rhs) noexcept { return rhs + n; } template -class general_span_iterator -{ +class general_span_iterator { public: using iterator_category = std::random_access_iterator_tag; using value_type = typename Span::value_type; @@ -2131,72 +2191,73 @@ private: general_span_iterator(const Span* container, bool isbegin) : m_container(container) , m_itr(isbegin ? m_container->bounds().begin() : m_container->bounds().end()) - { - } + {} public: - reference operator*() GSL_NOEXCEPT { return (*m_container)[*m_itr]; } - pointer operator->() GSL_NOEXCEPT { return &(*m_container)[*m_itr]; } - general_span_iterator& operator++() GSL_NOEXCEPT + reference operator*() noexcept { return (*m_container)[*m_itr]; } + pointer operator->() noexcept { return &(*m_container)[*m_itr]; } + general_span_iterator& operator++() noexcept { ++m_itr; return *this; } - general_span_iterator operator++(int) GSL_NOEXCEPT + general_span_iterator operator++(int) noexcept { auto ret = *this; ++(*this); return ret; } - general_span_iterator& operator--() GSL_NOEXCEPT + general_span_iterator& operator--() noexcept { --m_itr; return *this; } - general_span_iterator operator--(int) GSL_NOEXCEPT + general_span_iterator operator--(int) noexcept { auto ret = *this; --(*this); return ret; } - general_span_iterator operator+(difference_type n) const GSL_NOEXCEPT + general_span_iterator operator+(difference_type n) const noexcept { general_span_iterator ret{*this}; return ret += n; } - general_span_iterator& operator+=(difference_type n) GSL_NOEXCEPT + general_span_iterator& operator+=(difference_type n) noexcept { m_itr += n; return *this; } - general_span_iterator operator-(difference_type n) const GSL_NOEXCEPT + general_span_iterator operator-(difference_type n) const noexcept { general_span_iterator ret{*this}; return ret -= n; } - general_span_iterator& operator-=(difference_type n) GSL_NOEXCEPT { return *this += -n; } - difference_type operator-(const general_span_iterator& rhs) const GSL_NOEXCEPT + general_span_iterator& operator-=(difference_type n) noexcept { return *this += -n; } + difference_type operator-(const general_span_iterator& rhs) const { Expects(m_container == rhs.m_container); return m_itr - rhs.m_itr; } - value_type operator[](difference_type n) const GSL_NOEXCEPT { return (*m_container)[m_itr[n]]; } - bool operator==(const general_span_iterator& rhs) const GSL_NOEXCEPT + GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute + value_type operator[](difference_type n) const { return (*m_container)[m_itr[n]]; } + + bool operator==(const general_span_iterator& rhs) const { Expects(m_container == rhs.m_container); return m_itr == rhs.m_itr; } - bool operator!=(const general_span_iterator& rhs) const GSL_NOEXCEPT { return !(*this == rhs); } - bool operator<(const general_span_iterator& rhs) const GSL_NOEXCEPT + bool operator!=(const general_span_iterator& rhs) const { return !(*this == rhs); } + bool operator<(const general_span_iterator& rhs) const { Expects(m_container == rhs.m_container); return m_itr < rhs.m_itr; } - bool operator<=(const general_span_iterator& rhs) const GSL_NOEXCEPT { return !(rhs < *this); } - bool operator>(const general_span_iterator& rhs) const GSL_NOEXCEPT { return rhs < *this; } - bool operator>=(const general_span_iterator& rhs) const GSL_NOEXCEPT { return !(rhs > *this); } - void swap(general_span_iterator& rhs) GSL_NOEXCEPT + bool operator<=(const general_span_iterator& rhs) const { return !(rhs < *this); } + bool operator>(const general_span_iterator& rhs) const { return rhs < *this; } + bool operator>=(const general_span_iterator& rhs) const { return !(rhs > *this); } + void swap(general_span_iterator& rhs) noexcept { std::swap(m_itr, rhs.m_itr); std::swap(m_container, rhs.m_container); @@ -2205,15 +2266,13 @@ public: template general_span_iterator operator+(typename general_span_iterator::difference_type n, - const general_span_iterator& rhs) GSL_NOEXCEPT + const general_span_iterator& rhs) noexcept { return rhs + n; } } // namespace gsl -#undef GSL_NOEXCEPT - #ifdef _MSC_VER #if _MSC_VER < 1910 @@ -2225,4 +2284,8 @@ general_span_iterator operator+(typename general_span_iterator::diff #endif // _MSC_VER +#if __GNUC__ > 6 +#pragma GCC diagnostic pop +#endif // __GNUC__ > 6 + #endif // GSL_MULTI_SPAN_H diff --git a/src/gsl/pointers b/src/gsl/pointers index b2804a31..a3388561 100755 --- a/src/gsl/pointers +++ b/src/gsl/pointers @@ -72,7 +72,13 @@ public: static_assert(std::is_assignable::value, "T cannot be assigned nullptr."); template ::value>> - constexpr not_null(U&& u) : ptr_(std::forward(u)) + constexpr explicit not_null(U&& u) : ptr_(std::forward(u)) + { + Expects(ptr_ != nullptr); + } + + template ::value>> + constexpr explicit not_null(T u) : ptr_(u) { Expects(ptr_ != nullptr); } @@ -113,6 +119,11 @@ private: T ptr_; }; +template +auto make_not_null(T&& t) { + return gsl::not_null>>{std::forward(t)}; +} + template std::ostream& operator<<(std::ostream& os, const not_null& val) { diff --git a/src/gsl/span b/src/gsl/span index 6dd1c1f7..8cb3dbec 100755 --- a/src/gsl/span +++ b/src/gsl/span @@ -29,6 +29,7 @@ #include #include // for enable_if_t, declval, is_convertible, inte... #include +#include // for std::addressof #ifdef _MSC_VER #pragma warning(push) @@ -37,18 +38,17 @@ #pragma warning(disable : 4127) // conditional expression is constant #pragma warning(disable : 4702) // unreachable code -// blanket turn off warnings from CppCoreCheck for now -// so people aren't annoyed by them when running the tool. -// more targeted suppressions will be added in a future update to the GSL -#pragma warning(disable : 26481 26482 26483 26485 26490 26491 26492 26493 26495) +// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. +#pragma warning(disable : 26495) // uninitalized member when constructor calls constructor +#pragma warning(disable : 26446) // parser bug does not allow attributes on some templates #if _MSC_VER < 1910 #pragma push_macro("constexpr") #define constexpr /*constexpr*/ #define GSL_USE_STATIC_CONSTEXPR_WORKAROUND -#endif // _MSC_VER < 1910 -#else // _MSC_VER +#endif // _MSC_VER < 1910 +#endif // _MSC_VER // See if we have enough C++17 power to use a static constexpr data member // without needing an out-of-line definition @@ -56,7 +56,15 @@ #define GSL_USE_STATIC_CONSTEXPR_WORKAROUND #endif // !(defined(__cplusplus) && (__cplusplus >= 201703L)) -#endif // _MSC_VER +// GCC 7 does not like the signed unsigned missmatch (size_t ptrdiff_t) +// While there is a conversion from signed to unsigned, it happens at +// compiletime, so the compiler wouldn't have to warn indiscriminently, but +// could check if the source value actually doesn't fit into the target type +// and only warn in those cases. +#if __GNUC__ > 6 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#endif namespace gsl { @@ -119,7 +127,6 @@ namespace details using element_type_ = typename Span::element_type; public: - #ifdef _MSC_VER // Tell Microsoft standard library that span_iterators are checked. using _Unchecked_type = typename Span::pointer; @@ -139,12 +146,12 @@ namespace details {} friend span_iterator; - template* = nullptr> + template * = nullptr> constexpr span_iterator(const span_iterator& other) noexcept : span_iterator(other.span_, other.index_) - { - } + {} + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute constexpr reference operator*() const { Expects(index_ != span_->size()); @@ -191,6 +198,11 @@ namespace details return ret += n; } + friend constexpr span_iterator operator+(difference_type n, span_iterator const& rhs) + { + return rhs + n; + } + constexpr span_iterator& operator+=(difference_type n) { Expects((index_ + n) >= 0 && (index_ + n) <= span_->size()); @@ -212,68 +224,82 @@ namespace details return index_ - rhs.index_; } - constexpr reference operator[](difference_type n) const - { - return *(*this + n); - } + constexpr reference operator[](difference_type n) const { return *(*this + n); } - constexpr friend bool operator==(span_iterator lhs, - span_iterator rhs) noexcept + constexpr friend bool operator==(span_iterator lhs, span_iterator rhs) noexcept { return lhs.span_ == rhs.span_ && lhs.index_ == rhs.index_; } - constexpr friend bool operator!=(span_iterator lhs, - span_iterator rhs) noexcept + constexpr friend bool operator!=(span_iterator lhs, span_iterator rhs) noexcept { return !(lhs == rhs); } - constexpr friend bool operator<(span_iterator lhs, - span_iterator rhs) noexcept + constexpr friend bool operator<(span_iterator lhs, span_iterator rhs) noexcept { return lhs.index_ < rhs.index_; } - constexpr friend bool operator<=(span_iterator lhs, - span_iterator rhs) noexcept + constexpr friend bool operator<=(span_iterator lhs, span_iterator rhs) noexcept { return !(rhs < lhs); } - constexpr friend bool operator>(span_iterator lhs, - span_iterator rhs) noexcept + constexpr friend bool operator>(span_iterator lhs, span_iterator rhs) noexcept { return rhs < lhs; } - constexpr friend bool operator>=(span_iterator lhs, - span_iterator rhs) noexcept + constexpr friend bool operator>=(span_iterator lhs, span_iterator rhs) noexcept { return !(rhs > lhs); } +#ifdef _MSC_VER + // MSVC++ iterator debugging support; allows STL algorithms in 15.8+ + // to unwrap span_iterator to a pointer type after a range check in STL + // algorithm calls + friend constexpr void _Verify_range(span_iterator lhs, span_iterator rhs) noexcept + { // test that [lhs, rhs) forms a valid range inside an STL algorithm + Expects(lhs.span_ == rhs.span_ // range spans have to match + && lhs.index_ <= rhs.index_); // range must not be transposed + } + + constexpr void _Verify_offset(const difference_type n) const noexcept + { // test that the iterator *this + n is a valid range in an STL + // algorithm call + Expects((index_ + n) >= 0 && (index_ + n) <= span_->size()); + } + + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + constexpr pointer _Unwrapped() const noexcept + { // after seeking *this to a high water mark, or using one of the + // _Verify_xxx functions above, unwrap this span_iterator to a raw + // pointer + return span_->data() + index_; + } + + // Tell the STL that span_iterator should not be unwrapped if it can't + // validate in advance, even in release / optimized builds: +#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND) + static constexpr const bool _Unwrap_when_unverified = false; +#else + static constexpr bool _Unwrap_when_unverified = false; +#endif + GSL_SUPPRESS(con.3) // NO-FORMAT: attribute // TODO: false positive + constexpr void _Seek_to(const pointer p) noexcept + { // adjust the position of *this to previously verified location p + // after _Unwrapped + index_ = p - span_->data(); + } +#endif + protected: const Span* span_ = nullptr; std::ptrdiff_t index_ = 0; }; - template - constexpr span_iterator - operator+(typename span_iterator::difference_type n, - span_iterator rhs) - { - return rhs + n; - } - - template - constexpr span_iterator - operator-(typename span_iterator::difference_type n, - span_iterator rhs) - { - return rhs - n; - } - template class extent_type { @@ -305,8 +331,7 @@ namespace details template explicit constexpr extent_type(extent_type ext) : size_(ext.size()) - { - } + {} explicit constexpr extent_type(index_type size) : size_(size) { Expects(size >= 0); } @@ -319,7 +344,9 @@ namespace details template struct calculate_subspan_type { - using type = span; + using type = span; }; } // namespace details @@ -343,9 +370,9 @@ public: using size_type = index_type; #if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND) - static constexpr const index_type extent { Extent }; + static constexpr const index_type extent{Extent}; #else - static constexpr index_type extent { Extent }; + static constexpr index_type extent{Extent}; #endif // [span.cons], span constructors, copy, assignment, and destructor @@ -354,33 +381,30 @@ public: // since "std::enable_if_t" is ill-formed when Extent is greater than 0. class = std::enable_if_t<(Dependent || Extent <= 0)>> constexpr span() noexcept : storage_(nullptr, details::extent_type<0>()) - { - } + {} constexpr span(pointer ptr, index_type count) : storage_(ptr, count) {} constexpr span(pointer firstElem, pointer lastElem) : storage_(firstElem, std::distance(firstElem, lastElem)) - { - } + {} template constexpr span(element_type (&arr)[N]) noexcept - : storage_(KnownNotNull{&arr[0]}, details::extent_type()) - { - } + : storage_(KnownNotNull{std::addressof(arr[0])}, details::extent_type()) + {} template > + // GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute // TODO: parser bug constexpr span(std::array& arr) noexcept - : storage_(&arr[0], details::extent_type()) - { - } + : storage_(arr.data(), details::extent_type()) + {} template + // GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute // TODO: parser bug constexpr span(const std::array, N>& arr) noexcept - : storage_(&arr[0], details::extent_type()) - { - } + : storage_(arr.data(), details::extent_type()) + {} // NB: the SFINAE here uses .data() as a incomplete/imperfect proxy for the requirement // on Container to be a contiguous sequence container. @@ -391,8 +415,7 @@ public: std::is_convertible().data())>::value>> constexpr span(Container& cont) : span(cont.data(), narrow(cont.size())) - { - } + {} template ().data())>::value>> constexpr span(const Container& cont) : span(cont.data(), narrow(cont.size())) - { - } + {} constexpr span(const span& other) noexcept = default; @@ -413,12 +435,11 @@ public: details::is_allowed_element_type_conversion::value>> constexpr span(const span& other) : storage_(other.data(), details::extent_type(other.size())) - { - } + {} ~span() noexcept = default; constexpr span& operator=(const span& other) noexcept = default; - + // [span.sub], span subviews template constexpr span first() const @@ -428,6 +449,7 @@ public: } template + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute constexpr span last() const { Expects(Count >= 0 && size() - Count >= 0); @@ -435,7 +457,9 @@ public: } template - constexpr auto subspan() const -> typename details::calculate_subspan_type::type + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + constexpr auto subspan() const -> + typename details::calculate_subspan_type::type { Expects((Offset >= 0 && size() - Offset >= 0) && (Count == dynamic_extent || (Count >= 0 && Offset + Count <= size()))); @@ -460,7 +484,6 @@ public: return make_subspan(offset, count, subspan_selector{}); } - // [span.obs], span observers constexpr index_type size() const noexcept { return storage_.size(); } constexpr index_type size_bytes() const noexcept @@ -470,9 +493,10 @@ public: constexpr bool empty() const noexcept { return size() == 0; } // [span.elem], span element access + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute constexpr reference operator[](index_type idx) const { - Expects(idx >= 0 && idx < storage_.size()); + Expects(CheckRange(idx, storage_.size())); return data()[idx]; } @@ -490,13 +514,50 @@ public: constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; } constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; } - constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator{cend()}; } - constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator{cbegin()}; } + constexpr const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator{cend()}; + } + constexpr const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator{cbegin()}; + } + +#ifdef _MSC_VER + // Tell MSVC how to unwrap spans in range-based-for + constexpr pointer _Unchecked_begin() const noexcept { return data(); } + constexpr pointer _Unchecked_end() const noexcept + { + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + return data() + size(); + } +#endif // _MSC_VER private: + static bool CheckRange(index_type idx, index_type size) + { + // Optimization: + // + // idx >= 0 && idx < size + // => + // static_cast(idx) < static_cast(size) + // + // because size >=0 by span construction, and negative idx will + // wrap around to a value always greater than size when casted. + + // check if we have enough space to wrap around + if (sizeof(index_type) <= sizeof(size_t)) + { + return narrow_cast(idx) < narrow_cast(size); + } + else + { + return idx >= 0 && idx < size; + } + } // Needed to remove unnecessary null check in subspans - struct KnownNotNull + struct KnownNotNull { pointer p; }; @@ -508,20 +569,20 @@ private: class storage_type : public ExtentType { public: - // KnownNotNull parameter is needed to remove unnecessary null check + // KnownNotNull parameter is needed to remove unnecessary null check // in subspans and constructors from arrays template - constexpr storage_type(KnownNotNull data, OtherExtentType ext) : ExtentType(ext), data_(data.p) + constexpr storage_type(KnownNotNull data, OtherExtentType ext) + : ExtentType(ext), data_(data.p) { - Expects(ExtentType::size() >= 0); + Expects(ExtentType::size() >= 0); } - template constexpr storage_type(pointer data, OtherExtentType ext) : ExtentType(ext), data_(data) { - Expects(ExtentType::size() >= 0); - Expects(data || ExtentType::size() == 0); + Expects(ExtentType::size() >= 0); + Expects(data || ExtentType::size() == 0); } constexpr pointer data() const noexcept { return data_; } @@ -537,29 +598,28 @@ private: constexpr span(KnownNotNull ptr, index_type count) : storage_(ptr, count) {} template - class subspan_selector {}; + class subspan_selector + { + }; template - span make_subspan(index_type offset, - index_type count, + span make_subspan(index_type offset, index_type count, subspan_selector) const { - span tmp(*this); + const span tmp(*this); return tmp.subspan(offset, count); } - span make_subspan(index_type offset, - index_type count, + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + span make_subspan(index_type offset, index_type count, subspan_selector) const { Expects(offset >= 0 && size() - offset >= 0); - if (count == dynamic_extent) - { - return { KnownNotNull{ data() + offset }, size() - offset }; - } + + if (count == dynamic_extent) { return {KnownNotNull{data() + offset}, size() - offset}; } Expects(count >= 0 && size() - offset >= count); - return { KnownNotNull{ data() + offset }, count }; + return {KnownNotNull{data() + offset}, count}; } }; @@ -568,46 +628,39 @@ template constexpr const typename span::index_type span::extent; #endif - // [span.comparison], span comparison operators template -constexpr bool operator==(span l, - span r) +constexpr bool operator==(span l, span r) { return std::equal(l.begin(), l.end(), r.begin(), r.end()); } template -constexpr bool operator!=(span l, - span r) +constexpr bool operator!=(span l, span r) { return !(l == r); } template -constexpr bool operator<(span l, - span r) +constexpr bool operator<(span l, span r) { return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); } template -constexpr bool operator<=(span l, - span r) +constexpr bool operator<=(span l, span r) { return !(l > r); } template -constexpr bool operator>(span l, - span r) +constexpr bool operator>(span l, span r) { return r < l; } template -constexpr bool operator>=(span l, - span r) +constexpr bool operator>=(span l, span r) { return !(l < r); } @@ -633,13 +686,14 @@ namespace details : std::integral_constant { }; -} +} // namespace details // [span.objectrep], views of object representation template span::value> as_bytes(span s) noexcept { + GSL_SUPPRESS(type.1) // NO-FORMAT: attribute return {reinterpret_cast(s.data()), s.size_bytes()}; } @@ -648,6 +702,7 @@ template ::value> as_writeable_bytes(span s) noexcept { + GSL_SUPPRESS(type.1) // NO-FORMAT: attribute return {reinterpret_cast(s.data()), s.size_bytes()}; } @@ -655,7 +710,8 @@ as_writeable_bytes(span s) noexcept // make_span() - Utility functions for creating spans // template -constexpr span make_span(ElementType* ptr, typename span::index_type count) +constexpr span make_span(ElementType* ptr, + typename span::index_type count) { return span(ptr, count); } @@ -716,4 +772,8 @@ constexpr ElementType& at(span s, index i) #pragma warning(pop) #endif // _MSC_VER +#if __GNUC__ > 6 +#pragma GCC diagnostic pop +#endif // __GNUC__ > 6 + #endif // GSL_SPAN_H diff --git a/src/gsl/string_span b/src/gsl/string_span index 0bb98d21..d298039c 100755 --- a/src/gsl/string_span +++ b/src/gsl/string_span @@ -20,6 +20,7 @@ #include // for Ensures, Expects #include // for narrow_cast #include // for operator!=, operator==, dynamic_extent +#include // for not_null #include // for equal, lexicographical_compare #include // for array @@ -32,10 +33,9 @@ #ifdef _MSC_VER #pragma warning(push) -// blanket turn off warnings from CppCoreCheck for now -// so people aren't annoyed by them when running the tool. -// more targeted suppressions will be added in a future update to the GSL -#pragma warning(disable : 26481 26482 26483 26485 26490 26491 26492 26493 26495) +// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. +#pragma warning(disable : 26446) // TODO: bug in parser - attributes and templates +#pragma warning(disable : 26481) // TODO: suppress does not work inside templates sometimes #if _MSC_VER < 1910 #pragma push_macro("constexpr") @@ -44,13 +44,6 @@ #endif // _MSC_VER < 1910 #endif // _MSC_VER -// In order to test the library, we need it to throw exceptions that we can catch -#ifdef GSL_THROW_ON_CONTRACT_VIOLATION -#define GSL_NOEXCEPT /*noexcept*/ -#else -#define GSL_NOEXCEPT noexcept -#endif // GSL_THROW_ON_CONTRACT_VIOLATION - namespace gsl { // @@ -105,7 +98,7 @@ namespace details return len; } -} +} // namespace details // // ensure_sentinel() @@ -118,7 +111,13 @@ namespace details template span ensure_sentinel(T* seq, std::ptrdiff_t max = PTRDIFF_MAX) { + Ensures(seq != nullptr); + + GSL_SUPPRESS(f.23) // NO-FORMAT: attribute // TODO: false positive // TODO: suppress does not work auto cur = seq; + Ensures(cur != nullptr); // workaround for removing the warning + + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute // TODO: suppress does not work while ((cur - seq) < max && *cur != Sentinel) ++cur; Ensures(*cur == Sentinel); return {seq, cur - seq}; @@ -138,21 +137,20 @@ span ensure_z(CharT* const& sz, std::ptrdiff_t max = PTRD template span ensure_z(CharT (&sz)[N]) { - return ensure_z(&sz[0], static_cast(N)); + return ensure_z(&sz[0], narrow_cast(N)); } template span::type, dynamic_extent> ensure_z(Cont& cont) { - return ensure_z(cont.data(), static_cast(cont.size())); + return ensure_z(cont.data(), narrow_cast(cont.size())); } template class basic_string_span; -namespace details -{ +namespace details { template struct is_basic_string_span_oracle : std::false_type { @@ -167,7 +165,7 @@ namespace details struct is_basic_string_span : is_basic_string_span_oracle> { }; -} +} // namespace details // // string_span and relatives @@ -189,13 +187,13 @@ public: using const_reverse_iterator = typename impl_type::const_reverse_iterator; // default (empty) - constexpr basic_string_span() GSL_NOEXCEPT = default; + constexpr basic_string_span() noexcept = default; // copy - constexpr basic_string_span(const basic_string_span& other) GSL_NOEXCEPT = default; + constexpr basic_string_span(const basic_string_span& other) noexcept = default; // assign - constexpr basic_string_span& operator=(const basic_string_span& other) GSL_NOEXCEPT = default; + constexpr basic_string_span& operator=(const basic_string_span& other) noexcept = default; constexpr basic_string_span(pointer ptr, index_type length) : span_(ptr, length) {} constexpr basic_string_span(pointer firstElem, pointer lastElem) : span_(firstElem, lastElem) {} @@ -204,32 +202,27 @@ public: // All other containers allow 0s within the length, so we do not remove them template constexpr basic_string_span(element_type (&arr)[N]) : span_(remove_z(arr)) - { - } + {} template > - constexpr basic_string_span(std::array& arr) GSL_NOEXCEPT : span_(arr) - { - } + constexpr basic_string_span(std::array& arr) noexcept : span_(arr) + {} template > - constexpr basic_string_span(const std::array& arr) GSL_NOEXCEPT - : span_(arr) - { - } + constexpr basic_string_span(const std::array& arr) noexcept : span_(arr) + {} // Container signature should work for basic_string after C++17 version exists template + // GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute // TODO: parser bug constexpr basic_string_span(std::basic_string& str) : span_(&str[0], narrow_cast(str.length())) - { - } + {} template constexpr basic_string_span(const std::basic_string& str) : span_(&str[0], str.length()) - { - } + {} // from containers. Containers must have a pointer type and data() function signatures template ().data())>::value>> constexpr basic_string_span(Container& cont) : span_(cont) - { - } + {} template ().data())>::value>> constexpr basic_string_span(const Container& cont) : span_(cont) - { - } + {} // from string_span template < @@ -259,8 +250,7 @@ public: typename basic_string_span::impl_type, impl_type>::value>> constexpr basic_string_span(basic_string_span other) : span_(other.data(), other.length()) - { - } + {} template constexpr basic_string_span first() const @@ -301,23 +291,23 @@ public: constexpr pointer data() const { return span_.data(); } - constexpr index_type length() const GSL_NOEXCEPT { return span_.size(); } - constexpr index_type size() const GSL_NOEXCEPT { return span_.size(); } - constexpr index_type size_bytes() const GSL_NOEXCEPT { return span_.size_bytes(); } - constexpr index_type length_bytes() const GSL_NOEXCEPT { return span_.length_bytes(); } - constexpr bool empty() const GSL_NOEXCEPT { return size() == 0; } + constexpr index_type length() const noexcept { return span_.size(); } + constexpr index_type size() const noexcept { return span_.size(); } + constexpr index_type size_bytes() const noexcept { return span_.size_bytes(); } + constexpr index_type length_bytes() const noexcept { return span_.length_bytes(); } + constexpr bool empty() const noexcept { return size() == 0; } - constexpr iterator begin() const GSL_NOEXCEPT { return span_.begin(); } - constexpr iterator end() const GSL_NOEXCEPT { return span_.end(); } + constexpr iterator begin() const noexcept { return span_.begin(); } + constexpr iterator end() const noexcept { return span_.end(); } - constexpr const_iterator cbegin() const GSL_NOEXCEPT { return span_.cbegin(); } - constexpr const_iterator cend() const GSL_NOEXCEPT { return span_.cend(); } + constexpr const_iterator cbegin() const noexcept { return span_.cbegin(); } + constexpr const_iterator cend() const noexcept { return span_.cend(); } - constexpr reverse_iterator rbegin() const GSL_NOEXCEPT { return span_.rbegin(); } - constexpr reverse_iterator rend() const GSL_NOEXCEPT { return span_.rend(); } + constexpr reverse_iterator rbegin() const noexcept { return span_.rbegin(); } + constexpr reverse_iterator rend() const noexcept { return span_.rend(); } - constexpr const_reverse_iterator crbegin() const GSL_NOEXCEPT { return span_.crbegin(); } - constexpr const_reverse_iterator crend() const GSL_NOEXCEPT { return span_.crend(); } + constexpr const_reverse_iterator crbegin() const noexcept { return span_.crbegin(); } + constexpr const_reverse_iterator crend() const noexcept { return span_.crend(); } private: static impl_type remove_z(pointer const& sz, std::ptrdiff_t max) @@ -366,21 +356,37 @@ template std::basic_string::type> to_string(basic_string_span view) { - return {view.data(), static_cast(view.length())}; + return {view.data(), narrow_cast(view.length())}; } template , typename Allocator = std::allocator, typename gCharT, std::ptrdiff_t Extent> std::basic_string to_basic_string(basic_string_span view) { - return {view.data(), static_cast(view.length())}; + return {view.data(), narrow_cast(view.length())}; +} + +template +basic_string_span::value> +as_bytes(basic_string_span s) noexcept +{ + GSL_SUPPRESS(type.1) // NO-FORMAT: attribute + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +template ::value>> +basic_string_span::value> +as_writeable_bytes(basic_string_span s) noexcept +{ + GSL_SUPPRESS(type.1) // NO-FORMAT: attribute + return {reinterpret_cast(s.data()), s.size_bytes()}; } // zero-terminated string span, used to convert // zero-terminated spans to legacy strings template -class basic_zstring_span -{ +class basic_zstring_span { public: using value_type = CharT; using const_value_type = std::add_const_t; @@ -394,7 +400,7 @@ public: using impl_type = span; using string_span_type = basic_string_span; - constexpr basic_zstring_span(impl_type s) GSL_NOEXCEPT : span_(s) + constexpr basic_zstring_span(impl_type s) : span_(s) { // expects a zero-terminated span Expects(s[s.size() - 1] == '\0'); @@ -412,16 +418,16 @@ public: // move assign constexpr basic_zstring_span& operator=(basic_zstring_span&& other) = default; - constexpr bool empty() const GSL_NOEXCEPT { return span_.size() == 0; } + constexpr bool empty() const noexcept { return span_.size() == 0; } - constexpr string_span_type as_string_span() const GSL_NOEXCEPT + constexpr string_span_type as_string_span() const noexcept { - auto sz = span_.size(); - return { span_.data(), sz > 1 ? sz - 1 : 0 }; + const auto sz = span_.size(); + return {span_.data(), sz > 1 ? sz - 1 : 0}; } - constexpr string_span_type ensure_z() const GSL_NOEXCEPT { return gsl::ensure_z(span_); } + constexpr string_span_type ensure_z() const { return gsl::ensure_z(span_); } - constexpr const_zstring_type assume_z() const GSL_NOEXCEPT { return span_.data(); } + constexpr const_zstring_type assume_z() const noexcept { return span_.data(); } private: impl_type span_; @@ -456,7 +462,7 @@ template ::value || std::is_convertible>>::value>> -bool operator==(const gsl::basic_string_span& one, const T& other) GSL_NOEXCEPT +bool operator==(const gsl::basic_string_span& one, const T& other) { const gsl::basic_string_span> tmp(other); return std::equal(one.begin(), one.end(), tmp.begin(), tmp.end()); @@ -466,9 +472,9 @@ template ::value && std::is_convertible>>::value>> -bool operator==(const T& one, const gsl::basic_string_span& other) GSL_NOEXCEPT +bool operator==(const T& one, const gsl::basic_string_span& other) { - gsl::basic_string_span> tmp(one); + const gsl::basic_string_span> tmp(one); return std::equal(tmp.begin(), tmp.end(), other.begin(), other.end()); } @@ -476,7 +482,7 @@ bool operator==(const T& one, const gsl::basic_string_span& other template , Extent>>::value>> -bool operator!=(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator!=(gsl::basic_string_span one, const T& other) { return !(one == other); } @@ -486,7 +492,7 @@ template < typename = std::enable_if_t< std::is_convertible, Extent>>::value && !gsl::details::is_basic_string_span::value>> -bool operator!=(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator!=(const T& one, gsl::basic_string_span other) { return !(one == other); } @@ -495,7 +501,7 @@ bool operator!=(const T& one, gsl::basic_string_span other) GSL_N template , Extent>>::value>> -bool operator<(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator<(gsl::basic_string_span one, const T& other) { const gsl::basic_string_span, Extent> tmp(other); return std::lexicographical_compare(one.begin(), one.end(), tmp.begin(), tmp.end()); @@ -506,7 +512,7 @@ template < typename = std::enable_if_t< std::is_convertible, Extent>>::value && !gsl::details::is_basic_string_span::value>> -bool operator<(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator<(const T& one, gsl::basic_string_span other) { gsl::basic_string_span, Extent> tmp(one); return std::lexicographical_compare(tmp.begin(), tmp.end(), other.begin(), other.end()); @@ -525,7 +531,7 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator<(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator<(gsl::basic_string_span one, const T& other) { gsl::basic_string_span, Extent> tmp(other); return std::lexicographical_compare(one.begin(), one.end(), tmp.begin(), tmp.end()); @@ -539,7 +545,7 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator<(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator<(const T& one, gsl::basic_string_span other) { gsl::basic_string_span, Extent> tmp(one); return std::lexicographical_compare(tmp.begin(), tmp.end(), other.begin(), other.end()); @@ -550,7 +556,7 @@ bool operator<(const T& one, gsl::basic_string_span other) GSL_NO template , Extent>>::value>> -bool operator<=(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator<=(gsl::basic_string_span one, const T& other) { return !(other < one); } @@ -560,7 +566,7 @@ template < typename = std::enable_if_t< std::is_convertible, Extent>>::value && !gsl::details::is_basic_string_span::value>> -bool operator<=(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator<=(const T& one, gsl::basic_string_span other) { return !(other < one); } @@ -578,7 +584,7 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator<=(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator<=(gsl::basic_string_span one, const T& other) { return !(other < one); } @@ -591,7 +597,7 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator<=(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator<=(const T& one, gsl::basic_string_span other) { return !(other < one); } @@ -601,7 +607,7 @@ bool operator<=(const T& one, gsl::basic_string_span other) GSL_N template , Extent>>::value>> -bool operator>(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator>(gsl::basic_string_span one, const T& other) { return other < one; } @@ -611,7 +617,7 @@ template < typename = std::enable_if_t< std::is_convertible, Extent>>::value && !gsl::details::is_basic_string_span::value>> -bool operator>(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator>(const T& one, gsl::basic_string_span other) { return other < one; } @@ -629,7 +635,7 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator>(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator>(gsl::basic_string_span one, const T& other) { return other < one; } @@ -642,7 +648,7 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator>(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator>(const T& one, gsl::basic_string_span other) { return other < one; } @@ -652,7 +658,7 @@ bool operator>(const T& one, gsl::basic_string_span other) GSL_NO template , Extent>>::value>> -bool operator>=(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator>=(gsl::basic_string_span one, const T& other) { return !(one < other); } @@ -662,7 +668,7 @@ template < typename = std::enable_if_t< std::is_convertible, Extent>>::value && !gsl::details::is_basic_string_span::value>> -bool operator>=(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator>=(const T& one, gsl::basic_string_span other) { return !(one < other); } @@ -680,7 +686,7 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator>=(gsl::basic_string_span one, const T& other) GSL_NOEXCEPT +bool operator>=(gsl::basic_string_span one, const T& other) { return !(one < other); } @@ -693,14 +699,12 @@ template < std::is_convertible::value && std::is_same().size(), *std::declval().data())>, DataType>::value>> -bool operator>=(const T& one, gsl::basic_string_span other) GSL_NOEXCEPT +bool operator>=(const T& one, gsl::basic_string_span other) { return !(one < other); } #endif -} // namespace GSL - -#undef GSL_NOEXCEPT +} // namespace gsl #ifdef _MSC_VER #pragma warning(pop) diff --git a/src/sfeMovie/AudioStream.cpp b/src/sfeMovie/AudioStream.cpp index aacc6c56..9f86dd14 100755 --- a/src/sfeMovie/AudioStream.cpp +++ b/src/sfeMovie/AudioStream.cpp @@ -1,4 +1,3 @@ - /* * AudioStream.cpp * sfeMovie project @@ -24,476 +23,491 @@ extern "C" { -#include #include -#include -#include +#include #include +#include +#include #include } -#include -#include #include "AudioStream.hpp" +#include #include -#include "Utilities.hpp" namespace sfe { - namespace - { - void waitForStatusUpdate(const sf::SoundStream& stream, sf::SoundStream::Status expectedStatus) - { - // Wait for status to update - sf::Clock timeout; - while (stream.getStatus() != expectedStatus && timeout.getElapsedTime() < sf::seconds(5)) - sf::sleep(sf::microseconds(10)); - CHECK(timeout.getElapsedTime() < sf::seconds(5), "Audio did not reach state " + s(expectedStatus) + " within 5 seconds"); - } - - const int BytesPerSample = sizeof(sf::Int16); // Signed 16 bits audio sample - } - - AudioStream::AudioStream(AVFormatContext*& formatCtx, AVStream*& stream, DataSource& dataSource, - std::shared_ptr timer) : - Stream(formatCtx, stream, dataSource, timer), - - // Public properties - m_sampleRatePerChannel(0), - - // Private data - m_samplesBuffer(nullptr), - m_audioFrame(nullptr), - - // Resampling - m_swrCtx(nullptr), - m_dstNbSamples(0), - m_maxDstNbSamples(0), - m_dstNbChannels(0), - m_dstLinesize(0), - m_dstData(nullptr) - { - m_audioFrame = av_frame_alloc(); - CHECK(m_audioFrame, "AudioStream::AudioStream() - out of memory"); - - // Get some audio informations + namespace + { + void waitForStatusUpdate(const sf::SoundStream& stream, sf::SoundStream::Status expectedStatus) + { + // Wait for status to update + sf::Clock timeout; + while (stream.getStatus() != expectedStatus && + timeout.getElapsedTime() < sf::seconds(5)) + { + sf::sleep(sf::microseconds(10)); + } + } + + constexpr int BytesPerSample = sizeof(sf::Int16); // Signed 16 bits audio sample + } + + AudioStream::AudioStream(AVFormatContext*& formatCtx, AVStream*& stream, + DataSource& dataSource, Timer* timer) : + Stream(formatCtx, stream, dataSource, timer) + { + if (Stream::hasError() == true) + { + return; + } + + m_audioFrame = av_frame_alloc(); + if (m_audioFrame == nullptr) + { + return; + } + + // Get some audio informations #if LIBAVFORMAT_VERSION_MAJOR > 56 - m_sampleRatePerChannel = m_stream->codecpar->sample_rate; + m_sampleRatePerChannel = m_stream->codecpar->sample_rate; #else - m_sampleRatePerChannel = m_stream->codec->sample_rate; + m_sampleRatePerChannel = m_stream->codec->sample_rate; #endif - - // Alloc a two seconds buffer - m_samplesBuffer = (sf::Int16*)av_malloc(sizeof(sf::Int16) * av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO) - * m_sampleRatePerChannel * 2); // * 2 is for 2 seconds - CHECK(m_samplesBuffer, "AudioStream::AudioStream() - out of memory"); - - // Initialize the sf::SoundStream - // Whatever the channel count is, it'll we resampled to stereo - sf::SoundStream::initialize(av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO), m_sampleRatePerChannel); - - // Initialize resampler to be able to give signed 16 bits samples to SFML - initResampler(); - } - - /** Default destructor - */ - AudioStream::~AudioStream() - { - if (m_audioFrame) - { - av_frame_free(&m_audioFrame); - } - - if (m_samplesBuffer) - { - av_free(m_samplesBuffer); - } - - if (m_dstData) - { - av_freep(&m_dstData[0]); - } - av_freep(&m_dstData); - - swr_free(&m_swrCtx); - } - - void AudioStream::flushBuffers() - { - sf::SoundStream::Status sfStatus = sf::SoundStream::getStatus(); - CHECK (sfStatus != sf::SoundStream::Playing, "Trying to flush while audio is playing, this will introduce an audio glitch!"); - - // Flush audio driver/OpenAL/SFML buffer - if (sfStatus != sf::SoundStream::Stopped) - sf::SoundStream::stop(); - - m_extraAudioTime = sf::Time::Zero; - Stream::flushBuffers(); - } - - MediaType AudioStream::getStreamKind() const - { - return Audio; - } - - void AudioStream::update() - { - sf::SoundStream::Status sfStatus = sf::SoundStream::getStatus(); - - switch (sfStatus) - { - case sf::SoundStream::Playing: - setStatus(sfe::Playing); - break; - - case sf::SoundStream::Paused: - setStatus(sfe::Paused); - break; - - case sf::SoundStream::Stopped: - setStatus(sfe::Stopped); - break; - - default: - break; - } - } - - bool AudioStream::fastForward(sf::Time targetPosition) - { - sf::Time currentPosition; - sf::Time pktDuration; - - do - { - if (! computeEncodedPosition(currentPosition)) - { - return false; - } - - AVPacket* packet = popEncodedData(); - - if (! packet) - { - return false; - } - - pktDuration = packetDuration(packet); - - if (currentPosition > targetPosition) - { - // Computations with packet duration and stream position are not always very accurate so - // this can happen some times. In such cases, the different is very small (less than 1ms) - // so we just accept it - - m_extraAudioTime = sf::Time::Zero; - - // Reinsert, we don't want to decode now - prependEncodedData(packet); - } - else if (currentPosition + pktDuration > targetPosition) - { - // Reinsert, we don't want to decode now - prependEncodedData(packet); - m_extraAudioTime = targetPosition - currentPosition; - - CHECK(m_extraAudioTime > sf::Time::Zero, "inconcistency error"); - CHECK(m_extraAudioTime <= pktDuration, "Should have discarded a full packet"); - } - else - { + + // Alloc a two seconds buffer + m_samplesBuffer = (sf::Int16*)av_malloc(sizeof(sf::Int16) * av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO) + * m_sampleRatePerChannel * 2); // * 2 is for 2 seconds + if (m_samplesBuffer == nullptr) + { + return; + } + + // Initialize the sf::SoundStream + // Whatever the channel count is, it'll we resampled to stereo + sf::SoundStream::initialize(av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO), m_sampleRatePerChannel); + + // Initialize resampler to be able to give signed 16 bits samples to SFML + initResampler(); + } + + /** Default destructor + */ + AudioStream::~AudioStream() + { + if (m_audioFrame != nullptr) + { + av_frame_free(&m_audioFrame); + } + if (m_samplesBuffer != nullptr) + { + av_free(m_samplesBuffer); + } + if (m_dstData != nullptr) + { + av_freep(&m_dstData[0]); + } + av_freep(&m_dstData); + swr_free(&m_swrCtx); + } + + bool AudioStream::hasError() const noexcept + { + if (Stream::hasError() == true || + m_audioFrame == nullptr || + m_samplesBuffer == nullptr || + m_swrCtx == nullptr) + { + return true; + } + return false; + } + + void AudioStream::flushBuffers() + { + auto sfStatus = sf::SoundStream::getStatus(); + if (sfStatus == sf::SoundStream::Playing) + { + return; + } + // Flush audio driver/OpenAL/SFML buffer + if (sfStatus != sf::SoundStream::Stopped) + { + sf::SoundStream::stop(); + } + m_extraAudioTime = sf::Time::Zero; + Stream::flushBuffers(); + } + + MediaType AudioStream::getStreamKind() const + { + return Audio; + } + + void AudioStream::update() + { + switch (sf::SoundStream::getStatus()) + { + case sf::SoundStream::Playing: + setStatus(sfe::Playing); + break; + case sf::SoundStream::Paused: + setStatus(sfe::Paused); + break; + case sf::SoundStream::Stopped: + setStatus(sfe::Stopped); + break; + default: + break; + } + } + + bool AudioStream::fastForward(sf::Time targetPosition) + { + sf::Time currentPosition; + sf::Time pktDuration; + + do + { + if (computeEncodedPosition(currentPosition) == false) + { + return false; + } + + AVPacket* packet = popEncodedData(); + + if (packet == nullptr) + { + return false; + } + + pktDuration = packetDuration(packet); + + if (currentPosition > targetPosition) + { + // Computations with packet duration and stream position are not always very accurate so + // this can happen some times. In such cases, the different is very small (less than 1ms) + // so we just accept it + + m_extraAudioTime = sf::Time::Zero; + + // Reinsert, we don't want to decode now + prependEncodedData(packet); + } + else if (currentPosition + pktDuration > targetPosition) + { + // Reinsert, we don't want to decode now + prependEncodedData(packet); + m_extraAudioTime = targetPosition - currentPosition; + } + else + { #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(packet); + av_packet_unref(packet); #else - av_free_packet(packet); + av_free_packet(packet); #endif - av_free(packet); - } - } - while (currentPosition + pktDuration <= targetPosition); - - return true; - } - - bool AudioStream::onGetData(sf::SoundStream::Chunk& data) - { - AVPacket* packet = nullptr; - data.samples = m_samplesBuffer; - - const int stereoChannelCount = av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); - - while (data.sampleCount < stereoChannelCount * m_sampleRatePerChannel && - (nullptr != (packet = popEncodedData()))) - { - bool needsMoreDecoding = false; - bool gotFrame = false; - - do - { - needsMoreDecoding = decodePacket(packet, m_audioFrame, gotFrame); - - if (gotFrame) - { - uint8_t* samplesBuffer = nullptr; - int samplesCount = 0; - - resampleFrame(m_audioFrame, samplesBuffer, samplesCount); - CHECK(samplesBuffer, "AudioStream::onGetData() - resampleFrame() error"); - CHECK(samplesCount > 0, "AudioStream::onGetData() - resampleFrame() error"); - CHECK(samplesToTime(data.sampleCount + samplesCount) < sf::seconds(2), - "AudioStream::onGetData() - Going to overflow!!"); - - if (m_extraAudioTime > sf::Time::Zero) - { - int samplesToDiscard = timeToSamples(m_extraAudioTime); - if (samplesToDiscard > samplesCount) - { - samplesToDiscard = samplesCount; - } - - if (samplesToDiscard < stereoChannelCount && samplesCount > 0) - { - m_extraAudioTime = sf::Time::Zero; - } - else - { - CHECK(((samplesToDiscard / std::max(samplesCount, samplesToDiscard)) - - (m_extraAudioTime.asMicroseconds() - / samplesToTime(samplesCount).asMicroseconds())) - < 0.1, - "It looks like an invalid amount of audio samples was discarded, " - "please report this bug"); - - samplesBuffer += samplesToDiscard * BytesPerSample; - samplesCount -= samplesToDiscard; - - m_extraAudioTime -= samplesToTime(samplesToDiscard); - } - } - - std::memcpy((void *)(data.samples + data.sampleCount), - samplesBuffer, samplesCount * BytesPerSample); - data.sampleCount += samplesCount; - } - } - while (needsMoreDecoding); - + av_free(packet); + } + } while (currentPosition + pktDuration <= targetPosition); + + return true; + } + + bool AudioStream::onGetData(sf::SoundStream::Chunk& data) + { + AVPacket* packet = nullptr; + data.samples = m_samplesBuffer; + + const int stereoChannelCount = av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); + + while (data.sampleCount < stereoChannelCount * m_sampleRatePerChannel && + (nullptr != (packet = popEncodedData()))) + { + bool needsMoreDecoding = false; + bool gotFrame = false; + + do + { + needsMoreDecoding = decodePacket(packet, m_audioFrame, gotFrame); + + if (gotFrame) + { + uint8_t* samplesBuffer = nullptr; + int samplesCount = 0; + + resampleFrame(m_audioFrame, samplesBuffer, samplesCount); + + if (samplesBuffer == nullptr || + samplesCount <= 0) + { + break; + } + + if (m_extraAudioTime > sf::Time::Zero) + { + int samplesToDiscard = timeToSamples(m_extraAudioTime); + if (samplesToDiscard > samplesCount) + { + samplesToDiscard = samplesCount; + } + + if (samplesToDiscard < stereoChannelCount && samplesCount > 0) + { + m_extraAudioTime = sf::Time::Zero; + } + else + { + samplesBuffer += samplesToDiscard * BytesPerSample; + samplesCount -= samplesToDiscard; + + m_extraAudioTime -= samplesToTime(samplesToDiscard); + } + } + + std::memcpy((void *)(data.samples + data.sampleCount), + samplesBuffer, samplesCount * BytesPerSample); + data.sampleCount += samplesCount; + } + } while (needsMoreDecoding); + #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(packet); + av_packet_unref(packet); #else - av_free_packet(packet); + av_free_packet(packet); #endif - av_free(packet); - } - - return (packet != nullptr); - } - - void AudioStream::onSeek(sf::Time timeOffset) - { - // CHECK(0, "AudioStream::onSeek() - not implemented"); - } - - bool AudioStream::decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame) - { + av_free(packet); + } + return (packet != nullptr); + } + + void AudioStream::onSeek(sf::Time timeOffset) + { + // not implemented + } + + bool AudioStream::decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame) + { #if LIBAVCODEC_VERSION_MAJOR > 56 - int ret; - gotFrame = false; - - ret = avcodec_send_packet(m_codecCtx, packet); - if (ret < 0) - { - return false; - } - - ret = avcodec_receive_frame(m_codecCtx, outputFrame); - if (ret < 0) - { - if (ret == AVERROR(EAGAIN)) - { - return true; - } - return false; - } - gotFrame = true; - return false; + int ret; + gotFrame = false; + + ret = avcodec_send_packet(m_codecCtx, packet); + if (ret < 0) + { + return false; + } + + ret = avcodec_receive_frame(m_codecCtx, outputFrame); + if (ret < 0) + { + if (ret == AVERROR(EAGAIN)) + { + return true; + } + return false; + } + gotFrame = true; + return false; #else - bool needsMoreDecoding = false; - int igotFrame = 0; - int decodedLength = avcodec_decode_audio4(m_stream->codec, outputFrame, &igotFrame, packet); - gotFrame = (igotFrame != 0); - CHECK(decodedLength >= 0, "AudioStream::decodePacket() - error: decodedLength=" + s(decodedLength)); - - if (decodedLength < packet->size) - { - needsMoreDecoding = true; - packet->data += decodedLength; - packet->size -= decodedLength; - } - - return needsMoreDecoding; + bool needsMoreDecoding = false; + int igotFrame = 0; + int decodedLength = avcodec_decode_audio4(m_stream->codec, outputFrame, &igotFrame, packet); + gotFrame = (igotFrame != 0); + + if (decodedLength < 0) + { + return false; + } + if (decodedLength < packet->size) + { + needsMoreDecoding = true; + packet->data += decodedLength; + packet->size -= decodedLength; + } + return needsMoreDecoding; #endif - } - - void AudioStream::initResampler() - { - CHECK0(m_swrCtx, "AudioStream::initResampler() - resampler already initialized"); - int err = 0; - - /* create resampler context */ - m_swrCtx = swr_alloc(); - CHECK(m_swrCtx, "AudioStream::initResampler() - out of memory"); - - // Some media files don't define the channel layout, in this case take a default one - // according to the channels' count + } + + void AudioStream::initResampler() + { + if (m_swrCtx != nullptr) + { + return; + } + + /* create resampler context */ + m_swrCtx = swr_alloc(); + if (m_swrCtx == nullptr) + { + return; + } + + // Some media files don't define the channel layout, in this case take a default one + // according to the channels' count #if LIBAVFORMAT_VERSION_MAJOR > 56 - if (m_stream->codecpar->channel_layout == 0) - { - m_stream->codecpar->channel_layout = av_get_default_channel_layout(m_stream->codecpar->channels); - } - - /* set options */ - av_opt_set_int (m_swrCtx, "in_channel_layout", m_stream->codecpar->channel_layout, 0); - av_opt_set_int (m_swrCtx, "in_sample_rate", m_stream->codecpar->sample_rate, 0); - av_opt_set_sample_fmt (m_swrCtx, "in_sample_fmt", (AVSampleFormat)m_stream->codecpar->format, 0); - av_opt_set_int (m_swrCtx, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); - av_opt_set_int (m_swrCtx, "out_sample_rate", m_stream->codecpar->sample_rate, 0); - av_opt_set_sample_fmt (m_swrCtx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + if (m_stream->codecpar->channel_layout == 0) + { + m_stream->codecpar->channel_layout = av_get_default_channel_layout(m_stream->codecpar->channels); + } + + /* set options */ + av_opt_set_int(m_swrCtx, "in_channel_layout", m_stream->codecpar->channel_layout, 0); + av_opt_set_int(m_swrCtx, "in_sample_rate", m_stream->codecpar->sample_rate, 0); + av_opt_set_sample_fmt(m_swrCtx, "in_sample_fmt", (AVSampleFormat)m_stream->codecpar->format, 0); + av_opt_set_int(m_swrCtx, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + av_opt_set_int(m_swrCtx, "out_sample_rate", m_stream->codecpar->sample_rate, 0); + av_opt_set_sample_fmt(m_swrCtx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); #else - if (m_stream->codec->channel_layout == 0) - { - m_stream->codec->channel_layout = av_get_default_channel_layout(m_stream->codec->channels); - } - - /* set options */ - av_opt_set_int (m_swrCtx, "in_channel_layout", m_stream->codec->channel_layout, 0); - av_opt_set_int (m_swrCtx, "in_sample_rate", m_stream->codec->sample_rate, 0); - av_opt_set_sample_fmt (m_swrCtx, "in_sample_fmt", m_stream->codec->sample_fmt, 0); - av_opt_set_int (m_swrCtx, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); - av_opt_set_int (m_swrCtx, "out_sample_rate", m_stream->codec->sample_rate, 0); - av_opt_set_sample_fmt (m_swrCtx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + if (m_stream->codec->channel_layout == 0) + { + m_stream->codec->channel_layout = av_get_default_channel_layout(m_stream->codec->channels); + } + + /* set options */ + av_opt_set_int(m_swrCtx, "in_channel_layout", m_stream->codec->channel_layout, 0); + av_opt_set_int(m_swrCtx, "in_sample_rate", m_stream->codec->sample_rate, 0); + av_opt_set_sample_fmt(m_swrCtx, "in_sample_fmt", m_stream->codec->sample_fmt, 0); + av_opt_set_int(m_swrCtx, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + av_opt_set_int(m_swrCtx, "out_sample_rate", m_stream->codec->sample_rate, 0); + av_opt_set_sample_fmt(m_swrCtx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); #endif - - /* initialize the resampling context */ - err = swr_init(m_swrCtx); - CHECK(err >= 0, "AudioStream::initResampler() - resampling context initialization error"); - - /* compute the number of converted samples: buffering is avoided - * ensuring that the output buffer will contain at least all the - * converted input samples */ - m_maxDstNbSamples = m_dstNbSamples = 1024; - - /* Create the resampling output buffer */ - m_dstNbChannels = av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); - err = av_samples_alloc_array_and_samples(&m_dstData, &m_dstLinesize, m_dstNbChannels, - m_dstNbSamples, AV_SAMPLE_FMT_S16, 0); - CHECK(err >= 0, "AudioStream::initResampler() - av_samples_alloc_array_and_samples error"); - } - - void AudioStream::resampleFrame(const AVFrame* frame, uint8_t*& outSamples, int& outNbSamples) - { - CHECK(m_swrCtx, "AudioStream::resampleFrame() - resampler is not initialized, call AudioStream::initResamplerFirst() !"); - CHECK(frame, "AudioStream::resampleFrame() - invalid argument"); - - int src_rate, dst_rate, err, dst_bufsize; - src_rate = dst_rate = frame->sample_rate; - - /* compute destination number of samples */ - m_dstNbSamples = (int)av_rescale_rnd(swr_get_delay(m_swrCtx, src_rate) + - frame->nb_samples, dst_rate, src_rate, AV_ROUND_UP); - if (m_dstNbSamples > m_maxDstNbSamples) - { - av_free(m_dstData[0]); - err = av_samples_alloc(m_dstData, &m_dstLinesize, m_dstNbChannels, - m_dstNbSamples, AV_SAMPLE_FMT_S16, 1); - CHECK(err >= 0, "AudioStream::resampleFrame() - out of memory"); - m_maxDstNbSamples = m_dstNbSamples; - } - - /* convert to destination format */ - err = swr_convert(m_swrCtx, m_dstData, m_dstNbSamples, (const uint8_t **)frame->extended_data, frame->nb_samples); - CHECK(err >= 0, "AudioStream::resampleFrame() - swr_convert() error"); - - dst_bufsize = av_samples_get_buffer_size(&m_dstLinesize, m_dstNbChannels, - err, AV_SAMPLE_FMT_S16, 1); - CHECK(dst_bufsize >= 0, "AudioStream::resampleFrame() - av_samples_get_buffer_size() error"); - - outNbSamples = dst_bufsize / av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); - outSamples = m_dstData[0]; - } - - int AudioStream::timeToSamples(const sf::Time& time) const - { - const int channelCount = av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); - int64_t samplesPerSecond = m_sampleRatePerChannel * channelCount; - int64_t samples = (samplesPerSecond * time.asMicroseconds()) / 1000000; - CHECK(samples >= 0, "computation overflow"); - - // We don't want SFML to be confused by interverting left and right speaker sound in case - // samples are interleaved - if (samples % channelCount != 0) - samples -= samples % channelCount; - - return (int)samples; - } - - sf::Time AudioStream::samplesToTime(int nbSamples) const - { - int64_t samplesPerChannel = nbSamples / av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); - int64_t microseconds = 1000000 * samplesPerChannel / m_sampleRatePerChannel; - CHECK(microseconds >= 0, "computation overflow"); - - return sf::microseconds(microseconds); - } - - void AudioStream::willPlay(const Timer &timer) - { - Stream::willPlay(timer); - - if (Stream::getStatus() == sfe::Stopped) - { - sf::Time initialTime = sf::SoundStream::getPlayingOffset(); - sf::Clock timeout; - sf::SoundStream::play(); - - // Some audio drivers take time before the sound is actually played - // To avoid desynchronization with the timer, we don't return - // until the audio stream is actually started - while (sf::SoundStream::getPlayingOffset() == initialTime && timeout.getElapsedTime() < sf::seconds(5)) - sf::sleep(sf::microseconds(10)); - - CHECK(sf::SoundStream::getPlayingOffset() != initialTime, "is your audio device broken? Audio did not start within 5 seconds"); - } - else - { - sf::SoundStream::play(); - waitForStatusUpdate(*this, sf::SoundStream::Playing); - } - } - - void AudioStream::didPlay(const Timer& timer, sfe::Status previousStatus) - { - CHECK(SoundStream::getStatus() == SoundStream::Playing, "AudioStream::didPlay() - willPlay() not executed!"); - Stream::didPlay(timer, previousStatus); - } - - void AudioStream::didPause(const Timer& timer, sfe::Status previousStatus) - { - if (sf::SoundStream::getStatus() == sf::SoundStream::Playing) - { - sf::SoundStream::pause(); - waitForStatusUpdate(*this, sf::SoundStream::Paused); - } - - Stream::didPause(timer, previousStatus); - } - - void AudioStream::didStop(const Timer& timer, sfe::Status previousStatus) - { - sf::SoundStream::stop(); - waitForStatusUpdate(*this, sf::SoundStream::Stopped); - - Stream::didStop(timer, previousStatus); - } + + /* initialize the resampling context */ + auto err = swr_init(m_swrCtx); + if (err < 0) + { + return; + } + + /* compute the number of converted samples: buffering is avoided + * ensuring that the output buffer will contain at least all the + * converted input samples */ + m_maxDstNbSamples = m_dstNbSamples = 1024; + + /* Create the resampling output buffer */ + m_dstNbChannels = av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); + err = av_samples_alloc_array_and_samples(&m_dstData, &m_dstLinesize, m_dstNbChannels, + m_dstNbSamples, AV_SAMPLE_FMT_S16, 0); + if (err < 0) + { + return; + } + } + + void AudioStream::resampleFrame(const AVFrame* frame, uint8_t*& outSamples, int& outNbSamples) + { + if (m_swrCtx == nullptr || + frame == nullptr) + { + return; + } + + int src_rate, dst_rate, err, dst_bufsize; + src_rate = dst_rate = frame->sample_rate; + + /* compute destination number of samples */ + m_dstNbSamples = (int)av_rescale_rnd(swr_get_delay(m_swrCtx, src_rate) + + frame->nb_samples, dst_rate, src_rate, AV_ROUND_UP); + if (m_dstNbSamples > m_maxDstNbSamples) + { + av_free(m_dstData[0]); + err = av_samples_alloc(m_dstData, &m_dstLinesize, m_dstNbChannels, + m_dstNbSamples, AV_SAMPLE_FMT_S16, 1); + if (err < 0) + { + return; + } + m_maxDstNbSamples = m_dstNbSamples; + } + + /* convert to destination format */ + err = swr_convert(m_swrCtx, m_dstData, m_dstNbSamples, (const uint8_t **)frame->extended_data, frame->nb_samples); + if (err < 0) + { + return; + } + + dst_bufsize = av_samples_get_buffer_size(&m_dstLinesize, m_dstNbChannels, + err, AV_SAMPLE_FMT_S16, 1); + if (dst_bufsize < 0) + { + return; + } + + outNbSamples = dst_bufsize / av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); + outSamples = m_dstData[0]; + } + + int AudioStream::timeToSamples(const sf::Time& time) const + { + const int channelCount = av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); + int64_t samplesPerSecond = (int64_t)m_sampleRatePerChannel * channelCount; + int64_t samples = (samplesPerSecond * time.asMicroseconds()) / 1000000; + // We don't want SFML to be confused by interverting left and right speaker sound in case + // samples are interleaved + if (samples % channelCount != 0) + { + samples -= samples % channelCount; + } + return (int)samples; + } + + sf::Time AudioStream::samplesToTime(int nbSamples) const + { + int64_t samplesPerChannel = nbSamples / av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO); + int64_t microseconds = 1000000 * samplesPerChannel / (int)m_sampleRatePerChannel; + return sf::microseconds(microseconds); + } + + void AudioStream::willPlay(const Timer& timer) + { + Stream::willPlay(timer); + + if (Stream::getStatus() == sfe::Stopped) + { + sf::Time initialTime = sf::SoundStream::getPlayingOffset(); + sf::Clock timeout; + sf::SoundStream::play(); + + // Some audio drivers take time before the sound is actually played + // To avoid desynchronization with the timer, we don't return + // until the audio stream is actually started + while (sf::SoundStream::getPlayingOffset() == initialTime && + timeout.getElapsedTime() < sf::seconds(5)) + { + sf::sleep(sf::microseconds(10)); + } + } + else + { + sf::SoundStream::play(); + waitForStatusUpdate(*this, sf::SoundStream::Playing); + } + } + + void AudioStream::didPlay(const Timer& timer, sfe::Status previousStatus) + { + if (SoundStream::getStatus() == SoundStream::Playing) + { + Stream::didPlay(timer, previousStatus); + } + } + + void AudioStream::didPause(const Timer& timer, sfe::Status previousStatus) + { + if (sf::SoundStream::getStatus() == sf::SoundStream::Playing) + { + sf::SoundStream::pause(); + waitForStatusUpdate(*this, sf::SoundStream::Paused); + } + Stream::didPause(timer, previousStatus); + } + + void AudioStream::didStop(const Timer& timer, sfe::Status previousStatus) + { + sf::SoundStream::stop(); + waitForStatusUpdate(*this, sf::SoundStream::Stopped); + Stream::didStop(timer, previousStatus); + } } diff --git a/src/sfeMovie/AudioStream.hpp b/src/sfeMovie/AudioStream.hpp index 7ee69797..84b22af8 100755 --- a/src/sfeMovie/AudioStream.hpp +++ b/src/sfeMovie/AudioStream.hpp @@ -1,4 +1,3 @@ - /* * AudioStream.hpp * sfeMovie project @@ -22,116 +21,116 @@ * */ +#pragma once -#ifndef SFEMOVIE_AUDIOSTREAM_HPP -#define SFEMOVIE_AUDIOSTREAM_HPP - +#include #include #include "Stream.hpp" -#include namespace sfe { - class AudioStream : public Stream, private sf::SoundStream - { - public: - /** Create an audio stream from the given FFmpeg stream - * - * At the end of the constructor, the stream is guaranteed - * to have all of its fields set and the decoder loaded - */ - AudioStream(AVFormatContext*& formatCtx, AVStream*& stream, DataSource& dataSource, - std::shared_ptr timer); - - /** Default destructor - */ - virtual ~AudioStream(); - - /** Empty the encoded data queue, destroy all the packets and flush the decoding pipeline - */ - void flushBuffers() override; - - /** Get the stream kind (either audio or video stream) - * - * @return the kind of stream represented by this stream - */ - MediaType getStreamKind() const override; - - /** Update the stream's status - */ - void update() override; - - /** @see Stream::fastForward() - */ - bool fastForward(sf::Time targetPosition) override; - - using sf::SoundStream::setVolume; - using sf::SoundStream::getVolume; - using sf::SoundStream::getSampleRate; - using sf::SoundStream::getChannelCount; - private: - bool onGetData(sf::SoundStream::Chunk& data) override; - void onSeek(sf::Time timeOffset) override; - - /** Decode the encoded data @a packet into @a outputFrame - * - * gotFrame being set to false means that decoding should still continue: - * - with a new packet if false is returned - * - with the same packet if true is returned - * - * @param packet the encoded data - * @param outputFrame one decoded data - * @param gotFrame set to true if a frame has been extracted to outputFrame, false otherwise - * @return true if there's still data to decode in this packet, false otherwise - */ - bool decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame); - - /** Initialize the audio resampler for conversion from many formats to signed 16 bits audio - * - * This must be called before any packet is decoded and resampled - */ - void initResampler(); - - /** Resample the decoded audio frame @a frame into signed 16 bits audio samples - * - * @param frame the audio samples to convert - * @param outSamples [out] the convertedSamples - * @param outNbSamples [out] the count of signed 16 bits samples in @a outSamples - */ - void resampleFrame(const AVFrame* frame, uint8_t*& outSamples, int& outNbSamples); - - /** @return the amount of samples that would last the given time with the current audio stream - * properties - */ - int timeToSamples(const sf::Time& time) const; - - /** @return the time that would last the given amount of samples with the current audio stream - * properties - */ - sf::Time samplesToTime(int nbSamples) const; - - // Timer::Observer interface - void willPlay(const Timer &timer) override; - void didPlay(const Timer& timer, sfe::Status previousStatus) override; - void didPause(const Timer& timer, sfe::Status previousStatus) override; - void didStop(const Timer& timer, sfe::Status previousStatus) override; - - // Public properties - unsigned m_sampleRatePerChannel; - - // Private data - sf::Int16* m_samplesBuffer; - AVFrame* m_audioFrame; - sf::Time m_extraAudioTime; - - // Resampling - struct SwrContext* m_swrCtx; - int m_dstNbSamples; - int m_maxDstNbSamples; - int m_dstNbChannels; - int m_dstLinesize; - uint8_t** m_dstData; - }; -} + class AudioStream : public Stream, private sf::SoundStream + { + public: + /** Create an audio stream from the given FFmpeg stream + * + * At the end of the constructor, the stream is guaranteed + * to have all of its fields set and the decoder loaded + */ + AudioStream(AVFormatContext*& formatCtx, AVStream*& stream, + DataSource& dataSource, Timer* timer); + + /** Default destructor + */ + virtual ~AudioStream(); + + /** Empty the encoded data queue, destroy all the packets and flush the decoding pipeline + */ + void flushBuffers() override; + + /** Get the stream kind (either audio or video stream) + * + * @return the kind of stream represented by this stream + */ + MediaType getStreamKind() const override; + + /** Update the stream's status + */ + void update() override; + + /** @see Stream::fastForward() + */ + bool fastForward(sf::Time targetPosition) override; + + /** @see Stream::hasError() + */ + bool hasError() const noexcept override; + + using sf::SoundStream::setVolume; + using sf::SoundStream::getVolume; + using sf::SoundStream::getSampleRate; + using sf::SoundStream::getChannelCount; + private: + bool onGetData(sf::SoundStream::Chunk& data) override; + void onSeek(sf::Time timeOffset) override; -#endif + /** Decode the encoded data @a packet into @a outputFrame + * + * gotFrame being set to false means that decoding should still continue: + * - with a new packet if false is returned + * - with the same packet if true is returned + * + * @param packet the encoded data + * @param outputFrame one decoded data + * @param gotFrame set to true if a frame has been extracted to outputFrame, false otherwise + * @return true if there's still data to decode in this packet, false otherwise + */ + bool decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame); + + /** Initialize the audio resampler for conversion from many formats to signed 16 bits audio + * + * This must be called before any packet is decoded and resampled + */ + void initResampler(); + + /** Resample the decoded audio frame @a frame into signed 16 bits audio samples + * + * @param frame the audio samples to convert + * @param outSamples [out] the convertedSamples + * @param outNbSamples [out] the count of signed 16 bits samples in @a outSamples + */ + void resampleFrame(const AVFrame* frame, uint8_t*& outSamples, int& outNbSamples); + + /** @return the amount of samples that would last the given time with the current audio stream + * properties + */ + int timeToSamples(const sf::Time& time) const; + + /** @return the time that would last the given amount of samples with the current audio stream + * properties + */ + sf::Time samplesToTime(int nbSamples) const; + + // Timer::Observer interface + void willPlay(const Timer &timer) override; + void didPlay(const Timer& timer, sfe::Status previousStatus) override; + void didPause(const Timer& timer, sfe::Status previousStatus) override; + void didStop(const Timer& timer, sfe::Status previousStatus) override; + + // Public properties + unsigned m_sampleRatePerChannel{ 0 }; + + // Private data + sf::Int16* m_samplesBuffer{ nullptr }; + AVFrame* m_audioFrame{ nullptr }; + sf::Time m_extraAudioTime; + + // Resampling + struct SwrContext* m_swrCtx{ nullptr }; + int m_dstNbSamples{ 0 }; + int m_maxDstNbSamples{ 0 }; + int m_dstNbChannels{ 0 }; + int m_dstLinesize{ 0 }; + uint8_t** m_dstData{ nullptr }; + }; +} diff --git a/src/sfeMovie/Demuxer.cpp b/src/sfeMovie/Demuxer.cpp index 54c9e222..c3c84ea8 100755 --- a/src/sfeMovie/Demuxer.cpp +++ b/src/sfeMovie/Demuxer.cpp @@ -1,4 +1,3 @@ - /* * Demuxer.cpp * sfeMovie project @@ -24,714 +23,707 @@ extern "C" { -#include #include +#include #include #include } #include "Demuxer.hpp" -#include "VideoStream.hpp" #include "AudioStream.hpp" -#include "Utilities.hpp" +#include #include "TimerPriorities.hpp" -#include -#include +#include "VideoStream.hpp" namespace sfe { - std::list Demuxer::g_availableDemuxers; - std::list Demuxer::g_availableDecoders; - - static void loadFFmpeg() - { - ONCE(av_register_all()); - ONCE(avcodec_register_all()); - } - - static MediaType AVMediaTypeToMediaType(AVMediaType type) - { - switch (type) - { - case AVMEDIA_TYPE_AUDIO: return Audio; - case AVMEDIA_TYPE_VIDEO: return Video; - default: return Unknown; - } - } - - const std::list& Demuxer::getAvailableDemuxers() - { - AVInputFormat* demuxer = nullptr; - loadFFmpeg(); - - if (g_availableDemuxers.empty()) - { - while (nullptr != (demuxer = av_iformat_next(demuxer))) - { - DemuxerInfo info = - { - std::string(demuxer->name), - std::string(demuxer->long_name) - }; - - g_availableDemuxers.push_back(info); - } - } - - return g_availableDemuxers; - } - - const std::list& Demuxer::getAvailableDecoders() - { - AVCodec* codec = nullptr; - loadFFmpeg(); - - if (g_availableDecoders.empty()) - { - while (nullptr != (codec = av_codec_next(codec))) - { - DecoderInfo info = - { - avcodec_get_name(codec->id), - codec->long_name, - AVMediaTypeToMediaType(codec->type) - }; - - g_availableDecoders.push_back(info); - } - } - - return g_availableDecoders; - } - - Demuxer::Demuxer(const std::string& sourceFile, std::shared_ptr timer, - VideoStream::Delegate& videoDelegate) : - m_streamContext(), - m_formatCtx(nullptr), - m_eofReached(false), - m_streams(), - m_synchronized(), - m_timer(timer), - m_connectedAudioStream(nullptr), - m_connectedVideoStream(nullptr), - m_duration(sf::Time::Zero) - { - CHECK(sourceFile.size(), "Demuxer::Demuxer() - invalid argument: sourceFile"); - CHECK(timer, "Inconsistency error: null timer"); - - // Load all the decoders - loadFFmpeg(); - - init(sourceFile.c_str(), videoDelegate); - } - - Demuxer::Demuxer(sf::InputStream& inputStream, std::shared_ptr timer, - VideoStream::Delegate& videoDelegate) : - m_streamContext(), - m_formatCtx(nullptr), - m_eofReached(false), - m_streams(), - m_synchronized(), - m_timer(timer), - m_connectedAudioStream(nullptr), - m_connectedVideoStream(nullptr), - m_duration(sf::Time::Zero) - { - CHECK(timer, "Inconsistency error: null timer"); - - // Load all the decoders - loadFFmpeg(); - - m_streamContext = InputStreamIOContext(&inputStream); - m_formatCtx = ::avformat_alloc_context(); - m_formatCtx->pb = m_streamContext.getAVIOContext(); - init("", videoDelegate); - } - - void Demuxer::init(const char* fileName, VideoStream::Delegate& videoDelegate) - { - int err = 0; - - // Open the movie file - err = avformat_open_input(&m_formatCtx, fileName, nullptr, nullptr); - CHECK0(err, "Demuxer::Demuxer() - error while opening media stream"); - CHECK(m_formatCtx, "Demuxer() - inconsistency: media context cannot be nullptr"); - - // Read the general movie informations - err = avformat_find_stream_info(m_formatCtx, nullptr); - CHECK0(err, "Demuxer::Demuxer() - error while retreiving media information"); - - // Get the media duration if possible (otherwise rely on the streams) - if (m_formatCtx->duration != AV_NOPTS_VALUE) - { - int64_t secs, us; - secs = m_formatCtx->duration / AV_TIME_BASE; - us = m_formatCtx->duration % AV_TIME_BASE; - m_duration = sf::seconds(secs + (float)us / AV_TIME_BASE); - } - - // Find all interesting streams - for (unsigned int i = 0; i < m_formatCtx->nb_streams; i++) - { - AVStream* & ffstream = m_formatCtx->streams[i]; - - try - { - std::shared_ptr stream; - + // Load all the decoders + static void loadFFmpeg() + { + static std::once_flag flag1; + static std::once_flag flag2; + + std::call_once(flag1, []() {av_register_all(); }); + std::call_once(flag2, []() {avcodec_register_all(); }); + } + + Demuxer::Demuxer(const std::string_view sourceFile, Timer* timer, + VideoStream::Delegate& videoDelegate) : m_timer(timer) + { + if (sourceFile.empty() == true || + timer == nullptr) + { + return; + } + loadFFmpeg(); + init(sourceFile.data(), videoDelegate); + } + + Demuxer::Demuxer(sf::InputStream& inputStream, Timer* timer, + VideoStream::Delegate& videoDelegate) : m_timer(timer) + { + if (timer == nullptr) + { + return; + } + loadFFmpeg(); + + m_streamContext = InputStreamIOContext(&inputStream); + m_formatCtx = ::avformat_alloc_context(); + if (m_formatCtx == nullptr) + { + return; + } + m_formatCtx->pb = m_streamContext.getAVIOContext(); + init("", videoDelegate); + } + + void Demuxer::init(const char* fileName, VideoStream::Delegate& videoDelegate) + { + int err = 0; + + // Open the movie file + err = avformat_open_input(&m_formatCtx, fileName, nullptr, nullptr); + if (err != 0 || + m_formatCtx == nullptr) + { + return; + } + + // Read the general movie informations + err = avformat_find_stream_info(m_formatCtx, nullptr); + if (err < 0) + { + return; + } + + // Get the media duration if possible (otherwise rely on the streams) + if (m_formatCtx->duration != AV_NOPTS_VALUE) + { + int64_t secs, us; + secs = m_formatCtx->duration / AV_TIME_BASE; + us = m_formatCtx->duration % AV_TIME_BASE; + m_duration = sf::seconds(secs + (float)us / AV_TIME_BASE); + } + + // Find all interesting streams + for (unsigned int i = 0; i < m_formatCtx->nb_streams; i++) + { + AVStream* & ffstream = m_formatCtx->streams[i]; + #if LIBAVFORMAT_VERSION_MAJOR > 56 - switch (ffstream->codecpar->codec_type) + switch (ffstream->codecpar->codec_type) #else - switch (ffstream->codec->codec_type) + switch (ffstream->codec->codec_type) #endif - { - case AVMEDIA_TYPE_VIDEO: - stream = std::make_shared(m_formatCtx, ffstream, *this, m_timer, videoDelegate); - - if (m_duration == sf::Time::Zero) - { - extractDurationFromStream(ffstream); - } - break; - - case AVMEDIA_TYPE_AUDIO: - stream = std::make_shared(m_formatCtx, ffstream, *this, m_timer); - - if (m_duration == sf::Time::Zero) - { - extractDurationFromStream(ffstream); - } - break; - default: - break; - } - - // Don't create an entry in the map unless everything went well and stream did not get ignored - if (stream) - m_streams[ffstream->index] = stream; - } - catch (std::runtime_error) - { - CHECK(m_streams.find(ffstream->index) == m_streams.end(), - "Internal inconcistency error: stream whose loading failed should not be stored"); - } - } - - m_timer->addObserver(*this, DemuxerTimerPriority); - } - - Demuxer::~Demuxer() - { - if (m_timer->getStatus() != Stopped) - m_timer->stop(); - - m_timer->removeObserver(*this); - - // NB: these manual cleaning are important for the AVFormatContext to be deleted last, otherwise - // the streams lose their connection to the codec and leak - m_streams.clear(); - m_connectedAudioStream.reset(); - m_connectedVideoStream.reset(); - - if (m_formatCtx) - { - // Be very careful with this call: it'll also destroy its codec contexts and streams - avformat_close_input(&m_formatCtx); - } - - flushBuffers(); - } - - const std::map >& Demuxer::getStreams() const - { - return m_streams; - } - - std::set< std::shared_ptr > Demuxer::getStreamsOfType(MediaType type) const - { - std::set< std::shared_ptr > streamSet; - - for (const std::pair >& pair : m_streams) - { - if (pair.second->getStreamKind() == type) - streamSet.insert(pair.second); - } - - return streamSet; - } - - Streams Demuxer::computeStreamDescriptors(MediaType type) const - { - Streams entries; - std::set< std::shared_ptr > streamSet; - - for (const std::pair >& pair : m_streams) - { - if (pair.second->getStreamKind() == type) - { - StreamDescriptor entry; - entry.type = type; - entry.identifier = pair.first; - entry.language = pair.second->getLanguage(); - entries.push_back(entry); - } - } - - return entries; - } - - void Demuxer::selectAudioStream(std::shared_ptr stream) - { - Status oldStatus = m_timer->getStatus(); - CHECK(oldStatus == Stopped, "Changing the selected stream after starting " - "the movie playback isn't supported yet"); - - if (oldStatus == Playing) - m_timer->pause(); - - if (stream != m_connectedAudioStream) - { - if (m_connectedAudioStream) - { - m_connectedAudioStream->disconnect(); - } - - if (stream) - stream->connect(); - - m_connectedAudioStream = stream; - } - - if (oldStatus == Playing) - m_timer->play(); - } - - void Demuxer::selectFirstAudioStream() - { - std::set< std::shared_ptr > audioStreams = getStreamsOfType(Audio); - if (audioStreams.size()) - selectAudioStream(std::dynamic_pointer_cast(*audioStreams.begin())); - } - - std::shared_ptr Demuxer::getSelectedAudioStream() const - { - return std::dynamic_pointer_cast(m_connectedAudioStream); - } - - void Demuxer::selectVideoStream(std::shared_ptr stream) - { - Status oldStatus = m_timer->getStatus(); - CHECK(oldStatus == Stopped, "Changing the selected stream after starting " - "the movie playback isn't supported yet"); - - if (oldStatus == Playing) - m_timer->pause(); - - if (stream != m_connectedVideoStream) - { - if (m_connectedVideoStream) - { - m_connectedVideoStream->disconnect(); - } - - if (stream) - stream->connect(); - - m_connectedVideoStream = stream; - } - - if (oldStatus == Playing) - m_timer->play(); - } - - void Demuxer::selectFirstVideoStream() - { - std::set< std::shared_ptr > videoStreams = getStreamsOfType(Video); - if (videoStreams.size()) - selectVideoStream(std::dynamic_pointer_cast(*videoStreams.begin())); - } - - std::shared_ptr Demuxer::getSelectedVideoStream() const - { - return std::dynamic_pointer_cast(m_connectedVideoStream); - } - - void Demuxer::feedStream(Stream& stream) - { - CHECK(! stream.isPassive(), "Internal inconcistency - Cannot feed a passive stream"); - - sf::Lock l(m_synchronized); - - while ((!didReachEndOfFile() || hasPendingDataForStream(stream)) && stream.needsMoreData()) - { - AVPacket* pkt = NULL; - - pkt = gatherQueuedPacketForStream(stream); - - if (!pkt) - pkt = readPacket(); - - if (!pkt) - { - m_eofReached = true; - } - else - { - if (!distributePacket(pkt, stream)) - { + { + case AVMEDIA_TYPE_VIDEO: + { + auto stream = std::make_unique(m_formatCtx, ffstream, *this, m_timer, videoDelegate); + if (stream->hasError() == true) + { + continue; + } + if (m_duration == sf::Time::Zero) + { + extractDurationFromStream(ffstream); + } + if (stream != nullptr) + { + m_videoStreams.push_back(std::make_pair(std::move(stream), ffstream->index)); + } + break; + } + case AVMEDIA_TYPE_AUDIO: + { + auto stream = std::make_unique(m_formatCtx, ffstream, *this, m_timer); + if (stream->hasError() == true) + { + continue; + } + if (m_duration == sf::Time::Zero) + { + extractDurationFromStream(ffstream); + } + if (stream != nullptr) + { + m_audioStreams.push_back(std::make_pair(std::move(stream), ffstream->index)); + } + break; + } + default: + break; + } + } + m_timer->addObserver(*this, DemuxerTimerPriority); + } + + Demuxer::~Demuxer() + { + if (m_timer->getStatus() != Stopped) + { + m_timer->stop(); + } + + m_timer->removeObserver(*this); + + // NB: these manual cleaning are important for the AVFormatContext to be deleted last, otherwise + // the streams lose their connection to the codec and leak + m_audioStreams.clear(); + m_videoStreams.clear(); + m_connectedStreams[AudioStreamIndex] = nullptr; + m_connectedStreams[VideoStreamIndex] = nullptr; + + if (m_formatCtx != nullptr) + { + // Be very careful with this call: it'll also destroy its codec contexts and streams + avformat_close_input(&m_formatCtx); + } + flushBuffers(); + } + + const std::vector, int>>& Demuxer::getAudioStreams() const + { + return m_audioStreams; + } + + const std::vector, int>>& Demuxer::getVideoStreams() const + { + return m_videoStreams; + } + + std::vector Demuxer::computeStreamDescriptors(MediaType type) const + { + std::vector entries; + for (const auto& pair : m_audioStreams) + { + if (pair.first->getStreamKind() == type) + { + StreamDescriptor entry; + entry.type = type; + entry.identifier = pair.second; + entry.language = pair.first->getLanguage(); + entries.push_back(entry); + } + } + for (const auto& pair : m_videoStreams) + { + if (pair.first->getStreamKind() == type) + { + StreamDescriptor entry; + entry.type = type; + entry.identifier = pair.second; + entry.language = pair.first->getLanguage(); + entries.push_back(entry); + } + } + return entries; + } + + void Demuxer::selectAudioStream(AudioStream* stream) + { + auto oldStatus = m_timer->getStatus(); + if (oldStatus != Stopped) + { + return; + } + if (oldStatus == Playing) + { + m_timer->pause(); + } + if (stream != m_connectedStreams[AudioStreamIndex]) + { + if (m_connectedStreams[AudioStreamIndex] != nullptr) + { + m_connectedStreams[AudioStreamIndex]->disconnect(); + } + if (stream != nullptr) + { + stream->connect(); + } + m_connectedStreams[AudioStreamIndex] = stream; + m_pendingDataForActiveStreams[AudioStreamIndex].first = stream; + flushBuffer(m_pendingDataForActiveStreams[AudioStreamIndex].second); + } + if (oldStatus == Playing) + { + m_timer->play(); + } + } + + void Demuxer::selectFirstAudioStream() + { + if (m_audioStreams.empty() == false) + { + selectAudioStream(m_audioStreams.begin()->first.get()); + } + } + + AudioStream* Demuxer::getSelectedAudioStream() const + { + return (AudioStream*)m_connectedStreams[AudioStreamIndex]; + } + + void Demuxer::selectVideoStream(VideoStream* stream) + { + Status oldStatus = m_timer->getStatus(); + if (oldStatus != Stopped) + { + return; + } + if (oldStatus == Playing) + { + m_timer->pause(); + } + if (stream != m_connectedStreams[VideoStreamIndex]) + { + if (m_connectedStreams[VideoStreamIndex]) + { + m_connectedStreams[VideoStreamIndex]->disconnect(); + } + if (stream != nullptr) + { + stream->connect(); + } + m_connectedStreams[VideoStreamIndex] = stream; + m_pendingDataForActiveStreams[VideoStreamIndex].first = stream; + flushBuffer(m_pendingDataForActiveStreams[VideoStreamIndex].second); + } + if (oldStatus == Playing) + { + m_timer->play(); + } + } + + void Demuxer::selectFirstVideoStream() + { + if (m_videoStreams.empty() == false) + { + selectVideoStream(m_videoStreams.begin()->first.get()); + } + } + + VideoStream* Demuxer::getSelectedVideoStream() const + { + return (VideoStream*)m_connectedStreams[VideoStreamIndex]; + } + + void Demuxer::feedStream(Stream& stream) + { + if (stream.isPassive() == true) + { + return; + } + + sf::Lock l(m_synchronized); + + while ((didReachEndOfFile() == false || hasPendingDataForStream(stream) == true) + && stream.needsMoreData() == true) + { + AVPacket* pkt = nullptr; + + pkt = gatherQueuedPacketForStream(stream); + + if (pkt == nullptr) + { + pkt = readPacket(); + } + if (pkt == nullptr) + { + m_eofReached = true; + } + else + { + if (distributePacket(pkt, stream) == false) + { #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(pkt); + av_packet_unref(pkt); #else - av_free_packet(pkt); + av_free_packet(pkt); #endif - av_free(pkt); - } - } - } - } - - std::set> Demuxer::getSelectedStreams() const - { - std::set> set; - - if (m_connectedVideoStream) - set.insert(m_connectedVideoStream); - - if (m_connectedAudioStream) - set.insert(m_connectedAudioStream); - - return set; - } - - void Demuxer::update() - { - std::map > streams = getStreams(); - - for(std::pair > pair : streams) - { - pair.second->update(); - } - } - - bool Demuxer::didReachEndOfFile() const - { - return m_eofReached; - } - - sf::Time Demuxer::getDuration() const - { - return m_duration; - } - - AVPacket* Demuxer::readPacket() - { - sf::Lock l(m_synchronized); - - AVPacket *pkt = nullptr; - int err = 0; - - pkt = (AVPacket *)av_malloc(sizeof(*pkt)); - CHECK(pkt, "Demuxer::readPacket() - out of memory"); - av_init_packet(pkt); - - err = av_read_frame(m_formatCtx, pkt); - - if (err < 0) - { + av_free(pkt); + } + } + } + } + + void Demuxer::update() + { + for (const auto& pair : m_audioStreams) + { + pair.first->update(); + } + for (const auto& pair : m_videoStreams) + { + pair.first->update(); + } + } + + bool Demuxer::didReachEndOfFile() const + { + return m_eofReached; + } + + sf::Time Demuxer::getDuration() const + { + return m_duration; + } + + AVPacket* Demuxer::readPacket() + { + sf::Lock l(m_synchronized); + + AVPacket *pkt = nullptr; + int err = 0; + + pkt = (AVPacket *)av_malloc(sizeof(*pkt)); + if (pkt == nullptr) + { + return nullptr; + } + av_init_packet(pkt); + + err = av_read_frame(m_formatCtx, pkt); + + if (err < 0) + { #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(pkt); + av_packet_unref(pkt); #else - av_free_packet(pkt); + av_free_packet(pkt); #endif - av_free(pkt); - pkt = nullptr; - } - - return pkt; - } - - void Demuxer::flushBuffers() - { - sf::Lock l(m_synchronized); - - for (std::pair >&& pair : m_pendingDataForActiveStreams) - { - for (AVPacket* packet : pair.second) - { + av_free(pkt); + pkt = nullptr; + } + + return pkt; + } + + void Demuxer::flushBuffers() + { + sf::Lock l(m_synchronized); + + for (auto& pair : m_pendingDataForActiveStreams) + { + pair.first = nullptr; + flushBuffer(pair.second); + } + } + + void Demuxer::flushBuffer(std::list& buffer) + { + for (auto packet : buffer) + { #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(packet); + av_packet_unref(packet); #else - av_free_packet(packet); + av_free_packet(packet); #endif - av_free(packet); - } - } - - m_pendingDataForActiveStreams.clear(); - } - - void Demuxer::queueEncodedData(AVPacket* packet) - { - sf::Lock l(m_synchronized); - - std::set> connectedStreams = getSelectedStreams(); - - for (std::shared_ptr stream : connectedStreams) - { - if (stream->canUsePacket(packet)) - { - std::list& packets = m_pendingDataForActiveStreams[stream.get()]; - packets.push_back(packet); - return; - } - } - + av_free(packet); + } + buffer.clear(); + } + + void Demuxer::queueEncodedData(AVPacket* packet) + { + sf::Lock l(m_synchronized); + + for (auto stream : m_connectedStreams) + { + if (stream->canUsePacket(packet)) + { + for (auto& obj : m_pendingDataForActiveStreams) + { + if (obj.first == stream) + { + obj.second.push_back(packet); + return; + } + } + } + } + #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(packet); + av_packet_unref(packet); #else - av_free_packet(packet); + av_free_packet(packet); #endif - av_free(packet); - } - - bool Demuxer::hasPendingDataForStream(const Stream& stream) const - { - sf::Lock l(m_synchronized); - - const std::map >::const_iterator it = - m_pendingDataForActiveStreams.find(&stream); - - if (it != m_pendingDataForActiveStreams.end()) - return ! it->second.empty(); - - return false; - } - - AVPacket* Demuxer::gatherQueuedPacketForStream(Stream& stream) - { - sf::Lock l(m_synchronized); - - std::map >::iterator it - = m_pendingDataForActiveStreams.find(&stream); - - if (it != m_pendingDataForActiveStreams.end()) - { - std::list& pendingPackets = it->second; - - if (! pendingPackets.empty()) - { - AVPacket* packet = pendingPackets.front(); - pendingPackets.pop_front(); - return packet; - } - } - - return NULL; - } - - bool Demuxer::distributePacket(AVPacket* packet, Stream& stream) - { - sf::Lock l(m_synchronized); - CHECK(packet, "Demuxer::distributePacket() - invalid argument"); - - bool distributed = false; - std::map >::iterator it = m_streams.find(packet->stream_index); - - if (it != m_streams.end()) - { - std::shared_ptr targetStream = it->second; - - // We don't want to store the packets for inactive streams, - // let them be freed - if (targetStream == getSelectedVideoStream() || - targetStream == getSelectedAudioStream()) - { - if (targetStream.get() == &stream || targetStream->isPassive()) - targetStream->pushEncodedData(packet); - else - queueEncodedData(packet); - - distributed = true; - } - } - - return distributed; - } - - void Demuxer::extractDurationFromStream(const AVStream* stream) - { - if (m_duration != sf::Time::Zero) - return; - - if (stream->duration != AV_NOPTS_VALUE) - { - int64_t secs, us; - secs = stream->duration / AV_TIME_BASE; - us = stream->duration % AV_TIME_BASE; - m_duration = sf::seconds(secs + (float)us / AV_TIME_BASE); - } - } - - void Demuxer::requestMoreData(Stream& starvingStream) - { - CHECK(! starvingStream.isPassive(), "Internal inconcistency - passive streams cannot request data"); - - sf::Lock l(m_synchronized); - feedStream(starvingStream); - } - - void Demuxer::resetEndOfFileStatus() - { - m_eofReached = false; - } - - bool Demuxer::didSeek(const Timer &timer, sf::Time oldPosition) - { - resetEndOfFileStatus(); - sf::Time newPosition = timer.getOffset(); - std::set< std::shared_ptr > connectedStreams; - - if (m_connectedVideoStream) - connectedStreams.insert(m_connectedVideoStream); - if (m_connectedAudioStream) - connectedStreams.insert(m_connectedAudioStream); - - CHECK(!connectedStreams.empty(), "Inconcistency error: seeking with no active stream"); - - // Trivial seeking to beginning - if (newPosition == sf::Time::Zero) - { - int64_t timestamp = 0; - - if (m_formatCtx->iformat->flags & AVFMT_SEEK_TO_PTS && m_formatCtx->start_time != AV_NOPTS_VALUE) - timestamp += m_formatCtx->start_time; - - - // Flush all streams - for (std::shared_ptr stream : connectedStreams) - stream->flushBuffers(); - flushBuffers(); - - // Seek to beginning - int err = avformat_seek_file(m_formatCtx, -1, INT64_MIN, timestamp, INT64_MAX, AVSEEK_FLAG_BACKWARD); - if (err < 0) - { - return false; - } - } - else // Seeking to some other position - { - // Initial target seek point - int64_t timestamp = ((int)newPosition.asSeconds()) * AV_TIME_BASE; - - // < 0 = before seek point - // > 0 = after seek point - std::map< std::shared_ptr, sf::Time> seekingGaps; - - static const float brokenSeekingThreshold = 60.f; // seconds - bool didReseekBackward = false; - bool didReseekForward = false; - int tooEarlyCount = 0; - int tooLateCount = 0; - int brokenSeekingCount = 0; - int ffmpegSeekFlags = AVSEEK_FLAG_BACKWARD; - - do - { - // Flush all streams - for (std::shared_ptr stream : connectedStreams) - stream->flushBuffers(); - flushBuffers(); - - // Seek to new estimated target - if (m_formatCtx->iformat->flags & AVFMT_SEEK_TO_PTS && m_formatCtx->start_time != AV_NOPTS_VALUE) - timestamp += m_formatCtx->start_time; - - int err = avformat_seek_file(m_formatCtx, -1, timestamp - 10 * AV_TIME_BASE, - timestamp, timestamp, ffmpegSeekFlags); - CHECK0(err, "avformat_seek_file failure"); - - // Compute the new gap - for (std::shared_ptr stream : connectedStreams) - { - if (stream->isPassive()) - continue; - - sf::Time position; - if (stream->computeEncodedPosition(position)) - { - seekingGaps[stream] = position - newPosition; - } - } - - tooEarlyCount = 0; - tooLateCount = 0; - brokenSeekingCount = 0; - - // Check the current situation - for (std::pair< std::shared_ptr, sf::Time>&& gapByStream : seekingGaps) - { - // < 0 = before seek point - // > 0 = after seek point - const sf::Time& gap = gapByStream.second; - float absoluteDiff = fabs(gap.asSeconds()); - - // Before seek point - if (gap < sf::Time::Zero) - { - if (absoluteDiff > brokenSeekingThreshold) - { - brokenSeekingCount++; - tooEarlyCount++; - } - // else: a bit early but not too much, this is the final situation we want - } - // After seek point - else if (gap > sf::Time::Zero) - { - tooLateCount++; - - if (absoluteDiff > brokenSeekingThreshold) - brokenSeekingCount++; - } - } - - CHECK(false == (tooEarlyCount && tooLateCount), - "Both too late and too early for different streams, unhandled situation!"); - - // Define what to do next - if (tooEarlyCount) - { - // Go forward by 1 sec - timestamp += AV_TIME_BASE; - didReseekForward = true; - } - else if (tooLateCount) - { - // Go backward by 1 sec - timestamp -= AV_TIME_BASE; - didReseekBackward = true; - } - - if (brokenSeekingCount) - { - if (ffmpegSeekFlags & AVSEEK_FLAG_ANY) - { - return false; - } - else - { - // Try to seek to non-key frame before giving up - // Image may be wrong but it's better than nothing :) - ffmpegSeekFlags |= AVSEEK_FLAG_ANY; - } - } - - CHECK(!(didReseekBackward && didReseekForward), "infinitely seeking backward and forward"); - } - while (tooEarlyCount != 0 || tooLateCount != 0); - } - - return true; - } + av_free(packet); + } + + bool Demuxer::hasPendingDataForStream(const Stream& stream) const + { + sf::Lock l(m_synchronized); + + for (auto& obj : m_pendingDataForActiveStreams) + { + if (obj.first == &stream) + { + return obj.second.empty() == false; + } + } + return false; + } + + AVPacket* Demuxer::gatherQueuedPacketForStream(Stream& stream) + { + sf::Lock l(m_synchronized); + + for (auto& obj : m_pendingDataForActiveStreams) + { + if (obj.first == &stream) + { + auto& pendingPackets = obj.second; + if (pendingPackets.empty() == false) + { + AVPacket* packet = pendingPackets.front(); + pendingPackets.pop_front(); + return packet; + } + } + } + return nullptr; + } + + bool Demuxer::distributePacket(AVPacket* packet, Stream& stream) + { + sf::Lock l(m_synchronized); + if (packet == nullptr) + { + return false; + } + bool distributed = false; + for (const auto& s : m_audioStreams) + { + if (s.second != packet->stream_index) + { + continue; + } + const auto targetStream = s.first.get(); + + // We don't want to store the packets for inactive streams, + // let them be freed + if (targetStream == getSelectedAudioStream()) + { + if (targetStream == &stream || targetStream->isPassive() == true) + { + targetStream->pushEncodedData(packet); + } + else + { + queueEncodedData(packet); + } + distributed = true; + } + } + for (const auto& s : m_videoStreams) + { + if (s.second != packet->stream_index) + { + continue; + } + const auto targetStream = s.first.get(); + + // We don't want to store the packets for inactive streams, + // let them be freed + if (targetStream == getSelectedVideoStream()) + { + if (targetStream == &stream || targetStream->isPassive() == true) + { + targetStream->pushEncodedData(packet); + } + else + { + queueEncodedData(packet); + } + distributed = true; + } + } + return distributed; + } + + void Demuxer::extractDurationFromStream(const AVStream* stream) + { + if (m_duration != sf::Time::Zero) + { + return; + } + if (stream->duration != AV_NOPTS_VALUE) + { + int64_t secs, us; + secs = stream->duration / AV_TIME_BASE; + us = stream->duration % AV_TIME_BASE; + m_duration = sf::seconds(secs + (float)us / AV_TIME_BASE); + } + } + + void Demuxer::requestMoreData(Stream& starvingStream) + { + if (starvingStream.isPassive() == true) + { + return; + } + sf::Lock l(m_synchronized); + feedStream(starvingStream); + } + + void Demuxer::resetEndOfFileStatus() + { + m_eofReached = false; + } + + bool Demuxer::didSeek(const Timer &timer, sf::Time oldPosition) + { + resetEndOfFileStatus(); + sf::Time newPosition = timer.getOffset(); + + if (m_connectedStreams[AudioStreamIndex] == nullptr && + m_connectedStreams[VideoStreamIndex] == nullptr) + { + return false; + } + // Trivial seeking to beginning + if (newPosition == sf::Time::Zero) + { + int64_t timestamp = 0; + + if (m_formatCtx->iformat->flags & AVFMT_SEEK_TO_PTS && m_formatCtx->start_time != AV_NOPTS_VALUE) + { + timestamp += m_formatCtx->start_time; + } + + // Flush all streams + for (auto stream : m_connectedStreams) + { + if (stream != nullptr) + { + stream->flushBuffers(); + } + } + flushBuffers(); + + // Seek to beginning + int err = avformat_seek_file(m_formatCtx, -1, INT64_MIN, timestamp, INT64_MAX, AVSEEK_FLAG_BACKWARD); + if (err < 0) + { + return false; + } + } + else // Seeking to some other position + { + // Initial target seek point + int64_t timestamp = ((int64_t)newPosition.asSeconds()) * AV_TIME_BASE; + + // < 0 = before seek point + // > 0 = after seek point + std::vector seekingGaps; + + static const float brokenSeekingThreshold = 60.f; // seconds + int tooEarlyCount = 0; + int tooLateCount = 0; + int brokenSeekingCount = 0; + int ffmpegSeekFlags = AVSEEK_FLAG_BACKWARD; + + do + { + // Flush all streams + for (auto stream : m_connectedStreams) + { + if (stream != nullptr) + { + stream->flushBuffers(); + } + } + flushBuffers(); + + // Seek to new estimated target + if (m_formatCtx->iformat->flags & AVFMT_SEEK_TO_PTS && + m_formatCtx->start_time != AV_NOPTS_VALUE) + { + timestamp += m_formatCtx->start_time; + } + + int err = avformat_seek_file(m_formatCtx, -1, timestamp - 10 * AV_TIME_BASE, + timestamp, timestamp, ffmpegSeekFlags); + if (err < 0) + { + return false; + } + + // Compute the new gap + for (auto stream : m_connectedStreams) + { + if (stream == nullptr || + stream->isPassive() == true) + { + continue; + } + sf::Time position; + if (stream->computeEncodedPosition(position) == true) + { + seekingGaps.push_back(position - newPosition); + } + } + + tooEarlyCount = 0; + tooLateCount = 0; + brokenSeekingCount = 0; + + // Check the current situation + for (const auto& gap : seekingGaps) + { + // < 0 = before seek point + // > 0 = after seek point + float absoluteDiff = fabs(gap.asSeconds()); + + // Before seek point + if (gap < sf::Time::Zero) + { + if (absoluteDiff > brokenSeekingThreshold) + { + brokenSeekingCount++; + tooEarlyCount++; + } + // else: a bit early but not too much, this is the final situation we want + } + // After seek point + else if (gap > sf::Time::Zero) + { + tooLateCount++; + if (absoluteDiff > brokenSeekingThreshold) + { + brokenSeekingCount++; + } + } + } + + // Define what to do next + if (tooEarlyCount) + { + // Go forward by 1 sec + timestamp += AV_TIME_BASE; + } + else if (tooLateCount) + { + // Go backward by 1 sec + timestamp -= AV_TIME_BASE; + } + + if (brokenSeekingCount) + { + if (ffmpegSeekFlags & AVSEEK_FLAG_ANY) + { + return false; + } + else + { + // Try to seek to non-key frame before giving up + // Image may be wrong but it's better than nothing :) + ffmpegSeekFlags |= AVSEEK_FLAG_ANY; + } + } + } while (tooEarlyCount != 0 || tooLateCount != 0); + } + return true; + } } diff --git a/src/sfeMovie/Demuxer.hpp b/src/sfeMovie/Demuxer.hpp index 4a6017cb..f009820a 100755 --- a/src/sfeMovie/Demuxer.hpp +++ b/src/sfeMovie/Demuxer.hpp @@ -1,4 +1,3 @@ - /* * Demuxer.hpp * sfeMovie project @@ -22,310 +21,280 @@ * */ -#ifndef SFEMOVIE_DEMUXER_HPP -#define SFEMOVIE_DEMUXER_HPP +#pragma once +#include +#include "AudioStream.hpp" +#include +#include #include #include "Stream.hpp" -#include "AudioStream.hpp" -#include "VideoStream.hpp" +#include #include "Timer.hpp" -#include -#include -#include -#include #include -#include +#include "VideoStream.hpp" namespace sfe { - class Demuxer : public Stream::DataSource, public Timer::Observer - { - public: - /** Describes a demuxer - * - * Ie. an audio/video container format parser such as avi, mov, mkv, ogv... parsers - */ - struct DemuxerInfo - { - std::string name; - std::string description; - }; - - /** Describes a decoder - * - * Ie. an audio/video stream decoder for h.264, theora, vp9, mp3, pcm, srt... streams - */ - struct DecoderInfo - { - std::string name; - std::string description; - MediaType type; - }; - - /** Return a list containing the names of all the demuxers (ie. container parsers) included - * in this sfeMovie build - */ - static const std::list& getAvailableDemuxers(); - - /** Return a list containing the names of all the decoders included - * in this sfeMovie build - */ - static const std::list& getAvailableDecoders(); - - /** Default constructor - * - * Open a media file and find its streams - * - * @param sourceFile the path of the media to open and play - * @param timer the timer with which the media streams will be synchronized - * @param videoDelegate the delegate that will handle the images produced by the VideoStreams - */ - Demuxer(const std::string& sourceFile, std::shared_ptr timer, VideoStream::Delegate& videoDelegate); - - /** Default constructor - * - * Open a media file from an InputStream and find its streams - * - * @param inputStream the InputStream of the media to open and play - * @param timer the timer with which the media streams will be synchronized - * @param videoDelegate the delegate that will handle the images produced by the VideoStreams - */ - Demuxer(sf::InputStream& inputStream, std::shared_ptr timer, VideoStream::Delegate& videoDelegate); - - /** Default destructor - */ - virtual ~Demuxer(); - - /** Return a list of the streams found in the media - * The map key is the index of the stream - * - * @return the list of streams - */ - const std::map >& getStreams() const; - - /** Return a set containing all the streams found in the media that match the given type - * - * @param the media type against which the returned streams should be filtered - * @return the audio streams - */ - std::set< std::shared_ptr > getStreamsOfType(MediaType type) const; - - /** Gather the required stream metadata from each stream of the given type - * - * @param type the type of the streams that are to be described - * @return the stream entries computed from the gathered metadata - */ - Streams computeStreamDescriptors(MediaType type) const; - - /** Enable the given audio stream and connect it to the reference timer - * - * If another stream of the same kind is already enabled, it is first disabled and disconnected - * so that only one stream of the same kind can be enabled at the same time. - * - * @param stream the audio stream to enable and connect for playing, or nullptr to disable audio - */ - void selectAudioStream(std::shared_ptr stream); - - /** Enable the first found audio stream, if it exists - * - * @see selectAudioStream - */ - void selectFirstAudioStream(); - - /** Get the currently selected audio stream, if there's one - * - * @return the currently selected audio stream, or nullptr if there's none - */ - std::shared_ptr getSelectedAudioStream() const; - - /** Enable the given video stream and connect it to the reference timer - * - * If another stream of the same kind is already enabled, it is first disabled and disconnected - * so that only one stream of the same kind can be enabled at the same time. - * - * @param stream the video stream to enable and connect for playing, or nullptr to disable video - */ - void selectVideoStream(std::shared_ptr stream); - - /** Enable the first found video stream, if it exists - * - * @see selectAudioStream - */ - void selectFirstVideoStream(); - - /** Get the currently selected video stream, if there's one - * - * @return the currently selected video stream, or nullptr if there's none - */ - std::shared_ptr getSelectedVideoStream() const; - - /** Read encoded data from the media and makes sure that the given stream - * has enough data - * - * @param stream The stream to feed - */ - void feedStream(Stream& stream); - - /** @return a list of all the active streams - */ - std::set> getSelectedStreams() const; - - /** Update the media status and eventually decode frames - */ - void update(); - - /** Tell whether the demuxer has reached the end of the file and can no more feed the streams - * - * @return whether the end of the media file has been reached - */ - bool didReachEndOfFile() const; - - /** Give the media duration - * - * @return the media duration - */ - sf::Time getDuration() const; - - private: - - static const int kBufferSize = 1024 * 1024 * 500; - - class InputStreamIOContext - { - private: - InputStreamIOContext(InputStreamIOContext const &); - InputStreamIOContext& operator = (InputStreamIOContext const &); - - public: - // Move constructor - InputStreamIOContext(InputStreamIOContext&& other) { - m_inputStream = other.m_inputStream; - m_ctx = other.m_ctx; - other.m_ctx = nullptr; - } - - // Move assignment operator - InputStreamIOContext& operator=(InputStreamIOContext&& other) { - m_inputStream = other.m_inputStream; - m_ctx = other.m_ctx; - other.m_ctx = nullptr; - return *this; - } - - InputStreamIOContext() : m_inputStream(nullptr), m_ctx(nullptr) {} - - InputStreamIOContext(sf::InputStream* inputStream) : m_inputStream(inputStream) { - unsigned char* buffer = static_cast(::av_malloc(kBufferSize)); - m_ctx = ::avio_alloc_context(buffer, kBufferSize, 0, this, - &InputStreamIOContext::read, nullptr, &InputStreamIOContext::seek); - } - - ~InputStreamIOContext() { - if (m_ctx != nullptr) - { - auto buf = m_ctx->buffer; - ::av_freep(&m_ctx); - ::av_free(buf); - } - } - - static int read(void* opaque, unsigned char* buf, int buf_size) { - InputStreamIOContext* h = static_cast(opaque); - return (int)h->m_inputStream->read(buf, buf_size); - } - - static int64_t seek(void* opaque, int64_t offset, int whence) { - InputStreamIOContext* h = static_cast(opaque); - - if (0x10000 == whence) { - return h->m_inputStream->getSize(); - } - - return h->m_inputStream->seek(offset); - } - - ::AVIOContext* getAVIOContext() { return m_ctx; } - - private: - sf::InputStream* m_inputStream; - ::AVIOContext* m_ctx; - }; - - /** Common Constructor - */ - void init(const char* fileName, VideoStream::Delegate& videoDelegate); - - /** Read a encoded packet from the media file - * - * You're responsible for freeing the returned packet - * - * @return the read packet, or nullptr if the end of file has been reached - */ - AVPacket* readPacket(); - - /** Empty the temporarily encoded data queue - */ - void flushBuffers(); - - /** Queue a packet that has been read and is to be used by an active stream in near future - * - * @param packet the packet to temporarily store - */ - void queueEncodedData(AVPacket* packet); - - /** Check whether data that should be distributed to the given stream is currently pending - * in the demuxer's temporary queue - * - * @param stream the stream for which pending data availability is to be checked - * @param whether pending data exists for the given stream - */ - bool hasPendingDataForStream(const Stream& stream) const; - - /** Look for a queued packet for the given stream - * - * @param stream the stream for which to search a packet - * @return if a packet for the given stream has been found, it is dequeued and returned - * otherwise NULL is returned - */ - AVPacket* gatherQueuedPacketForStream(Stream& stream); - - /** Distribute the given packet to the correct stream - * - * If the packet doesn't match any known stream, nothing is done - * - * @param packet the packet to distribute - * @param stream the stream that requested data from the demuxer, if the packet is not for this stream - * it must be queued - * @return true if the packet could be distributed, false otherwise - */ - bool distributePacket(AVPacket* packet, Stream& stream); - - /** Try to extract the media duration from the given stream - */ - void extractDurationFromStream(const AVStream* stream); - - // Data source interface - void requestMoreData(Stream& starvingStream) override; - void resetEndOfFileStatus() override; - - // Timer interface - bool didSeek(const Timer& timer, sf::Time oldPosition) override; - - InputStreamIOContext m_streamContext; - AVFormatContext* m_formatCtx; - bool m_eofReached; - std::map > m_streams; - mutable sf::Mutex m_synchronized; - std::shared_ptr m_timer; - std::shared_ptr m_connectedAudioStream; - std::shared_ptr m_connectedVideoStream; - sf::Time m_duration; - std::map > m_pendingDataForActiveStreams; - - static std::list g_availableDemuxers; - static std::list g_availableDecoders; - }; -} + class Demuxer : public Stream::DataSource, public Timer::Observer + { + public: + /** Default constructor + * + * Open a media file and find its streams + * + * @param sourceFile the path of the media to open and play + * @param timer the timer with which the media streams will be synchronized + * @param videoDelegate the delegate that will handle the images produced by the VideoStreams + */ + Demuxer(const std::string_view sourceFile, Timer* timer, VideoStream::Delegate& videoDelegate); + + /** Default constructor + * + * Open a media file from an InputStream and find its streams + * + * @param inputStream the InputStream of the media to open and play + * @param timer the timer with which the media streams will be synchronized + * @param videoDelegate the delegate that will handle the images produced by the VideoStreams + */ + Demuxer(sf::InputStream& inputStream, Timer* timer, VideoStream::Delegate& videoDelegate); + + /** Default destructor + */ + virtual ~Demuxer(); + + /** Return a list of audio streams found in the media + * The map key is the index of the stream + * + * @return the list of streams + */ + const std::vector, int>>& getAudioStreams() const; + + /** Return a list of video streams found in the media + * The map key is the index of the stream + * + * @return the list of streams + */ + const std::vector, int>>& getVideoStreams() const; + + /** Gather the required stream metadata from each stream of the given type + * + * @param type the type of the streams that are to be described + * @return the stream entries computed from the gathered metadata + */ + std::vector computeStreamDescriptors(MediaType type) const; + + /** Enable the given audio stream and connect it to the reference timer + * + * If another stream of the same kind is already enabled, it is first disabled and disconnected + * so that only one stream of the same kind can be enabled at the same time. + * + * @param stream the audio stream to enable and connect for playing, or nullptr to disable audio + */ + void selectAudioStream(AudioStream* stream); + + /** Enable the first found audio stream, if it exists + * + * @see selectAudioStream + */ + void selectFirstAudioStream(); + + /** Get the currently selected audio stream, if there's one + * + * @return the currently selected audio stream, or nullptr if there's none + */ + AudioStream* getSelectedAudioStream() const; + + /** Enable the given video stream and connect it to the reference timer + * + * If another stream of the same kind is already enabled, it is first disabled and disconnected + * so that only one stream of the same kind can be enabled at the same time. + * + * @param stream the video stream to enable and connect for playing, or nullptr to disable video + */ + void selectVideoStream(VideoStream* stream); + + /** Enable the first found video stream, if it exists + * + * @see selectAudioStream + */ + void selectFirstVideoStream(); + + /** Get the currently selected video stream, if there's one + * + * @return the currently selected video stream, or nullptr if there's none + */ + VideoStream* getSelectedVideoStream() const; + + /** Read encoded data from the media and makes sure that the given stream + * has enough data + * + * @param stream The stream to feed + */ + void feedStream(Stream& stream); + + /** Update the media status and eventually decode frames + */ + void update(); + + /** Tell whether the demuxer has reached the end of the file and can no more feed the streams + * + * @return whether the end of the media file has been reached + */ + bool didReachEndOfFile() const; + + /** Give the media duration + * + * @return the media duration + */ + sf::Time getDuration() const; -#endif + private: + + static const int kBufferSize = 1024 * 1024 * 500; + + class InputStreamIOContext + { + private: + InputStreamIOContext(InputStreamIOContext const &) = delete; + InputStreamIOContext& operator=(InputStreamIOContext const &) = delete; + + public: + // Move constructor + InputStreamIOContext(InputStreamIOContext&& other) noexcept + { + m_inputStream = other.m_inputStream; + m_ctx = other.m_ctx; + other.m_ctx = nullptr; + } + + // Move assignment operator + InputStreamIOContext& operator=(InputStreamIOContext&& other) noexcept + { + m_inputStream = other.m_inputStream; + m_ctx = other.m_ctx; + other.m_ctx = nullptr; + return *this; + } + + InputStreamIOContext() : m_inputStream(nullptr), m_ctx(nullptr) {} + + InputStreamIOContext(sf::InputStream* inputStream) : m_inputStream(inputStream) + { + unsigned char* buffer = static_cast(::av_malloc(kBufferSize)); + m_ctx = ::avio_alloc_context(buffer, kBufferSize, 0, this, + &InputStreamIOContext::read, nullptr, &InputStreamIOContext::seek); + } + + ~InputStreamIOContext() + { + if (m_ctx != nullptr) + { + auto buf = m_ctx->buffer; + ::av_freep(&m_ctx); + ::av_free(buf); + } + } + + static int read(void* opaque, unsigned char* buf, int buf_size) + { + InputStreamIOContext* h = static_cast(opaque); + return (int)h->m_inputStream->read(buf, buf_size); + } + + static int64_t seek(void* opaque, int64_t offset, int whence) + { + InputStreamIOContext* h = static_cast(opaque); + if (0x10000 == whence) + { + return h->m_inputStream->getSize(); + } + return h->m_inputStream->seek(offset); + } + + ::AVIOContext* getAVIOContext() { return m_ctx; } + + private: + sf::InputStream* m_inputStream; + ::AVIOContext* m_ctx; + }; + + /** Common Constructor + */ + void init(const char* fileName, VideoStream::Delegate& videoDelegate); + + /** Read a encoded packet from the media file + * + * You're responsible for freeing the returned packet + * + * @return the read packet, or nullptr if the end of file has been reached + */ + AVPacket* readPacket(); + + /** Empty the temporarily encoded data queue + */ + void flushBuffers(); + + /** Empty the temporarily encoded data queue + */ + void flushBuffer(std::list& buffer); + + /** Queue a packet that has been read and is to be used by an active stream in near future + * + * @param packet the packet to temporarily store + */ + void queueEncodedData(AVPacket* packet); + + /** Check whether data that should be distributed to the given stream is currently pending + * in the demuxer's temporary queue + * + * @param stream the stream for which pending data availability is to be checked + * @param whether pending data exists for the given stream + */ + bool hasPendingDataForStream(const Stream& stream) const; + + /** Look for a queued packet for the given stream + * + * @param stream the stream for which to search a packet + * @return if a packet for the given stream has been found, it is dequeued and returned + * otherwise nullptr is returned + */ + AVPacket* gatherQueuedPacketForStream(Stream& stream); + + /** Distribute the given packet to the correct stream + * + * If the packet doesn't match any known stream, nothing is done + * + * @param packet the packet to distribute + * @param stream the stream that requested data from the demuxer, if the packet is not for this stream + * it must be queued + * @return true if the packet could be distributed, false otherwise + */ + bool distributePacket(AVPacket* packet, Stream& stream); + + /** Try to extract the media duration from the given stream + */ + void extractDurationFromStream(const AVStream* stream); + + // Data source interface + void requestMoreData(Stream& starvingStream) override; + void resetEndOfFileStatus() override; + + // Timer interface + bool didSeek(const Timer& timer, sf::Time oldPosition) override; + + static constexpr size_t AudioStreamIndex = 0; + static constexpr size_t VideoStreamIndex = 1; + + InputStreamIOContext m_streamContext; + AVFormatContext* m_formatCtx{ nullptr }; + bool m_eofReached{ false }; + std::vector, int>> m_audioStreams; + std::vector, int>> m_videoStreams; + mutable sf::Mutex m_synchronized; + Timer* m_timer{ nullptr }; + std::array m_connectedStreams{}; + sf::Time m_duration; + std::array>, 2> m_pendingDataForActiveStreams{}; + }; +} diff --git a/src/sfeMovie/Macros.cpp b/src/sfeMovie/Macros.cpp deleted file mode 100755 index a742dbaf..00000000 --- a/src/sfeMovie/Macros.cpp +++ /dev/null @@ -1,37 +0,0 @@ - -/* - * Macros.cpp - * sfeMovie project - * - * Copyright (C) 2010-2015 Lucas Soltic - * lucas.soltic@orange.fr - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "Macros.hpp" - -namespace sfe -{ - std::string ff_err2str(int code) - { - char buf[AV_ERROR_MAX_STRING_SIZE]; - memset(buf, 0, AV_ERROR_MAX_STRING_SIZE); - - av_make_error_string(buf, AV_ERROR_MAX_STRING_SIZE, code); - return std::string(buf); - } -} diff --git a/src/sfeMovie/Macros.hpp b/src/sfeMovie/Macros.hpp deleted file mode 100755 index 1b56630c..00000000 --- a/src/sfeMovie/Macros.hpp +++ /dev/null @@ -1,68 +0,0 @@ - -/* - * Macros.hpp - * sfeMovie project - * - * Copyright (C) 2010-2015 Lucas Soltic - * lucas.soltic@orange.fr - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -#include -#include -#include - -extern "C" -{ - #include -} - -#ifndef SFEMOVIE_MACROS_HPP -#define SFEMOVIE_MACROS_HPP - -#ifndef NDEBUG -#define DEBUG 1 -#endif - -#define CHECK(value, message) if (!(value)) throw std::runtime_error(message); -#define CHECK0(value, message) CHECK(value == 0, message) -#define ONCE(sequence)\ -{ static bool __done = false; if (!__done) { { sequence; } __done = true; } } - -#define BENCH_START \ -{ \ -sf::Clock __bench; - -#define BENCH_END(title) \ -sfeLogDebug(std::string(title) + " took " + s(__bench.getElapsedTime().asMilliseconds()) + "ms"); \ -} - -#if defined(SFML_SYSTEM_WINDOWS) - #ifdef av_err2str - #undef av_err2str - #endif - - namespace sfe - { - std::string ff_err2str(int code); - } - - #define av_err2str sfe::ff_err2str -#endif - -#endif diff --git a/src/sfeMovie/Movie.cpp b/src/sfeMovie/Movie.cpp index dddb110d..d47ef206 100755 --- a/src/sfeMovie/Movie.cpp +++ b/src/sfeMovie/Movie.cpp @@ -1,4 +1,3 @@ - /* * Movie.cpp * sfeMovie project @@ -25,144 +24,118 @@ #include "Movie.hpp" #include "MovieImpl.hpp" - namespace sfe { - Movie::Movie() : - m_impl(new MovieImpl(*this)) - { - } - - Movie::~Movie() - { - } - - - bool Movie::openFromFile(const std::string& filename) - { - return m_impl->openFromFile(filename); - } - - bool Movie::openFromStream(sf::InputStream& stream) - { - return m_impl->openFromStream(stream); - } - - const Streams& Movie::getStreams(MediaType type) const - { - return m_impl->getStreams(type); - } - - bool Movie::selectStream(const StreamDescriptor& streamDescriptor) - { - return m_impl->selectStream(streamDescriptor); - } - - void Movie::play() - { - m_impl->play(); - } - - - void Movie::pause() - { - m_impl->pause(); - } - - - void Movie::stop() - { - m_impl->stop(); - } - - - void Movie::update() - { - m_impl->update(); - } - - - void Movie::setVolume(float volume) - { - m_impl->setVolume(volume); - } - - - float Movie::getVolume() const - { - return m_impl->getVolume(); - } - - - sf::Time Movie::getDuration() const - { - return m_impl->getDuration(); - } - - - sf::Vector2f Movie::getSize() const - { - return m_impl->getSize(); - } - - - void Movie::fit(float x, float y, float width, float height, bool preserveRatio) - { - m_impl->fit(x, y, width, height, preserveRatio); - } - - - void Movie::fit(sf::FloatRect frame, bool preserveRatio) - { - m_impl->fit(frame, preserveRatio); - } - - - float Movie::getFramerate() const - { - return m_impl->getFramerate(); - } - - - unsigned int Movie::getSampleRate() const - { - return m_impl->getSampleRate(); - } - - - unsigned int Movie::getChannelCount() const - { - return m_impl->getChannelCount(); - } - - - Status Movie::getStatus() const - { - return m_impl->getStatus(); - } - - - sf::Time Movie::getPlayingOffset() const - { - return m_impl->getPlayingOffset(); - } - - - bool Movie::setPlayingOffset(const sf::Time& targetSeekTime) - { - return m_impl->setPlayingOffset(targetSeekTime); - } - - - const sf::Texture& Movie::getCurrentImage() const - { - return m_impl->getCurrentImage(); - } - - void Movie::draw(sf::RenderTarget& target, sf::RenderStates states) const - { - states.transform *= getTransform(); - target.draw(*m_impl, states); - } - + Movie::Movie() : m_impl(std::make_shared(*this)) {} + + bool Movie::openFromFile(const std::string_view filename) + { + return m_impl->openFromFile(filename); + } + + bool Movie::openFromStream(sf::InputStream& stream) + { + return m_impl->openFromStream(stream); + } + + const std::vector& Movie::getStreams(MediaType type) const + { + return m_impl->getStreams(type); + } + + bool Movie::selectStream(const StreamDescriptor& streamDescriptor) + { + return m_impl->selectStream(streamDescriptor); + } + + void Movie::play() + { + m_impl->play(); + } + + void Movie::pause() + { + m_impl->pause(); + } + + void Movie::stop() + { + m_impl->stop(); + } + + void Movie::update() + { + m_impl->update(); + } + + void Movie::setVolume(float volume) + { + m_impl->setVolume(volume); + } + + float Movie::getVolume() const + { + return m_impl->getVolume(); + } + + sf::Time Movie::getDuration() const + { + return m_impl->getDuration(); + } + + sf::Vector2f Movie::getSize() const + { + return m_impl->getSize(); + } + + void Movie::fit(float x, float y, float width, float height, bool preserveRatio) + { + m_impl->fit(x, y, width, height, preserveRatio); + } + + void Movie::fit(sf::FloatRect frame, bool preserveRatio) + { + m_impl->fit(frame, preserveRatio); + } + + float Movie::getFramerate() const + { + return m_impl->getFramerate(); + } + + unsigned int Movie::getSampleRate() const + { + return m_impl->getSampleRate(); + } + + unsigned int Movie::getChannelCount() const + { + return m_impl->getChannelCount(); + } + + Status Movie::getStatus() const + { + return m_impl->getStatus(); + } + + sf::Time Movie::getPlayingOffset() const + { + return m_impl->getPlayingOffset(); + } + + bool Movie::setPlayingOffset(const sf::Time& targetSeekTime) + { + return m_impl->setPlayingOffset(targetSeekTime); + } + + const sf::Texture& Movie::getCurrentImage() const + { + return m_impl->getCurrentImage(); + } + + void Movie::draw(sf::RenderTarget& target, sf::RenderStates states) const + { + states.transform *= getTransform(); + target.draw(*m_impl, states); + } } // namespace sfe diff --git a/src/sfeMovie/Movie.hpp b/src/sfeMovie/Movie.hpp index e9aa01fb..89ad4b14 100755 --- a/src/sfeMovie/Movie.hpp +++ b/src/sfeMovie/Movie.hpp @@ -1,4 +1,3 @@ - /* * Movie.hpp * sfeMovie project @@ -22,204 +21,198 @@ * */ +#pragma once -#ifndef SFEMOVIE_MOVIE_HPP -#define SFEMOVIE_MOVIE_HPP - +#include #include #include #include "StreamSelection.hpp" -#include -#include -#include +#include namespace sfe { - /** Constants giving the a playback status - */ - enum Status - { - Stopped, //!< The playback is stopped (ie. not playing and at the beginning) - Paused, //!< The playback is paused - Playing, //!< The playback is playing - End - }; - - class MovieImpl; - /** Main class of the sfeMovie API. It is used to open media files, provide playback and basic controls - */ - class Movie : public sf::Drawable, public sf::Transformable - { - public: - Movie(); - ~Movie(); - - /** @brief Attemps to open a media file (movie or audio) - * - * Opening can fails either because of a wrong filename, - * or because you tried to open a media file that has no supported - * video or audio stream. - * - * @param filename the path to the media file - * @return true on success, false otherwise - */ - bool openFromFile(const std::string& filename); - - /** @brief Attemps to open a media file (movie or audio) from an InputStream - * - * Opening can fails either because of a wrong stream, - * or because you tried to open a media file that has no supported - * video or audio stream. - * - * @param stream the InputStream to the media file - * @return true on success, false otherwise - */ - bool openFromStream(sf::InputStream& stream); - - /** @brief Return a description of all the streams of the given type contained in the opened media - * - * @param type the stream type (audio, video...) to return - */ - const Streams& getStreams(MediaType type) const; - - /** @brief Request activation of the given stream. - * - * In case another stream of the same kind is already active, - * it is deactivated. - * - * @note When opening a new media file, the default behaviour is to automatically activate the first - * found audio and video streams - * - * @warning This method can only be used when the movie is stopped - * - * @param streamDescriptor the descriptor of the stream to activate - * @return true if the stream could be selected (ie. valid stream and movie is stopped) - */ - bool selectStream(const StreamDescriptor& streamDescriptor); - - /** @brief Start or resume playing the media playback - * - * This function starts the stream if it was stopped, resumes it if it was paused, - * and restarts it from beginning if it was already playing. This function is non blocking - * and lets the audio playback happen in the background. The video playback must be updated - * with the update() method. - */ - void play(); - - /** @brief Pauses the media playback - * - * If the media playback is already paused, - * this does nothing, otherwise the playback is paused. - */ - void pause(); - - /** @brief Stops the media playback. The playing offset is reset to the beginning. - * - * This function stops the stream if it was playing or paused, and does nothing - * if it was already stopped. It also resets the playing position (unlike pause()). - */ - void stop(); - - /** @brief Update the media status and eventually decode frames - */ - void update(); - - /** @brief Sets the sound's volume (default is 100) - * - * @param volume the volume in range [0, 100] - */ - void setVolume(float volume); - - /** @brief Returns the current sound's volume - * - * @return the sound's volume, in range [0, 100] - */ - float getVolume() const; - - /** @brief Returns the duration of the movie - * - * @return the duration as sf::Time - */ - sf::Time getDuration() const; - - /** @brief Returns the size (width, height) of the currently active video stream - * - * @return the size of the currently active video stream, or (0, 0) is there is none - */ - sf::Vector2f getSize() const; - - /** @see fitFrame(sf::FloatRect, bool) - */ - void fit(float x, float y, float width, float height, bool preserveRatio = true); - - /** @brief Scales the movie to fit the requested frame. - * - * If the ratio is preserved, the movie may be centered - * in the given frame, thus the movie position may be different from - * the one you specified. - * - * @note This method will erase any previously set scale and position - * - * @param frame the target frame in which you want to display the movie - * @param preserveRatio true to keep the original movie ratio, false otherwise - */ - void fit(sf::FloatRect frame, bool preserveRatio = true); - - /** @brief Returns the average amount of video frames per second - * - * In case of media that use Variable Frame Rate, this value is approximative - * - * @return the average video frame rate - */ - float getFramerate() const; - - /** @brief Returns the amount of audio samples per second - * - * @return the audio sample rate - */ - unsigned int getSampleRate() const; - - /** @brief Returns the count of audio channels - * - * @return the channels' count - */ - unsigned int getChannelCount() const; - - /** @brief Returns the current status of the movie - * - * @return See enum Status - */ - Status getStatus() const; - - /** @brief Returns the current playing position in the movie - * - * @return the playing position - */ - sf::Time getPlayingOffset() const; - - /** Seek up to @a targetSeekTime - * - * @param targetSeekTime the new expected playing offset - * @return true is seeking was successfull on all the streams, false otherwise - * If seeking failed, it is not guaranteed to still be playable and synchronized - */ - bool setPlayingOffset(const sf::Time& targetSeekTime); - - /** @brief Returns the latest movie image - * - * The returned image is a texture in VRAM. - * If the movie has no video stream, this returns an empty texture. - * - * @note As in the classic update()/draw() workflow, update() needs to be called - * before using this method if you want the image to be up to date - * - * @return the current image of the movie for the activated video stream - */ - const sf::Texture& getCurrentImage() const; - private: - void draw(sf::RenderTarget& Target, sf::RenderStates states) const; - std::shared_ptr m_impl; - }; -} // namespace sfe + /** Constants giving the a playback status + */ + enum Status + { + Stopped, //!< The playback is stopped (ie. not playing and at the beginning) + Paused, //!< The playback is paused + Playing, //!< The playback is playing + End + }; + + class MovieImpl; + /** Main class of the sfeMovie API. It is used to open media files, provide playback and basic controls + */ + class Movie : public sf::Drawable, public sf::Transformable + { + public: + Movie(); + + /** @brief Attemps to open a media file (movie or audio) + * + * Opening can fails either because of a wrong filename, + * or because you tried to open a media file that has no supported + * video or audio stream. + * + * @param filename the path to the media file + * @return true on success, false otherwise + */ + bool openFromFile(const std::string_view filename); + + /** @brief Attemps to open a media file (movie or audio) from an InputStream + * + * Opening can fails either because of a wrong stream, + * or because you tried to open a media file that has no supported + * video or audio stream. + * + * @param stream the InputStream to the media file + * @return true on success, false otherwise + */ + bool openFromStream(sf::InputStream& stream); + + /** @brief Return a description of all the streams of the given type contained in the opened media + * + * @param type the stream type (audio, video...) to return + */ + const std::vector& getStreams(MediaType type) const; + + /** @brief Request activation of the given stream. + * + * In case another stream of the same kind is already active, + * it is deactivated. + * + * @note When opening a new media file, the default behaviour is to automatically activate the first + * found audio and video streams + * + * @warning This method can only be used when the movie is stopped + * + * @param streamDescriptor the descriptor of the stream to activate + * @return true if the stream could be selected (ie. valid stream and movie is stopped) + */ + bool selectStream(const StreamDescriptor& streamDescriptor); + + /** @brief Start or resume playing the media playback + * + * This function starts the stream if it was stopped, resumes it if it was paused, + * and restarts it from beginning if it was already playing. This function is non blocking + * and lets the audio playback happen in the background. The video playback must be updated + * with the update() method. + */ + void play(); + + /** @brief Pauses the media playback + * + * If the media playback is already paused, + * this does nothing, otherwise the playback is paused. + */ + void pause(); + + /** @brief Stops the media playback. The playing offset is reset to the beginning. + * + * This function stops the stream if it was playing or paused, and does nothing + * if it was already stopped. It also resets the playing position (unlike pause()). + */ + void stop(); + + /** @brief Update the media status and eventually decode frames + */ + void update(); -#endif + /** @brief Sets the sound's volume (default is 100) + * + * @param volume the volume in range [0, 100] + */ + void setVolume(float volume); + + /** @brief Returns the current sound's volume + * + * @return the sound's volume, in range [0, 100] + */ + float getVolume() const; + + /** @brief Returns the duration of the movie + * + * @return the duration as sf::Time + */ + sf::Time getDuration() const; + + /** @brief Returns the size (width, height) of the currently active video stream + * + * @return the size of the currently active video stream, or (0, 0) is there is none + */ + sf::Vector2f getSize() const; + + /** @see fitFrame(sf::FloatRect, bool) + */ + void fit(float x, float y, float width, float height, bool preserveRatio = true); + + /** @brief Scales the movie to fit the requested frame. + * + * If the ratio is preserved, the movie may be centered + * in the given frame, thus the movie position may be different from + * the one you specified. + * + * @note This method will erase any previously set scale and position + * + * @param frame the target frame in which you want to display the movie + * @param preserveRatio true to keep the original movie ratio, false otherwise + */ + void fit(sf::FloatRect frame, bool preserveRatio = true); + + /** @brief Returns the average amount of video frames per second + * + * In case of media that use Variable Frame Rate, this value is approximative + * + * @return the average video frame rate + */ + float getFramerate() const; + + /** @brief Returns the amount of audio samples per second + * + * @return the audio sample rate + */ + unsigned int getSampleRate() const; + + /** @brief Returns the count of audio channels + * + * @return the channels' count + */ + unsigned int getChannelCount() const; + + /** @brief Returns the current status of the movie + * + * @return See enum Status + */ + Status getStatus() const; + + /** @brief Returns the current playing position in the movie + * + * @return the playing position + */ + sf::Time getPlayingOffset() const; + + /** Seek up to @a targetSeekTime + * + * @param targetSeekTime the new expected playing offset + * @return true is seeking was successfull on all the streams, false otherwise + * If seeking failed, it is not guaranteed to still be playable and synchronized + */ + bool setPlayingOffset(const sf::Time& targetSeekTime); + + /** @brief Returns the latest movie image + * + * The returned image is a texture in VRAM. + * If the movie has no video stream, this returns an empty texture. + * + * @note As in the classic update()/draw() workflow, update() needs to be called + * before using this method if you want the image to be up to date + * + * @return the current image of the movie for the activated video stream + */ + const sf::Texture& getCurrentImage() const; + private: + void draw(sf::RenderTarget& Target, sf::RenderStates states) const; + std::shared_ptr m_impl; + }; +} // namespace sfe diff --git a/src/sfeMovie/MovieImpl.cpp b/src/sfeMovie/MovieImpl.cpp index 980f9b26..65f73b74 100755 --- a/src/sfeMovie/MovieImpl.cpp +++ b/src/sfeMovie/MovieImpl.cpp @@ -1,4 +1,3 @@ - /* * MovieImpl.cpp * sfeMovie project @@ -23,421 +22,402 @@ */ #include "MovieImpl.hpp" +#include #include "Demuxer.hpp" #include "Timer.hpp" -#include "Utilities.hpp" -#include -#include namespace sfe { - MovieImpl::MovieImpl(sf::Transformable& movieView) : - m_movieView(movieView), - m_demuxer(nullptr), - m_timer(nullptr), - m_videoSprite() - { - } - - MovieImpl::~MovieImpl() - { - if (m_timer && m_timer->getStatus() != Stopped) - stop(); - } - - bool MovieImpl::openFromFile(const std::string& filename) - { - try - { - m_timer = std::make_shared(); - m_demuxer = std::make_shared(filename, m_timer, *this); - - return open(); - } - catch (std::runtime_error) - { - return false; - } - } - - bool MovieImpl::openFromStream(sf::InputStream& stream) - { - try - { - m_timer = std::make_shared(); - m_demuxer = std::make_shared(stream, m_timer, *this); - - return open(); - } - catch (std::runtime_error) - { - return false; - } - } - - bool MovieImpl::open() - { - m_audioStreamsDesc = m_demuxer->computeStreamDescriptors(Audio); - m_videoStreamsDesc = m_demuxer->computeStreamDescriptors(Video); - - std::set< std::shared_ptr > audioStreams = m_demuxer->getStreamsOfType(Audio); - std::set< std::shared_ptr > videoStreams = m_demuxer->getStreamsOfType(Video); - - m_demuxer->selectFirstAudioStream(); - m_demuxer->selectFirstVideoStream(); - - if (audioStreams.empty() && videoStreams.empty()) - { - return false; - } - else - { - if (!videoStreams.empty()) - { - sf::Vector2f size = getSize(); - m_displayFrame = sf::FloatRect(0, 0, size.x, size.y); - } - - return true; - } - } - - const Streams& MovieImpl::getStreams(MediaType type) const - { - switch (type) - { - case Audio: return m_audioStreamsDesc; - case Video: return m_videoStreamsDesc; - default: CHECK(false, "Movie::getStreams() - Unknown stream type:" + mediaTypeToString(type)); - } - } - - bool MovieImpl::selectStream(const StreamDescriptor& streamDescriptor) - { - if (!m_demuxer || !m_timer) - { - return false; - } - - if (m_timer->getStatus() != Stopped) - { - return false; - } - - std::map > streams = m_demuxer->getStreams(); - std::map >::iterator it = streams.find(streamDescriptor.identifier); - std::shared_ptr streamToSelect = nullptr; - - if (it != streams.end()) - { - streamToSelect = it->second; - } - - switch (streamDescriptor.type) - { - case Audio: - m_demuxer->selectAudioStream(std::dynamic_pointer_cast(streamToSelect)); - return true; - case Video: - m_demuxer->selectVideoStream(std::dynamic_pointer_cast(streamToSelect)); - return true; - default: - return false; - } - } - - void MovieImpl::play() - { - if (m_demuxer && m_timer) - { - if (m_timer->getStatus() == Playing) - { - return; - } - - m_timer->play(); - update(); - } - } - - void MovieImpl::pause() - { - if (m_demuxer && m_timer) - { - if (m_timer->getStatus() == Paused) - { - return; - } - - m_timer->pause(); - update(); - } - } - - void MovieImpl::stop() - { - if (m_demuxer && m_timer) - { - if (m_timer->getStatus() == Stopped) - { - return; - } - - m_timer->stop(); - update(); - - std::shared_ptr videoStream(m_demuxer->getSelectedVideoStream()); - - if (videoStream) - videoStream->preload(); - } - } - - void MovieImpl::update() - { - if (m_demuxer && m_timer) - { - m_demuxer->update(); - - if (getStatus() == Stopped && m_timer->getStatus() != Stopped) - { - m_timer->stop(); - } - - // Enable smoothing when the video is scaled - std::shared_ptr vStream = m_demuxer->getSelectedVideoStream(); - if (vStream) - { - sf::Vector2f movieScale = m_movieView.getScale(); - sf::Vector2f subviewScale = m_videoSprite.getScale(); - - if (std::fabs(movieScale.x - 1.f) < 0.00001 && - std::fabs(movieScale.y - 1.f) < 0.00001 && - std::fabs(subviewScale.x - 1.f) < 0.00001 && - std::fabs(subviewScale.y - 1.f) < 0.00001) - { - vStream->getVideoTexture().setSmooth(false); - } - else - { - vStream->getVideoTexture().setSmooth(true); - } - } - } - } - - void MovieImpl::setVolume(float volume) - { - if (m_demuxer && m_timer) - { - std::set< std::shared_ptr > audioStreams = m_demuxer->getStreamsOfType(Audio); - - for (std::shared_ptr stream : audioStreams) - { - std::shared_ptr audioStream = std::dynamic_pointer_cast(stream); - audioStream->setVolume(volume); - } - } - } - - float MovieImpl::getVolume() const - { - if (m_demuxer && m_timer) - { - std::shared_ptr audioStream = m_demuxer->getSelectedAudioStream(); - - if (audioStream) - return audioStream->getVolume(); - } - - return 0; - } - - sf::Time MovieImpl::getDuration() const - { - if (m_demuxer && m_timer) - { - return m_demuxer->getDuration(); - } - - return sf::Time::Zero; - } - - sf::Vector2f MovieImpl::getSize() const - { - if (m_demuxer && m_timer) - { - std::shared_ptr videoStream = m_demuxer->getSelectedVideoStream(); - - if (videoStream) - { - return sf::Vector2f(videoStream->getFrameSize()); - } - } - return sf::Vector2f(0, 0); - } - - void MovieImpl::fit(float x, float y, float width, float height, bool preserveRatio) - { - fit(sf::FloatRect(x, y, width, height), preserveRatio); - } - - void MovieImpl::fit(sf::FloatRect frame, bool preserveRatio) - { - sf::Vector2f movie_size = getSize(); - - if (movie_size.x == 0 || movie_size.y == 0) - { - return; - } - - sf::Vector2f wanted_size = sf::Vector2f(frame.width, frame.height); - sf::Vector2f new_size; - - if (preserveRatio) - { - sf::Vector2f target_size = movie_size; - - float source_ratio = movie_size.x / movie_size.y; - float target_ratio = wanted_size.x / wanted_size.y; - - if (source_ratio > target_ratio) - { - target_size.x = movie_size.x * wanted_size.x / movie_size.x; - target_size.y = movie_size.y * wanted_size.x / movie_size.x; - } - else - { - target_size.x = movie_size.x * wanted_size.y / movie_size.y; - target_size.y = movie_size.y * wanted_size.y / movie_size.y; - } - - new_size = target_size; - } - else - { - new_size = wanted_size; - } - - m_videoSprite.setPosition((wanted_size.x - new_size.x) / 2.f, - (wanted_size.y - new_size.y) / 2.f); - m_movieView.setPosition(frame.left, frame.top); - m_videoSprite.setScale((float)new_size.x / movie_size.x, (float)new_size.y / movie_size.y); - m_displayFrame = frame; - } - - float MovieImpl::getFramerate() const - { - if (m_demuxer && m_timer) - { - std::shared_ptr videoStream = m_demuxer->getSelectedVideoStream(); - - if (videoStream) - return videoStream->getFrameRate(); - } - - return 0; - } - - unsigned int MovieImpl::getSampleRate() const - { - if (m_demuxer && m_timer) - { - std::shared_ptr audioStream = m_demuxer->getSelectedAudioStream(); - - if (audioStream) - return audioStream->getSampleRate(); - } - - return 0; - } - - unsigned int MovieImpl::getChannelCount() const - { - if (m_demuxer && m_timer) - { - std::shared_ptr audioStream = m_demuxer->getSelectedAudioStream(); - if (audioStream) - return audioStream->getChannelCount(); - } - - return 0; - } - - Status MovieImpl::getStatus() const - { - Status st = Stopped; - - if (m_demuxer) - { - std::shared_ptr videoStream = m_demuxer->getSelectedVideoStream(); - std::shared_ptr audioStream = m_demuxer->getSelectedAudioStream(); - Status vStatus = videoStream ? videoStream->getStatus() : Stopped; - Status aStatus = audioStream ? audioStream->Stream::getStatus() : Stopped; - - if (vStatus == Playing || aStatus == Playing) - { - st = Playing; - } - else if (vStatus == Paused || aStatus == Paused) - { - st = Paused; - } - } - - return st; - } - - sf::Time MovieImpl::getPlayingOffset() const - { - if (m_demuxer && m_timer) - { - return m_timer->getOffset(); - } - - return sf::Time::Zero; - } - - bool MovieImpl::setPlayingOffset(const sf::Time& targetSeekTime) - { - bool seekingResult = false; - - if (m_demuxer && m_timer) - { - if (!(targetSeekTime < sf::Time::Zero || targetSeekTime >= getDuration())) - { - seekingResult = m_timer->seek(targetSeekTime); - - if (m_timer->getStatus() == Status::Stopped) - pause(); - } - } - - return seekingResult; - } - - const sf::Texture& MovieImpl::getCurrentImage() const - { - static sf::Texture emptyTexture; - - if (m_videoSprite.getTexture()) - { - return * m_videoSprite.getTexture(); - } - else - { - return emptyTexture; - } - } - - void MovieImpl::draw(sf::RenderTarget& target, sf::RenderStates states) const - { - target.draw(m_videoSprite, states); - } - - void MovieImpl::didUpdateVideo(const VideoStream& sender, const sf::Texture& image) - { - if (m_videoSprite.getTexture() != &image) - m_videoSprite.setTexture(image); - } + MovieImpl::MovieImpl(sf::Transformable& movieView) : m_movieView(movieView) {} + + MovieImpl::~MovieImpl() + { + m_demuxer = nullptr; + if (m_timer != nullptr && m_timer->getStatus() != Stopped) + { + stop(); + } + m_timer = nullptr; + } + + bool MovieImpl::openFromFile(const std::string_view filename) + { + m_timer = std::make_unique(); + m_demuxer = std::make_unique(filename, m_timer.get(), *this); + return open(); + } + + bool MovieImpl::openFromStream(sf::InputStream& stream) + { + m_timer = std::make_unique(); + m_demuxer = std::make_unique(stream, m_timer.get(), *this); + return open(); + } + + bool MovieImpl::open() + { + if (m_demuxer->getAudioStreams().empty() == true && + m_demuxer->getVideoStreams().empty() == true) + { + return false; + } + + m_audioStreamsDesc = m_demuxer->computeStreamDescriptors(Audio); + m_videoStreamsDesc = m_demuxer->computeStreamDescriptors(Video); + + m_demuxer->selectFirstAudioStream(); + m_demuxer->selectFirstVideoStream(); + + if (m_demuxer->getVideoStreams().empty() == false) + { + sf::Vector2f size = getSize(); + m_displayFrame = sf::FloatRect(0, 0, size.x, size.y); + } + return true; + } + + const std::vector& MovieImpl::getStreams(MediaType type) const + { + switch (type) + { + case Audio: + return m_audioStreamsDesc; + case Video: + return m_videoStreamsDesc; + default: + return m_noStreamsDesc; + } + } + + bool MovieImpl::selectStream(const StreamDescriptor& streamDescriptor) + { + if (m_demuxer == nullptr || m_timer == nullptr) + { + return false; + } + if (m_timer->getStatus() != Stopped) + { + return false; + } + switch (streamDescriptor.type) + { + case Audio: + { + for (const auto& stream : m_demuxer->getAudioStreams()) + { + if (stream.second == streamDescriptor.identifier) + { + m_demuxer->selectAudioStream(dynamic_cast(stream.first.get())); + return true; + } + } + break; + } + case Video: + { + for (const auto& stream : m_demuxer->getVideoStreams()) + { + if (stream.second == streamDescriptor.identifier) + { + m_demuxer->selectVideoStream(dynamic_cast(stream.first.get())); + return true; + } + } + break; + } + default: + break; + } + return false; + } + + void MovieImpl::play() + { + if (m_demuxer == nullptr || m_timer == nullptr) + { + return; + } + if (m_timer->getStatus() == Playing) + { + return; + } + m_timer->play(); + update(); + } + + void MovieImpl::pause() + { + if (m_demuxer == nullptr || m_timer == nullptr) + { + return; + } + if (m_timer->getStatus() == Paused) + { + return; + } + m_timer->pause(); + update(); + } + + void MovieImpl::stop() + { + if (m_demuxer == nullptr || m_timer == nullptr) + { + return; + } + if (m_timer->getStatus() == Stopped) + { + return; + } + m_timer->stop(); + update(); + auto videoStream = m_demuxer->getSelectedVideoStream(); + if (videoStream) + { + videoStream->preload(); + } + } + + void MovieImpl::update() + { + if (m_demuxer == nullptr || m_timer == nullptr) + { + return; + } + m_demuxer->update(); + if (getStatus() == Stopped && m_timer->getStatus() != Stopped) + { + m_timer->stop(); + } + // Enable smoothing when the video is scaled + auto vStream = m_demuxer->getSelectedVideoStream(); + if (vStream != nullptr) + { + sf::Vector2f movieScale = m_movieView.getScale(); + sf::Vector2f subviewScale = m_videoSprite.getScale(); + + if (std::fabs(movieScale.x - 1.f) < 0.00001 && + std::fabs(movieScale.y - 1.f) < 0.00001 && + std::fabs(subviewScale.x - 1.f) < 0.00001 && + std::fabs(subviewScale.y - 1.f) < 0.00001) + { + vStream->getVideoTexture().setSmooth(false); + } + else + { + vStream->getVideoTexture().setSmooth(true); + } + } + } + + void MovieImpl::setVolume(float volume) + { + if (m_demuxer == nullptr || m_timer == nullptr) + { + return; + } + for (auto& stream : m_demuxer->getAudioStreams()) + { + stream.first->setVolume(volume); + } + } + + float MovieImpl::getVolume() const + { + if (m_demuxer != nullptr && m_timer != nullptr) + { + auto audioStream = m_demuxer->getSelectedAudioStream(); + if (audioStream != nullptr) + { + return audioStream->getVolume(); + } + } + return 0.f; + } + + sf::Time MovieImpl::getDuration() const + { + if (m_demuxer != nullptr && m_timer != nullptr) + { + return m_demuxer->getDuration(); + } + return sf::Time::Zero; + } + + sf::Vector2f MovieImpl::getSize() const + { + if (m_demuxer != nullptr && m_timer != nullptr) + { + auto videoStream = m_demuxer->getSelectedVideoStream(); + if (videoStream != nullptr) + { + return sf::Vector2f(videoStream->getFrameSize()); + } + } + return sf::Vector2f(0, 0); + } + + void MovieImpl::fit(float x, float y, float width, float height, bool preserveRatio) + { + fit(sf::FloatRect(x, y, width, height), preserveRatio); + } + + void MovieImpl::fit(sf::FloatRect frame, bool preserveRatio) + { + sf::Vector2f movie_size = getSize(); + + if (movie_size.x == 0 || movie_size.y == 0) + { + return; + } + + sf::Vector2f wanted_size = sf::Vector2f(frame.width, frame.height); + sf::Vector2f new_size; + + if (preserveRatio) + { + sf::Vector2f target_size = movie_size; + + float source_ratio = movie_size.x / movie_size.y; + float target_ratio = wanted_size.x / wanted_size.y; + + if (source_ratio > target_ratio) + { + target_size.x = movie_size.x * wanted_size.x / movie_size.x; + target_size.y = movie_size.y * wanted_size.x / movie_size.x; + } + else + { + target_size.x = movie_size.x * wanted_size.y / movie_size.y; + target_size.y = movie_size.y * wanted_size.y / movie_size.y; + } + + new_size = target_size; + } + else + { + new_size = wanted_size; + } + + m_videoSprite.setPosition((wanted_size.x - new_size.x) / 2.f, + (wanted_size.y - new_size.y) / 2.f); + m_movieView.setPosition(frame.left, frame.top); + m_videoSprite.setScale((float)new_size.x / movie_size.x, (float)new_size.y / movie_size.y); + m_displayFrame = frame; + } + + float MovieImpl::getFramerate() const + { + if (m_demuxer != nullptr && m_timer != nullptr) + { + auto videoStream = m_demuxer->getSelectedVideoStream(); + if (videoStream != nullptr) + { + return videoStream->getFrameRate(); + } + } + return 0.f; + } + + unsigned int MovieImpl::getSampleRate() const + { + if (m_demuxer != nullptr && m_timer != nullptr) + { + auto audioStream = m_demuxer->getSelectedAudioStream(); + if (audioStream != nullptr) + { + return audioStream->getSampleRate(); + } + } + return 0; + } + + unsigned int MovieImpl::getChannelCount() const + { + if (m_demuxer != nullptr && m_timer != nullptr) + { + auto audioStream = m_demuxer->getSelectedAudioStream(); + if (audioStream != nullptr) + { + return audioStream->getChannelCount(); + } + } + return 0; + } + + Status MovieImpl::getStatus() const + { + Status st = Stopped; + if (m_demuxer != nullptr) + { + auto videoStream = m_demuxer->getSelectedVideoStream(); + auto audioStream = m_demuxer->getSelectedAudioStream(); + Status vStatus = (videoStream != nullptr ? videoStream->getStatus() : Stopped); + Status aStatus = (audioStream != nullptr ? audioStream->Stream::getStatus() : Stopped); + + if (vStatus == Playing || aStatus == Playing) + { + st = Playing; + } + else if (vStatus == Paused || aStatus == Paused) + { + st = Paused; + } + } + return st; + } + + sf::Time MovieImpl::getPlayingOffset() const + { + if (m_demuxer != nullptr && m_timer != nullptr) + { + return m_timer->getOffset(); + } + return sf::Time::Zero; + } + + bool MovieImpl::setPlayingOffset(const sf::Time& targetSeekTime) + { + bool seekingResult = false; + if (m_demuxer != nullptr && m_timer != nullptr) + { + if (targetSeekTime >= sf::Time::Zero && + targetSeekTime < getDuration()) + { + seekingResult = m_timer->seek(targetSeekTime); + if (m_timer->getStatus() == Status::Stopped) + { + pause(); + } + } + } + return seekingResult; + } + + const sf::Texture& MovieImpl::getCurrentImage() const + { + static sf::Texture emptyTexture; + + if (m_videoSprite.getTexture() != nullptr) + { + return *m_videoSprite.getTexture(); + } + else + { + return emptyTexture; + } + } + + void MovieImpl::draw(sf::RenderTarget& target, sf::RenderStates states) const + { + target.draw(m_videoSprite, states); + } + + void MovieImpl::didUpdateVideo(const VideoStream& sender, const sf::Texture& image) + { + if (m_videoSprite.getTexture() != &image) + { + m_videoSprite.setTexture(image); + } + } } diff --git a/src/sfeMovie/MovieImpl.hpp b/src/sfeMovie/MovieImpl.hpp index 1ce8195b..40d5c1a5 100755 --- a/src/sfeMovie/MovieImpl.hpp +++ b/src/sfeMovie/MovieImpl.hpp @@ -1,4 +1,3 @@ - /* * MovieImpl.hpp * sfeMovie project @@ -22,140 +21,120 @@ * */ -#ifndef SFEMOVIE_MOVIEIMPL_HPP -#define SFEMOVIE_MOVIEIMPL_HPP +#pragma once -#include #include -#include -#include -#include +#include #include "VideoStream.hpp" namespace sfe { - class Demuxer; - - class MovieImpl : public VideoStream::Delegate, public sf::Drawable - { - public: - MovieImpl(sf::Transformable& movieView); - virtual ~MovieImpl(); - - /** @see Movie::openFromFile() - */ - bool openFromFile(const std::string& filename); - - /** @see Movie::openFromStream() - */ - bool openFromStream(sf::InputStream& stream); - - /** @see Movie::getStreams() - */ - const Streams& getStreams(MediaType type) const; - - /** @see Movie::selectStream() - */ - bool selectStream(const StreamDescriptor& streamDescriptor); - - /** @see Movie::play() - */ - void play(); - - - /** @see Movie::pause() - */ - void pause(); - - - /** @see Movie::stop() - */ - void stop(); - - - /** Update the media status and eventually decode frames - */ - void update(); - - - /** @see Movie::setVolume() - */ - void setVolume(float volume); - - - /** @see Movie::getVolume() - */ - float getVolume() const; - - - /** @see Movie::getDuration() - */ - sf::Time getDuration() const; - - - /** @see Movie::getSize() - */ - sf::Vector2f getSize() const; - - - /** @see fit(sf::FloatRect, bool) - */ - void fit(float x, float y, float width, float height, bool preserveRatio = true); - - - /** @see Movie::fit() - */ - void fit(sf::FloatRect frame, bool preserveRatio = true); - - - /** @see Movie::getFramerate() - */ - float getFramerate() const; - - - /** @see Movie::getSampleRate() - */ - unsigned int getSampleRate() const; - - - /** @see Movie::getChannelCount() - */ - unsigned int getChannelCount() const; - - - /** @see Movie::getStatus() - */ - Status getStatus() const; - - - /** @see Movie::getPlayingOffset() - */ - sf::Time getPlayingOffset() const; - - /** @see Movie::setPlayingOffset() - */ - bool setPlayingOffset(const sf::Time& targetSeekTime); - - /** @see Movie::getCurrentImage() - */ - const sf::Texture& getCurrentImage() const; - - void draw(sf::RenderTarget& target, sf::RenderStates states) const override; - void didUpdateVideo(const VideoStream& sender, const sf::Texture& image) override; - - private: - - bool open(); - - sf::Transformable& m_movieView; - std::shared_ptr m_demuxer; - std::shared_ptr m_timer; - sf::Sprite m_videoSprite; - Streams m_audioStreamsDesc; - Streams m_videoStreamsDesc; - sf::FloatRect m_displayFrame; - }; - -} + class Demuxer; + + class MovieImpl : public VideoStream::Delegate, public sf::Drawable + { + public: + MovieImpl(sf::Transformable& movieView); + virtual ~MovieImpl(); + + /** @see Movie::openFromFile() + */ + bool openFromFile(const std::string_view filename); + + /** @see Movie::openFromStream() + */ + bool openFromStream(sf::InputStream& stream); + + /** @see Movie::getStreams() + */ + const std::vector& getStreams(MediaType type) const; + + /** @see Movie::selectStream() + */ + bool selectStream(const StreamDescriptor& streamDescriptor); + + /** @see Movie::play() + */ + void play(); + + /** @see Movie::pause() + */ + void pause(); + + /** @see Movie::stop() + */ + void stop(); + + /** Update the media status and eventually decode frames + */ + void update(); + + /** @see Movie::setVolume() + */ + void setVolume(float volume); + + /** @see Movie::getVolume() + */ + float getVolume() const; + + /** @see Movie::getDuration() + */ + sf::Time getDuration() const; -#endif + /** @see Movie::getSize() + */ + sf::Vector2f getSize() const; + + /** @see fit(sf::FloatRect, bool) + */ + void fit(float x, float y, float width, float height, bool preserveRatio = true); + + /** @see Movie::fit() + */ + void fit(sf::FloatRect frame, bool preserveRatio = true); + + /** @see Movie::getFramerate() + */ + float getFramerate() const; + + /** @see Movie::getSampleRate() + */ + unsigned int getSampleRate() const; + + /** @see Movie::getChannelCount() + */ + unsigned int getChannelCount() const; + + /** @see Movie::getStatus() + */ + Status getStatus() const; + + /** @see Movie::getPlayingOffset() + */ + sf::Time getPlayingOffset() const; + + /** @see Movie::setPlayingOffset() + */ + bool setPlayingOffset(const sf::Time& targetSeekTime); + + /** @see Movie::getCurrentImage() + */ + const sf::Texture& getCurrentImage() const; + + void draw(sf::RenderTarget& target, sf::RenderStates states) const override; + void didUpdateVideo(const VideoStream& sender, const sf::Texture& image) override; + + private: + + bool open(); + + sf::Transformable& m_movieView; + std::unique_ptr m_demuxer; + std::unique_ptr m_timer; + sf::Sprite m_videoSprite; + std::vector m_audioStreamsDesc; + std::vector m_videoStreamsDesc; + std::vector m_noStreamsDesc; + sf::FloatRect m_displayFrame; + }; +} diff --git a/src/sfeMovie/Stream.cpp b/src/sfeMovie/Stream.cpp index a4217622..d2f8c166 100755 --- a/src/sfeMovie/Stream.cpp +++ b/src/sfeMovie/Stream.cpp @@ -1,4 +1,3 @@ - /* * Stream.cpp * sfeMovie project @@ -29,281 +28,288 @@ extern "C" } #include "Stream.hpp" -#include "Utilities.hpp" #include "TimerPriorities.hpp" -#include -#include -#include namespace sfe { - Stream::Stream(AVFormatContext*& formatCtx, AVStream*& stream, DataSource& dataSource, std::shared_ptr timer) : - m_formatCtx(formatCtx), - m_stream(stream), - m_dataSource(dataSource), - m_timer(timer), - m_codec(nullptr), -#if LIBAVFORMAT_VERSION_MAJOR > 56 - m_codecCtx(nullptr), -#endif - m_streamID(-1), - m_packetList(), - m_status(Stopped), - m_readerMutex() - { - CHECK(stream, "Stream::Stream() - invalid stream argument"); - CHECK(timer, "Inconcistency error: null timer"); - int err = 0; - - m_stream = stream; - m_streamID = stream->index; - CHECK(m_stream, "Inconcistency error: null stream") - CHECK(m_streamID >= 0, "Inconcistency error: invalid stream id"); - - // Get the decoder + Stream::Stream(AVFormatContext*& formatCtx, AVStream*& stream, + DataSource& dataSource, Timer* timer) : m_formatCtx(formatCtx), + m_stream(stream), m_dataSource(dataSource), m_timer(timer) + { + if (stream == nullptr || + timer == nullptr) + { + return; + } + + m_stream = stream; + m_streamID = stream->index; + + if (m_streamID < 0) + { + return; + } + + // Get the decoder #if LIBAVFORMAT_VERSION_MAJOR > 56 - m_codec = avcodec_find_decoder(m_stream->codecpar->codec_id); - CHECK(m_codec, "Stream() - no decoder for " + std::string(avcodec_get_name(m_stream->codecpar->codec_id)) + " codec"); - - // Load the codec - m_codecCtx = avcodec_alloc_context3(m_codec); - avcodec_parameters_to_context(m_codecCtx, stream->codecpar); - err = avcodec_open2(m_codecCtx, m_codec, nullptr); - CHECK0(err, "Stream() - unable to load decoder for codec " + std::string(avcodec_get_name(m_stream->codecpar->codec_id))); + m_codec = avcodec_find_decoder(m_stream->codecpar->codec_id); + if (m_codec == nullptr) + { + return; + } + + // Load the codec + m_codecCtx = avcodec_alloc_context3(m_codec); + avcodec_parameters_to_context(m_codecCtx, stream->codecpar); + auto err = avcodec_open2(m_codecCtx, m_codec, nullptr); #else - m_codec = avcodec_find_decoder(m_stream->codec->codec_id); - CHECK(m_codec, "Stream() - no decoder for " + std::string(avcodec_get_name(m_stream->codec->codec_id)) + " codec"); - - // Load the codec - err = avcodec_open2(m_stream->codec, m_codec, nullptr); - CHECK0(err, "Stream() - unable to load decoder for codec " + std::string(avcodec_get_name(m_stream->codec->codec_id))); + m_codec = avcodec_find_decoder(m_stream->codec->codec_id); + if (m_codec == nullptr) + { + return; + } + + // Load the codec + auto err = avcodec_open2(m_stream->codec, m_codec, nullptr); #endif - - AVDictionaryEntry* entry = av_dict_get(m_stream->metadata, "language", nullptr, 0); - if (entry) - { - m_language = entry->value; - } - } - - Stream::~Stream() - { - disconnect(); - Stream::flushBuffers(); - + if (err < 0) + { + return; + } + + AVDictionaryEntry* entry = av_dict_get(m_stream->metadata, "language", nullptr, 0); + if (entry) + { + m_language = entry->value; + } + } + + Stream::~Stream() + { + disconnect(); + Stream::flushBuffers(); + #if LIBAVFORMAT_VERSION_MAJOR > 56 - if (m_formatCtx && m_stream && m_codecCtx) - { - avcodec_free_context(&m_codecCtx); - } + if (m_formatCtx && m_stream && m_codecCtx) + { + avcodec_free_context(&m_codecCtx); + } #else - if (m_formatCtx && m_stream && m_stream->codec) - { - avcodec_close(m_stream->codec); - } + if (m_formatCtx && m_stream && m_stream->codec) + { + avcodec_close(m_stream->codec); + } #endif - } - - void Stream::connect() - { - if (isPassive()) - m_timer->addObserver(*this, PassiveStreamTimerPriority); - else - m_timer->addObserver(*this, ActiveStreamTimerPriority); - } - - void Stream::disconnect() - { - m_timer->removeObserver(*this); - } - - void Stream::pushEncodedData(AVPacket* packet) - { - CHECK(packet, "invalid argument"); - sf::Lock l(m_readerMutex); - m_packetList.push_back(packet); - } - - void Stream::prependEncodedData(AVPacket* packet) - { - CHECK(packet, "invalid argument"); - sf::Lock l(m_readerMutex); - m_packetList.push_front(packet); - } - - AVPacket* Stream::popEncodedData() - { - AVPacket* result = nullptr; - sf::Lock l(m_readerMutex); - - if (m_packetList.empty() && !isPassive()) - { - m_dataSource.requestMoreData(*this); - } - - if (!m_packetList.empty()) - { - result = m_packetList.front(); - m_packetList.pop_front(); - } - else - { + } + + bool Stream::hasError() const noexcept + { + if (m_stream == nullptr || + m_streamID < 0 || + m_timer == nullptr || + m_codec == nullptr) + { + return true; + } + return false; + } + + void Stream::connect() + { + if (isPassive() == true) + { + m_timer->addObserver(*this, PassiveStreamTimerPriority); + } + else + { + m_timer->addObserver(*this, ActiveStreamTimerPriority); + } + } + + void Stream::disconnect() + { + m_timer->removeObserver(*this); + } + + void Stream::pushEncodedData(AVPacket* packet) + { + sf::Lock l(m_readerMutex); + m_packetList.push_back(packet); + } + + void Stream::prependEncodedData(AVPacket* packet) + { + sf::Lock l(m_readerMutex); + m_packetList.push_front(packet); + } + + AVPacket* Stream::popEncodedData() + { + AVPacket* result = nullptr; + sf::Lock l(m_readerMutex); + + if (m_packetList.empty() == true && isPassive() == false) + { + m_dataSource.requestMoreData(*this); + } + + if (m_packetList.empty() == false) + { + result = m_packetList.front(); + m_packetList.pop_front(); + } + else + { #if LIBAVFORMAT_VERSION_MAJOR > 56 - if (m_codecCtx->codec->capabilities & CODEC_CAP_DELAY) + if (m_codecCtx->codec->capabilities & AV_CODEC_CAP_DELAY) #else - if (m_stream->codec->codec->capabilities & CODEC_CAP_DELAY) + if (m_stream->codec->codec->capabilities & AV_CODEC_CAP_DELAY) #endif - { - AVPacket* flushPacket = (AVPacket*)av_malloc(sizeof(*flushPacket)); - av_init_packet(flushPacket); - flushPacket->data = nullptr; - flushPacket->size = 0; - result = flushPacket; - } - } - - return result; - } - - void Stream::flushBuffers() - { - sf::Lock l(m_readerMutex); - + { + AVPacket* flushPacket = (AVPacket*)av_malloc(sizeof(*flushPacket)); + av_init_packet(flushPacket); + flushPacket->data = nullptr; + flushPacket->size = 0; + result = flushPacket; + } + } + + return result; + } + + void Stream::flushBuffers() + { + sf::Lock l(m_readerMutex); + #if LIBAVCODEC_VERSION_MAJOR > 56 - if (m_formatCtx && m_codecCtx) - avcodec_flush_buffers(m_codecCtx); + if (m_formatCtx != nullptr && m_codecCtx != nullptr) + { + avcodec_flush_buffers(m_codecCtx); + } #else - if (m_formatCtx && m_stream) - avcodec_flush_buffers(m_stream->codec); + if (m_formatCtx != nullptr && m_stream != nullptr) + { + avcodec_flush_buffers(m_stream->codec); + } #endif - - AVPacket* pkt = nullptr; - - while (!m_packetList.empty()) - { - pkt = m_packetList.front(); - m_packetList.pop_front(); - + while (m_packetList.empty() == false) + { + auto pkt = m_packetList.front(); + m_packetList.pop_front(); + #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(pkt); + av_packet_unref(pkt); #else - av_free_packet(pkt); + av_free_packet(pkt); #endif - av_free(pkt); - } - } - - bool Stream::needsMoreData() const - { - return m_packetList.size() < 10; - } - - MediaType Stream::getStreamKind() const - { - return Unknown; - } - - Status Stream::getStatus() const - { - return m_status; - } - - std::string Stream::getLanguage() const - { - return m_language; - } - - bool Stream::computeEncodedPosition(sf::Time& position) - { - if (m_packetList.empty() && !isPassive()) - { - m_dataSource.requestMoreData(*this); - } - - if (! m_packetList.empty()) - { - sf::Lock l(m_readerMutex); - AVPacket* packet = m_packetList.front(); - CHECK(packet, "internal inconcistency"); - - int64_t timestamp = -424242; - - if (packet->dts != AV_NOPTS_VALUE) - { - timestamp = packet->dts; - } - else if (packet->pts != AV_NOPTS_VALUE) - { - int64_t startTime = m_stream->start_time != AV_NOPTS_VALUE ? m_stream->start_time : 0; - timestamp = packet->pts - startTime; - } - - AVRational seconds = av_mul_q(av_make_q((int)timestamp, 1), m_stream->time_base); - position = sf::milliseconds((int)(1000 * av_q2d(seconds))); - return true; - } - - return false; - } - - sf::Time Stream::packetDuration(const AVPacket* packet) const - { - CHECK(packet, "inconcistency error: null packet"); - CHECK(packet->stream_index == m_streamID, "Asking for duration of a packet for a different stream!"); - - if (packet->duration != 0) - { - AVRational seconds = av_mul_q(av_make_q(packet->duration, 1), m_stream->time_base); - return sf::seconds((float)av_q2d(seconds)); - } - else - { - return sf::seconds((float)(1. / av_q2d(av_guess_frame_rate(m_formatCtx, m_stream, nullptr)))); - } - } - - bool Stream::canUsePacket(AVPacket* packet) const - { - CHECK(packet, "inconcistency error: null argument"); - - return packet->stream_index == m_stream->index; - } - - bool Stream::isPassive() const - { - return false; - } - - void Stream::setStatus(Status status) - { - m_status = status; - } - - void Stream::didPlay(const Timer& timer, Status previousStatus) - { - setStatus(Playing); - } - - void Stream::didPause(const Timer& timer, Status previousStatus) - { - setStatus(Paused); - } - - void Stream::didStop(const Timer& timer, Status previousStatus) - { - setStatus(Stopped); - } - - bool Stream::didSeek(const Timer& timer, sf::Time oldPosition) - { - if (timer.getOffset() != sf::Time::Zero) - return fastForward(timer.getOffset()); - - return true; - } - - bool Stream::hasPackets() - { - return !m_packetList.empty(); - } + av_free(pkt); + } + } + + bool Stream::needsMoreData() const + { + return m_packetList.size() < 10; + } + + MediaType Stream::getStreamKind() const + { + return Unknown; + } + + Status Stream::getStatus() const + { + return m_status; + } + + std::string Stream::getLanguage() const + { + return m_language; + } + + bool Stream::computeEncodedPosition(sf::Time& position) + { + if (m_packetList.empty() == true && isPassive() == false) + { + m_dataSource.requestMoreData(*this); + } + if (m_packetList.empty() == false) + { + sf::Lock l(m_readerMutex); + AVPacket* packet = m_packetList.front(); + + int64_t timestamp = -424242; + + if (packet->dts != AV_NOPTS_VALUE) + { + timestamp = packet->dts; + } + else if (packet->pts != AV_NOPTS_VALUE) + { + int64_t startTime = m_stream->start_time != AV_NOPTS_VALUE ? m_stream->start_time : 0; + timestamp = packet->pts - startTime; + } + + AVRational seconds = av_mul_q(av_make_q((int)timestamp, 1), m_stream->time_base); + position = sf::milliseconds((int)(1000 * av_q2d(seconds))); + return true; + } + return false; + } + + sf::Time Stream::packetDuration(const AVPacket* packet) const + { + if (packet->duration != 0) + { + AVRational seconds = av_mul_q(av_make_q((int)packet->duration, 1), m_stream->time_base); + return sf::seconds((float)av_q2d(seconds)); + } + else + { + return sf::seconds((float)(1. / av_q2d(av_guess_frame_rate(m_formatCtx, m_stream, nullptr)))); + } + } + + bool Stream::canUsePacket(AVPacket* packet) const + { + return packet->stream_index == m_stream->index; + } + + bool Stream::isPassive() const + { + return false; + } + + void Stream::setStatus(Status status) + { + m_status = status; + } + + void Stream::didPlay(const Timer& timer, Status previousStatus) + { + setStatus(Playing); + } + + void Stream::didPause(const Timer& timer, Status previousStatus) + { + setStatus(Paused); + } + + void Stream::didStop(const Timer& timer, Status previousStatus) + { + setStatus(Stopped); + } + + bool Stream::didSeek(const Timer& timer, sf::Time oldPosition) + { + if (timer.getOffset() != sf::Time::Zero) + { + return fastForward(timer.getOffset()); + } + return true; + } + + bool Stream::hasPackets() + { + return m_packetList.empty() == false; + } } diff --git a/src/sfeMovie/Stream.hpp b/src/sfeMovie/Stream.hpp index cdd97fff..81894734 100755 --- a/src/sfeMovie/Stream.hpp +++ b/src/sfeMovie/Stream.hpp @@ -1,4 +1,3 @@ - /* * Stream.hpp * sfeMovie project @@ -22,15 +21,13 @@ * */ -#ifndef SFEMOVIE_STREAM_HPP -#define SFEMOVIE_STREAM_HPP +#pragma once -#include "Macros.hpp" -#include "Timer.hpp" #include #include -#include #include "Movie.hpp" +#include +#include "Timer.hpp" extern "C" { @@ -39,156 +36,158 @@ extern "C" namespace sfe { - class Stream : public Timer::Observer - { - public: - struct DataSource - { - virtual void requestMoreData(Stream& starvingStream) = 0; - virtual void resetEndOfFileStatus() = 0; - }; - - /** Create a stream from the given FFmpeg stream - * - * At the end of the constructor, the stream is guaranteed - * to have all of its fields set and the decoder loaded - * - * @param stream the FFmpeg stream - * @param dataSource the encoded data provider for this stream - */ - Stream(AVFormatContext*& formatCtx, AVStream*& stream, DataSource& dataSource, std::shared_ptr timer); - - /** Default destructor - */ - virtual ~Stream(); - - /** Connect this stream against the reference timer to receive playback events; this allows this - * stream to be played - */ - void connect(); - - /** Disconnect this stream from the reference timer ; this disables this stream - */ - void disconnect(); - - /** Called by the demuxer to provide the stream with encoded data - * - * @return packet the encoded data usable by this stream - */ - virtual void pushEncodedData(AVPacket* packet); - - /** Reinsert an AVPacket at the beginning of the queue - * - * This is used for packets that contain several frames, but whose next frames - * cannot be decoded yet. These packets are repushed to be decoded when possible. - * - * @param packet the packet to re-insert at the beginning of the queue - */ - virtual void prependEncodedData(AVPacket* packet); - - /** Return the oldest encoded data that was pushed to this stream - * - * If no packet is stored when this method is called, it will ask the - * data source to feed this stream first - * - * @return the oldest encoded data, or nullptr if no data could be read from the media - */ - virtual AVPacket* popEncodedData(); - - /** Empty the encoded data queue, destroy all the packets and flush the decoding pipeline - * @warning Subclasses overriding this method must also call the Stream implementation - */ - virtual void flushBuffers(); - - /** Used by the demuxer to know if this stream should be fed with more data - * - * The default implementation returns true if the packet list contains less than 10 packets - * - * @return true if the demuxer should give more data to this stream, false otherwise - */ - virtual bool needsMoreData() const; - - /** Get the stream kind (either audio or video stream) - * - * @return the kind of stream represented by this stream - */ - virtual MediaType getStreamKind() const; - - /** Give the stream's status - * - * @return The stream's status (Playing, Paused or Stopped) - */ - Status getStatus() const; - - /** Return the stream's language code - * - * @return the language code of the stream as ISO 639-2 format - */ - std::string getLanguage() const; - - /** Compute the stream position in the media, by possibly fetching a packet - * - * @param[out] position the current stream position, if available - * @return true if stream position could be computed and @ref position is set, false otherwise - */ - bool computeEncodedPosition(sf::Time& position); - - /** Compute how much time would be covered by the given packet, it's the diff between - * the current packet pts, and the next packet pts - */ - sf::Time packetDuration(const AVPacket* packet) const; - - /** Discard the data not needed to start playback at the given position - * - * Every single bit of unneeded data must be discarded as streams synchronization accuracy will - * depend on this - * - * @param targetPosition the position for which the stream is expected to be ready to play - * @return true is fast forwarding could be done successfully, false otherwise - */ - virtual bool fastForward(sf::Time targetPosition) = 0; - - /** Update the current stream's status and eventually decode frames - */ - virtual void update() = 0; - - /** @return true if the given packet is for the current stream - */ - bool canUsePacket(AVPacket* packet) const; - - /** @return true if this stream never requests packets and let - * itself be fed, false otherwise. Default implementation always - * returns false - */ - virtual bool isPassive() const; - protected: - // Timer::Observer interface - void didPlay(const Timer& timer, Status previousStatus) override; - void didPause(const Timer& timer, Status previousStatus) override; - void didStop(const Timer& timer, Status previousStatus) override; - bool didSeek(const Timer& timer, sf::Time oldPosition) override; - - /** @return true if any raw packet for the current stream is queued - */ - bool hasPackets(); - - void setStatus(Status status); - - AVFormatContext* & m_formatCtx; - AVStream*& m_stream; - - DataSource& m_dataSource; - std::shared_ptr m_timer; - AVCodec* m_codec; + class Stream : public Timer::Observer + { + public: + struct DataSource + { + virtual void requestMoreData(Stream& starvingStream) = 0; + virtual void resetEndOfFileStatus() = 0; + }; + + /** Create a stream from the given FFmpeg stream + * + * At the end of the constructor, the stream is guaranteed + * to have all of its fields set and the decoder loaded + * + * @param stream the FFmpeg stream + * @param dataSource the encoded data provider for this stream + */ + Stream(AVFormatContext*& formatCtx, AVStream*& stream, DataSource& dataSource, Timer* timer); + + /** Default destructor + */ + virtual ~Stream(); + + /** Connect this stream against the reference timer to receive playback events; this allows this + * stream to be played + */ + void connect(); + + /** Disconnect this stream from the reference timer ; this disables this stream + */ + void disconnect(); + + /** Called by the demuxer to provide the stream with encoded data + * + * @return packet the encoded data usable by this stream + */ + virtual void pushEncodedData(AVPacket* packet); + + /** Reinsert an AVPacket at the beginning of the queue + * + * This is used for packets that contain several frames, but whose next frames + * cannot be decoded yet. These packets are repushed to be decoded when possible. + * + * @param packet the packet to re-insert at the beginning of the queue + */ + virtual void prependEncodedData(AVPacket* packet); + + /** Return the oldest encoded data that was pushed to this stream + * + * If no packet is stored when this method is called, it will ask the + * data source to feed this stream first + * + * @return the oldest encoded data, or nullptr if no data could be read from the media + */ + virtual AVPacket* popEncodedData(); + + /** Empty the encoded data queue, destroy all the packets and flush the decoding pipeline + * @warning Subclasses overriding this method must also call the Stream implementation + */ + virtual void flushBuffers(); + + /** Used by the demuxer to know if this stream should be fed with more data + * + * The default implementation returns true if the packet list contains less than 10 packets + * + * @return true if the demuxer should give more data to this stream, false otherwise + */ + virtual bool needsMoreData() const; + + /** Get the stream kind (either audio or video stream) + * + * @return the kind of stream represented by this stream + */ + virtual MediaType getStreamKind() const; + + /** Give the stream's status + * + * @return The stream's status (Playing, Paused or Stopped) + */ + Status getStatus() const; + + /** Return the stream's language code + * + * @return the language code of the stream as ISO 639-2 format + */ + std::string getLanguage() const; + + /** Compute the stream position in the media, by possibly fetching a packet + * + * @param[out] position the current stream position, if available + * @return true if stream position could be computed and @ref position is set, false otherwise + */ + bool computeEncodedPosition(sf::Time& position); + + /** Compute how much time would be covered by the given packet, it's the diff between + * the current packet pts, and the next packet pts + */ + sf::Time packetDuration(const AVPacket* packet) const; + + /** Discard the data not needed to start playback at the given position + * + * Every single bit of unneeded data must be discarded as streams synchronization accuracy will + * depend on this + * + * @param targetPosition the position for which the stream is expected to be ready to play + * @return true is fast forwarding could be done successfully, false otherwise + */ + virtual bool fastForward(sf::Time targetPosition) = 0; + + /** Update the current stream's status and eventually decode frames + */ + virtual void update() = 0; + + /** @return true if the given packet is for the current stream + */ + bool canUsePacket(AVPacket* packet) const; + + /** @return true if this stream never requests packets and let + * itself be fed, false otherwise. Default implementation always + * returns false + */ + virtual bool isPassive() const; + + /** @return true if this stream wasn't properly constructed. + */ + virtual bool hasError() const noexcept; + protected: + // Timer::Observer interface + void didPlay(const Timer& timer, Status previousStatus) override; + void didPause(const Timer& timer, Status previousStatus) override; + void didStop(const Timer& timer, Status previousStatus) override; + bool didSeek(const Timer& timer, sf::Time oldPosition) override; + + /** @return true if any raw packet for the current stream is queued + */ + bool hasPackets(); + + void setStatus(Status status); + + AVFormatContext*& m_formatCtx; + AVStream*& m_stream; + + DataSource& m_dataSource; + Timer* m_timer{ nullptr }; + AVCodec* m_codec{ nullptr }; #if LIBAVFORMAT_VERSION_MAJOR > 56 - AVCodecContext* m_codecCtx; + AVCodecContext* m_codecCtx{ nullptr }; #endif - int m_streamID; - std::string m_language; - std::list m_packetList; - Status m_status; - sf::Mutex m_readerMutex; - }; + int m_streamID{ -1 }; + std::string m_language; + std::list m_packetList; + Status m_status{ Stopped }; + sf::Mutex m_readerMutex; + }; } - -#endif diff --git a/src/sfeMovie/StreamSelection.cpp b/src/sfeMovie/StreamSelection.cpp deleted file mode 100755 index 752b6012..00000000 --- a/src/sfeMovie/StreamSelection.cpp +++ /dev/null @@ -1,36 +0,0 @@ - -/* - * StreamSelection.cpp - * sfeMovie project - * - * Copyright (C) 2010-2015 Lucas Soltic - * lucas.soltic@orange.fr - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "StreamSelection.hpp" - -namespace sfe -{ - StreamDescriptor StreamDescriptor::NoSelection(sfe::MediaType type) - { - StreamDescriptor descriptor; - descriptor.type = type; - descriptor.identifier = -1; - return descriptor; - } -} diff --git a/src/sfeMovie/StreamSelection.hpp b/src/sfeMovie/StreamSelection.hpp index 47b70e2f..6e702f7f 100755 --- a/src/sfeMovie/StreamSelection.hpp +++ b/src/sfeMovie/StreamSelection.hpp @@ -1,4 +1,3 @@ - /* * StreamSelection.hpp * sfeMovie project @@ -22,39 +21,26 @@ * */ -#ifndef SFEMOVIE_STREAM_SELECTION_HPP -#define SFEMOVIE_STREAM_SELECTION_HPP +#pragma once #include -#include namespace sfe { - enum MediaType - { - Audio, - Video, - Unknown - }; - - /** Structure that allows both knowing metadata about each stream, and identifying streams - * for selection through Movie::selectStream() - */ - struct StreamDescriptor - { - /** Return a stream descriptor that identifies no stream. This allows disabling a specific stream kind - * - * @param type the stream kind (audio, video...) to disable - * @return a StreamDescriptor that can be used to disable the given stream kind - */ - static StreamDescriptor NoSelection(MediaType type); - - MediaType type; //!< Stream kind: video or audio - int identifier; //!< Internal stream identifier in the media, used for choosing which stream to enable - std::string language; //!< Language code defined by ISO 639-2, if set by the media - }; - - typedef std::vector Streams; -} + enum MediaType + { + Audio, + Video, + Unknown + }; -#endif + /** Structure that allows both knowing metadata about each stream, and identifying streams + * for selection through Movie::selectStream() + */ + struct StreamDescriptor + { + MediaType type{ MediaType::Unknown }; //!< Stream kind: video or audio + int identifier{ -1 }; //!< Internal stream identifier in the media, used for choosing which stream to enable + std::string language; //!< Language code defined by ISO 639-2, if set by the media + }; +} diff --git a/src/sfeMovie/Timer.cpp b/src/sfeMovie/Timer.cpp index 691c76a3..3d4c9f35 100755 --- a/src/sfeMovie/Timer.cpp +++ b/src/sfeMovie/Timer.cpp @@ -1,4 +1,3 @@ - /* * Timer.cpp * sfeMovie project @@ -23,198 +22,181 @@ */ #include "Timer.hpp" -#include "Macros.hpp" namespace sfe { - Timer::Observer::Observer() - { - } - - Timer::Observer::~Observer() - { - } - - void Timer::Observer::willPlay(const Timer& timer) - { - } - - void Timer::Observer::didPlay(const Timer& timer, Status previousStatus) - { - } - - void Timer::Observer::didPause(const Timer& timer, Status previousStatus) - { - } - - void Timer::Observer::didStop(const Timer& timer, Status previousStatus) - { - } - - bool Timer::Observer::didSeek(const Timer& timer, sf::Time oldPosition) - { - return true; - } - - Timer::Timer() : - m_pausedTime(sf::Time::Zero), - m_status(Stopped), - m_timer(), - m_observers() - { - } - - void Timer::addObserver(Observer& anObserver, int priority) - { - CHECK(m_observers.find(&anObserver) == m_observers.end(), "Timer::addObserver() - cannot add the same observer twice"); - - m_observers.insert(std::make_pair(&anObserver, priority)); - m_observersByPriority[priority].insert(&anObserver); - } - - void Timer::removeObserver(Observer& anObserver) - { - std::map::iterator it = m_observers.find(&anObserver); - - if (it != m_observers.end()) - { - m_observersByPriority[it->second].erase(&anObserver); - m_observers.erase(it); - } - } - - void Timer::play() - { - CHECK(getStatus() != Playing, "Timer::play() - timer playing twice"); - - notifyObservers(Playing); - - Status oldStatus = getStatus(); - m_status = Playing; - m_timer.restart(); - - notifyObservers(oldStatus, getStatus()); - } - - void Timer::pause() - { - CHECK(getStatus() != Paused, "Timer::pause() - timer paused twice"); - - Status oldStatus = getStatus(); - m_status = Paused; - - if (oldStatus != Stopped) - m_pausedTime += m_timer.getElapsedTime(); - - notifyObservers(oldStatus, getStatus()); - } - - void Timer::stop() - { - CHECK(getStatus() != Stopped, "Timer::stop() - timer stopped twice"); - - Status oldStatus = getStatus(); - m_status = Stopped; - m_pausedTime = sf::Time::Zero; - - notifyObservers(oldStatus, getStatus()); - - seek(sf::Time::Zero); - } - - bool Timer::seek(sf::Time position) - { - Status oldStatus = getStatus(); - sf::Time oldPosition = getOffset(); - bool couldSeek = false; - - if (oldStatus == Playing) - pause(); - - m_pausedTime = position; - couldSeek = notifyObservers(oldPosition); - - if (oldStatus == Playing) - play(); - - return couldSeek; - } - - Status Timer::getStatus() const - { - return m_status; - } - - sf::Time Timer::getOffset() const - { - if (Timer::getStatus() == Playing) - return m_pausedTime + m_timer.getElapsedTime(); - else - return m_pausedTime; - } - - void Timer::notifyObservers(Status futureStatus) - { - for (std::pair >&& pairByPriority : m_observersByPriority) - { - for (Observer* observer : pairByPriority.second) - { - switch(futureStatus) - { - case Playing: - observer->willPlay(*this); - break; - - default: - CHECK(false, "Timer::notifyObservers() - unhandled case in switch"); - } - } - } - } - - void Timer::notifyObservers(Status oldStatus, Status newStatus) - { - CHECK(oldStatus != newStatus, "Timer::notifyObservers() - inconsistency: no change happened"); - - for (std::pair >&& pairByPriority : m_observersByPriority) - { - for (Observer* observer : pairByPriority.second) - { - switch(newStatus) - { - case Playing: - observer->didPlay(*this, oldStatus); - break; - - case Paused: - observer->didPause(*this, oldStatus); - break; - - case Stopped: - observer->didStop(*this, oldStatus); - break; - default: - break; - } - } - } - } - - bool Timer::notifyObservers(sf::Time oldPosition) - { - CHECK(getStatus() != Playing, "inconsistency in timer"); - bool successfullSeeking = true; - - for (std::pair >&& pairByPriority : m_observersByPriority) - { - for (Observer* observer : pairByPriority.second) - { - if (! observer->didSeek(*this, oldPosition)) - successfullSeeking = false; - } - } - - return successfullSeeking; - } - + void Timer::addObserver(Observer& anObserver, int priority) + { + for (const auto& obs : m_observers) + { + if (obs.first == &anObserver) + { + return; + } + } + for (auto it = m_observers.begin(); it != m_observers.end(); ++it) + { + if (priority < it->second) + { + m_observers.insert(it, std::make_pair(&anObserver, priority)); + return; + } + } + m_observers.push_back(std::make_pair(&anObserver, priority)); + } + + void Timer::removeObserver(Observer& anObserver) + { + for (auto it = m_observers.begin(); it != m_observers.end(); ++it) + { + if (it->first == &anObserver) + { + m_observers.erase(it); + break; + } + } + } + + void Timer::play() + { + if (getStatus() == Playing) + { + return; + } + + notifyObservers(Playing); + + Status oldStatus = getStatus(); + m_status = Playing; + m_timer.restart(); + + notifyObservers(oldStatus, getStatus()); + } + + void Timer::pause() + { + if (getStatus() == Paused) + { + return; + } + + Status oldStatus = getStatus(); + m_status = Paused; + + if (oldStatus != Stopped) + { + m_pausedTime += m_timer.getElapsedTime(); + } + + notifyObservers(oldStatus, getStatus()); + } + + void Timer::stop() + { + if (getStatus() == Stopped) + { + return; + } + + Status oldStatus = getStatus(); + m_status = Stopped; + m_pausedTime = sf::Time::Zero; + + notifyObservers(oldStatus, getStatus()); + + seek(sf::Time::Zero); + } + + bool Timer::seek(sf::Time position) + { + Status oldStatus = getStatus(); + sf::Time oldPosition = getOffset(); + bool couldSeek = false; + + if (oldStatus == Playing) + { + pause(); + } + + m_pausedTime = position; + couldSeek = notifyObservers(oldPosition); + + if (oldStatus == Playing) + { + play(); + } + + return couldSeek; + } + + Status Timer::getStatus() const + { + return m_status; + } + + sf::Time Timer::getOffset() const + { + if (Timer::getStatus() == Playing) + { + return m_pausedTime + m_timer.getElapsedTime(); + } + return m_pausedTime; + } + + void Timer::notifyObservers(Status futureStatus) + { + for (auto& observer : m_observers) + { + switch (futureStatus) + { + case Playing: + observer.first->willPlay(*this); + break; + default: + break; + } + } + } + + void Timer::notifyObservers(Status oldStatus, Status newStatus) + { + if (oldStatus == newStatus) + { + return; + } + for (auto& observer : m_observers) + { + switch (newStatus) + { + case Playing: + observer.first->didPlay(*this, oldStatus); + break; + case Paused: + observer.first->didPause(*this, oldStatus); + break; + case Stopped: + observer.first->didStop(*this, oldStatus); + break; + default: + break; + } + } + } + + bool Timer::notifyObservers(sf::Time oldPosition) + { + if (getStatus() == Playing) + { + return false; + } + bool successfullSeeking = true; + for (auto& observer : m_observers) + { + if (observer.first->didSeek(*this, oldPosition) == false) + { + successfullSeeking = false; + } + } + return successfullSeeking; + } } diff --git a/src/sfeMovie/Timer.hpp b/src/sfeMovie/Timer.hpp index 27693665..1304ca40 100755 --- a/src/sfeMovie/Timer.hpp +++ b/src/sfeMovie/Timer.hpp @@ -1,4 +1,3 @@ - /* * Timer.hpp * sfeMovie project @@ -22,153 +21,144 @@ * */ -#ifndef SFEMOVIE_TIMER_HPP -#define SFEMOVIE_TIMER_HPP +#pragma once -#include -#include #include "Movie.hpp" +#include namespace sfe { - class Timer - { - public: - class Observer - { - public: - /** Default constructor - */ - Observer(); - - /** Default destructor - */ - virtual ~Observer(); - - /** Called by @a timer before playing if this Observer is registered for notifications - * - * Playing won't start until all Observers are done executing willPlay() - * - * @param timer the timer that generated the notification - */ - virtual void willPlay(const Timer& timer); - - /** Called by @a timer when playing if this Observer is registered for notifications - * - * @param timer the timer that generated the notification - * @param previousStatus the timer's status before playing - */ - virtual void didPlay(const Timer& timer, Status previousStatus); - - /** Called by @a timer when pausing if this Observer is registered for notifications - * - * @param timer the timer that generated the notification - * @param previousStatus the timer's status before playing - */ - virtual void didPause(const Timer& timer, Status previousStatus); - - /** Called by @a timer when stopping if this Observer is registered for notifications - * - * @param timer the timer that generated the notification - * @param previousStatus the timer's status before playing - */ - virtual void didStop(const Timer& timer, Status previousStatus); - - /** Called by @a timer right after seeking if this Observer is registered for notifications - * - * When this method is called, the timer is guaranteed to be paused or stopped - * - * @param timer the timer that generated the notification - * @param position the position before seeking - * @return true if the observer successfully responded to the seeking event - */ - virtual bool didSeek(const Timer& timer, sf::Time oldPosition); - }; - - /** Default constructor - */ - Timer(); - - /** Register an observer that should be notified when this timer is - * played, paused or stopped - * - * @param anObserver the observer that should receive notifications - * @param priority the priority that should be taken into account when distributing notifications, - * observers with the lowest priority value will be notified first - */ - void addObserver(Observer& anObserver, int priority = 0); - - /** Stop sending notifications to this observer - * - * @param anObserver the observer that must receive no more notification - */ - void removeObserver(Observer& anObserver); - - /** Start this timer and notify all observers - */ - void play(); - - /** Pause this timer (but do not reset it) and notify all observers - */ - void pause(); - - /** Stop this timer and reset it and notify all observers - */ - void stop(); - - /** Seek to the given position, the timer's offset is updated accordingly - * - * If the timer was playing, it is paused, seeking occurs, then it is resumed. - * The timer offset is always updated, even if seeking fails - * - * @param position the new wished timer position - * @return true if seeking succeeded, false otherwise - */ - bool seek(sf::Time position); - - /** Return this timer status - * - * @return Playing, Paused or Stopped - */ - Status getStatus() const; - - /** Return the timer's time - * - * @return the timer's time - */ - sf::Time getOffset() const; - - private: - /** Notify all observers that the timer's status is about to change to @a futureStatus - * - * The status change won't occur before all observers have received the noficiation - * - * @param futureStatus the status to which this timer is about to change - */ - void notifyObservers(Status newStatus); - - /** Notify all observers that the timer's status changed from @a oldStatus to @a newStatus - * - * @param oldStatus the timer's status before the state change - * @param newStatus the timer's status after the state change - */ - void notifyObservers(Status oldStatus, Status newStatus); - - /** Notify all observers that the timer is seeking to a new position - * - * When the observer receives the notification, the timer is guaranteed to be paused or stopped - * - * @param oldPosition the timer position before seeking - * @return true if all the observers successfully responsed to the seek event - */ - bool notifyObservers(sf::Time oldPosition); - - sf::Time m_pausedTime; - Status m_status; - sf::Clock m_timer; - std::map m_observers; - std::map > m_observersByPriority; - }; -} + class Timer + { + public: + class Observer + { + public: + /** Default destructor + */ + virtual ~Observer() = default; + + /** Called by @a timer before playing if this Observer is registered for notifications + * + * Playing won't start until all Observers are done executing willPlay() + * + * @param timer the timer that generated the notification + */ + virtual void willPlay(const Timer& timer) {}; + + /** Called by @a timer when playing if this Observer is registered for notifications + * + * @param timer the timer that generated the notification + * @param previousStatus the timer's status before playing + */ + virtual void didPlay(const Timer& timer, Status previousStatus) {}; + + /** Called by @a timer when pausing if this Observer is registered for notifications + * + * @param timer the timer that generated the notification + * @param previousStatus the timer's status before playing + */ + virtual void didPause(const Timer& timer, Status previousStatus) {}; + + /** Called by @a timer when stopping if this Observer is registered for notifications + * + * @param timer the timer that generated the notification + * @param previousStatus the timer's status before playing + */ + virtual void didStop(const Timer& timer, Status previousStatus) {}; + + /** Called by @a timer right after seeking if this Observer is registered for notifications + * + * When this method is called, the timer is guaranteed to be paused or stopped + * + * @param timer the timer that generated the notification + * @param position the position before seeking + * @return true if the observer successfully responded to the seeking event + */ + virtual bool didSeek(const Timer& timer, sf::Time oldPosition) { return true; }; + }; + + /** Default constructor + */ + Timer() = default; + + /** Register an observer that should be notified when this timer is + * played, paused or stopped + * + * @param anObserver the observer that should receive notifications + * @param priority the priority that should be taken into account when distributing notifications, + * observers with the lowest priority value will be notified first + */ + void addObserver(Observer& anObserver, int priority = 0); -#endif + /** Stop sending notifications to this observer + * + * @param anObserver the observer that must receive no more notification + */ + void removeObserver(Observer& anObserver); + + /** Start this timer and notify all observers + */ + void play(); + + /** Pause this timer (but do not reset it) and notify all observers + */ + void pause(); + + /** Stop this timer and reset it and notify all observers + */ + void stop(); + + /** Seek to the given position, the timer's offset is updated accordingly + * + * If the timer was playing, it is paused, seeking occurs, then it is resumed. + * The timer offset is always updated, even if seeking fails + * + * @param position the new wished timer position + * @return true if seeking succeeded, false otherwise + */ + bool seek(sf::Time position); + + /** Return this timer status + * + * @return Playing, Paused or Stopped + */ + Status getStatus() const; + + /** Return the timer's time + * + * @return the timer's time + */ + sf::Time getOffset() const; + + private: + /** Notify all observers that the timer's status is about to change to @a futureStatus + * + * The status change won't occur before all observers have received the noficiation + * + * @param futureStatus the status to which this timer is about to change + */ + void notifyObservers(Status newStatus); + + /** Notify all observers that the timer's status changed from @a oldStatus to @a newStatus + * + * @param oldStatus the timer's status before the state change + * @param newStatus the timer's status after the state change + */ + void notifyObservers(Status oldStatus, Status newStatus); + + /** Notify all observers that the timer is seeking to a new position + * + * When the observer receives the notification, the timer is guaranteed to be paused or stopped + * + * @param oldPosition the timer position before seeking + * @return true if all the observers successfully responsed to the seek event + */ + bool notifyObservers(sf::Time oldPosition); + + sf::Time m_pausedTime{ sf::Time::Zero }; + Status m_status{ Stopped }; + sf::Clock m_timer; + std::vector> m_observers; + }; +} diff --git a/src/sfeMovie/TimerPriorities.cpp b/src/sfeMovie/TimerPriorities.cpp deleted file mode 100755 index 2451cf37..00000000 --- a/src/sfeMovie/TimerPriorities.cpp +++ /dev/null @@ -1,30 +0,0 @@ - -/* - * TimerPriorities.cpp - * sfeMovie project - * - * Copyright (C) 2010-2015 Lucas Soltic - * lucas.soltic@orange.fr - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "TimerPriorities.hpp" - -const int DefaultTimerPriority = 0; -const int DemuxerTimerPriority = -5; // Demuxer always notified first! -const int ActiveStreamTimerPriority = 5; -const int PassiveStreamTimerPriority = 10; // Always last diff --git a/src/sfeMovie/TimerPriorities.hpp b/src/sfeMovie/TimerPriorities.hpp index 62e7f616..621e128f 100755 --- a/src/sfeMovie/TimerPriorities.hpp +++ b/src/sfeMovie/TimerPriorities.hpp @@ -1,4 +1,3 @@ - /* * TimerPriorities.hpp * sfeMovie project @@ -22,12 +21,12 @@ * */ -#ifndef SFEMOVIE_TIMER_PRIORITIES_HPP -#define SFEMOVIE_TIMER_PRIORITIES_HPP - -extern const int DefaultTimerPriority; -extern const int DemuxerTimerPriority; -extern const int ActiveStreamTimerPriority; -extern const int PassiveStreamTimerPriority; +#pragma once -#endif +namespace sfe +{ + constexpr int DefaultTimerPriority = 0; + constexpr int DemuxerTimerPriority = -5; // Demuxer always notified first! + constexpr int ActiveStreamTimerPriority = 5; + constexpr int PassiveStreamTimerPriority = 10; // Always last +} diff --git a/src/sfeMovie/Utilities.cpp b/src/sfeMovie/Utilities.cpp deleted file mode 100755 index dc631e7a..00000000 --- a/src/sfeMovie/Utilities.cpp +++ /dev/null @@ -1,39 +0,0 @@ - -/* - * Utilities.cpp - * sfeMovie project - * - * Copyright (C) 2010-2015 Lucas Soltic - * lucas.soltic@orange.fr - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "Utilities.hpp" - -namespace sfe -{ - std::string mediaTypeToString(MediaType type) - { - switch (type) - { - case Audio: return "audio"; - case Video: return "video"; - default: - case Unknown: return "unknown"; - } - } -} diff --git a/src/sfeMovie/Utilities.hpp b/src/sfeMovie/Utilities.hpp deleted file mode 100755 index 13be1a2c..00000000 --- a/src/sfeMovie/Utilities.hpp +++ /dev/null @@ -1,57 +0,0 @@ - -/* - * Utilities.hpp - * sfeMovie project - * - * Copyright (C) 2010-2015 Lucas Soltic - * lucas.soltic@orange.fr - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef SFEMOVIE_UTILITIES_HPP -#define SFEMOVIE_UTILITIES_HPP - -#include "Stream.hpp" -#include -#include - -namespace sfe -{ - /** Gives the string representing the given @a type - * - * Conversion is done as follow: - * Audio -> audio - * Video -> video - * Unknown -> unknown - * - * @param type the media type to stringify - * @return the stringified media type - */ - std::string mediaTypeToString(MediaType type); - - /** Stringify any type of object supported by ostringstream - */ - template - std::string s(const T& obj) - { - std::ostringstream ss; - ss << obj; - return ss.str(); - } -} - -#endif diff --git a/src/sfeMovie/VideoStream.cpp b/src/sfeMovie/VideoStream.cpp index ada37223..f4bf2ff7 100755 --- a/src/sfeMovie/VideoStream.cpp +++ b/src/sfeMovie/VideoStream.cpp @@ -1,4 +1,3 @@ - /* * VideoStream.cpp * sfeMovie project @@ -24,327 +23,344 @@ extern "C" { -#include #include -#include +#include #include +#include } #include "VideoStream.hpp" -#include "Utilities.hpp" namespace sfe { - VideoStream::VideoStream(AVFormatContext*& formatCtx, AVStream*& stream, - DataSource& dataSource, std::shared_ptr timer, Delegate& delegate) : - Stream(formatCtx ,stream, dataSource, timer), - m_texture(), - m_rawVideoFrame(nullptr), - m_rgbaVideoBuffer(), - m_rgbaVideoLinesize(), - m_delegate(delegate), - m_swsCtx(nullptr) - { - int err; - - for (int i = 0; i < 4;i++) - { - m_rgbaVideoBuffer[i] = nullptr; - m_rgbaVideoLinesize[i] = 0; - } - - m_rawVideoFrame = av_frame_alloc(); - CHECK(m_rawVideoFrame, "VideoStream() - out of memory"); - - // RGBA video buffer + VideoStream::VideoStream(AVFormatContext*& formatCtx, AVStream*& stream, + DataSource& dataSource, Timer* timer, Delegate& delegate) : + Stream(formatCtx, stream, dataSource, timer), m_delegate(delegate) + { + if (Stream::hasError() == true) + { + return; + } + + m_rawVideoFrame = av_frame_alloc(); + if (m_rawVideoFrame == nullptr) + { + return; + } + + // RGBA video buffer #if LIBAVFORMAT_VERSION_MAJOR > 56 - err = av_image_alloc(m_rgbaVideoBuffer, m_rgbaVideoLinesize, - m_stream->codecpar->width, m_stream->codecpar->height, - AV_PIX_FMT_RGBA, 1); + auto avErr = av_image_alloc(m_rgbaVideoBuffer, m_rgbaVideoLinesize, + m_stream->codecpar->width, m_stream->codecpar->height, + AV_PIX_FMT_RGBA, 1); #else - err = av_image_alloc(m_rgbaVideoBuffer, m_rgbaVideoLinesize, - m_stream->codec->width, m_stream->codec->height, - AV_PIX_FMT_RGBA, 1); + auto avErr = av_image_alloc(m_rgbaVideoBuffer, m_rgbaVideoLinesize, + m_stream->codec->width, m_stream->codec->height, + AV_PIX_FMT_RGBA, 1); #endif - CHECK(err >= 0, "VideoStream() - av_image_alloc() error"); - - // SFML video frame + if (avErr < 0) + { + return; + } + + // SFML video frame #if LIBAVFORMAT_VERSION_MAJOR > 56 - err = m_texture.create(m_stream->codecpar->width, m_stream->codecpar->height); + auto texErr = m_texture.create(m_stream->codecpar->width, m_stream->codecpar->height); #else - err = m_texture.create(m_stream->codec->width, m_stream->codec->height); + auto texErr = m_texture.create(m_stream->codec->width, m_stream->codec->height); #endif - CHECK(err, "VideoStream() - sf::Texture::create() error"); - - initRescaler(); - } - - VideoStream::~VideoStream() - { - if (m_rawVideoFrame) - { - av_frame_free(&m_rawVideoFrame); - } - - if (m_rgbaVideoBuffer[0]) - { - av_freep(&m_rgbaVideoBuffer[0]); - } - - if (m_swsCtx) - { - sws_freeContext(m_swsCtx); - } - } - - MediaType VideoStream::getStreamKind() const - { - return Video; - } - - sf::Vector2i VideoStream::getFrameSize() const - { + if (texErr == false) + { + return; + } + + initRescaler(); + } + + VideoStream::~VideoStream() + { + if (m_rawVideoFrame != nullptr) + { + av_frame_free(&m_rawVideoFrame); + } + if (m_rgbaVideoBuffer[0] != nullptr) + { + av_freep(&m_rgbaVideoBuffer[0]); + } + if (m_swsCtx != nullptr) + { + sws_freeContext(m_swsCtx); + } + } + + bool VideoStream::hasError() const noexcept + { + if (Stream::hasError() == true || + m_texture.getNativeHandle() == 0 || + m_rawVideoFrame == nullptr || + m_rgbaVideoBuffer[0] == nullptr || + m_swsCtx == nullptr) + { + return true; + } + return false; + } + + MediaType VideoStream::getStreamKind() const + { + return Video; + } + + sf::Vector2i VideoStream::getFrameSize() const + { #if LIBAVFORMAT_VERSION_MAJOR > 56 - return sf::Vector2i(m_stream->codecpar->width, m_stream->codecpar->height); + return sf::Vector2i(m_stream->codecpar->width, m_stream->codecpar->height); #else - return sf::Vector2i(m_stream->codec->width, m_stream->codec->height); + return sf::Vector2i(m_stream->codec->width, m_stream->codec->height); #endif - } - - float VideoStream::getFrameRate() const - { - return static_cast(av_q2d(av_guess_frame_rate(m_formatCtx, m_stream, nullptr))); - } - - sf::Texture& VideoStream::getVideoTexture() - { - return m_texture; - } - - void VideoStream::update() - { - sf::Time gap; - bool couldComputeGap = false; - while (getStatus() == Playing && (couldComputeGap = getSynchronizationGap(gap)) && - gap < sf::Time::Zero) - { - if (!onGetData(m_texture)) - { - setStatus(Stopped); - } - else - { - static const sf::Time skipFrameThreshold(sf::milliseconds(50)); - if (getSynchronizationGap(gap) && gap + skipFrameThreshold >= sf::Time::Zero) - m_delegate.didUpdateVideo(*this, m_texture); - } - } - - if (! couldComputeGap) - { - setStatus(Stopped); - } - } - - void VideoStream::flushBuffers() - { - m_codecBufferingDelays.clear(); - Stream::flushBuffers(); - } - - bool VideoStream::fastForward(sf::Time targetPosition) - { - sf::Time position; - bool couldGetPosition = false; - - while ((couldGetPosition = computeEncodedPosition(position)) && position < targetPosition) - { - // We HAVE to decode the frames to get a full image when we reach the target position - if (! onGetData(m_texture)) - { - return false; - } - } - - return true; - } - - void VideoStream::preload() - { - onGetData(m_texture); - } - - bool VideoStream::onGetData(sf::Texture& texture) - { - AVPacket* packet = popEncodedData(); - bool gotFrame = false; - bool goOn = false; - - if (packet) - { - goOn = true; - - while (!gotFrame && packet && goOn) - { - bool needsMoreDecoding = false; - - CHECK(packet != nullptr, "inconsistency error"); - goOn = decodePacket(packet, m_rawVideoFrame, gotFrame, needsMoreDecoding); - - if (gotFrame) - { - rescale(m_rawVideoFrame, m_rgbaVideoBuffer, m_rgbaVideoLinesize); - texture.update(m_rgbaVideoBuffer[0]); - } - - if (!gotFrame && goOn) - { - // Decoding went fine but did not produce an image. This means the decoder is working in - // a pipelined way and wants more packets to output a full image. When the first full image will - // be generated, the encoded data queue head pts will be late compared to the generated image pts - // To take that into account we accumulate this time difference for reuse in getSynchronizationGap() - m_codecBufferingDelays.push_back(packetDuration(packet)); - + } + + float VideoStream::getFrameRate() const + { + return static_cast(av_q2d(av_guess_frame_rate(m_formatCtx, m_stream, nullptr))); + } + + sf::Texture& VideoStream::getVideoTexture() + { + return m_texture; + } + + void VideoStream::update() + { + sf::Time gap; + bool couldComputeGap = false; + while (getStatus() == Playing && + (couldComputeGap = getSynchronizationGap(gap)) && + gap < sf::Time::Zero) + { + if (onGetData(m_texture) == false) + { + setStatus(Stopped); + } + else + { + static const sf::Time skipFrameThreshold(sf::milliseconds(50)); + if (getSynchronizationGap(gap) && gap + skipFrameThreshold >= sf::Time::Zero) + { + m_delegate.didUpdateVideo(*this, m_texture); + } + } + } + if (!couldComputeGap) + { + setStatus(Stopped); + } + } + + void VideoStream::flushBuffers() + { + m_codecBufferingDelays.clear(); + Stream::flushBuffers(); + } + + bool VideoStream::fastForward(sf::Time targetPosition) + { + sf::Time position; + bool couldGetPosition = false; + while ((couldGetPosition = computeEncodedPosition(position)) && + position < targetPosition) + { + // We HAVE to decode the frames to get a full image when we reach the target position + if (onGetData(m_texture) == false) + { + return false; + } + } + return true; + } + + void VideoStream::preload() + { + onGetData(m_texture); + } + + bool VideoStream::onGetData(sf::Texture& texture) + { + AVPacket* packet = popEncodedData(); + bool gotFrame = false; + bool goOn = false; + + if (packet != nullptr) + { + goOn = true; + + while (gotFrame == false && + packet != nullptr && + goOn == true) + { + bool needsMoreDecoding = false; + + goOn = decodePacket(packet, m_rawVideoFrame, gotFrame, needsMoreDecoding); + + if (gotFrame) + { + rescale(m_rawVideoFrame, m_rgbaVideoBuffer, m_rgbaVideoLinesize); + texture.update(m_rgbaVideoBuffer[0]); + } + + if (!gotFrame && goOn) + { + // Decoding went fine but did not produce an image. This means the decoder is working in + // a pipelined way and wants more packets to output a full image. When the first full image will + // be generated, the encoded data queue head pts will be late compared to the generated image pts + // To take that into account we accumulate this time difference for reuse in getSynchronizationGap() + m_codecBufferingDelays.push_back(packetDuration(packet)); + #if LIBAVFORMAT_VERSION_MAJOR > 56 - if (m_codecBufferingDelays.size() > (size_t)m_stream->codecpar->video_delay) - m_codecBufferingDelays.pop_front(); + if (m_codecBufferingDelays.size() > (size_t)m_stream->codecpar->video_delay) + { + m_codecBufferingDelays.pop_front(); + } #else - if (m_codecBufferingDelays.size() > (size_t)m_stream->codec->delay) - m_codecBufferingDelays.pop_front(); + if (m_codecBufferingDelays.size() > (size_t)m_stream->codec->delay) + { + m_codecBufferingDelays.pop_front(); + } #endif - } - - if (needsMoreDecoding) - { - prependEncodedData(packet); - } - else - { + } + + if (needsMoreDecoding) + { + prependEncodedData(packet); + } + else + { #if LIBAVCODEC_VERSION_MAJOR > 56 - av_packet_unref(packet); + av_packet_unref(packet); #else - av_free_packet(packet); + av_free_packet(packet); #endif - av_free(packet); - } - - if (!gotFrame && goOn) - { - packet = popEncodedData(); - } - } - } - - return goOn; - } - - bool VideoStream::getSynchronizationGap(sf::Time& gap) - { - sf::Time position; - if (computeEncodedPosition(position)) - { - gap = (position - codecBufferingDelay()) - m_timer->getOffset(); - return true; - } - else - { - return false; - } - } - - bool VideoStream::decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame, bool& needsMoreDecoding) - { + av_free(packet); + } + + if (!gotFrame && goOn) + { + packet = popEncodedData(); + } + } + } + return goOn; + } + + bool VideoStream::getSynchronizationGap(sf::Time& gap) + { + sf::Time position; + if (computeEncodedPosition(position) == true) + { + gap = (position - codecBufferingDelay()) - m_timer->getOffset(); + return true; + } + else + { + return false; + } + } + + bool VideoStream::decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame, bool& needsMoreDecoding) + { #if LIBAVCODEC_VERSION_MAJOR > 56 - int ret; - gotFrame = false; - needsMoreDecoding = false; - - ret = avcodec_send_packet(m_codecCtx, packet); - if (ret < 0) - { - return false; - } - - ret = avcodec_receive_frame(m_codecCtx, outputFrame); - if (ret < 0) - { - needsMoreDecoding = (ret == AVERROR(EAGAIN)); - if (needsMoreDecoding == true) - { - return true; - } - return false; - } - gotFrame = true; - return true; + int ret; + gotFrame = false; + needsMoreDecoding = false; + + ret = avcodec_send_packet(m_codecCtx, packet); + if (ret < 0) + { + return false; + } + + ret = avcodec_receive_frame(m_codecCtx, outputFrame); + if (ret < 0) + { + needsMoreDecoding = (ret == AVERROR(EAGAIN)); + if (needsMoreDecoding == true) + { + return true; + } + return false; + } + gotFrame = true; + return true; #else - int gotPicture = 0; - needsMoreDecoding = false; - int decodedLength = avcodec_decode_video2(m_stream->codec, outputFrame, &gotPicture, packet); - - gotFrame = (gotPicture != 0); - - if (decodedLength > 0 || gotFrame) - { - if (decodedLength < packet->size) - { - needsMoreDecoding = true; - packet->data += decodedLength; - packet->size -= decodedLength; - } - - return true; - } - else - { - return false; - } + int gotPicture = 0; + needsMoreDecoding = false; + int decodedLength = avcodec_decode_video2(m_stream->codec, outputFrame, &gotPicture, packet); + + gotFrame = (gotPicture != 0); + + if (decodedLength > 0 || gotFrame) + { + if (decodedLength < packet->size) + { + needsMoreDecoding = true; + packet->data += decodedLength; + packet->size -= decodedLength; + } + + return true; + } + else + { + return false; + } #endif - } - - void VideoStream::initRescaler() - { - /* create scaling context */ - int algorithm = SWS_FAST_BILINEAR; - - if (getFrameSize().x % 8 != 0 && getFrameSize().x * getFrameSize().y < 500000) - { - algorithm |= SWS_ACCURATE_RND; - } - + } + + void VideoStream::initRescaler() + { + /* create scaling context */ + int algorithm = SWS_FAST_BILINEAR; + + if (getFrameSize().x % 8 != 0 && getFrameSize().x * getFrameSize().y < 500000) + { + algorithm |= SWS_ACCURATE_RND; + } + #if LIBAVFORMAT_VERSION_MAJOR > 56 - m_swsCtx = sws_getCachedContext(nullptr, m_stream->codecpar->width, m_stream->codecpar->height, (AVPixelFormat)m_stream->codecpar->format, - m_stream->codecpar->width, m_stream->codecpar->height, AV_PIX_FMT_RGBA, - algorithm, nullptr, nullptr, nullptr); + m_swsCtx = sws_getCachedContext(nullptr, m_stream->codecpar->width, m_stream->codecpar->height, (AVPixelFormat)m_stream->codecpar->format, + m_stream->codecpar->width, m_stream->codecpar->height, AV_PIX_FMT_RGBA, + algorithm, nullptr, nullptr, nullptr); #else - m_swsCtx = sws_getCachedContext(nullptr, m_stream->codec->width, m_stream->codec->height, m_stream->codec->pix_fmt, - m_stream->codec->width, m_stream->codec->height, AV_PIX_FMT_RGBA, - algorithm, nullptr, nullptr, nullptr); + m_swsCtx = sws_getCachedContext(nullptr, m_stream->codec->width, m_stream->codec->height, m_stream->codec->pix_fmt, + m_stream->codec->width, m_stream->codec->height, AV_PIX_FMT_RGBA, + algorithm, nullptr, nullptr, nullptr); #endif - CHECK(m_swsCtx, "VideoStream::initRescaler() - sws_getContext() error"); - } - - void VideoStream::rescale(AVFrame* frame, uint8_t* outVideoBuffer[4], int outVideoLinesize[4]) - { - CHECK(frame, "VideoStream::rescale() - invalid argument"); - sws_scale(m_swsCtx, frame->data, frame->linesize, 0, frame->height, outVideoBuffer, outVideoLinesize); - } - - void VideoStream::willPlay(const Timer &timer) - { - Stream::willPlay(timer); - if (getStatus() == Stopped) - { - preload(); - } - } - - sf::Time VideoStream::codecBufferingDelay() const - { - sf::Time delay; - for (const sf::Time& packetDelay : m_codecBufferingDelays) - delay += packetDelay; - - return delay; - } + } + + void VideoStream::rescale(AVFrame* frame, uint8_t* outVideoBuffer[4], int outVideoLinesize[4]) + { + if (frame != nullptr) + { + sws_scale(m_swsCtx, frame->data, frame->linesize, 0, frame->height, outVideoBuffer, outVideoLinesize); + } + } + + void VideoStream::willPlay(const Timer &timer) + { + Stream::willPlay(timer); + if (getStatus() == Stopped) + { + preload(); + } + } + + sf::Time VideoStream::codecBufferingDelay() const + { + sf::Time delay; + for (const auto& packetDelay : m_codecBufferingDelays) + { + delay += packetDelay; + } + return delay; + } } diff --git a/src/sfeMovie/VideoStream.hpp b/src/sfeMovie/VideoStream.hpp index 066392ec..204ec6a7 100755 --- a/src/sfeMovie/VideoStream.hpp +++ b/src/sfeMovie/VideoStream.hpp @@ -1,4 +1,3 @@ - /* * VideoStream.hpp * sfeMovie project @@ -22,134 +21,134 @@ * */ -#ifndef SFEMOVIE_VIDEOSTREAM_HPP -#define SFEMOVIE_VIDEOSTREAM_HPP +#pragma once -#include "Macros.hpp" -#include "Stream.hpp" +#include #include -#include +#include "Stream.hpp" namespace sfe { - class VideoStream : public Stream - { - public: - struct Delegate - { - virtual void didUpdateVideo(const VideoStream& sender, const sf::Texture& image) = 0; - }; - - /** Create a video stream from the given FFmpeg stream - * - * At the end of the constructor, the stream is guaranteed - * to have all of its fields set and the decoder loaded - */ - VideoStream(AVFormatContext*& formatCtx, AVStream*& stream, - DataSource& dataSource, std::shared_ptr timer, Delegate& delegate); - - /** Default destructor - */ - virtual ~VideoStream(); - - /** Get the stream kind (either audio or video stream) - * - * @return the kind of stream represented by this stream - */ - MediaType getStreamKind() const override; - - /** Get the video frame size (width, height) - * - * @return the video frame size - */ - sf::Vector2i getFrameSize() const; - - /** Get the average amount of video frame per second for this stream - * - * @param formatCtx the FFmpeg format context to which this stream belongs - * @return the average framerate - */ - float getFrameRate() const; - - /** Get the SFML texture that contains the latest video frame - */ - sf::Texture& getVideoTexture(); - - /** Update the video frame and the stream's status - */ - void update() override; - - /** @see Stream::flushBuffers() - */ - void flushBuffers() override; - - /** @see Stream::fastForward() - */ - bool fastForward(sf::Time targetPosition) override; - - /** Load packets until one frame can be decoded - */ - void preload(); - private: - bool onGetData(sf::Texture& texture); - - /** Returns the difference between the video stream timer and the reference timer - * - * A positive value means the video stream is ahead of the reference timer - * whereas a nevatige value means the video stream is late - * - * @param[out] gap the gap, if it could be computed - * @return true if the gap could be computed, false otherwise (@ref gap is left unmodified) - */ - bool getSynchronizationGap(sf::Time& gap); - - /** Decode the encoded data @a packet into @a outputFrame - * - * gotFrame being set to false means that decoding should still continue: - * - with a new packet if false is returned - * - with the same packet if true is returned - * - * @param packet the encoded data - * @param outputFrame one decoded data - * @param gotFrame set to true if a frame has been extracted to outputFrame, false otherwise - * @param goOn set to true if decoding can continue, or false if no more data can be decoded (EOF) - * @return true if decoding succeeded, false otherwise (EOF) - */ - bool decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame, bool& needsMoreDecoding); - - /** Initialize the audio resampler for conversion from many formats to signed 16 bits audio - * - * This must be called before any packet is decoded and resampled - */ - void initRescaler(); - - /** Convert the decoded video frame @a frame into RGBA image data - * - * @param frame the audio samples to convert - * @param outSamples [out] the convertedSamples - * @param outNbSamples [out] the count of samples in @a outSamples - * @param outSamplesLength [out] the length of @a outSamples in bytes - */ - void rescale(AVFrame* frame, uint8_t* outVideoBuffer[4], int outVideoLinesize[4]); - - // Timer::Observer interface - void willPlay(const Timer &timer) override; - - /** Returns the delay caused by the FFmpeg decoder buffering - */ - sf::Time codecBufferingDelay() const; - - // Private data - sf::Texture m_texture; - AVFrame* m_rawVideoFrame; - uint8_t *m_rgbaVideoBuffer[4]; - int m_rgbaVideoLinesize[4]; - std::list m_codecBufferingDelays; - Delegate& m_delegate; - - // Rescaler data - struct SwsContext *m_swsCtx; - }; -} + class VideoStream : public Stream + { + public: + struct Delegate + { + virtual void didUpdateVideo(const VideoStream& sender, const sf::Texture& image) = 0; + }; + + /** Create a video stream from the given FFmpeg stream + * + * At the end of the constructor, the stream is guaranteed + * to have all of its fields set and the decoder loaded + */ + VideoStream(AVFormatContext*& formatCtx, AVStream*& stream, + DataSource& dataSource, Timer* timer, Delegate& delegate); + + /** Default destructor + */ + virtual ~VideoStream(); + + /** Get the stream kind (either audio or video stream) + * + * @return the kind of stream represented by this stream + */ + MediaType getStreamKind() const override; + + /** Get the video frame size (width, height) + * + * @return the video frame size + */ + sf::Vector2i getFrameSize() const; + + /** Get the average amount of video frame per second for this stream + * + * @param formatCtx the FFmpeg format context to which this stream belongs + * @return the average framerate + */ + float getFrameRate() const; + + /** Get the SFML texture that contains the latest video frame + */ + sf::Texture& getVideoTexture(); + + /** Update the video frame and the stream's status + */ + void update() override; + + /** @see Stream::flushBuffers() + */ + void flushBuffers() override; -#endif + /** @see Stream::fastForward() + */ + bool fastForward(sf::Time targetPosition) override; + + /** Load packets until one frame can be decoded + */ + void preload(); + + /** @see Stream::hasError() + */ + bool hasError() const noexcept override; + private: + bool onGetData(sf::Texture& texture); + + /** Returns the difference between the video stream timer and the reference timer + * + * A positive value means the video stream is ahead of the reference timer + * whereas a nevatige value means the video stream is late + * + * @param[out] gap the gap, if it could be computed + * @return true if the gap could be computed, false otherwise (@ref gap is left unmodified) + */ + bool getSynchronizationGap(sf::Time& gap); + + /** Decode the encoded data @a packet into @a outputFrame + * + * gotFrame being set to false means that decoding should still continue: + * - with a new packet if false is returned + * - with the same packet if true is returned + * + * @param packet the encoded data + * @param outputFrame one decoded data + * @param gotFrame set to true if a frame has been extracted to outputFrame, false otherwise + * @param goOn set to true if decoding can continue, or false if no more data can be decoded (EOF) + * @return true if decoding succeeded, false otherwise (EOF) + */ + bool decodePacket(AVPacket* packet, AVFrame* outputFrame, bool& gotFrame, bool& needsMoreDecoding); + + /** Initialize the audio resampler for conversion from many formats to signed 16 bits audio + * + * This must be called before any packet is decoded and resampled + */ + void initRescaler(); + + /** Convert the decoded video frame @a frame into RGBA image data + * + * @param frame the audio samples to convert + * @param outSamples [out] the convertedSamples + * @param outNbSamples [out] the count of samples in @a outSamples + * @param outSamplesLength [out] the length of @a outSamples in bytes + */ + void rescale(AVFrame* frame, uint8_t* outVideoBuffer[4], int outVideoLinesize[4]); + + // Timer::Observer interface + void willPlay(const Timer& timer) override; + + /** Returns the delay caused by the FFmpeg decoder buffering + */ + sf::Time codecBufferingDelay() const; + + // Private data + sf::Texture m_texture; + AVFrame* m_rawVideoFrame{ nullptr }; + uint8_t* m_rgbaVideoBuffer[4]{}; + int m_rgbaVideoLinesize[4]{}; + std::list m_codecBufferingDelays; + Delegate& m_delegate; + + // Rescaler data + struct SwsContext* m_swsCtx{ nullptr }; + }; +}