Codebase list blockattack / upstream/2.7.0
New upstream version 2.7.0 Markus Koschany 2 years ago
91 changed file(s) with 2777 addition(s) and 3052 deletion(s). Raw diff Collapse all Expand all
0 name: Build
1
2 on: [push]
3
4 jobs:
5 ci_job:
6 runs-on: ubuntu-latest
7 name: Test that the game can be compiled
8 steps:
9 - name: Check Out Repo
10 uses: actions/checkout@v2
11 - name: Check lint
12 run: bash source/misc/lint/runLint.sh
13 - name: Test Fedora 25
14 run: docker build -f source/misc/docker/Dockerfile.Fedora25build . -t blockattack_test
15 - name: Test Windows MXE
16 run: docker build -f source/misc/docker/Dockerfile.WindoesBuild . -t blockattack_test
1212 !.dockerignore
1313 *.patch
1414 Game/blockattack*
15 Game/mods/1.3.0.bricks.data
1516 cmake_install.cmake
1617 CMake*
1718 -CMakeLists.txt
+0
-12
.travis.yml less more
0 sudo: required
1
2 language: cpp
3
4 services:
5 - docker
6
7
8 script: ./travis_build.script
9
10 notifications:
11 email: false
0 # Changelog
1
2
3 ## [2.7.0] - 2021-10-23
4
5 ### Added
6 - Volume for sound effect and music is now stored in the configFile
7 - Menu for changing music and sound volume
8
9 ### Changed
10 - Linux icons have been converted to png (patch by pinotree)
11 - Now requires Ubuntu 18.04 or later (or equivalent)
12 - utfcpp is now an embedded library
13 - Dialog boxes now uses contructed textures thus reducing tearing on some renderers
14 - Garbage blocks now uses constructed textures thus reducing tearing on some renderers
15 - Screen shot feature now works with hardware render
16 - Update library versions for the compiled version:
17 - SDL2: 2.0.12 to 2.0.16
18
19 ### Removed
20 - Linux standalone build no longer includes 32 bit binary
21
22 ## [2.6.0] - 2020-09-26
23
24 ### Added
25 - Patch by bmwiedemann for sorting in the data file. Should make builds reproducible
26 - Virtual keyboard on the enter name screen allowing using a mouse or a gamepad to type.
27
28 ### Changed
29 - Modified the controller keybind. "B" is now Cancel instead of "Y"
30 - Update embedded Cerial from 1.2.2 to 1.3.0
31 - Update library versions for the compiled version:
32 - SDL2: 2.0.9 to 2.0.12
33 - SDL2_image: 2.0.4 to 2.0.5
34 - SDL2_ttf: 2.0.14 to 2.0.15
35 - physfs: 2.0.3 to 3.0.2
36
37 ## [2.5.0+1] - 2019-07-04
38
39 Not given a version number as the build environment is not part of the project.
40 Given a +1 to show that the build environment has changed
41
42 ### Fixed
43 - New Windows build environment to prevent a crash on Windows 10 1809
44
45 ## [2.5.0] - 2019-05-25
46
47 ### Added
48 - Option to always use the software renderer
49 - Automatically start in software render the first time after a crash
50 - Widescreen support. Only used in fullscreen by default.
51 - Appstream metadata
52
53 ### Fixed
54 - Fixed the search order in archives
55 - Screenshot feature no longer crashes in hardware acceleration. Still only works in software mode
56
57 ## [2.4.0] - 2019-03-10
58
59 ## Added
60 - Different starting speeds for Endless
61 - Dumps the about page info to "about.txt" when viewed
62 - Default player 1 name is now fetched from the OS
63
64 ## Changed
65 - Minor code cleanup
66 - Improved "About" page with technical information
67 - Improved Unicode support (--homepath can now be used with Unicode chars) (Windows only)
68
69 ## Removed
70 - Support for any Windows operating systems before Windows 7 (Windows only)
71
72 ## Fixed
73 - Build against SDL 2.0.9 fixing some scaling problems and improving gamepad support (Windows only)
74
75 ## [2.3.0] - 2018-07-01
76
77 ## Changed
78 - Several keyboard keys are now translatable
79 - Window size is now restored on next startup
80 - The back-button on the gamepad now goes back in menus
81 - Gamepad L2 and R2 can now be used to push lines
82 - Game Over, Winner and Draw are now translatable
83
84 ## [2.2.0] - 2018-05-20
85
86 ## Added
87 - Help menu with rule explanations
88
89 ## Changed
90 - New font system
91 - Better scaling
92 - Works out of the box on Windows with high resolution displays
93
94 ## [2.1.2] - 2018-01-12
95
96 ### Fixed
97 - The Windows version would not save correctly if "My Games" did not already exist in the Documents folder.
98
99 ## [2.1.1] - 2017-04-01
100
101 This has the first gameplay change in a long time. In the previous version the rise would stop
102 while clearing. It could stop for several seconds. This is no longer the case. The time is now
103 bound and will lower as the game progresses.
104
105 The update of the model has also been changed. This should make it more smooth in some of the
106 high speed Stage Clear levels.
107
108 ### Added
109 - Docker files are now provided to make compiling even easier
110
111 ### Changed
112 - There is now an upper limit on how long the rise will stop
113 - The internal updated of the game has been updated from 20 times a second to 100 times a second
114 - Menu fonts have been changed
115 - Window is now resizeable by default
116 - Code cleanup
117 - Translation strings changed
118 - Updated libraries
119
120 ### Removed
121 * jsoncpp is no longer a dependency
122
123 ## [2.1.0] - 2017-04-01 [YANKED]
124
125 ## [2.0.1] - 2016-10-01
126
127 ### Fixed
128 - The "Get Ready" animation used the wrong sprite
129 - My homepath was hardcoded in the Makefile (Linux only)
130
131
132 ## [2.0.0] - 2016-05-01
133
134 ### Added
135 - TTF font support
136 - gettext based translation support (includes a Danish translation)
137
138 ### Changed
139 - Uses SDL2. This means textures and sprites instead of old surfaces.
140 - New config file format
141 - Linux saves are now stored under $HOME/.local/share/blockattack
142 - New keyboard and game controller friendly menu system
143 - Better behind the scenes handling
144 - Now uses a CMake build system
145 - Better game controller support (although limited to SDL2 supported controllers)
146 - Better mouse play
147 - More modern icon
148 - Old config and some saves are lost then converting to 2.0.0+
149
150 ### Removed
151 - Replay functionality
152 - Network support
153 - Including dependency on Enet
154 - Themes support
155 - Support for non-SDL2 game controllers
156
157
158 ## [2.0.0-SNAPSHOT-2016-03-20] - 2016-03-20
159
160 Preview release for SDL2 support
161
162 ## [1.4.2] - 2014-09-11
163
164 ### Fixed
165 - The Windows uninstaller now works on Vista/7/8 (Windows only)
166
167 ## [1.4.1] - 2009-11-19
168
169 ### Added
170 - PhysFS is now a requirement
171 - Theme support
172
173 ## [1.4.0] - 2009-04-07
174
175 ### Changed
176 - New graphics by Qubodup
177
178 ## [1.3.2] - 2008-01-17
179
180 ### Changed
181 - Enet updated from 1.0 to 1.1
182
183 ## [1.3.1] - 2007-01-17
184
185 ### Fixed
186 - Windows 9x know works again (Windows only)
187 - Puzzle mode has been fixed (Windows only)
188
189 ## [1.3.0] - 2006-08-29
190
191 ### Added
192 - gray garbage blocks
193 - "." can be entered while typing an IP address
194
195 ## [1.2.2] - 2006-08-09
196
197 ### Added
198 - 64 bit support
199
200 ## [1.2.0] - 2006-06-19
201
202 ### Added
203 - Network play
204 - Ability to save replays up to 5 minutes long
205
206 ## [1.1.2] - 2005-11-20
207
208 ### Added
209 - Small numbers while chaining
210
211 ## [1.1.1] - 2005-10-29
212
213 ### Added
214 - Handicap in multiplayer matches
215 - Basic AI
216
217 ### Changed
218 - Now always uses software surfaces
219 - Better puzzle management
220 - Better controls
221 - New Makefile
222 - Now hosted on blockattack.sf.net
223
224 ### Removed
225 - Windows 9x support
226
227 ## [1.1.0] - 2005-06-12
228
229 ### Changed
230 - Radically changed gameplay
231 - Blocks no longer falls instantly
232 - Blocks will not match while falling
233 - Chains give more points
234 - Combos give less points
235
236 ## [1.0.6] - 2005-05-08
237
238 ### Added
239 - Mouse play
240 - Joypad support
241
242 ### Changed
243 - Renamed to "Block Attack - Rise of the Blocks"
244
245 ## [1.0.5] - 2005-05-02
246 First non beta release
0 cmake_minimum_required(VERSION 2.8.7)
0 cmake_minimum_required(VERSION 3.5.1...3.18.4)
11 project (blockattack)
2 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${blockattack_SOURCE_DIR}/source/misc/cmake")
32 set(BIN_DIR ${blockattack_SOURCE_DIR}/Game)
43
5 SET(CPACK_PACKAGE_VERSION "2.6.0")
4 SET(CPACK_PACKAGE_VERSION "2.7.0")
65 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
7 SET(CPACK_PACKAGE_VERSION_MINOR "6")
6 SET(CPACK_PACKAGE_VERSION_MINOR "7")
87 SET(CPACK_PACKAGE_VERSION_PATCH "0")
98 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Block Attack - Rise of the Blocks ${CPACK_PACKAGE_VERSION}")
109 SET(CPACK_PACKAGE_VENDOR "Poul Sander")
5756 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG")
5857 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -O2")
5958
60 #Newer versions of gcc fails for Cereal.
61 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-implicit-fallthrough")
62
6359 #Setup SDL2
6460 find_package(SDL2 REQUIRED)
65 include_directories(${SDL2_INCLUDE_DIR})
61 include_directories(${SDL2_INCLUDE_DIRS})
6662
6763 #Setup things that use pkg-config
6864 find_package(PkgConfig REQUIRED)
9086
9187 #building/compiling/linking
9288 add_executable(blockattack ${GUI_TYPE} ${SOURCES} ${RES_FILES})
93 target_link_libraries( blockattack ${SDL2_LIBRARY})
89 target_link_libraries( blockattack ${SDL2_LIBRARIES})
9490 target_link_libraries( blockattack physfs)
9591 target_link_libraries( blockattack ${SDL2MIXER_LIBRARIES} ${SDL2IMAGE_LIBRARIES} ${SDL2TTF_LIBRARIES})
9692 target_link_libraries( blockattack ${Boost_LIBRARIES} )
10298 install(FILES man/blockattack.6.gz DESTINATION ${INSTALL_MAN_DIR} )
10399 install(FILES source/misc/blockattack.desktop DESTINATION ${INSTALL_APPLICATIONS_DIR} )
104100 install(FILES source/misc/net.blockattack.game.metainfo.xml DESTINATION ${INSTALL_METAINFO_DIR} )
105 install(FILES source/misc/icons/blockattack16.xpm DESTINATION "${INSTALL_ICONS_DIR}/16x16/apps" RENAME blockattack.xpm )
106 install(FILES source/misc/icons/blockattack48.xpm DESTINATION "${INSTALL_ICONS_DIR}/48x48/apps" RENAME blockattack.xpm )
107 install(FILES source/misc/icons/blockattack128.xpm DESTINATION "${INSTALL_ICONS_DIR}/128x128/apps" RENAME blockattack.xpm )
108 install(FILES source/misc/icons/blockattack256.xpm DESTINATION "${INSTALL_ICONS_DIR}/256x256/apps" RENAME blockattack.xpm )
109 install(FILES source/misc/icons/blockattack64.xpm DESTINATION "${INSTALL_ICONS_DIR}/64x64/apps" RENAME blockattack.xpm )
110 install(FILES source/misc/icons/blockattack32.xpm DESTINATION "${INSTALL_ICONS_DIR}/32x32/apps" RENAME blockattack.xpm )
101 install(FILES source/misc/icons/blockattack16.png DESTINATION "${INSTALL_ICONS_DIR}/16x16/apps" RENAME blockattack.png )
102 install(FILES source/misc/icons/blockattack48.png DESTINATION "${INSTALL_ICONS_DIR}/48x48/apps" RENAME blockattack.png )
103 install(FILES source/misc/icons/blockattack128.png DESTINATION "${INSTALL_ICONS_DIR}/128x128/apps" RENAME blockattack.png )
104 install(FILES source/misc/icons/blockattack256.png DESTINATION "${INSTALL_ICONS_DIR}/256x256/apps" RENAME blockattack.png )
105 install(FILES source/misc/icons/blockattack64.png DESTINATION "${INSTALL_ICONS_DIR}/64x64/apps" RENAME blockattack.png )
106 install(FILES source/misc/icons/blockattack32.png DESTINATION "${INSTALL_ICONS_DIR}/32x32/apps" RENAME blockattack.png )
111107 install(DIRECTORY source/misc/translation/locale/ DESTINATION "${INSTALL_LOCALE_DIR}")
0 {
1 "name" : "1.3.0.bricks",
2 "description" : "Uses the bricks from version 1.3.0",
3 "sprites" : "bricks1.3.0"
4 }
0 {
1
2 "block_blue" : {
3 "texture" : "bricks130",
4 "topx" : 0,
5 "topy" : 0,
6 "height" : 50,
7 "width" : 50,
8 "number_of_frames" : 1,
9 "frame_time" : 1
10 },
11
12 "block_green" : {
13 "texture" : "bricks130",
14 "topx" : 50,
15 "topy" : 0,
16 "height" : 50,
17 "width" : 50,
18 "number_of_frames" : 1,
19 "frame_time" : 1
20 },
21
22 "block_gray" : {
23 "texture" : "bricks130",
24 "topx" : 100,
25 "topy" : 0,
26 "height" : 50,
27 "width" : 50,
28 "number_of_frames" : 1,
29 "frame_time" : 1
30 },
31
32 "block_purple" : {
33 "texture" : "bricks130",
34 "topx" : 150,
35 "topy" : 0,
36 "height" : 50,
37 "width" : 50,
38 "number_of_frames" : 1,
39 "frame_time" : 1
40 },
41
42 "block_red" : {
43 "texture" : "bricks130",
44 "topx" : 200,
45 "topy" : 0,
46 "height" : 50,
47 "width" : 50,
48 "number_of_frames" : 1,
49 "frame_time" : 1
50 },
51
52 "block_turkish" : {
53 "texture" : "bricks130",
54 "topx" : 250,
55 "topy" : 0,
56 "height" : 50,
57 "width" : 50,
58 "number_of_frames" : 1,
59 "frame_time" : 1
60 },
61
62 "block_yellow" : {
63 "texture" : "bricks130",
64 "topx" : 300,
65 "topy" : 0,
66 "height" : 50,
67 "width" : 50,
68 "number_of_frames" : 1,
69 "frame_time" : 1
70 }
71
72 }
+0
-5
Game/themes/default less more
0 This is an empty file
1
2 It needs to be here so the theme 'default' can be selected from the menu
3
4 Custom themes should be placed as directories next to this file
0 # blockattack-game [![Build Status](https://travis-ci.org/blockattack/blockattack-game.svg?branch=master)](https://travis-ci.org/blockattack/blockattack-game) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/0dfba60f2ce9484a828bd7c112f50089)](https://www.codacy.com/app/github_43/blockattack-game?utm_source=github.com&utm_medium=referral&utm_content=blockattack/blockattack-game&utm_campaign=Badge_Grade) [![Coverity Status](https://scan.coverity.com/projects/8278/badge.svg)](https://scan.coverity.com/projects/8278) [![license](https://img.shields.io/github/license/blockattack/blockattack-game.svg)]()
0 # blockattack-game ![Build status](https://github.com/blockattack/blockattack-game/actions/workflows/main.yml/badge.svg) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/044d09ab34be4a1fa93e31d9585adacf)](https://www.codacy.com/gh/blockattack/blockattack-game/dashboard?utm_source=github.com&utm_medium=referral&utm_content=blockattack/blockattack-game&utm_campaign=Badge_Grade) [![license](https://img.shields.io/github/license/blockattack/blockattack-game.svg)]()
11 Block Attack - Rise of the Blocks - the game<br/>
22 A Tetris Attack Clone under the GPL.
33
1616 * libphysfs
1717 * libboost (only needed for compiling)
1818 * libboost-program-options
19 * libutfcpp (only needed for compiling)
2019
2120 ## Building
2221 The only supported build method is using the CMake<br/>
4443 ```
4544 sdl2 sdl2_image sdl2_mixer sdl2_ttf physfs libtool gettext freetype zlib boost
4645 ```
47 and libutfcpp copied from "source/misc/travis_help/utf8_v2_3_4/source/" to "/path/to/mxe/usr/lib/gcc/i686-w64-mingw32.static/4.9.3/include"
4846
4947 Compiled with:
5048 ```
5553
5654 As getting a C++ project with many dependencies to compile can be a daunting task then I have provided a couple of Docker images that can perform a build. Both for Windows and Linux.
5755
56 The project should at all time be able to compile on the oldest and latest supported version of Ubuntu. This is tested with Docker.
57
5858 On a fresh checkout you can use:
5959 ```
60 docker build -f source/misc/docker/Dockerfile.Ubuntu16.04build . -t blockattack_test
60 docker build -f source/misc/docker/Dockerfile.Ubuntu18.04build . -t blockattack_test
6161 ```
6262 and
6363 ```
6565 ```
6666
6767 ## Source Structure
68 This project is a bit unconversionel because I didn't know any better at the time.
68 This project is a bit unconventional because I didn't know any better at the time.
6969
7070 * Game - The output is placed here
7171 * man - The manual file and the script to generate it. May be moved to source/misc at some point
+0
-16
ReleaseNotes-2.6.0.txt less more
0 This is Block Attack - Rise of the Blocks - version 2.6.0
1
2 The main focus of this release is improved controller support.
3
4 Changes since 2.5.0:
5
6 Modified the controller keybind. "B" is now Cancel instead of "Y"
7 There is a virtual keyboard on the enter name screen allowing using a mouse or a gamepad to type.
8 Added patch by bmwiedemann for sorting in the data file
9 Update embedded Cerial from 1.2.2 to 1.3.0
10 Update library versions for the compiled Linux version:
11 * SDL2: 2.0.9 to 2.0.12
12 * SDL2_image: 2.0.4 to 2.0.5
13 * SDL2_ttf: 2.0.14 to 2.0.15
14 * physfs: 2.0.3 to 3.0.2
15
00 .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13.
1 .TH BLOCKATTACK "6" "September 2020" "blockattack 2.6.0" "Games"
1 .TH BLOCKATTACK "6" "October 2021" "blockattack 2.7.0" "Games"
22 .SH NAME
33 blockattack \- a puzzle game inspired by Tetris Attack
44 .SH SYNOPSIS
55 .B blockattack
66 [\fI\,OPTION\/\fR]...
77 .SH DESCRIPTION
8 Block Attack \- Rise of the blocks 2.6.0
8 Block Attack \- Rise of the blocks 2.7.0
99 .PP
1010 Block Attack \- Rise of the Blocks is a puzzle/blockfall game inspired by Tetris Attack for the SNES.
1111 .PP
5656 .TP
5757 \fB\-\-homepath\fR arg
5858 Set the home folder where settings are saved. The directory will be created if it does not exist. Default: "$HOME/.local/share/blockattack"
59 .TP
60 \fB\-m\fR [ \fB\-\-mod\fR ] arg
61 Loads a mod. Later mods have preference
5962 .SH EXAMPLES
6063 .TP
6164 blockattack
00 #!/bin/bash
11 set -e
22 zip -9jX Game/blockattack.data source/AUTH
3 cd Game/data
4 zip -9X $(find ../blockattack.data * | sort) -x \*svn*
5 cd ../../man
3 pushd Game/data
4 zip -9X $(find ../blockattack.data ./* | sort) -x \*svn*
5 popd
6 pushd Game/mods/1.3.0.bricks_unpacked.data/
7 zip -9X ../1.3.0.bricks.data $(find ./* | sort)
8 popd
9 pushd man
610 gzip -9n -c blockattack.man > blockattack.6.gz
7 cd ../source/misc/translation/
11 popd
12 pushd source/misc/translation/
813 ./build_mo_all.sh
14 popd
915
1016 exit 0
9797 return;
9898 }
9999 match = true;
100 x = (mousex-topx) / 50;
101 y = (50*12+topy-mousey-pixels) / 50;
100 x = (mousex-topx) / bsize;
101 y = (bsize*12+topy-mousey-pixels) / bsize;
102102 }
103103
104104 bool IsInTheBoard(int mousex, int mousey) const {
105 if (mousex < topx || mousex > topx+50*6 || mousey < topy || mousey > topy+50*12) {
105 if (mousex < topx || mousex > topx+bsize*6 || mousey < topy || mousey > topy+bsize*12) {
106106 return false;
107107 }
108108 return true;
109109 }
110110
111111 bool IsUnderTheBoard(int mousex, int mousey) const {
112 if (mousex < topx || mousex > topx+50*6 || mousey < topy+50*12) {
112 if (mousex < topx || mousex > topx+bsize*6 || mousey < topy+bsize*12) {
113113 return false;
114114 }
115115 return true;
165165 Mix_PlayChannel(1, applause.get(), 0);
166166 }
167167 private:
168
169 /**
170 This crops "dstrect" and "srcrect" to fit inside "bounds"
171 dstrect and srcrect are modified in place.
172 */
173 void CropTexture(SDL_Rect& dstrect, SDL_Rect& srcrect, const SDL_Rect& bounds) const {
174 if (dstrect.x > bounds.x+bounds.w) {
175 dstrect = {0,0,0,0};
176 return;
177 }
178 if (dstrect.y > bounds.y+bounds.h) {
179 dstrect = {0,0,0,0};
180 return;
181 }
182 if (dstrect.x+dstrect.w < bounds.x) {
183 dstrect = {0,0,0,0};
184 return;
185 }
186 if (dstrect.y+dstrect.h < bounds.y) {
187 dstrect = {0,0,0,0};
188 return;
189 }
190 if (dstrect.x < bounds.x) {
191 Sint16 absDiff = bounds.x-dstrect.x;
192 dstrect.x+=absDiff;
193 srcrect.x+=absDiff;
194 dstrect.w-=absDiff;
195 srcrect.w-=absDiff;
196 }
197 if (dstrect.y < bounds.y) {
198 Sint16 absDiff = bounds.y-dstrect.y;
199 dstrect.y+=absDiff;
200 srcrect.y+=absDiff;
201 dstrect.h-=absDiff;
202 srcrect.h-=absDiff;
203 }
204 if (dstrect.x+dstrect.w > bounds.x+bounds.w) {
205 Sint16 absDiff = dstrect.x+dstrect.w-(bounds.x+bounds.w);
206 dstrect.w -= absDiff;
207 srcrect.w -= absDiff;
208 }
209 if (dstrect.y+dstrect.h > bounds.y+bounds.h) {
210 Sint16 absDiff = dstrect.y+dstrect.h-(bounds.y+bounds.h);
211 dstrect.h -= absDiff;
212 srcrect.h -= absDiff;
213 }
214 }
215
216 /**
217 * Creates a new texture for a garabge block of size size_x*size_y at x,y and crops it.
218 * Also sets globalData.screen to point to the texture, so Draw now draws on the Texture.
219 */
220 SDL_Texture* CreateGarbageTexture(int x, int y, int size_x, int size_y, SDL_Rect& dstrect, SDL_Rect& srcrect) const {
221 dstrect = { x, y, size_x*bsize, size_y*bsize };
222 srcrect = { 0, 0, size_x*bsize, size_y*bsize };
223 SDL_Rect bound = {topx, topy, backBoard.GetWidth(), backBoard.GetHeight()};
224 CropTexture (dstrect, srcrect, bound);
225 SDL_Texture* mTexture = SDL_CreateTexture( globalData.screen, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, size_x*bsize, size_y*bsize );
226 SDL_SetRenderTarget( globalData.screen, mTexture );
227
228 SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_NONE);
229 SDL_SetTextureBlendMode(mTexture, SDL_BLENDMODE_BLEND);
230 SDL_SetRenderDrawColor(globalData.screen, 0, 0, 0, 0);
231 SDL_RenderFillRect(globalData.screen, NULL);
232 SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_BLEND);
233 return mTexture;
234 }
235
236 /**
237 Paints a garbage block of size size_x*size_y (size in blocks) at x,y (coordinates in pixels).
238 The garbage block will be painted on an internal texture and rendered to screen to protect against tearing.
239 The result will be cropped to the playable area.
240 */
241 void PaintGarbageBlock(int x, int y, int size_x, int size_y) const {
242 SDL_Rect dstrect ;
243 SDL_Rect srcrect ;
244 SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect);
245 const Sint32 draw_time = SDL_GetTicks();
246
247 if (size_y == 1) {
248 //single line
249 garbageML.Draw(globalData.screen, draw_time, 0, 0);
250 for (int i = 1; i < size_x-1; ++i) {
251 garbageM.Draw(globalData.screen, draw_time, i*bsize, 0);
252 }
253 garbageMR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0);
254 }
255 if (size_y > 1) {
256 // Top line
257 garbageTL.Draw(globalData.screen, draw_time, 0, 0);
258 for (int i = 1; i < size_x-1; ++i) {
259 garbageT.Draw(globalData.screen, draw_time, i*bsize, 0);
260 }
261 garbageTR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0);
262 // Middle lines (if any)
263 for (int j=1; j < size_y-1; ++j) {
264 garbageL.Draw(globalData.screen, draw_time, 0, j*bsize);
265 for (int i = 1; i < size_x-1; ++i) {
266 garbageFill.Draw(globalData.screen, draw_time, i*bsize, j*bsize);
267 }
268 garbageR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, j*bsize);
269 }
270 //Buttom line
271 garbageBL.Draw(globalData.screen, draw_time, 0, (size_y-1)*bsize);
272 for (int i = 1; i < size_x-1; ++i) {
273 garbageB.Draw(globalData.screen, draw_time, i*bsize, (size_y-1)*bsize);
274 }
275 garbageBR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, (size_y-1)*bsize);
276 }
277
278 SDL_SetRenderTarget( globalData.screen, nullptr );
279 SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect );
280 SDL_DestroyTexture(mTexture);
281 }
282
283 /**
284 Paints a grey garbage block of size size_x (size in blocks, always 6) at x,y (coordinates in pixels).
285 The result will be cropped to the playable area.
286 */
287 void PaintGreyGarbageBlock(int x, int y, int size_x) const {
288 const int size_y = bsize;
289 SDL_Rect dstrect ;
290 SDL_Rect srcrect ;
291 SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect);
292 const Sint32 draw_time = SDL_GetTicks();
293
294 for (int j=0; j < size_y; ++j) {
295 if (j==0) {
296 garbageGML.Draw(globalData.screen, draw_time, j*bsize, 0);
297 }
298 else if (j==5) {
299 garbageGMR.Draw(globalData.screen, draw_time, j*bsize, 0);
300 }
301 else {
302 garbageGM.Draw(globalData.screen, draw_time, j*bsize, 0);
303 }
304 }
305
306 SDL_SetRenderTarget( globalData.screen, nullptr );
307 SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect );
308 SDL_DestroyTexture(mTexture);
309 }
310
311 std::pair<int, int> getGarbageSize(int topx, int topy) const {
312 int size_x = 0;
313 int size_y = 0;
314 int number = board[topx][topy];
315 for (int i=topy; i < 30 ; ++i) {
316 if(number == board[topx][i]) {
317 ++size_y;
318 }
319 }
320 for (int i=topx; i < 7 ; ++i) {
321 if(number == board[i][topy]) {
322 ++size_x;
323 }
324 }
325 return std::make_pair(size_x, size_y);
326 }
327
168328 //Draws all the bricks to the board (including garbage)
169329 void PaintBricks() const {
330 int lastGarbageNumber = 0;
170331 for (int i=0; i<13; ++i) {
171332 for (int j=0; j<6; ++j) {
172333 int basicBrick = board[j][i]%10; //The basic brick, stored on the least significant digit
181342
182343 }
183344 if ((board[j][i]/1000000)%10==1) {
184 int left, right, over, under;
185345 int number = board[j][i];
186 if (j<1) {
187 left = -1;
346 if (number != lastGarbageNumber) {
347 const auto& garbage_size = getGarbageSize(j, i);
348 lastGarbageNumber = number;
349 PaintGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first, garbage_size.second);
188350 }
189 else {
190 left = board[j-1][i];
191 }
192 if (j>=5) {
193 right = -1;
194 }
195 else {
196 right = board[j+1][i];
197 }
198 if (i>28) {
199 over = -1;
200 }
201 else {
202 over = board[j][i+1];
203 }
204 if (i<1) {
205 under = -1;
206 }
207 else {
208 under = board[j][i-1];
209 }
210 if ((left == number)&&(right == number)&&(over == number)&&(under == number)) {
211 DrawImgBoardBounded(garbageFill, j*bsize, bsize*12-i*bsize-pixels);
212 }
213 if ((left != number)&&(right == number)&&(over == number)&&(under == number)) {
214 DrawImgBoardBounded(garbageL, j*bsize, bsize*12-i*bsize-pixels);
215 }
216 if ((left == number)&&(right != number)&&(over == number)&&(under == number)) {
217 DrawImgBoardBounded(garbageR, j*bsize, bsize*12-i*bsize-pixels);
218 }
219 if ((left == number)&&(right == number)&&(over != number)&&(under == number)) {
220 DrawImgBoardBounded(garbageT, j*bsize, bsize*12-i*bsize-pixels);
221 }
222 if ((left == number)&&(right == number)&&(over == number)&&(under != number)) {
223 DrawImgBoardBounded(garbageB, j*bsize, bsize*12-i*bsize-pixels);
224 }
225 if ((left != number)&&(right == number)&&(over != number)&&(under == number)) {
226 DrawImgBoardBounded(garbageTL, j*bsize, bsize*12-i*bsize-pixels);
227 }
228 if ((left != number)&&(right == number)&&(over == number)&&(under != number)) {
229 DrawImgBoardBounded(garbageBL, j*bsize, bsize*12-i*bsize-pixels);
230 }
231 if ((left == number)&&(right != number)&&(over != number)&&(under == number)) {
232 DrawImgBoardBounded(garbageTR, j*bsize, bsize*12-i*bsize-pixels);
233 }
234 if ((left == number)&&(right != number)&&(over == number)&&(under != number)) {
235 DrawImgBoardBounded(garbageBR, j*bsize, bsize*12-i*bsize-pixels);
236 }
237 if ((left == number)&&(right != number)&&(over != number)&&(under != number)) {
238 DrawImgBoardBounded(garbageMR, j*bsize, bsize*12-i*bsize-pixels);
239 }
240 if ((left == number)&&(right == number)&&(over != number)&&(under != number)) {
241 DrawImgBoardBounded(garbageM, j*bsize, bsize*12-i*bsize-pixels);
242 }
243 if ((left != number)&&(right == number)&&(over != number)&&(under != number)) {
244 DrawImgBoardBounded(garbageML, j*bsize, bsize*12-i*bsize-pixels);
245 }
246351 }
247352 if ((board[j][i]/1000000)%10==2) {
248 if (j==0) {
249 DrawImgBoardBounded(garbageGML, j*bsize, bsize*12-i*bsize-pixels);
250 }
251 else if (j==5) {
252 DrawImgBoardBounded(garbageGMR, j*bsize, bsize*12-i*bsize-pixels);
253 }
254 else {
255 DrawImgBoardBounded(garbageGM, j*bsize, bsize*12-i*bsize-pixels);
353 int number = board[j][i];
354 if (number != lastGarbageNumber) {
355 const auto& garbage_size = getGarbageSize(j, i);
356 lastGarbageNumber = number;
357 PaintGreyGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first);
256358 }
257359 }
258360 }
2626 #include "ReadKeyboard.h"
2727 #include "utf8.h"
2828 #include "MenuSystem.h"
29 #include <unordered_map>
2930
3031 static void setButtonFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text) {
3132 field.SetHolder(holder);
3637 field.SetText(text);
3738 }
3839
40
41 // Cache for DrawRect
42 static std::unordered_map<std::string, SDL_Texture*> draw_rect_cache;
43 static Uint64 draw_rect_cache_version=0;
44
45 static void draw_rect_cache_clear() {
46 for (auto&& it: draw_rect_cache) {
47 SDL_DestroyTexture(it.second);
48 }
49 draw_rect_cache.clear();
50 }
51
52
3953 static void DrawRect(SDL_Renderer* target, int topx, int topy, int height, int width, const std::string& name) {
4054 const int size = 32;
41 SDL_Rect bounds_ns = {topx, topy+size, width, height-2*size}; //bounds for south
42 SDL_Rect bounds_e = {topx, topy, width-size, height};
55 SDL_Rect dstrect = { topx, topy, width, height };
56 std::string key_name = SPrintStringF("%s-%d-%d", name.c_str(),width, height);
57 Uint64 new_version = globalData.spriteHolder->GetDataHolder().getVersion();
58 if (draw_rect_cache_version != new_version) {
59 draw_rect_cache_clear();
60 draw_rect_cache_version = new_version;
61 }
62 if (draw_rect_cache.find(key_name) != draw_rect_cache.end()) {
63 SDL_RenderCopy( target, draw_rect_cache[key_name], NULL, &dstrect );
64 return;
65 }
66 SDL_Rect bounds_ns = {0, size, width, height-2*size}; //bounds for south
67 SDL_Rect bounds_e = {0, 0, width-size, height};
68 SDL_Texture* mTexture = SDL_CreateTexture( target, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height );
69 draw_rect_cache[key_name] = mTexture;
70 SDL_SetRenderTarget( target, mTexture );
71
72 SDL_SetRenderDrawBlendMode(target, SDL_BLENDMODE_NONE);
73 SDL_SetTextureBlendMode(mTexture, SDL_BLENDMODE_BLEND);
74 SDL_SetRenderDrawColor(target, 0, 0, 0, 0);
75 SDL_RenderFillRect(target, NULL);
76 SDL_SetRenderDrawBlendMode(target, SDL_BLENDMODE_BLEND);
77
4378 const sago::SagoSprite& n = globalData.spriteHolder->GetSprite(name+"n");
4479 const sago::SagoSprite& s = globalData.spriteHolder->GetSprite(name+"s");
4580 const sago::SagoSprite& e = globalData.spriteHolder->GetSprite(name+"e");
4681 const sago::SagoSprite& w = globalData.spriteHolder->GetSprite(name+"w");
4782 const sago::SagoSprite& fill = globalData.spriteHolder->GetSprite(name+"fill");
4883 for (int i = 1; i < width/size; ++i) {
49 n.DrawBounded(target, SDL_GetTicks(), topx+i*size, topy, bounds_e);
84 n.DrawBounded(target, SDL_GetTicks(), i*size, 0, bounds_e);
5085 for (int j = 1; j < height/size; ++j) {
51 w.DrawBounded(target, SDL_GetTicks(), topx, topy+j*size, bounds_ns);
52 fill.Draw(target, SDL_GetTicks(),topx+i*size, topy+j*size);
53 e.DrawBounded(target, SDL_GetTicks(), topx+width-size, topy+j*size, bounds_ns);
54 }
55 s.DrawBounded(target, SDL_GetTicks(), topx+i*size, topy+height-size, bounds_e);
86 w.DrawBounded(target, SDL_GetTicks(), 0, j*size, bounds_ns);
87 fill.Draw(target, SDL_GetTicks(),i*size, j*size);
88 e.DrawBounded(target, SDL_GetTicks(), width-size, j*size, bounds_ns);
89 }
90 s.DrawBounded(target, SDL_GetTicks(), i*size, height-size, bounds_e);
5691 }
5792 //Corners
5893 const sago::SagoSprite& nw = globalData.spriteHolder->GetSprite(name+"nw");
5994 const sago::SagoSprite& ne = globalData.spriteHolder->GetSprite(name+"ne");
6095 const sago::SagoSprite& se = globalData.spriteHolder->GetSprite(name+"se");
6196 const sago::SagoSprite& sw = globalData.spriteHolder->GetSprite(name+"sw");
62 nw.Draw(target, SDL_GetTicks(), topx, topy);
63 ne.Draw(target, SDL_GetTicks(), topx+width-size, topy);
64 se.Draw(target, SDL_GetTicks(), topx+width-size, topy+height-size);
65 sw.Draw(target, SDL_GetTicks(), topx, topy+height-size);
97 nw.Draw(target, SDL_GetTicks(), 0, 0);
98 ne.Draw(target, SDL_GetTicks(), width-size, 0);
99 se.Draw(target, SDL_GetTicks(), width-size, height-size);
100 sw.Draw(target, SDL_GetTicks(), 0, height-size);
101 SDL_SetRenderTarget( target, nullptr );
102 SDL_RenderCopy( target, mTexture, NULL, &dstrect );
66103 }
67104
68105 static void DrawRectWhite(SDL_Renderer* target, int topx, int topy, int height, int width) {
8585 DrawBackground(target);
8686 const sago::SagoSprite& gamepad = globalData.spriteHolder->GetSprite("help_controller");
8787 gamepad.Draw(target, SDL_GetTicks(), globalData.xsize/2-480/2, 100);
88 SDL_SetRenderDrawColor(target, 0, 0, 0, SDL_ALPHA_OPAQUE);
8889 SDL_RenderDrawLine(target, 100+OFFSETX, 210, globalData.xsize/2-480/2+130, 210);
8990 SDL_RenderDrawLine(target, 100+OFFSETX, 298, globalData.xsize/2-480/2+158, 298);
9091 SDL_RenderDrawLine(target, 100+OFFSETX, 210, 100+OFFSETX, 400);
165165
166166 void HelpHowtoState::Draw(SDL_Renderer* target) {
167167 DrawBackground(target);
168 SDL_SetRenderDrawColor(target, 0, 0, 0, SDL_ALPHA_OPAQUE);
168169 RenderRowOfBricks(target, switchAnimation.brickStr, 50, 50);
169170 globalData.spriteHolder->GetSprite("cursor").Draw(target, SDL_GetTicks(), 50+switchAnimation.cursorPos*50, 50);
170171 switchAnimationField.Draw(target, 50 +150+30, 50+25, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::center);
11 ==========================================
22 Included in Block Attack - Rise of the Blocks.
33
4 http://USCiLab.github.com/cereal
4 https://uscilab.github.io/cereal/
55
66 See LICENSE for more information
77
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include "core.h"
31 #include <stdexcept>
32
33 namespace utf8
34 {
35 // Base for the exceptions that may be thrown from the library
36 class exception : public ::std::exception {
37 };
38
39 // Exceptions that may be thrown from the library functions.
40 class invalid_code_point : public exception {
41 uint32_t cp;
42 public:
43 invalid_code_point(uint32_t cp) : cp(cp) {}
44 virtual const char* what() const throw() { return "Invalid code point"; }
45 uint32_t code_point() const {return cp;}
46 };
47
48 class invalid_utf8 : public exception {
49 uint8_t u8;
50 public:
51 invalid_utf8 (uint8_t u) : u8(u) {}
52 virtual const char* what() const throw() { return "Invalid UTF-8"; }
53 uint8_t utf8_octet() const {return u8;}
54 };
55
56 class invalid_utf16 : public exception {
57 uint16_t u16;
58 public:
59 invalid_utf16 (uint16_t u) : u16(u) {}
60 virtual const char* what() const throw() { return "Invalid UTF-16"; }
61 uint16_t utf16_word() const {return u16;}
62 };
63
64 class not_enough_room : public exception {
65 public:
66 virtual const char* what() const throw() { return "Not enough space"; }
67 };
68
69 /// The library API - functions intended to be called by the users
70
71 template <typename octet_iterator>
72 octet_iterator append(uint32_t cp, octet_iterator result)
73 {
74 if (!utf8::internal::is_code_point_valid(cp))
75 throw invalid_code_point(cp);
76
77 if (cp < 0x80) // one octet
78 *(result++) = static_cast<uint8_t>(cp);
79 else if (cp < 0x800) { // two octets
80 *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0);
81 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
82 }
83 else if (cp < 0x10000) { // three octets
84 *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0);
85 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
86 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
87 }
88 else { // four octets
89 *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0);
90 *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f) | 0x80);
91 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
92 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
93 }
94 return result;
95 }
96
97 template <typename octet_iterator, typename output_iterator>
98 output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement)
99 {
100 while (start != end) {
101 octet_iterator sequence_start = start;
102 internal::utf_error err_code = utf8::internal::validate_next(start, end);
103 switch (err_code) {
104 case internal::UTF8_OK :
105 for (octet_iterator it = sequence_start; it != start; ++it)
106 *out++ = *it;
107 break;
108 case internal::NOT_ENOUGH_ROOM:
109 throw not_enough_room();
110 case internal::INVALID_LEAD:
111 out = utf8::append (replacement, out);
112 ++start;
113 break;
114 case internal::INCOMPLETE_SEQUENCE:
115 case internal::OVERLONG_SEQUENCE:
116 case internal::INVALID_CODE_POINT:
117 out = utf8::append (replacement, out);
118 ++start;
119 // just one replacement mark for the sequence
120 while (start != end && utf8::internal::is_trail(*start))
121 ++start;
122 break;
123 }
124 }
125 return out;
126 }
127
128 template <typename octet_iterator, typename output_iterator>
129 inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)
130 {
131 static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd);
132 return utf8::replace_invalid(start, end, out, replacement_marker);
133 }
134
135 template <typename octet_iterator>
136 uint32_t next(octet_iterator& it, octet_iterator end)
137 {
138 uint32_t cp = 0;
139 internal::utf_error err_code = utf8::internal::validate_next(it, end, cp);
140 switch (err_code) {
141 case internal::UTF8_OK :
142 break;
143 case internal::NOT_ENOUGH_ROOM :
144 throw not_enough_room();
145 case internal::INVALID_LEAD :
146 case internal::INCOMPLETE_SEQUENCE :
147 case internal::OVERLONG_SEQUENCE :
148 throw invalid_utf8(*it);
149 case internal::INVALID_CODE_POINT :
150 throw invalid_code_point(cp);
151 }
152 return cp;
153 }
154
155 template <typename octet_iterator>
156 uint32_t peek_next(octet_iterator it, octet_iterator end)
157 {
158 return utf8::next(it, end);
159 }
160
161 template <typename octet_iterator>
162 uint32_t prior(octet_iterator& it, octet_iterator start)
163 {
164 // can't do much if it == start
165 if (it == start)
166 throw not_enough_room();
167
168 octet_iterator end = it;
169 // Go back until we hit either a lead octet or start
170 while (utf8::internal::is_trail(*(--it)))
171 if (it == start)
172 throw invalid_utf8(*it); // error - no lead byte in the sequence
173 return utf8::peek_next(it, end);
174 }
175
176 /// Deprecated in versions that include "prior"
177 template <typename octet_iterator>
178 uint32_t previous(octet_iterator& it, octet_iterator pass_start)
179 {
180 octet_iterator end = it;
181 while (utf8::internal::is_trail(*(--it)))
182 if (it == pass_start)
183 throw invalid_utf8(*it); // error - no lead byte in the sequence
184 octet_iterator temp = it;
185 return utf8::next(temp, end);
186 }
187
188 template <typename octet_iterator, typename distance_type>
189 void advance (octet_iterator& it, distance_type n, octet_iterator end)
190 {
191 for (distance_type i = 0; i < n; ++i)
192 utf8::next(it, end);
193 }
194
195 template <typename octet_iterator>
196 typename std::iterator_traits<octet_iterator>::difference_type
197 distance (octet_iterator first, octet_iterator last)
198 {
199 typename std::iterator_traits<octet_iterator>::difference_type dist;
200 for (dist = 0; first < last; ++dist)
201 utf8::next(first, last);
202 return dist;
203 }
204
205 template <typename u16bit_iterator, typename octet_iterator>
206 octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
207 {
208 while (start != end) {
209 uint32_t cp = utf8::internal::mask16(*start++);
210 // Take care of surrogate pairs first
211 if (utf8::internal::is_lead_surrogate(cp)) {
212 if (start != end) {
213 uint32_t trail_surrogate = utf8::internal::mask16(*start++);
214 if (utf8::internal::is_trail_surrogate(trail_surrogate))
215 cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
216 else
217 throw invalid_utf16(static_cast<uint16_t>(trail_surrogate));
218 }
219 else
220 throw invalid_utf16(static_cast<uint16_t>(cp));
221
222 }
223 // Lone trail surrogate
224 else if (utf8::internal::is_trail_surrogate(cp))
225 throw invalid_utf16(static_cast<uint16_t>(cp));
226
227 result = utf8::append(cp, result);
228 }
229 return result;
230 }
231
232 template <typename u16bit_iterator, typename octet_iterator>
233 u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
234 {
235 while (start != end) {
236 uint32_t cp = utf8::next(start, end);
237 if (cp > 0xffff) { //make a surrogate pair
238 *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET);
239 *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
240 }
241 else
242 *result++ = static_cast<uint16_t>(cp);
243 }
244 return result;
245 }
246
247 template <typename octet_iterator, typename u32bit_iterator>
248 octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
249 {
250 while (start != end)
251 result = utf8::append(*(start++), result);
252
253 return result;
254 }
255
256 template <typename octet_iterator, typename u32bit_iterator>
257 u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
258 {
259 while (start != end)
260 (*result++) = utf8::next(start, end);
261
262 return result;
263 }
264
265 // The iterator class
266 template <typename octet_iterator>
267 class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
268 octet_iterator it;
269 octet_iterator range_start;
270 octet_iterator range_end;
271 public:
272 iterator () {}
273 explicit iterator (const octet_iterator& octet_it,
274 const octet_iterator& range_start,
275 const octet_iterator& range_end) :
276 it(octet_it), range_start(range_start), range_end(range_end)
277 {
278 if (it < range_start || it > range_end)
279 throw std::out_of_range("Invalid utf-8 iterator position");
280 }
281 // the default "big three" are OK
282 octet_iterator base () const { return it; }
283 uint32_t operator * () const
284 {
285 octet_iterator temp = it;
286 return utf8::next(temp, range_end);
287 }
288 bool operator == (const iterator& rhs) const
289 {
290 if (range_start != rhs.range_start || range_end != rhs.range_end)
291 throw std::logic_error("Comparing utf-8 iterators defined with different ranges");
292 return (it == rhs.it);
293 }
294 bool operator != (const iterator& rhs) const
295 {
296 return !(operator == (rhs));
297 }
298 iterator& operator ++ ()
299 {
300 utf8::next(it, range_end);
301 return *this;
302 }
303 iterator operator ++ (int)
304 {
305 iterator temp = *this;
306 utf8::next(it, range_end);
307 return temp;
308 }
309 iterator& operator -- ()
310 {
311 utf8::prior(it, range_start);
312 return *this;
313 }
314 iterator operator -- (int)
315 {
316 iterator temp = *this;
317 utf8::prior(it, range_start);
318 return temp;
319 }
320 }; // class iterator
321
322 } // namespace utf8
323
324 #endif //header guard
325
326
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include <iterator>
31
32 namespace utf8
33 {
34 // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers
35 // You may need to change them to match your system.
36 // These typedefs have the same names as ones from cstdint, or boost/cstdint
37 typedef unsigned char uint8_t;
38 typedef unsigned short uint16_t;
39 typedef unsigned int uint32_t;
40
41 // Helper code - not intended to be directly called by the library users. May be changed at any time
42 namespace internal
43 {
44 // Unicode constants
45 // Leading (high) surrogates: 0xd800 - 0xdbff
46 // Trailing (low) surrogates: 0xdc00 - 0xdfff
47 const uint16_t LEAD_SURROGATE_MIN = 0xd800u;
48 const uint16_t LEAD_SURROGATE_MAX = 0xdbffu;
49 const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u;
50 const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu;
51 const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10);
52 const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN;
53
54 // Maximum valid value for a Unicode code point
55 const uint32_t CODE_POINT_MAX = 0x0010ffffu;
56
57 template<typename octet_type>
58 inline uint8_t mask8(octet_type oc)
59 {
60 return static_cast<uint8_t>(0xff & oc);
61 }
62 template<typename u16_type>
63 inline uint16_t mask16(u16_type oc)
64 {
65 return static_cast<uint16_t>(0xffff & oc);
66 }
67 template<typename octet_type>
68 inline bool is_trail(octet_type oc)
69 {
70 return ((utf8::internal::mask8(oc) >> 6) == 0x2);
71 }
72
73 template <typename u16>
74 inline bool is_lead_surrogate(u16 cp)
75 {
76 return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX);
77 }
78
79 template <typename u16>
80 inline bool is_trail_surrogate(u16 cp)
81 {
82 return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);
83 }
84
85 template <typename u16>
86 inline bool is_surrogate(u16 cp)
87 {
88 return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);
89 }
90
91 template <typename u32>
92 inline bool is_code_point_valid(u32 cp)
93 {
94 return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp));
95 }
96
97 template <typename octet_iterator>
98 inline typename std::iterator_traits<octet_iterator>::difference_type
99 sequence_length(octet_iterator lead_it)
100 {
101 uint8_t lead = utf8::internal::mask8(*lead_it);
102 if (lead < 0x80)
103 return 1;
104 else if ((lead >> 5) == 0x6)
105 return 2;
106 else if ((lead >> 4) == 0xe)
107 return 3;
108 else if ((lead >> 3) == 0x1e)
109 return 4;
110 else
111 return 0;
112 }
113
114 template <typename octet_difference_type>
115 inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length)
116 {
117 if (cp < 0x80) {
118 if (length != 1)
119 return true;
120 }
121 else if (cp < 0x800) {
122 if (length != 2)
123 return true;
124 }
125 else if (cp < 0x10000) {
126 if (length != 3)
127 return true;
128 }
129
130 return false;
131 }
132
133 enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT};
134
135 /// Helper for get_sequence_x
136 template <typename octet_iterator>
137 utf_error increase_safely(octet_iterator& it, octet_iterator end)
138 {
139 if (++it == end)
140 return NOT_ENOUGH_ROOM;
141
142 if (!utf8::internal::is_trail(*it))
143 return INCOMPLETE_SEQUENCE;
144
145 return UTF8_OK;
146 }
147
148 #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;}
149
150 /// get_sequence_x functions decode utf-8 sequences of the length x
151 template <typename octet_iterator>
152 utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point)
153 {
154 if (it == end)
155 return NOT_ENOUGH_ROOM;
156
157 code_point = utf8::internal::mask8(*it);
158
159 return UTF8_OK;
160 }
161
162 template <typename octet_iterator>
163 utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point)
164 {
165 if (it == end)
166 return NOT_ENOUGH_ROOM;
167
168 code_point = utf8::internal::mask8(*it);
169
170 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
171
172 code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f);
173
174 return UTF8_OK;
175 }
176
177 template <typename octet_iterator>
178 utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point)
179 {
180 if (it == end)
181 return NOT_ENOUGH_ROOM;
182
183 code_point = utf8::internal::mask8(*it);
184
185 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
186
187 code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
188
189 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
190
191 code_point += (*it) & 0x3f;
192
193 return UTF8_OK;
194 }
195
196 template <typename octet_iterator>
197 utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point)
198 {
199 if (it == end)
200 return NOT_ENOUGH_ROOM;
201
202 code_point = utf8::internal::mask8(*it);
203
204 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
205
206 code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
207
208 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
209
210 code_point += (utf8::internal::mask8(*it) << 6) & 0xfff;
211
212 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
213
214 code_point += (*it) & 0x3f;
215
216 return UTF8_OK;
217 }
218
219 #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR
220
221 template <typename octet_iterator>
222 utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point)
223 {
224 // Save the original value of it so we can go back in case of failure
225 // Of course, it does not make much sense with i.e. stream iterators
226 octet_iterator original_it = it;
227
228 uint32_t cp = 0;
229 // Determine the sequence length based on the lead octet
230 typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type;
231 const octet_difference_type length = utf8::internal::sequence_length(it);
232
233 // Get trail octets and calculate the code point
234 utf_error err = UTF8_OK;
235 switch (length) {
236 case 0:
237 return INVALID_LEAD;
238 case 1:
239 err = utf8::internal::get_sequence_1(it, end, cp);
240 break;
241 case 2:
242 err = utf8::internal::get_sequence_2(it, end, cp);
243 break;
244 case 3:
245 err = utf8::internal::get_sequence_3(it, end, cp);
246 break;
247 case 4:
248 err = utf8::internal::get_sequence_4(it, end, cp);
249 break;
250 }
251
252 if (err == UTF8_OK) {
253 // Decoding succeeded. Now, security checks...
254 if (utf8::internal::is_code_point_valid(cp)) {
255 if (!utf8::internal::is_overlong_sequence(cp, length)){
256 // Passed! Return here.
257 code_point = cp;
258 ++it;
259 return UTF8_OK;
260 }
261 else
262 err = OVERLONG_SEQUENCE;
263 }
264 else
265 err = INVALID_CODE_POINT;
266 }
267
268 // Failure branch - restore the original value of the iterator
269 it = original_it;
270 return err;
271 }
272
273 template <typename octet_iterator>
274 inline utf_error validate_next(octet_iterator& it, octet_iterator end) {
275 uint32_t ignored;
276 return utf8::internal::validate_next(it, end, ignored);
277 }
278
279 } // namespace internal
280
281 /// The library API - functions intended to be called by the users
282
283 // Byte order mark
284 const uint8_t bom[] = {0xef, 0xbb, 0xbf};
285
286 template <typename octet_iterator>
287 octet_iterator find_invalid(octet_iterator start, octet_iterator end)
288 {
289 octet_iterator result = start;
290 while (result != end) {
291 utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end);
292 if (err_code != internal::UTF8_OK)
293 return result;
294 }
295 return result;
296 }
297
298 template <typename octet_iterator>
299 inline bool is_valid(octet_iterator start, octet_iterator end)
300 {
301 return (utf8::find_invalid(start, end) == end);
302 }
303
304 template <typename octet_iterator>
305 inline bool starts_with_bom (octet_iterator it, octet_iterator end)
306 {
307 return (
308 ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) &&
309 ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) &&
310 ((it != end) && (utf8::internal::mask8(*it)) == bom[2])
311 );
312 }
313
314 //Deprecated in release 2.3
315 template <typename octet_iterator>
316 inline bool is_bom (octet_iterator it)
317 {
318 return (
319 (utf8::internal::mask8(*it++)) == bom[0] &&
320 (utf8::internal::mask8(*it++)) == bom[1] &&
321 (utf8::internal::mask8(*it)) == bom[2]
322 );
323 }
324 } // namespace utf8
325
326 #endif // header guard
327
328
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include "core.h"
31
32 namespace utf8
33 {
34 namespace unchecked
35 {
36 template <typename octet_iterator>
37 octet_iterator append(uint32_t cp, octet_iterator result)
38 {
39 if (cp < 0x80) // one octet
40 *(result++) = static_cast<uint8_t>(cp);
41 else if (cp < 0x800) { // two octets
42 *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0);
43 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
44 }
45 else if (cp < 0x10000) { // three octets
46 *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0);
47 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
48 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
49 }
50 else { // four octets
51 *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0);
52 *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80);
53 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
54 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
55 }
56 return result;
57 }
58
59 template <typename octet_iterator>
60 uint32_t next(octet_iterator& it)
61 {
62 uint32_t cp = utf8::internal::mask8(*it);
63 typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it);
64 switch (length) {
65 case 1:
66 break;
67 case 2:
68 it++;
69 cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
70 break;
71 case 3:
72 ++it;
73 cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
74 ++it;
75 cp += (*it) & 0x3f;
76 break;
77 case 4:
78 ++it;
79 cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
80 ++it;
81 cp += (utf8::internal::mask8(*it) << 6) & 0xfff;
82 ++it;
83 cp += (*it) & 0x3f;
84 break;
85 }
86 ++it;
87 return cp;
88 }
89
90 template <typename octet_iterator>
91 uint32_t peek_next(octet_iterator it)
92 {
93 return utf8::unchecked::next(it);
94 }
95
96 template <typename octet_iterator>
97 uint32_t prior(octet_iterator& it)
98 {
99 while (utf8::internal::is_trail(*(--it))) ;
100 octet_iterator temp = it;
101 return utf8::unchecked::next(temp);
102 }
103
104 // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous)
105 template <typename octet_iterator>
106 inline uint32_t previous(octet_iterator& it)
107 {
108 return utf8::unchecked::prior(it);
109 }
110
111 template <typename octet_iterator, typename distance_type>
112 void advance (octet_iterator& it, distance_type n)
113 {
114 for (distance_type i = 0; i < n; ++i)
115 utf8::unchecked::next(it);
116 }
117
118 template <typename octet_iterator>
119 typename std::iterator_traits<octet_iterator>::difference_type
120 distance (octet_iterator first, octet_iterator last)
121 {
122 typename std::iterator_traits<octet_iterator>::difference_type dist;
123 for (dist = 0; first < last; ++dist)
124 utf8::unchecked::next(first);
125 return dist;
126 }
127
128 template <typename u16bit_iterator, typename octet_iterator>
129 octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
130 {
131 while (start != end) {
132 uint32_t cp = utf8::internal::mask16(*start++);
133 // Take care of surrogate pairs first
134 if (utf8::internal::is_lead_surrogate(cp)) {
135 uint32_t trail_surrogate = utf8::internal::mask16(*start++);
136 cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
137 }
138 result = utf8::unchecked::append(cp, result);
139 }
140 return result;
141 }
142
143 template <typename u16bit_iterator, typename octet_iterator>
144 u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
145 {
146 while (start < end) {
147 uint32_t cp = utf8::unchecked::next(start);
148 if (cp > 0xffff) { //make a surrogate pair
149 *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET);
150 *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
151 }
152 else
153 *result++ = static_cast<uint16_t>(cp);
154 }
155 return result;
156 }
157
158 template <typename octet_iterator, typename u32bit_iterator>
159 octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
160 {
161 while (start != end)
162 result = utf8::unchecked::append(*(start++), result);
163
164 return result;
165 }
166
167 template <typename octet_iterator, typename u32bit_iterator>
168 u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
169 {
170 while (start < end)
171 (*result++) = utf8::unchecked::next(start);
172
173 return result;
174 }
175
176 // The iterator class
177 template <typename octet_iterator>
178 class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
179 octet_iterator it;
180 public:
181 iterator () {}
182 explicit iterator (const octet_iterator& octet_it): it(octet_it) {}
183 // the default "big three" are OK
184 octet_iterator base () const { return it; }
185 uint32_t operator * () const
186 {
187 octet_iterator temp = it;
188 return utf8::unchecked::next(temp);
189 }
190 bool operator == (const iterator& rhs) const
191 {
192 return (it == rhs.it);
193 }
194 bool operator != (const iterator& rhs) const
195 {
196 return !(operator == (rhs));
197 }
198 iterator& operator ++ ()
199 {
200 ::std::advance(it, utf8::internal::sequence_length(it));
201 return *this;
202 }
203 iterator operator ++ (int)
204 {
205 iterator temp = *this;
206 ::std::advance(it, utf8::internal::sequence_length(it));
207 return temp;
208 }
209 iterator& operator -- ()
210 {
211 utf8::unchecked::prior(it);
212 return *this;
213 }
214 iterator operator -- (int)
215 {
216 iterator temp = *this;
217 utf8::unchecked::prior(it);
218 return temp;
219 }
220 }; // class iterator
221
222 } // namespace utf8::unchecked
223 } // namespace utf8
224
225
226 #endif // header guard
227
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include "utf8/checked.h"
31 #include "utf8/unchecked.h"
32
33 #endif // header guard
5858 return labels[text].get();
5959 }
6060
61 Button::Button(const Button& b) : action{b.action}, label{b.label}, marked{b.marked} {
61 Button::Button(const Button& b) : action{b.action}, popOnRun{b.popOnRun}, label{b.label}, marked{b.marked} {
6262 }
6363
6464 Button& Button::operator=(const Button& other) {
6565 action = other.action;
6666 label = other.label;
6767 marked = other.marked;
68 popOnRun = other.popOnRun;
6869 return *this;
6970 }
7071
100101 globalData.spriteHolder->GetSprite(menu_unmarked).Draw(globalData.screen, SDL_GetTicks(), b.x, b.y);
101102 }
102103
103 standardButton.getLabel(b.label)->Draw(globalData.screen, b.x+standardButton.xsize/2,b.y+standardButton.ysize/2,
104 standardButton.getLabel(b.getLabel())->Draw(globalData.screen, b.x+standardButton.xsize/2,b.y+standardButton.ysize/2,
104105 sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center);
105106 }
106107
5252 {
5353 private:
5454 //Pointer to a callback function.
55 void (*action)(void);
55 void (*action)(void) = nullptr;
5656
5757 //If true the menu should also be closed then the button is clicked
5858 bool popOnRun = false;
5959
60 public:
6160 //The label. This is written on the button
6261 std::string label;
62 public:
6363 //Is the button marked?
6464 bool marked = false;
6565 //Where is the button on the screen
8080 virtual void doAction(); //Run the callback function
8181 void setPopOnRun(bool popOnRun);
8282 bool isPopOnRun() const;
83 virtual const std::string& getLabel() const {return this->label; };
8384
8485 //May hold any other information the callback might need
8586 int iGeneric1 = 0;
0 /*
1 ===========================================================================
2 blockattack - Block Attack - Rise of the Blocks
3 Copyright (C) 2005-2020 Poul Sander
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see http://www.gnu.org/licenses/
17
18 Source information and contacts persons can be found at
19 https://blockattack.net
20 ===========================================================================
21 */
22
23 #include "ModConfigMenuState.hpp"
24 #include "MenuSystem.h"
25 #include "global.hpp"
26 #include "MenuSystem.h"
27 #include "sago/SagoMisc.hpp"
28 #include "os.hpp"
29 #include <boost/algorithm/string/predicate.hpp>
30
31 const int buttonOffset = 160;
32 extern sago::SagoSprite bExit;
33
34 bool sort_mods_enabled_order (const Mod& i,const Mod& j) {
35 if (i.enabled && !j.enabled) {
36 //Enabled mods always goes before disabled ones
37 return true;
38 }
39 if (i.enabled) {
40 return i.order < j.order;
41 }
42 return i.name < j.name;
43 }
44
45 static void initMods(std::vector<Mod>& mod_list) {
46 for (size_t i=0; i < globalData.modList.size(); ++i) {
47 for (Mod& m : mod_list) {
48 if (m.name == globalData.modList[i]) {
49 m.order = i;
50 m.enabled = true;
51 }
52 }
53 }
54 std::sort(mod_list.begin(), mod_list.end(), sort_mods_enabled_order);
55 }
56
57 static void appendMods(const std::vector<std::string>& mod_files, const std::string& dir, std::vector<Mod>& mods_available) {
58 for (const std::string& mod : mod_files) {
59 if (!boost::ends_with(mod, ".data")) {
60 continue;
61 }
62 Mod m;
63 m.name = mod.substr(0, mod.length()-5);
64 m.filename = dir + "/" + mod;
65 mods_available.push_back(m);
66 }
67 }
68
69
70 ModConfigMenuState::ModConfigMenuState() {
71 mods_available.clear();
72 std::string baseMods = std::string(PHYSFS_getBaseDir())+ "/mods";
73 std::vector<std::string> baseModFiles = OsGetDirFileList(baseMods);
74 appendMods(baseModFiles, baseMods, mods_available);
75 std::string userMods = getPathToSaveFiles()+"/mods";
76 std::vector<std::string> userModFiles = OsGetDirFileList(userMods);
77 appendMods(userModFiles, userMods, mods_available);
78 initMods(mods_available);
79 }
80
81 ModConfigMenuState::~ModConfigMenuState() {}
82
83 bool ModConfigMenuState::IsActive() {
84 return isActive;
85 }
86
87 void ModConfigMenuState::Draw(SDL_Renderer* target) {
88 DrawBackground(target);
89 standardButton.getLabel(_("Mod config"))->Draw(target, 50, 50);
90 for (size_t i = 0; i < mods_available.size(); ++i) {
91 standardButton.getLabel(mods_available[i].name)->Draw(target, 60, 160+30*i);
92 standardButton.getLabel(mods_available[i].enabled ? _("Yes") : _("No"))->Draw(target, 600, 160+30*i);
93 if (mods_available[i].enabled) {
94 standardButton.getLabel(std::to_string(mods_available[i].order))->Draw(target, 700, 160+30*i);
95 }
96 }
97 bExit.Draw(globalData.screen, SDL_GetTicks(), globalData.xsize-buttonOffset, globalData.ysize-buttonOffset);
98 }
99
100 void ModConfigMenuState::ProcessInput(const SDL_Event& event, bool& processed) {
101 if (isEscapeEvent(event)) {
102 isActive = false;
103 processed = true;
104 }
105 }
106
107 void ModConfigMenuState::Update() {
108 // If the mouse button is released, make bMouseUp equal true
109 if ( !(SDL_GetMouseState(nullptr, nullptr)&SDL_BUTTON(1)) ) {
110 bMouseUp=true;
111 }
112
113 if (SDL_GetMouseState(nullptr,nullptr)&SDL_BUTTON(1) && bMouseUp) {
114 bMouseUp = false;
115
116 //The Score button:
117 if ((globalData.mousex>globalData.xsize-buttonOffset) && (globalData.mousex<globalData.xsize-buttonOffset+bExit.GetWidth())
118 && (globalData.mousey>globalData.ysize-buttonOffset) && (globalData.mousey<globalData.ysize-buttonOffset+bExit.GetHeight())) {
119 isActive = false;
120 }
121
122 }
123 }
0 /*
1 ===========================================================================
2 blockattack - Block Attack - Rise of the Blocks
3 Copyright (C) 2005-2020 Poul Sander
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see http://www.gnu.org/licenses/
17
18 Source information and contacts persons can be found at
19 https://blockattack.net
20 ===========================================================================
21 */
22
23 #ifndef MODCONFIG_HPP
24 #define MODCONFIG_HPP
25
26 #include "sago/GameStateInterface.hpp"
27 #include "sago/SagoTextField.hpp"
28 #include "sago/SagoTextBox.hpp"
29 #include "global.hpp"
30 #include "common.h"
31
32 struct Mod {
33 std::string name;
34 std::string filename;
35 bool enabled = false;
36 int order = 0;
37 };
38
39 /**
40 * This will one day be the menu to configure mods.
41 * This will need to be able to scan the filesystem for mods
42 */
43 class ModConfigMenuState : public sago::GameStateInterface {
44 public:
45 ModConfigMenuState();
46 ModConfigMenuState(const ModConfigMenuState& orig) = delete;
47 virtual ~ModConfigMenuState();
48
49 bool IsActive() override;
50 void Draw(SDL_Renderer* target) override;
51 void ProcessInput(const SDL_Event& event, bool &processed) override;
52 void Update() override;
53
54 private:
55 bool isActive = true;
56 bool bMouseUp = true;
57 std::vector<Mod> mods_available;
58 };
59
60 #endif /* MODCONFIG_HPP */
0 /*
1 ===========================================================================
2 blockattack - Block Attack - Rise of the Blocks
3 Copyright (C) 2005-2020 Poul Sander
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see http://www.gnu.org/licenses/
17
18 Source information and contacts persons can be found at
19 http://blockattack.net
20 ===========================================================================
21 */
22
23 #include "ModInfo.hpp"
24 #include "sago/SagoMisc.hpp"
25 #include "rapidjson/document.h"
26 #include <iostream>
27 #include <sstream>
28 #include <boost/algorithm/string.hpp>
29
30 void ModInfo::InitModList(const std::vector<std::string>& modlist) {
31 this->mod_list = modlist;
32 sprite_filename_list.clear();
33 for (const std::string& s : mod_list) {
34 std::string filename_info = std::string("modinfo/") + s + ".json";
35 if (sago::FileExists(filename_info.c_str())) {
36 std::string content = sago::GetFileContent(filename_info.c_str());
37 rapidjson::Document document;
38 document.Parse(content.c_str());
39 if ( !document.IsObject() ) {
40 std::cerr << "Failed to parse: " << filename_info << "\n";
41 continue;
42 }
43 const auto& t = document.GetObject().FindMember("sprites");
44 if (t != document.MemberEnd() && t->value.IsString()) {
45 std::string sprites = t->value.GetString();
46 std::vector<std::string> sprites_vector;
47 boost::split(sprites_vector, sprites, boost::is_any_of(","));
48 sprite_filename_list.insert(sprite_filename_list.end(), sprites_vector.begin(), sprites_vector.end());
49 }
50 }
51 }
52 }
53
54 void ModInfo::ParseModFile(const std::string& content) {
55 std::istringstream ss(content);
56 std::string line;
57 while (std::getline(ss, line)) {
58 std::vector<std::string> line_vector;
59 boost::split(line_vector, line, boost::is_any_of(","));
60 if (line_vector.size() < 2) {
61 std::cerr << "skipping " << line << "\n";
62 continue;
63 }
64 if (line_vector[1] == "1") {
65 this->mod_list.push_back(line_vector[0]);
66 }
67 }
68 InitModList(this->mod_list);
69 }
70
71 const std::vector<std::string>& ModInfo::getModList() {
72 return this->mod_list;
73 }
74
75 const std::vector<std::string>& ModInfo::getModSpriteFiles() {
76 return this->sprite_filename_list;
77 }
0 /*
1 ===========================================================================
2 blockattack - Block Attack - Rise of the Blocks
3 Copyright (C) 2005-2020 Poul Sander
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see http://www.gnu.org/licenses/
17
18 Source information and contacts persons can be found at
19 http://blockattack.net
20 ===========================================================================
21 */
22
23
24 #ifndef MODINFO_HPP
25 #define MODINFO_HPP
26
27 #include <string>
28 #include <vector>
29
30 class ModInfo {
31 public:
32 ModInfo() = default;
33 void InitModList(const std::vector<std::string>& modlist);
34 void ParseModFile(const std::string& content);
35 const std::vector<std::string>& getModList();
36 const std::vector<std::string>& getModSpriteFiles();
37 private:
38 std::vector<std::string> mod_list;
39 std::vector<std::string> sprite_filename_list;
40 };
41
42 #endif
3030 #include "TextManager.hpp"
3131 #include "ExplosionManager.hpp"
3232 #include "sago/SagoTextField.hpp"
33 #include "ModInfo.hpp"
3334
3435 void MainMenu();
3536 void SafeModeMenu();
7475 bool alwaysSixteenNine = false;
7576 int verboseLevel = 0;
7677 std::unique_ptr<sago::SagoSpriteHolder> spriteHolder;
78 std::vector<std::string> modList;
79 ModInfo modinfo;
7780
7881 TextManager theTextManager;
7982
6363 #define PACKAGE "blockattack_roftb"
6464 #endif
6565
66 #define MODLIST_TXT "mod_list.txt"
67
6668 #include "highscore.h" //Stores highscores
6769 #include "ReadKeyboard.h" //Reads text from keyboard
6870 #include "stats.h" //Saves general stats
7072
7173 #include "common.h"
7274 #include "gamecontroller.h"
75 #include <boost/algorithm/string.hpp>
7376 #include <boost/program_options.hpp>
7477 #include <fstream>
7578 #include "levelselect.hpp"
8790 paths.push_back((std::string)SHAREDIR+"/blockattack.data");
8891 paths.push_back((std::string)PHYSFS_getBaseDir()+"/blockattack.data");
8992 paths.push_back((std::string)PHYSFS_getBaseDir()+"/data");
93 }
94
95 static void FsSearchPathModAppend(std::vector<std::string>& paths, const std::vector<std::string>& modlist) {
96 for (const std::string& mod : modlist) {
97 std::string filename = std::string(SHAREDIR)+"/mods/"+mod+".data";
98 paths.push_back(filename);
99 filename = std::string(PHYSFS_getBaseDir())+"/mods/"+mod+".data";
100 paths.push_back(filename);
101 }
90102 }
91103
92104 static void PhysFsSetSearchPath(const std::vector<std::string>& paths, const std::string& savepath) {
209221 globalData.typingChunk = holder.GetDataHolder().getSoundHandler("typing");
210222 counterChunk = holder.GetDataHolder().getSoundHandler("counter");
211223 counterFinalChunk = holder.GetDataHolder().getSoundHandler("counter_final");
212 const int soundVolume = 84; //0-128
224 Config::getInstance()->setDefault("volume_sound", "24"); //0-128
225 int soundVolume = Config::getInstance()->getInt("volume_sound");
213226 Mix_VolumeChunk(boing.get(), soundVolume);
214227 Mix_VolumeChunk(applause.get(), soundVolume);
215228 Mix_VolumeChunk(photoClick.get(), soundVolume);
263276 SDL_RenderSetLogicalSize(globalData.screen, globalData.xsize, globalData.ysize);
264277 dataHolder.invalidateAll(globalData.screen);
265278 globalData.spriteHolder.reset(new sago::SagoSpriteHolder( dataHolder ) );
279 globalData.spriteHolder->ReadSprites(globalData.modinfo.getModSpriteFiles());
266280 InitImages(*(globalData.spriteHolder.get()) );
267281 SDL_ShowCursor(SDL_DISABLE);
268282 }
333347 std::cout << "Saving screenshot" << "\n";
334348 }
335349 int rightNow = (int)time(nullptr);
336 SDL_Surface* infoSurface = SDL_GetWindowSurface(sdlWindow);
337 if (!infoSurface) {
338 std::cerr << "Could not get infoSurface. No screenshot written. Be aware that the screenshot feature only works with software render\n";
339 return;
340 }
341 std::vector<char> pixels(infoSurface->w * infoSurface->h * infoSurface->format->BytesPerPixel);
342 int errorCode = SDL_RenderReadPixels(globalData.screen, &infoSurface->clip_rect, infoSurface->format->format, static_cast<void*>(pixels.data()), infoSurface->w * infoSurface->format->BytesPerPixel);
343 if (errorCode) {
344 SDL_FreeSurface(infoSurface);
345 std::cerr << "Could not do SDL_RenderReadPixels. Error code: " << errorCode << ". No screenshot written\n";
346 return;
347 }
348 SDL_Surface* sreenshotSurface = SDL_CreateRGBSurfaceFrom(static_cast<void*>(pixels.data()), infoSurface->w, infoSurface->h, infoSurface->format->BitsPerPixel, infoSurface->w * infoSurface->format->BytesPerPixel, infoSurface->format->Rmask, infoSurface->format->Gmask, infoSurface->format->Bmask, infoSurface->format->Amask);
349 SDL_FreeSurface(infoSurface);
350 if (!sreenshotSurface) {
351 std::cerr << "Could not get sreenshotSurface. No screenshot written\n";
352 return;
353 }
350 int w, h;
351 SDL_GetRendererOutputSize(globalData.screen, &w, &h);
352 SDL_Surface *sreenshotSurface = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
353 SDL_RenderReadPixels(globalData.screen, NULL, SDL_PIXELFORMAT_ARGB8888, sreenshotSurface->pixels, sreenshotSurface->pitch);
354354 OsCreateFolder(pathToScreenShots());
355355 std::string buf = pathToScreenShots() + "/screenshot"+std::to_string(rightNow)+".bmp";
356356 SDL_SaveBMP(sreenshotSurface, buf.c_str());
865865 "Default: \"%s\"", LOCALEDIR).c_str())
866866 ("homepath", boost::program_options::value<std::string>(), SPrintStringF("Set the home folder where settings are saved. The directory will be created if it does not exist."
867867 " Default: \"%s\"", getPathToSaveFiles().c_str()).c_str())
868 ("mod,m", boost::program_options::value<std::vector<std::string> >(), "Loads a mod. Later mods have preference")
868869
869870 ;
870871 boost::program_options::variables_map vm;
956957 if (vm.count("play-replay")) {
957958 globalData.replayArgument = vm["play-replay"].as<std::string>();
958959 }
959
960 }
960 if (vm.count("mod")) {
961 globalData.modList = vm["mod"].as<std::vector<std::string> >();
962 }
963
964 }
965
966 //Physfs 2.0.z does not have PHYSFS_unmount
967 #if (PHYSFS_VER_MAJOR <= 2) && (PHYSFS_VER_MINOR < 1)
968 #define PHYSFS_unmount PHYSFS_removeFromSearchPath
969 #endif
961970
962971 //Warning: the arguments to main must be "int argc, char* argv[]" NO CONST! or SDL_main will fail to find it
963972 int main(int argc, char* argv[]) {
978987 ParseArguments(argc, argv, config);
979988 OsCreateSaveFolder();
980989 PhysFsSetSearchPath(config.search_paths, config.savepath);
990 /*if (globalData.modList.empty() && sago::FileExists(MODLIST_TXT)) {
991 std::string modString = sago::GetFileContent(MODLIST_TXT);
992 boost::split(globalData.modList, modString, boost::is_any_of(","));
993 }*/
994 globalData.modinfo.InitModList(globalData.modList);
995 if (sago::FileExists(MODLIST_TXT)) {
996 globalData.modinfo.ParseModFile(sago::GetFileContent(MODLIST_TXT));
997 globalData.modList = globalData.modinfo.getModList();
998 }
999 std::cout << "Mod list: ";
1000 for (const std::string& s : globalData.modList) {
1001 std::cout << s << ",";
1002 }
1003 std::cout << "\n";
1004 if (globalData.modList.size()>0) {
1005 PHYSFS_unmount(config.savepath.c_str());
1006 FsSearchPathModAppend(config.search_paths, globalData.modList);
1007 PhysFsSetSearchPath(config.search_paths, config.savepath);
1008 }
9811009 //Os create folders must be after the parameters because they can change the home folder
9821010 PhysFsCreateFolders();
9831011 bool gameShutdownProperly = true;
10141042 globalData.NoSound = true; //Tries to stop all sound from playing/loading
10151043 }
10161044 }
1045 Config::getInstance()->setDefault("volume_music", "20"); //0-128
10171046
10181047
10191048 if (globalData.verboseLevel) {
12441273 std::cout << SPrintStringF("Block Attack - Rise of the Blocks ran for: %i hours %i mins and %i secs", ct.hours, ct.minutes, ct.seconds) << "\n";
12451274 }
12461275
1276 /*std::string modListString;
1277 if (globalData.modList.size()>0) {
1278 modListString = globalData.modList.at(0);
1279 for (size_t i = 1; i < globalData.modList.size(); ++i) {
1280 modListString += std::string(",")+globalData.modList[i];
1281 }
1282 }*/
12471283 ct = TimeHandler::addTime("totalTime",ct);
12481284 if (globalData.verboseLevel) {
12491285 std::cout << "Total run time is now: " << ct.days << " days " << ct.hours << " hours " << ct.minutes << " mins and " << ct.seconds << " secs" << "\n";
1250 }
1251
1286 //std::cout << "Mods loaded: " << modListString << "\n";
1287 }
1288 //sago::WriteFileContent(MODLIST_TXT, modListString);
12521289 Stats::getInstance()->save();
12531290 Config::getInstance()->save();
12541291 }
16991736 if ((!globalData.NoSound)&&(!Mix_PlayingMusic())&&(globalData.MusicEnabled)&&(!bNearDeath)) {
17001737 // then starts playing it.
17011738 Mix_PlayMusic(bgMusic.get(), -1); //music loop
1702 Mix_VolumeMusic((MIX_MAX_VOLUME*3)/10);
1739 int musicVolume = Config::getInstance()->getInt("volume_music");
1740 Mix_VolumeMusic(musicVolume);
17031741 }
17041742
17051743 if (bNearDeath!=bNearDeathPrev) {
1744 int musicVolume = Config::getInstance()->getInt("volume_music");
17061745 if (bNearDeath) {
17071746 if (!globalData.NoSound &&(globalData.MusicEnabled)) {
17081747 Mix_PlayMusic(highbeatMusic.get(), 1);
1709 Mix_VolumeMusic((MIX_MAX_VOLUME*5)/10);
1748 Mix_VolumeMusic(musicVolume);
17101749 }
17111750 }
17121751 else {
17131752 if (!globalData.NoSound &&(globalData.MusicEnabled)) {
17141753 Mix_PlayMusic(bgMusic.get(), -1);
1715 Mix_VolumeMusic((MIX_MAX_VOLUME*3)/10);
1754 Mix_VolumeMusic(musicVolume);
17161755 }
17171756 }
17181757 }
2828 #include "HelpGamepadState.hpp"
2929 #include "HelpAboutState.hpp"
3030 #include "ShowFileState.hpp"
31 #include "ModConfigMenuState.hpp"
3132
3233
3334 #if 0
101102 std::string m_keyname;
102103 public:
103104 Button_changekey(SDL_Keycode* key, const char* keyname);
104 void doAction();
105 virtual void doAction() override;
105106 };
106107
107108
126127 }
127128 }
128129 setLabel(m_keyname+" : "+getKeyName(*m_key2change));
130 }
131
132 class Button_confirmVolume : public Button {
133 private:
134 std::string cvar="";
135 mutable std::string volumeLabel; /*used for cache*/
136 public:
137 explicit Button_confirmVolume(const char* cvar);
138 virtual void doAction() override { /*Do nothing. Equal to choose "back". */ };
139 virtual const std::string& getLabel() const override;
140 };
141
142 Button_confirmVolume::Button_confirmVolume(const char* cvar) : cvar{cvar} {
143 this->setPopOnRun(true);
144 }
145
146 const std::string& Button_confirmVolume::getLabel() const {
147 int volumePct = Config::getInstance()->getInt(cvar)*100.0/MIX_MAX_VOLUME;
148 this->volumeLabel = SPrintStringF(_("Volume: %d%%"), volumePct); // std::string(_("Volume: "))+ std::to_string(volumePct)+"%" ;
149 return volumeLabel;
150 }
151
152 class Button_increaseVolume : public Button {
153 private:
154 std::string cvar="";
155 int incrementValue = 1;
156 int lowerLimit = 0;
157 int upperLimit = MIX_MAX_VOLUME;
158 public:
159 Button_increaseVolume(const char* cvar, int incrementValue);
160 virtual void doAction() override;
161 };
162
163 Button_increaseVolume::Button_increaseVolume(const char* cvar, int incrementValue)
164 : cvar{cvar},incrementValue{incrementValue} {
165 char prefix = '+';
166 double value = incrementValue;
167 if (incrementValue<0) {
168 prefix = '-';
169 value = -incrementValue;
170 }
171 value = value*100.0/MIX_MAX_VOLUME;
172 setLabel(SPrintStringF("%c%.2f", prefix, value));
173 }
174
175 void Button_increaseVolume::doAction() {
176 int newValue = Config::getInstance()->getInt(cvar)+incrementValue;
177 if (newValue<lowerLimit) {
178 newValue = lowerLimit;
179 }
180 if (newValue>upperLimit) {
181 newValue = upperLimit;
182 }
183 Config::getInstance()->setInt(cvar, newValue);
184 }
185
186 class Button_testSound : public Button {
187 public:
188 Button_testSound();
189 virtual void doAction() override;
190 };
191
192 Button_testSound::Button_testSound() {
193 setLabel(_("Test sound"));
194 }
195
196 void Button_testSound::doAction() {
197 sago::SoundHandler testSound = globalData.spriteHolder->GetDataHolder().getSoundHandler("pop");
198 Mix_VolumeChunk(testSound.get(), Config::getInstance()->getInt("volume_sound"));
199 Mix_PlayChannel(1, testSound.get(), 0);
200 }
201
202 class Button_testMusic : public Button {
203 public:
204 Button_testMusic();
205 virtual void doAction() override;
206 };
207
208 Button_testMusic::Button_testMusic() {
209 setLabel(_("Test music"));
210 }
211
212 void Button_testMusic::doAction() {
213 Mix_VolumeMusic(Config::getInstance()->getInt("volume_music"));
214 sago::MusicHandler bgMusic = globalData.spriteHolder->GetDataHolder().getMusicHandler("bgmusic");
215 Mix_PlayMusic(bgMusic.get(), -1);
129216 }
130217
131218 void InitMenues() {
210297 : _("Always use software render: Off"));
211298 }
212299
300 static void runSetMusicVolume(const char* cvar, const char* header) {
301 Menu volumeMenu(globalData.screen, header, true);
302 Button_confirmVolume bConfirm(cvar);
303 Button_increaseVolume plus5(cvar, 5);
304 Button_increaseVolume minus5(cvar, -5);
305 Button_increaseVolume plus1(cvar, 1);
306 Button_increaseVolume minus1(cvar, -1);
307 volumeMenu.addButton(&bConfirm);
308 volumeMenu.addButton(&plus5);
309 volumeMenu.addButton(&minus5);
310 volumeMenu.addButton(&plus1);
311 volumeMenu.addButton(&minus1);
312 Button_testSound bTestSound;
313 volumeMenu.addButton(&bTestSound);
314 Button_testMusic bTestMusic;
315 volumeMenu.addButton(&bTestMusic);
316 RunGameState(volumeMenu);
317 }
318
213319 static void SetMusicLabel (Button* b) {
214 b->setLabel(globalData.MusicEnabled? _("Music: On") : _("Music: Off") );
320 if (globalData.MusicEnabled) {
321 double volume = Config::getInstance()->getInt("volume_music");
322 int volumePct = volume*100.0/MIX_MAX_VOLUME;
323 b->setLabel(std::string(_("Music: "))+ std::to_string(volumePct)+"%" );
324 }
325 else {
326 b->setLabel(_("Music: Off") );
327 }
215328 }
216329
217330 static void SetSoundLabel (Button* b) {
218 b->setLabel(globalData.SoundEnabled? _("Sound: On") : _("Sound: Off") );
331 if (globalData.SoundEnabled) {
332 double volume = Config::getInstance()->getInt("volume_sound");
333 int volumePct = volume*100.0/MIX_MAX_VOLUME;
334 b->setLabel(std::string(_("Sound: "))+ std::to_string(volumePct)+"%" );
335 }
336 else {
337 b->setLabel(_("Sound: Off") );
338 }
219339 }
220340
221341 static void SetFullscreenLabel (Button* b) {
231351
232352 class MusicButton : public Button {
233353 virtual void doAction() override {
234 globalData.MusicEnabled = !globalData.MusicEnabled;
354 runSetMusicVolume("volume_music", _("Music volume"));
355 globalData.MusicEnabled = (Config::getInstance()->getInt("volume_music") != 0);
235356 SetMusicLabel(this);
236357 }
237358 };
238359
239360 class SoundButton : public Button {
240361 virtual void doAction() override {
241 globalData.SoundEnabled = !globalData.SoundEnabled;
362 runSetMusicVolume("volume_sound", _("Sound volume"));
363 globalData.MusicEnabled = (Config::getInstance()->getInt("volume_sound") != 0);
242364 SetSoundLabel(this);
243365 }
244366 };
292414 ChangeKeysMenu(2);
293415 }
294416
295 static void ConfigureMenu() {
296 Menu cm(globalData.screen,_("Configuration"),true);
297 Button bPlayer1Name,bPlayer2Name;
417 static void PlayerConfigMenu() {
418 Menu pcm(globalData.screen,_("Player configuration"),true);
419 Button bPlayer1Name, bPlayer2Name;
298420 Button bPlayer1Keys, bPlayer2Keys;
299 AlwaysSoftwareRenderButton bSoftware;
300 MusicButton bMusic;
301 SoundButton bSound;
302 FullscreenButton buttonFullscreen;
303 SetAlwaysSoftwareLabel(&bSoftware);
304 SetMusicLabel(&bMusic);
305 SetSoundLabel(&bSound);
306 SetFullscreenLabel(&buttonFullscreen);
307421 bPlayer1Name.setAction(buttonActionPlayer1Name);
308422 bPlayer1Name.setLabel(_("Change player 1's name") );
309423 bPlayer2Name.setAction(buttonActionPlayer2Name);
312426 bPlayer1Keys.setLabel(_("Change player 1's keys") );
313427 bPlayer2Keys.setAction(ChangeKeysMenu2);
314428 bPlayer2Keys.setLabel(_("Change player 2's keys") );
429 pcm.addButton(&bPlayer1Name);
430 pcm.addButton(&bPlayer2Name);
431 pcm.addButton(&bPlayer1Keys);
432 pcm.addButton(&bPlayer2Keys);
433 RunGameState(pcm);
434 }
435
436 static void runModConfigMenu() {
437 ModConfigMenuState modmenu;
438 RunGameState(modmenu);
439 }
440
441 static void ConfigureMenu() {
442 Menu cm(globalData.screen,_("Configuration"),true);
443 AlwaysSoftwareRenderButton bSoftware;
444 MusicButton bMusic;
445 SoundButton bSound;
446 FullscreenButton buttonFullscreen;
447 Button bPlayerConfig;
448 Button bModConfig;
449 bPlayerConfig.setLabel(_("Player configuration") );
450 bPlayerConfig.setAction(PlayerConfigMenu);
451 bModConfig.setLabel(_("Configure mods"));
452 bModConfig.setAction(&runModConfigMenu);
453 SetAlwaysSoftwareLabel(&bSoftware);
454 SetMusicLabel(&bMusic);
455 SetSoundLabel(&bSound);
456 SetFullscreenLabel(&buttonFullscreen);
315457 cm.addButton(&bMusic);
316458 cm.addButton(&bSound);
317459 cm.addButton(&bSoftware);
318460 cm.addButton(&buttonFullscreen);
319 cm.addButton(&bPlayer1Name);
320 cm.addButton(&bPlayer2Name);
321 cm.addButton(&bPlayer1Keys);
322 cm.addButton(&bPlayer2Keys);
461 cm.addButton(&bPlayerConfig);
462 cm.addButton(&bModConfig);
323463 RunGameState(cm);
324464 }
325465
3131 #include <pwd.h>
3232 #include <unistd.h>
3333 #endif
34
35 #include <dirent.h>
3436
3537 static sago::PlatformFolders pf;
3638
131133 std::string path = getPathToSaveFiles();
132134 OsCreateFolder(path);
133135 }
136
137 std::vector<std::string> OsGetDirFileList(const std::string& path) {
138 //At the moment dirent.h is used for all OS. Should have a Unicode version on Windows.
139 std::vector<std::string> ret;
140 DIR* dir = opendir(path.c_str());
141 if (dir) {
142 struct dirent* ent;
143 while ((ent = readdir (dir)) ) {
144 if (ent->d_name[0] == '.') {
145 continue;
146 }
147 ret.push_back(ent->d_name);
148 }
149 closedir (dir);
150 }
151 else {
152 std::cerr << "Failed to list: " << path+"/" << "\n";
153 }
154 return ret;
155 }
2828 #include "shlobj.h"
2929 #endif
3030 #include <string>
31 #include <vector>
3132
3233 std::string getPathToSaveFiles();
33 #if defined(_WIN32)
34 std::string getMyDocumentsPath();
35 #endif
3634
3735 std::string defaultPlayerName();
3836
4240
4341 bool OsPathIsRelative(const std::string& path);
4442
43 /**
44 * Create a folder
45 * The folder path is created recursively
46 * Fails silently if failing to create the path
47 * @param path The folder to create
48 */
4549 void OsCreateFolder(const std::string& path);
4650
51 /**
52 * Lists the content of a directory.
53 * Ignores files starting with a dot (".")
54 *
55 * @param path The path to list
56 * @return std::vector<std::string> Files names in directory
57 */
58 std::vector<std::string> OsGetDirFileList(const std::string& path);
59
4760 #endif /* OS_HPP */
3535 * @return true if active
3636 */
3737 virtual bool IsActive() = 0;
38
38
3939 /**
4040 * Tells the state to draw itself to target
4141 * @param target The RenderWindow to draw to
4242 */
4343 virtual void Draw(SDL_Renderer* target) = 0;
44
45 virtual void ProcessInput(const SDL_Event& event, bool &processed) = 0;
46
44
45 virtual void ProcessInput(const SDL_Event& event, bool& processed) = 0;
46
4747 virtual void Update() {}
48
48
4949 virtual ~GameStateInterface() {}
5050 };
5151
244244 return data->version;
245245 }
246246
247 TextureHandler::TextureHandler(const SagoDataHolder* holder, const std::string &textureName) {
247 TextureHandler::TextureHandler(const SagoDataHolder* holder, const std::string& textureName) {
248248 this->holder = holder;
249249 this->version = 0;
250250 this->textureName = textureName;
291291 }
292292
293293
294 TextureHandler SagoDataHolder::getTextureHandler(const std::string &textureName) const {
294 TextureHandler SagoDataHolder::getTextureHandler(const std::string& textureName) const {
295295 return TextureHandler(this, textureName);
296296 }
297297
298 MusicHandler SagoDataHolder::getMusicHandler(const std::string &musicName) const {
298 MusicHandler SagoDataHolder::getMusicHandler(const std::string& musicName) const {
299299 return MusicHandler(this, musicName);
300300 }
301301
302 SoundHandler SagoDataHolder::getSoundHandler(const std::string &soundName) const {
302 SoundHandler SagoDataHolder::getSoundHandler(const std::string& soundName) const {
303303 return SoundHandler(this, soundName);
304304 }
305305
2929 #include <string>
3030
3131 #ifndef TEXTUREHOLDER_HPP
32 #define TEXTUREHOLDER_HPP
32 #define TEXTUREHOLDER_HPP
3333
3434 namespace sago {
3535
3838 class TextureHandler {
3939 public:
4040 TextureHandler() {};
41 TextureHandler(const SagoDataHolder* holder, const std::string &textureName);
41 TextureHandler(const SagoDataHolder* holder, const std::string& textureName);
4242 SDL_Texture* get();
4343 private:
4444 std::string textureName;
5151 class MusicHandler final {
5252 public:
5353 MusicHandler() {};
54 MusicHandler(const SagoDataHolder* holder, const std::string &musicName);
54 MusicHandler(const SagoDataHolder* holder, const std::string& musicName);
5555 Mix_Music* get();
5656 private:
5757 std::string musicName;
6464 class SoundHandler final {
6565 public:
6666 SoundHandler() {};
67 SoundHandler(const SagoDataHolder* holder, const std::string &soundName);
67 SoundHandler(const SagoDataHolder* holder, const std::string& soundName);
6868 Mix_Chunk* get();
6969 private:
7070 std::string soundName;
8787 * @param textureName Name of the texture
8888 * @return Pointer to the loaded texture
8989 */
90 SDL_Texture* getTexturePtr(const std::string &textureName) const;
90 SDL_Texture* getTexturePtr(const std::string& textureName) const;
9191
92 TextureHandler getTextureHandler(const std::string &textureName) const;
93 TTF_Font* getFontPtr(const std::string &fontName, int ptsize) const;
94 Mix_Music* getMusicPtr(const std::string &musicName) const;
95 MusicHandler getMusicHandler(const std::string &musicName) const;
96 Mix_Chunk* getSoundPtr(const std::string &soundName) const;
97 SoundHandler getSoundHandler(const std::string &soundName) const;
92 TextureHandler getTextureHandler(const std::string& textureName) const;
93 TTF_Font* getFontPtr(const std::string& fontName, int ptsize) const;
94 Mix_Music* getMusicPtr(const std::string& musicName) const;
95 MusicHandler getMusicHandler(const std::string& musicName) const;
96 Mix_Chunk* getSoundPtr(const std::string& soundName) const;
97 SoundHandler getSoundHandler(const std::string& soundName) const;
9898 void setVerbose(bool value);
9999
100100 /**
116116 * @return A globally unique number.
117117 */
118118 Uint64 getVersion() const;
119
119
120120 ~SagoDataHolder();
121121 private:
122122 SagoDataHolder(const SagoDataHolder& base) = delete;
123123 SagoDataHolder& operator=(const SagoDataHolder& base) = delete;
124124 struct SagoDataHolderData;
125 mutable SagoDataHolderData *data;
125 mutable SagoDataHolderData* data;
126126 };
127127
128128 } //namespace sago
129129
130 #endif /* TEXTUREHOLDER_HPP */
130 #endif /* TEXTUREHOLDER_HPP */
131131
2222 */
2323
2424 #ifndef SAGOMISC_HPP
25 #define SAGOMISC_HPP
25 #define SAGOMISC_HPP
2626
2727 #include <vector>
2828 #include <string>
3030
3131 namespace sago {
3232
33 /**
34 * Returns a vector with all filenames in a given directory.
35 * PHYSFS must be setup before hand. The directory is relative to the PHYSFS base
36 * @param dir The directory to list
37 * @return A vector with the filenames in the given directory. If empty the directory was empty or did not exist
38 */
39 std::vector<std::string> GetFileList(const char* dir);
33 /**
34 * Returns a vector with all filenames in a given directory.
35 * PHYSFS must be setup before hand. The directory is relative to the PHYSFS base
36 * @param dir The directory to list
37 * @return A vector with the filenames in the given directory. If empty the directory was empty or did not exist
38 */
39 std::vector<std::string> GetFileList(const char* dir);
4040
41 /**
42 * Reads an entire file into memory.
43 * PHYSFS must be setup before hand
44 * @param filename The file to read
45 * @param dest The unique pointer in which the bytes will be written
46 * @param bytes Number of bytes written
47 * @return The content of the file. If empty either the file was empty, did not exist or could not be opened
48 */
49 void ReadBytesFromFile(const char* filename, std::unique_ptr<char[]>& dest, unsigned int& bytes);
41 /**
42 * Reads an entire file into memory.
43 * PHYSFS must be setup before hand
44 * @param filename The file to read
45 * @param dest The unique pointer in which the bytes will be written
46 * @param bytes Number of bytes written
47 * @return The content of the file. If empty either the file was empty, did not exist or could not be opened
48 */
49 void ReadBytesFromFile(const char* filename, std::unique_ptr<char[]>& dest, unsigned int& bytes);
5050
51 /**
52 * Reads an entire file into memory.
53 * PHYSFS must be setup before hand
54 * @param filename The file to read
55 * @return The content of the file. If empty either the file was empty, did not exist or could not be opened
56 */
57 std::string GetFileContent(const char* filename);
51 /**
52 * Reads an entire file into memory.
53 * PHYSFS must be setup before hand
54 * @param filename The file to read
55 * @return The content of the file. If empty either the file was empty, did not exist or could not be opened
56 */
57 std::string GetFileContent(const char* filename);
5858
59 /**
60 * Reads an entire file into memory.
61 * PHYSFS must be setup before hand
62 * @param filename The file to read
63 * @return The content of the file. If empty either the file was empty, did not exist or could not be opened
64 */
65 inline std::string GetFileContent(const std::string& filename) { return GetFileContent(filename.c_str()); };
59 /**
60 * Reads an entire file into memory.
61 * PHYSFS must be setup before hand
62 * @param filename The file to read
63 * @return The content of the file. If empty either the file was empty, did not exist or could not be opened
64 */
65 inline std::string GetFileContent(const std::string& filename) {
66 return GetFileContent(filename.c_str());
67 };
6668
67 bool FileExists(const char* filename);
69 bool FileExists(const char* filename);
6870
69 void WriteFileContent(const char* filename, const std::string& content);
71 void WriteFileContent(const char* filename, const std::string& content);
7072
71 /**
72 * This functions converts a string on a best effort basis
73 * Unlike atol this does NOT cause undefined behavior if out of range
74 * @param c_string A string that may contain a number
75 * @return A number between LONG_MIN and LONG_MAX (both inclusive)
76 */
77 long int StrToLong(const char* c_string);
73 /**
74 * This functions converts a string on a best effort basis
75 * Unlike atol this does NOT cause undefined behavior if out of range
76 * @param c_string A string that may contain a number
77 * @return A number between LONG_MIN and LONG_MAX (both inclusive)
78 */
79 long int StrToLong(const char* c_string);
7880
7981 } //namespace sago
8082
81 #endif /* SAGOMISC_HPP */
83 #endif /* SAGOMISC_HPP */
8284
2525 #define SAGOMISCSDL2_HPP
2626
2727 namespace sago {
28
29 /**
30 * Writes an error message to the screen and aborts the program
31 * @param errorMsg The message displayed in a pop-up box to the user.
32 */
33 void SagoFatalError(const char* errorMsg);
34
35 /**
36 * Writes an error message to the screen and aborts the program
37 * @param fmt A printf-style format string
38 * @param ... Parameters to the format string
39 */
40 void SagoFatalErrorF(const char* fmt, ...) __attribute__ ((format (printf, 1, 2)));
41
28
29 /**
30 * Writes an error message to the screen and aborts the program
31 * @param errorMsg The message displayed in a pop-up box to the user.
32 */
33 void SagoFatalError(const char* errorMsg);
34
35 /**
36 * Writes an error message to the screen and aborts the program
37 * @param fmt A printf-style format string
38 * @param ... Parameters to the format string
39 */
40 void SagoFatalErrorF(const char* fmt, ...) __attribute__ ((format (printf, 1, 2)));
41
4242 }
4343
4444 #endif /* SAGOMISCSDL2_HPP */
2222 */
2323
2424 #ifndef SAGOSPRITE_HPP
25 #define SAGOSPRITE_HPP
25 #define SAGOSPRITE_HPP
2626
2727 #include "SagoDataHolder.hpp"
2828
3131 class SagoSprite final {
3232 public:
3333 SagoSprite();
34 SagoSprite(const SagoDataHolder &texHolder, const std::string &texture,const SDL_Rect& initImage,const int animationFrames, const int animationFrameLength);
34 SagoSprite(const SagoDataHolder& texHolder, const std::string& texture,const SDL_Rect& initImage,const int animationFrames, const int animationFrameLength);
3535
3636 /**
3737 * Draws the sprite to a given render window
5858 * @param frameTime The time in milliseonds since gamestart. Used to determen the place in the animation
5959 * @param x Place to draw the sprite
6060 * @param y Place to draw the sprite
61 * @param part the part of the sprite that should be drawn.
61 * @param part the part of the sprite that should be drawn.
6262 */
6363 void Draw(SDL_Renderer* target, Sint32 frameTime, int x, int y, const SDL_Rect& part) const;
6464
7171 * @param bounds A recagular area that we must not draw outside.
7272 */
7373 void DrawBounded(SDL_Renderer* target, Sint32 frameTime, int x, int y, const SDL_Rect& bounds) const;
74
74
7575 /**
7676 * Draws the sprite to a given render window
7777 * @param target The render window to draw on
8383
8484 void DrawScaled(SDL_Renderer* target, Sint32 frameTime, int x, int y, int w, int h) const;
8585 void DrawScaledAndRotated(SDL_Renderer* target, Sint32 frameTime, int x, int y, int w, int h,
86 const double angleRadian, const SDL_Point* center, const SDL_RendererFlip flip) const;
86 const double angleRadian, const SDL_Point* center, const SDL_RendererFlip flip) const;
8787
8888 /**
8989 * Set a different origin. Normally it is the top left cornor. But in some cases you might want to center the origin or tranform it for other reasons
90 * @param newOrigin the coordinates that should be the new origin. Call with {0,0} to reset to default
90 * @param newOrigin the coordinates that should be the new origin. Call with {0,0} to reset to default
9191 */
9292 void SetOrigin(const SDL_Rect& newOrigin);
9393 SagoSprite(const SagoSprite& base);
9797 ~SagoSprite();
9898 private:
9999 struct SagoSpriteData;
100 SagoSpriteData *data;
100 SagoSpriteData* data;
101101 };
102102
103103 }
104104
105 #endif /* SAGOSPRITE_HPP */
105 #endif /* SAGOSPRITE_HPP */
106106
130130 }
131131 }
132132
133 void SagoSpriteHolder::ReadSprites(const std::vector<std::string>& extra_sprites) {
134 for (std::string item : extra_sprites) {
135 item+=".sprite";
136 ReadSpriteFile(item);
137 }
138 }
139
133140 const sago::SagoSprite& SagoSpriteHolder::GetSprite(const std::string& spritename) const {
134141 std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>>::const_iterator got = data->sprites.find (spritename);
135142 if ( got == data->sprites.end() ) {
2222 */
2323
2424 #ifndef SAGOSPRITEHOLDER_HPP
25 #define SAGOSPRITEHOLDER_HPP
25 #define SAGOSPRITEHOLDER_HPP
2626
2727 #include "SagoDataHolder.hpp"
2828 #include "SagoSprite.hpp"
29 #include <vector>
2930
3031 namespace sago {
3132
3233 class SagoSpriteHolder final {
3334 public:
34 explicit SagoSpriteHolder(const SagoDataHolder &texHolder);
35 explicit SagoSpriteHolder(const SagoDataHolder& texHolder);
3536 ~SagoSpriteHolder();
37 /**
38 * Reads all the sprites from the "sprites" directory in alphabetical order
39 **/
3640 void ReadSprites();
37 const sago::SagoSprite& GetSprite(const std::string &spritename) const;
41 /**
42 * Reads an additional sprites. Used to append mod data.
43 **/
44 void ReadSprites(const std::vector<std::string>& extra_sprites);
45 const sago::SagoSprite& GetSprite(const std::string& spritename) const;
3846 const SagoDataHolder& GetDataHolder() const;
3947 private:
4048 SagoSpriteHolder(const SagoSpriteHolder& base) = delete;
4149 SagoSpriteHolder& operator=(const SagoSpriteHolder& base) = delete;
42 void ReadSpriteFile(const std::string &filename);
50 void ReadSpriteFile(const std::string& filename);
4351 struct SagoSpriteHolderData;
44 SagoSpriteHolderData *data;
52 SagoSpriteHolderData* data;
4553 };
4654
4755 }
4856
49 #endif /* SAGOSPRITEHOLDER_HPP */
57 #endif /* SAGOSPRITEHOLDER_HPP */
5058
160160 std::cerr << "FATAL: SagoTextBox::UpdateCache - DataHolder not set!\n";
161161 abort();
162162 }
163 TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize);
163 TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize);
164164 const char delim = '\n';
165165 const std::string& s = data->text;
166166 auto start = 0U;
167167 auto end = s.find(delim);
168168 data->lines.clear();
169 while (end != std::string::npos)
170 {
169 while (end != std::string::npos) {
171170 const std::string& theSubString = s.substr(start, end - start);
172171 SplitAndAppendLineToCache(font, theSubString);
173172 start = end + 1;
181180 if (data->text != data->renderedText) {
182181 UpdateCache();
183182 }
184 TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize);
183 TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize);
185184 int lineSkip = TTF_FontLineSkip(font);
186185 for (size_t i = 0; i < data->lines.size(); ++i) {
187186 data->lines[i].Draw(target, x, y+i*lineSkip, alignment);
3737 void SetText(const char* text);
3838 void SetText(const std::string& text);
3939 void SetColor(const SDL_Color& color);
40
40
4141 /**
4242 * Set the name of the font. Must be known to the data holder.
4343 * The name could for instance be "freeserif".
4646 void SetFont(const char* fontName);
4747 void SetFontSize(int fontSize);
4848 void SetOutline(int outlineSize, const SDL_Color& color);
49
49
5050 /**
5151 * Sets the max width to generate. SagoTextBox will insert line breaks to keep the width below this number.
5252 * Outline is not included in the width: If you have a 2 pixels outline the rendere may go 2 pixels beyond.
6464 SagoTextBox(const SagoTextBox& orig) = delete;
6565 SagoTextBox& operator=(const SagoTextBox& base) = delete;
6666 struct SagoTextBoxData;
67 SagoTextBoxData *data;
67 SagoTextBoxData* data;
6868 };
6969
7070 } //namespace sago
2727
2828 namespace sago {
2929
30 class OutlineHandler {
31 TTF_Font* font;
32 int originalOutline = 0;
33 int targetOutline;
34 bool doChange = false;
35 public:
36 OutlineHandler(TTF_Font* font, int outline) : font{font}, targetOutline{outline} {
37 originalOutline = TTF_GetFontOutline(font);
38 if (originalOutline == targetOutline) {
39 return;
40 }
41 doChange = true;
42 TTF_SetFontOutline(font, targetOutline);
43 };
44
45 void reset() {
46 if (doChange) {
47 TTF_SetFontOutline(font,originalOutline);
48 doChange = false;
49 }
50 }
51
52 ~OutlineHandler() {
53 reset();
54 }
55 private:
56 OutlineHandler(const OutlineHandler& orig) = delete;
57 OutlineHandler& operator=(const OutlineHandler& base) = delete;
30 class OutlineHandler {
31 TTF_Font* font;
32 int originalOutline = 0;
33 int targetOutline;
34 bool doChange = false;
35 public:
36 OutlineHandler(TTF_Font* font, int outline) : font{font}, targetOutline{outline} {
37 originalOutline = TTF_GetFontOutline(font);
38 if (originalOutline == targetOutline) {
39 return;
40 }
41 doChange = true;
42 TTF_SetFontOutline(font, targetOutline);
5843 };
59
44
45 void reset() {
46 if (doChange) {
47 TTF_SetFontOutline(font,originalOutline);
48 doChange = false;
49 }
50 }
51
52 ~OutlineHandler() {
53 reset();
54 }
55 private:
56 OutlineHandler(const OutlineHandler& orig) = delete;
57 OutlineHandler& operator=(const OutlineHandler& base) = delete;
58 };
59
6060 struct SagoTextField::SagoTextFieldData {
6161 const sago::SagoDataHolder* tex = nullptr;
6262 SDL_Surface* textSurface = nullptr;
7272 std::string renderedText = "";
7373 Uint64 renderedVersion = 0;
7474 };
75
75
7676 SagoTextField::SagoTextField() {
7777 data = new SagoTextFieldData();
7878 }
9292 data->textSurface = nullptr;
9393 data->texture = nullptr;
9494 return *this;
95 } catch (...) {
95 }
96 catch (...) {
9697 delete data;
9798 throw;
9899 }
99100 }
100101
101102 SagoTextField::~SagoTextField() {
102 if(!data) {
103 if (!data) {
103104 return;
104105 }
105106 ClearCache();
164165 abort();
165166 }
166167 ClearCache();
167 TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize);
168 TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize);
168169 data->textSurface = TTF_RenderUTF8_Blended (font, data->text.c_str(), data->color);
169170 data->texture = SDL_CreateTextureFromSurface(target, data->textSurface);
170171 if (data->outline > 0) {
178179 }
179180
180181 void SagoTextField::GetRenderedSize(const char* text, int* w, int* h) {
181 TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize);
182 TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize);
182183 int ret = TTF_SizeUTF8(font, text, w, h);
183184 if (ret) {
184185 if (w) {
3232 * This is a text field.
3333 * It represents a line of text to be drawn on screen. It is not possible to have line breaks.
3434 * If line breaks are needed use SagoTextBox instead.
35 *
35 *
3636 * This object renderes to a texture and cahces the texture. The texture will be automatically refreshed if the text changes, the SagoDataHolder is invalidated or ClearCache is called.
3737 * Normally all values will be set at the beginning before text is drawn.
3838 * SetHolder MUST be called before the field is drawn!
4848 /**
4949 * This method creates a copy of a given font.
5050 * The cache will not be copied.
51 * This is ALMOST like the "= operator" but given its own name to prevent implicit calling.
51 * This is ALMOST like the "= operator" but given its own name to prevent implicit calling.
5252 * @param base The object to copy from
5353 * @return A reference to this object.
5454 */
127127 private:
128128 SagoTextField(const SagoTextField& orig) = delete;
129129 struct SagoTextFieldData;
130 SagoTextFieldData *data;
130 SagoTextFieldData* data;
131131 };
132132
133133 } //namespace sago
2929 #define GAMENAME "blockattack"
3030
3131 #ifndef VERSION_NUMBER
32 #define VERSION_NUMBER "2.6.0"
32 #define VERSION_NUMBER "2.7.0"
3333 #endif
00 #! /bin/bash
11 astyle -t -j -y -c -k1 -z2 -A2 --pad-header ../../code/*.cpp
2 astyle -t -j -y -c -k1 -z2 -A2 --pad-header ../../code/sago/*.cpp
3 astyle -t -j -y -c -k1 -z2 -A2 --pad-header ../../code/sago/*.hpp
+0
-46
source/misc/cmake/FindSDL2.cmake less more
0 # - Try to find SDL2
1 # Once done, this will define
2 #
3 # SDL2_FOUND - system has SDL2
4 # SDL2_INCLUDE_DIRS - the SDL2 include directories
5 # SDL2_LIBRARIES - link these to use SDL2
6 # SDL2_SDL_LIBRARY - only libSDL2
7 # SDL2_SDLmain_LIBRARY - only libSDL2main
8 # SDL2_SOURCES - add this in the source file list of your target (hack for OSX)
9 #
10 # See documentation on how to write CMake scripts at
11 # http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries
12
13 include(LibFindMacros)
14 libfind_pkg_detect(SDL2 sdl2 FIND_PATH SDL.h PATH_SUFFIXES SDL2 FIND_LIBRARY SDL2)
15
16 # Process others than OSX with native SDL normally
17 if(NOT "${SDL2_SDL_LIBRARY}" MATCHES "framework")
18 if(MINGW)
19 set(MINGW32_LIBRARY mingw32)
20 set(SDL2_PROCESS_LIBS ${SDL2_PROCESS_LIBS} MINGW32_LIBRARY)
21 endif()
22 find_library(SDL2_SDLmain_LIBRARY
23 NAMES libSDL2main.a SDL2main
24 HINTS ${SDL2_PKGCONF_LIBRARY_DIRS}
25 )
26 if (SDL2_SDLmain_LIBRARY)
27 set(SDL2_PROCESS_LIBS ${SDL2_PROCESS_LIBS} SDL2_SDLmain_LIBRARY)
28 endif()
29 set(SDL2_PROCESS_LIBS ${SDL2_PROCESS_LIBS} SDL2_SDL_LIBRARY)
30 endif()
31
32 libfind_process(SDL2)
33
34 # Special processing for OSX native SDL
35 if("${SDL2_SDL_LIBRARY}" MATCHES "SDL.framework")
36 set(SDL2_SOURCES "osx/SDLmain.m")
37 set(SDL2_LIBRARIES "-framework SDL2")
38 endif()
39
40 # All OSX versions need Cocoa
41 if(APPLE)
42 set(SDL2_LIBRARIES ${SDL2_LIBRARIES} "-framework Cocoa")
43 endif(APPLE)
44
45
+0
-267
source/misc/cmake/LibFindMacros.cmake less more
0 # Version 2.2
1 # Public Domain, originally written by Lasse Kärkkäinen <tronic>
2 # Maintained at https://github.com/Tronic/cmake-modules
3 # Please send your improvements as pull requests on Github.
4
5 # Find another package and make it a dependency of the current package.
6 # This also automatically forwards the "REQUIRED" argument.
7 # Usage: libfind_package(<prefix> <another package> [extra args to find_package])
8 macro (libfind_package PREFIX PKG)
9 set(${PREFIX}_args ${PKG} ${ARGN})
10 if (${PREFIX}_FIND_REQUIRED)
11 set(${PREFIX}_args ${${PREFIX}_args} REQUIRED)
12 endif()
13 find_package(${${PREFIX}_args})
14 set(${PREFIX}_DEPENDENCIES ${${PREFIX}_DEPENDENCIES};${PKG})
15 unset(${PREFIX}_args)
16 endmacro()
17
18 # A simple wrapper to make pkg-config searches a bit easier.
19 # Works the same as CMake's internal pkg_check_modules but is always quiet.
20 macro (libfind_pkg_check_modules)
21 find_package(PkgConfig QUIET)
22 if (PKG_CONFIG_FOUND)
23 pkg_check_modules(${ARGN} QUIET)
24 endif()
25 endmacro()
26
27 # Avoid useless copy&pasta by doing what most simple libraries do anyway:
28 # pkg-config, find headers, find library.
29 # Usage: libfind_pkg_detect(<prefix> <pkg-config args> FIND_PATH <name> [other args] FIND_LIBRARY <name> [other args])
30 # E.g. libfind_pkg_detect(SDL2 sdl2 FIND_PATH SDL.h PATH_SUFFIXES SDL2 FIND_LIBRARY SDL2)
31 function (libfind_pkg_detect PREFIX)
32 # Parse arguments
33 set(argname pkgargs)
34 foreach (i ${ARGN})
35 if ("${i}" STREQUAL "FIND_PATH")
36 set(argname pathargs)
37 elseif ("${i}" STREQUAL "FIND_LIBRARY")
38 set(argname libraryargs)
39 else()
40 set(${argname} ${${argname}} ${i})
41 endif()
42 endforeach()
43 if (NOT pkgargs)
44 message(FATAL_ERROR "libfind_pkg_detect requires at least a pkg_config package name to be passed.")
45 endif()
46 # Find library
47 libfind_pkg_check_modules(${PREFIX}_PKGCONF ${pkgargs})
48 if (pathargs)
49 find_path(${PREFIX}_INCLUDE_DIR NAMES ${pathargs} HINTS ${${PREFIX}_PKGCONF_INCLUDE_DIRS})
50 endif()
51 if (libraryargs)
52 find_library(${PREFIX}_LIBRARY NAMES ${libraryargs} HINTS ${${PREFIX}_PKGCONF_LIBRARY_DIRS})
53 endif()
54 endfunction()
55
56 # Extracts a version #define from a version.h file, output stored to <PREFIX>_VERSION.
57 # Usage: libfind_version_header(Foobar foobar/version.h FOOBAR_VERSION_STR)
58 # Fourth argument "QUIET" may be used for silently testing different define names.
59 # This function does nothing if the version variable is already defined.
60 function (libfind_version_header PREFIX VERSION_H DEFINE_NAME)
61 # Skip processing if we already have a version or if the include dir was not found
62 if (${PREFIX}_VERSION OR NOT ${PREFIX}_INCLUDE_DIR)
63 return()
64 endif()
65 set(quiet ${${PREFIX}_FIND_QUIETLY})
66 # Process optional arguments
67 foreach(arg ${ARGN})
68 if (arg STREQUAL "QUIET")
69 set(quiet TRUE)
70 else()
71 message(AUTHOR_WARNING "Unknown argument ${arg} to libfind_version_header ignored.")
72 endif()
73 endforeach()
74 # Read the header and parse for version number
75 set(filename "${${PREFIX}_INCLUDE_DIR}/${VERSION_H}")
76 if (NOT EXISTS ${filename})
77 if (NOT quiet)
78 message(AUTHOR_WARNING "Unable to find ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}")
79 endif()
80 return()
81 endif()
82 file(READ "${filename}" header)
83 string(REGEX REPLACE ".*#[ \t]*define[ \t]*${DEFINE_NAME}[ \t]*\"([^\n]*)\".*" "\\1" match "${header}")
84 # No regex match?
85 if (match STREQUAL header)
86 if (NOT quiet)
87 message(AUTHOR_WARNING "Unable to find \#define ${DEFINE_NAME} \"<version>\" from ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}")
88 endif()
89 return()
90 endif()
91 # Export the version string
92 set(${PREFIX}_VERSION "${match}" PARENT_SCOPE)
93 endfunction()
94
95 # Do the final processing once the paths have been detected.
96 # If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain
97 # all the variables, each of which contain one include directory.
98 # Ditto for ${PREFIX}_PROCESS_LIBS and library files.
99 # Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES.
100 # Also handles errors in case library detection was required, etc.
101 function (libfind_process PREFIX)
102 # Skip processing if already processed during this configuration run
103 if (${PREFIX}_FOUND)
104 return()
105 endif()
106
107 set(found TRUE) # Start with the assumption that the package was found
108
109 # Did we find any files? Did we miss includes? These are for formatting better error messages.
110 set(some_files FALSE)
111 set(missing_headers FALSE)
112
113 # Shorthands for some variables that we need often
114 set(quiet ${${PREFIX}_FIND_QUIETLY})
115 set(required ${${PREFIX}_FIND_REQUIRED})
116 set(exactver ${${PREFIX}_FIND_VERSION_EXACT})
117 set(findver "${${PREFIX}_FIND_VERSION}")
118 set(version "${${PREFIX}_VERSION}")
119
120 # Lists of config option names (all, includes, libs)
121 unset(configopts)
122 set(includeopts ${${PREFIX}_PROCESS_INCLUDES})
123 set(libraryopts ${${PREFIX}_PROCESS_LIBS})
124
125 # Process deps to add to
126 foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES})
127 if (DEFINED ${i}_INCLUDE_OPTS OR DEFINED ${i}_LIBRARY_OPTS)
128 # The package seems to export option lists that we can use, woohoo!
129 list(APPEND includeopts ${${i}_INCLUDE_OPTS})
130 list(APPEND libraryopts ${${i}_LIBRARY_OPTS})
131 else()
132 # If plural forms don't exist or they equal singular forms
133 if ((NOT DEFINED ${i}_INCLUDE_DIRS AND NOT DEFINED ${i}_LIBRARIES) OR
134 ({i}_INCLUDE_DIR STREQUAL ${i}_INCLUDE_DIRS AND ${i}_LIBRARY STREQUAL ${i}_LIBRARIES))
135 # Singular forms can be used
136 if (DEFINED ${i}_INCLUDE_DIR)
137 list(APPEND includeopts ${i}_INCLUDE_DIR)
138 endif()
139 if (DEFINED ${i}_LIBRARY)
140 list(APPEND libraryopts ${i}_LIBRARY)
141 endif()
142 else()
143 # Oh no, we don't know the option names
144 message(FATAL_ERROR "We couldn't determine config variable names for ${i} includes and libs. Aieeh!")
145 endif()
146 endif()
147 endforeach()
148
149 if (includeopts)
150 list(REMOVE_DUPLICATES includeopts)
151 endif()
152
153 if (libraryopts)
154 list(REMOVE_DUPLICATES libraryopts)
155 endif()
156
157 string(REGEX REPLACE ".*[ ;]([^ ;]*(_INCLUDE_DIRS|_LIBRARIES))" "\\1" tmp "${includeopts} ${libraryopts}")
158 if (NOT tmp STREQUAL "${includeopts} ${libraryopts}")
159 message(AUTHOR_WARNING "Plural form ${tmp} found in config options of ${PREFIX}. This works as before but is now deprecated. Please only use singular forms INCLUDE_DIR and LIBRARY, and update your find scripts for LibFindMacros > 2.0 automatic dependency system (most often you can simply remove the PROCESS variables entirely).")
160 endif()
161
162 # Include/library names separated by spaces (notice: not CMake lists)
163 unset(includes)
164 unset(libs)
165
166 # Process all includes and set found false if any are missing
167 foreach (i ${includeopts})
168 list(APPEND configopts ${i})
169 if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND")
170 list(APPEND includes "${${i}}")
171 else()
172 set(found FALSE)
173 set(missing_headers TRUE)
174 endif()
175 endforeach()
176
177 # Process all libraries and set found false if any are missing
178 foreach (i ${libraryopts})
179 list(APPEND configopts ${i})
180 if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND")
181 list(APPEND libs "${${i}}")
182 else()
183 set (found FALSE)
184 endif()
185 endforeach()
186
187 # Version checks
188 if (found AND findver)
189 if (NOT version)
190 message(WARNING "The find module for ${PREFIX} does not provide version information, so we'll just assume that it is OK. Please fix the module or remove package version requirements to get rid of this warning.")
191 elseif (version VERSION_LESS findver OR (exactver AND NOT version VERSION_EQUAL findver))
192 set(found FALSE)
193 set(version_unsuitable TRUE)
194 endif()
195 endif()
196
197 # If all-OK, hide all config options, export variables, print status and exit
198 if (found)
199 foreach (i ${configopts})
200 mark_as_advanced(${i})
201 endforeach()
202 if (NOT quiet)
203 message(STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}")
204 if (LIBFIND_DEBUG)
205 message(STATUS " ${PREFIX}_DEPENDENCIES=${${PREFIX}_DEPENDENCIES}")
206 message(STATUS " ${PREFIX}_INCLUDE_OPTS=${includeopts}")
207 message(STATUS " ${PREFIX}_INCLUDE_DIRS=${includes}")
208 message(STATUS " ${PREFIX}_LIBRARY_OPTS=${libraryopts}")
209 message(STATUS " ${PREFIX}_LIBRARIES=${libs}")
210 endif()
211 set (${PREFIX}_INCLUDE_OPTS ${includeopts} PARENT_SCOPE)
212 set (${PREFIX}_LIBRARY_OPTS ${libraryopts} PARENT_SCOPE)
213 set (${PREFIX}_INCLUDE_DIRS ${includes} PARENT_SCOPE)
214 set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE)
215 set (${PREFIX}_FOUND TRUE PARENT_SCOPE)
216 endif()
217 return()
218 endif()
219
220 # Format messages for debug info and the type of error
221 set(vars "Relevant CMake configuration variables:\n")
222 foreach (i ${configopts})
223 mark_as_advanced(CLEAR ${i})
224 set(val ${${i}})
225 if ("${val}" STREQUAL "${i}-NOTFOUND")
226 set (val "<not found>")
227 elseif (val AND NOT EXISTS ${val})
228 set (val "${val} (does not exist)")
229 else()
230 set(some_files TRUE)
231 endif()
232 set(vars "${vars} ${i}=${val}\n")
233 endforeach()
234 set(vars "${vars}You may use CMake GUI, cmake -D or ccmake to modify the values. Delete CMakeCache.txt to discard all values and force full re-detection if necessary.\n")
235 if (version_unsuitable)
236 set(msg "${PREFIX} ${${PREFIX}_VERSION} was found but")
237 if (exactver)
238 set(msg "${msg} only version ${findver} is acceptable.")
239 else()
240 set(msg "${msg} version ${findver} is the minimum requirement.")
241 endif()
242 else()
243 if (missing_headers)
244 set(msg "We could not find development headers for ${PREFIX}. Do you have the necessary dev package installed?")
245 elseif (some_files)
246 set(msg "We only found some files of ${PREFIX}, not all of them. Perhaps your installation is incomplete or maybe we just didn't look in the right place?")
247 if(findver)
248 set(msg "${msg} This could also be caused by incompatible version (if it helps, at least ${PREFIX} ${findver} should work).")
249 endif()
250 else()
251 set(msg "We were unable to find package ${PREFIX}.")
252 endif()
253 endif()
254
255 # Fatal error out if REQUIRED
256 if (required)
257 set(msg "REQUIRED PACKAGE NOT FOUND\n${msg} This package is REQUIRED and you need to install it or adjust CMake configuration in order to continue building ${CMAKE_PROJECT_NAME}.")
258 message(FATAL_ERROR "${msg}\n${vars}")
259 endif()
260 # Otherwise just print a nasty warning
261 if (NOT quiet)
262 message(WARNING "WARNING: MISSING PACKAGE\n${msg} This package is NOT REQUIRED and you may ignore this warning but by doing so you may miss some functionality of ${CMAKE_PROJECT_NAME}. \n${vars}")
263 endif()
264 endfunction()
265
266
66 boost-devel \
77 physfs-devel \
88 SDL2_image-devel SDL2_ttf-devel SDL2_mixer-devel \
9 utf8cpp-devel \
109 findutils \
1110 gettext \
1211 zip \
1413
1514 COPY . /staging/blockattack-game
1615
17 ENV BLOCKATTACK_VERSION 2.6.0
16 ENV BLOCKATTACK_VERSION 2.7.0
1817
1918 RUN cd /staging/blockattack-game && \
2019 ./packdata.sh && \
66 boost-devel \
77 physfs-devel \
88 SDL2_image-devel SDL2_ttf-devel SDL2_mixer-devel \
9 utf8cpp-devel \
109 findutils \
1110 gettext \
1211 zip \
1413
1514 COPY . /staging/blockattack-game
1615
17 ENV BLOCKATTACK_VERSION 2.6.0
16 ENV BLOCKATTACK_VERSION 2.7.0
1817
1918 RUN cd /staging/blockattack-game && \
2019 ./packdata.sh && \
+0
-27
source/misc/docker/Dockerfile.Ubuntu12.04build_Standalone less more
0 FROM ubuntu:12.04
1
2 RUN apt-get update && apt-get install -y build-essential cmake pkg-config libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libpng12-dev zip gettext
3
4 RUN apt-get update && apt-get install -y python-software-properties && \
5 add-apt-repository ppa:ubuntu-toolchain-r/test && \
6 apt-get update && \
7 apt-get install -y gcc-4.8 g++-4.8 && \
8 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 && \
9 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
10
11 COPY source/misc/standalone/compile_requirements.sh /
12 RUN /compile_requirements.sh
13
14
15
16 COPY . /staging/blockattack-game
17
18 ENV BLOCKATTACK_VERSION 2.6.0
19
20 RUN cd /staging/blockattack-game && \
21 ./packdata.sh && \
22 cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/ && \
23 cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/sago/ && \
24 cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/ && \
25 cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/sago/ && \
26 cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make
+0
-14
source/misc/docker/Dockerfile.Ubuntu14.04build less more
0 FROM ubuntu:14.04
1
2 RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext
3
4 RUN mkdir -p /staging/blockattack-game
5
6 COPY . /staging/blockattack-game
7
8 ENV BLOCKATTACK_VERSION 2.6.0
9
10 RUN cd /staging/blockattack-game && \
11 ./packdata.sh && \
12 cmake . && \
13 make
+0
-14
source/misc/docker/Dockerfile.Ubuntu14.04build_Standalone less more
0 FROM ubuntu:14.04
1
2 RUN apt-get update && apt-get install -y build-essential libboost-dev cmake pkg-config libboost-program-options-dev libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libutfcpp-dev zip gettext
3
4 COPY source/misc/standalone/compile_requirements.sh /
5 RUN /compile_requirements.sh
6
7 COPY . /staging/blockattack-game
8
9 ENV BLOCKATTACK_VERSION 2.6.0
10
11 RUN cd /staging/blockattack-game && \
12 ./packdata.sh && \
13 cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make
+0
-14
source/misc/docker/Dockerfile.Ubuntu14.04build_Standalone32 less more
0 FROM ioft/i386-ubuntu:14.04
1
2 RUN apt-get update && apt-get install -y build-essential libboost-dev cmake pkg-config libboost-program-options-dev libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libutfcpp-dev zip gettext
3
4 COPY source/misc/standalone/compile_requirements.sh /
5 RUN /compile_requirements.sh
6
7 COPY . /staging/blockattack-game
8
9 ENV BLOCKATTACK_VERSION 2.6.0
10
11 RUN cd /staging/blockattack-game && \
12 ./packdata.sh && \
13 cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make
+0
-14
source/misc/docker/Dockerfile.Ubuntu16.04build less more
0 FROM ubuntu:16.04
1
2 RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext
3
4 RUN mkdir -p /staging/blockattack-game
5
6 COPY . /staging/blockattack-game
7
8 ENV BLOCKATTACK_VERSION 2.6.0
9
10 RUN cd /staging/blockattack-game && \
11 ./packdata.sh && \
12 cmake . && \
13 make
0 FROM ubuntu:16.04
1
2 RUN apt-get update && apt-get install -y build-essential cmake pkg-config libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libpng12-dev zip gettext
3
4 RUN apt-get update && apt-get install -y python-software-properties && \
5 apt-get update && \
6 apt-get install -y gcc-4.8 g++-4.8 && \
7 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 && \
8 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
9
10 COPY source/misc/standalone/compile_requirements.sh /
11 RUN /compile_requirements.sh
12
13
14
15 COPY . /staging/blockattack-game
16
17 ENV BLOCKATTACK_VERSION 2.7.0
18
19 RUN cd /staging/blockattack-game && \
20 ./packdata.sh && \
21 cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make
0 FROM ioft/i386-ubuntu:16.04
1
2 RUN apt-get update && apt-get install -y build-essential cmake pkg-config libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libpng12-dev zip gettext
3
4 RUN apt-get update && apt-get install -y python-software-properties software-properties-common && \
5 add-apt-repository ppa:ubuntu-toolchain-r/test && \
6 apt-get update && \
7 apt-get install -y gcc-4.8 g++-4.8 && \
8 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 && \
9 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
10
11 COPY source/misc/standalone/compile_requirements.sh /
12 RUN /compile_requirements.sh
13
14
15
16 COPY . /staging/blockattack-game
17
18 ENV BLOCKATTACK_VERSION 2.3.0
19
20 RUN cd /staging/blockattack-game && \
21 ./packdata.sh && \
22 cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make
0 FROM ubuntu:18.04
1
2 RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext
3
4 RUN mkdir -p /staging/blockattack-game
5
6 COPY . /staging/blockattack-game
7
8 ENV BLOCKATTACK_VERSION 2.7.0
9
10 RUN cd /staging/blockattack-game && \
11 ./packdata.sh && \
12 cmake . && \
13 make
0 FROM ubuntu:20.04
1
2 # Set timezone to UTC. This prevents apt-get install SOME-PACKAGES from asking for timezone during setup
3 ENV TZ=UTC
4 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
5
6
7 RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext
8
9 RUN mkdir -p /staging/blockattack-game
10
11 COPY . /staging/blockattack-game
12
13 ENV BLOCKATTACK_VERSION 2.7.0
14
15 RUN cd /staging/blockattack-game && \
16 ./packdata.sh && \
17 cmake . && \
18 make
77
88 COPY . /staging/blockattack-game
99
10 ENV BLOCKATTACK_VERSION 2.6.0
10 ENV BLOCKATTACK_VERSION 2.7.0
1111
1212 RUN cd /staging/blockattack-game && \
1313 ./packdata.sh && \
14 cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/Libs/include/ && \
15 cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/Libs/include/ && \
1614 i686-w64-mingw32.static-cmake . && \
1715 make && \
1816 cd windows\ installer/ && \
2321 cp /staging/blockattack-game/Game/blockattack.data ./ && \
2422 cp /staging/blockattack-game/Game/blockattack.exe ./ && \
2523 cp /staging/blockattack-game/COPYING ./COPYING.txt && \
24 mkdir -p mods && cp /staging/blockattack-game/Game/mods/1.3.0.bricks.data ./mods/ && \
2625 cp -r /staging/blockattack-game/source/misc/translation/locale ./ && \
2726 echo "[InternetShortcut]" > "Block Attack - Rise Of the Blocks.url" && \
2827 echo "URL=https://blockattack.net" >> "Block Attack - Rise Of the Blocks.url" && \
+0
-236
source/misc/icons/blockattack128.xpm less more
0 /* XPM */
1 static char *blockattack128[] = {
2 /* columns rows colors chars-per-pixel */
3 "128 128 102 2 ",
4 " c #654500",
5 ". c #644600",
6 "X c #654600",
7 "o c #654700",
8 "O c #664600",
9 "+ c #664700",
10 "@ c #735200",
11 "# c #745300",
12 "$ c #755400",
13 "% c #765500",
14 "& c #775500",
15 "* c #775600",
16 "= c #876400",
17 "- c #886500",
18 "; c #896500",
19 ": c #896600",
20 "> c #8C6700",
21 ", c #8B6800",
22 "< c #A57E00",
23 "1 c #A67F00",
24 "2 c #A78000",
25 "3 c #A88100",
26 "4 c #C19600",
27 "5 c #C19700",
28 "6 c #C29800",
29 "7 c #C39800",
30 "8 c #C49900",
31 "9 c #CDA200",
32 "0 c #CEA200",
33 "q c #CFA300",
34 "w c #DEB100",
35 "e c #DFB100",
36 "r c #E0B100",
37 "t c #E0B200",
38 "y c #EABB00",
39 "u c #EBBB00",
40 "i c #ECBC00",
41 "p c #ECBD00",
42 "a c #F1C100",
43 "s c #F2C100",
44 "d c #F2C200",
45 "f c #F3C200",
46 "g c #FAC900",
47 "h c #FBC900",
48 "j c #FDCB00",
49 "k c #FDCC00",
50 "l c #FFCD00",
51 "z c #FFCE00",
52 "x c #FFCF00",
53 "c c #FFD000",
54 "v c #FED100",
55 "b c #FFD100",
56 "n c #FED200",
57 "m c #FED300",
58 "M c #FED400",
59 "N c #FED500",
60 "B c #FED600",
61 "V c #FED700",
62 "C c #FDD900",
63 "Z c #FDDA00",
64 "A c #FDDB00",
65 "S c #FDDC00",
66 "D c #FDDD00",
67 "F c #FDDE00",
68 "G c #FCDF00",
69 "H c #FDDF00",
70 "J c #FCE000",
71 "K c #FCE100",
72 "L c #FCE200",
73 "P c #FCE300",
74 "I c #FBE600",
75 "U c #FBE700",
76 "Y c #FCE400",
77 "T c #FCE500",
78 "R c #FCE600",
79 "E c #FBE800",
80 "W c #FBEA00",
81 "Q c #FBEB00",
82 "! c #FBEC00",
83 "~ c #FAED00",
84 "^ c #FBED00",
85 "/ c #FAEE00",
86 "( c #FAEF00",
87 ") c #FAF000",
88 "_ c #FAF100",
89 "` c #FAF200",
90 "' c #FAF300",
91 "] c #F9F400",
92 "[ c #F9F500",
93 "{ c #FAF400",
94 "} c #F9F600",
95 "| c #F9F700",
96 " . c #F9F800",
97 ".. c #F9F900",
98 "X. c #F9FA00",
99 "o. c #F8FB00",
100 "O. c #F9FB00",
101 "+. c #F8FC00",
102 "@. c #F8FD00",
103 "#. c #F8FE00",
104 "$. c #F8FF00",
105 "%. c None",
106 /* pixels */
107 "%.%.%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.%.%.%.",
108 "%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.%.",
109 "%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.",
110 "%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.",
111 "%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.",
112 "%.X X X X X X X X X X % 2 q e y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y e q 2 % X X X X X X X X X X %.",
113 "%.X X X X X X X X # 5 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 6 % X X X X X X X X %.",
114 "X X X X X X X X : a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l a > X X X X X X X X ",
115 "X X X X X X X : g l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l g : X X X X X X X ",
116 "X X X X X X % a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l a # X X X X X X ",
117 "X X X X X X 8 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 5 X X X X X X ",
118 "X X X X X % l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l % X X X X X ",
119 "X X X X X 3 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 1 X X X X X ",
120 "X X X X X q l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l q X X X X X ",
121 "X X X X X r l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l e X X X X X ",
122 "X X X X X i l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l y X X X X X ",
123 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
124 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
125 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
126 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
127 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
128 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
129 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
130 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
131 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
132 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
133 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z #.#.Z l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
134 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
135 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
136 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l E #.#.#.#.#.#.E l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
137 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z #.#.#.#.#.#.#.#.Z l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
138 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
139 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.$.$.$.$.$.P l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
140 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.$.$.$.$.$.$.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
141 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l ' #.#.#.#.#.#.$.$.$.$.$.$./ l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
142 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z #.#.#.#.#.#.#.$.$.$.$.$.$.$.Z l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
143 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.$.$.$.$.$.$.$.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
144 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l P #.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.I l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
145 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.O.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
146 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l / #.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$./ l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
147 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z #.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.Z l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
148 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
149 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.P l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
150 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
151 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
152 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z ' #.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.' Z l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
153 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N P / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.O./ P N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
154 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z P / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.O.' I Z m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
155 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m H E } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.} E P m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
156 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l m H / O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.O.^ H l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
157 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l m P } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.' P m l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
158 "X X X X X p l l l l l l l l l l l l l l l l l l l l l m / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.#./ m l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
159 "X X X X X p l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.R l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
160 "X X X X X p l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.m l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
161 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.P l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
162 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.} l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
163 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l m O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.O.m l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
164 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l Z #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.Z l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
165 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l P #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.P l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
166 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l E #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.E l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
167 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l m / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.$.$./ l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
168 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l m } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.$.} m l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
169 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l m O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.O.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
170 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
171 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.H l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
172 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l P #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.H l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
173 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l I #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.R l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
174 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#./ l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
175 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
176 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.O.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
177 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l H #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.Z l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
178 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.O.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
179 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
180 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.O.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
181 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.O.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
182 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
183 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
184 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
185 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
186 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l H #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.H l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
187 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l P #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.P l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
188 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l I #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.I l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
189 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.E l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
190 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$./ l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
191 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l ' #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.$.$.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
192 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.$.$.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
193 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
194 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.} P N N P ' $.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
195 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$./ N l l l l l l N E $.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
196 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.O.I l l l l l l l l l l l m G } $.$.$.$.$.$.$.$.#.#.#.#.#.#.#.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
197 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.#.' H l l l l l l l l l l l l l l l l Z ' $.$.$.$.$.$.#.#.#.#.#.#.#.N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
198 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.O./ N l l l l l l l l l l l l l l l l l l l l N E $.$.$.$.#.#.#.#.#.#.#.N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
199 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m $.$.$.#.#.#.#.#.} R m l l l l l l l l l l l l l l l l l l l l l l l l m H } $.#.#.#.#.#.#.#.m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
200 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m $.$.$.#.#.#.^ Z l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l Z / #.#.#.#.#.#.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
201 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.O./ P l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m H / #.#.O.l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
202 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l m N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N m l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
203 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
204 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
205 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
206 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
207 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
208 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
209 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
210 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
211 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
212 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
213 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
214 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
215 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
216 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
217 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
218 "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l p X X X X X ",
219 "X X X X X i l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l y o X X ",
220 "X X X X X r l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l e . X X ",
221 "X X X X X q l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l q X X X X ",
222 "X X X X X 1 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 1 X X X X ",
223 "X X X X X & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l % X X X X X ",
224 "X X X X X X 7 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 5 X X X X X X ",
225 "X X X X X X # a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l a @ X X X X X o ",
226 "X X X X X X X = g l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l g = X X X X X X ",
227 "X X X X X X X X = a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l f , X X X X X X ",
228 "%.X X X X X X X X # 5 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 5 # X o . X X X X X %.",
229 "%.X X X X X X X X X X % 1 q w y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y e q 1 % X X X X X X X X X X %.",
230 "%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.",
231 "%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X . . o X X X X X X X X X %.%.%.",
232 "%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.",
233 "%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.%.",
234 "%.%.%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X o X X %.%.%.%.%.%.%."
235 };
+0
-41
source/misc/icons/blockattack16.xpm less more
0 /* XPM */
1 static char *blockattack16[] = {
2 /* columns rows colors chars-per-pixel */
3 "16 16 19 1 ",
4 " c #644600",
5 ". c #664600",
6 "X c #886500",
7 "o c #896600",
8 "O c #987300",
9 "+ c #9D7700",
10 "@ c #FFCD00",
11 "# c #FFD000",
12 "$ c #FED400",
13 "% c #FDDB00",
14 "& c #FDDC00",
15 "* c #FCE500",
16 "= c #FBED00",
17 "- c #FAF000",
18 "; c #F9F700",
19 ": c #F9F900",
20 "> c #F9FA00",
21 ", c #F8FE00",
22 "< c #F8FF00",
23 /* pixels */
24 ".oOOOOOOOOOOOOo.",
25 "o@@@@@@@@@@@@@@o",
26 "+@@@@@@@@@@@@@@+",
27 "+@@@@@@&%@@@@@@+",
28 "+@@@@@#>>#@@@@@+",
29 "+@@@@$=<<=@@@@@+",
30 "+@@&><<<<<<>%@@+",
31 "+@@@;<<<<<<>@@@+",
32 "+@@@#>,,<>>#@@@+",
33 "+@@@@>,,,,>@@@@+",
34 "+@@@@;,,,,>@@@@+",
35 "+@@@@-*#@*-@@@@+",
36 "+@@@@@@@@@@@@@@+",
37 "+@@@@@@@@@@@@@@+",
38 "X@@@@@@@@@@@@@@X",
39 " XOOOOOOOOOOOOX "
40 };
+0
-384
source/misc/icons/blockattack256.xpm less more
0 /* XPM */
1 static char *blockattack256[] = {
2 /* columns rows colors chars-per-pixel */
3 "256 256 122 2 ",
4 " c #654500",
5 ". c #644600",
6 "X c #654600",
7 "o c #644700",
8 "O c #654700",
9 "+ c #664600",
10 "@ c #664700",
11 "# c #704F00",
12 "$ c #705000",
13 "% c #715100",
14 "& c #725100",
15 "* c #725200",
16 "= c #735200",
17 "- c #745300",
18 "; c #785600",
19 ": c #785700",
20 "> c #795800",
21 ", c #7A5800",
22 "< c #7B5900",
23 "1 c #957000",
24 "2 c #977100",
25 "3 c #A47D00",
26 "4 c #A57E00",
27 "5 c #A67F00",
28 "6 c #A78000",
29 "7 c #A88100",
30 "8 c #A98100",
31 "9 c #A98200",
32 "0 c #AF8700",
33 "q c #B08800",
34 "w c #B18800",
35 "e c #BA9000",
36 "r c #BB9100",
37 "t c #BB9200",
38 "y c #BD9300",
39 "u c #C69B00",
40 "i c #C79C00",
41 "p c #CFA300",
42 "a c #D0A300",
43 "s c #D0A400",
44 "d c #D1A500",
45 "f c #D2A600",
46 "g c #D3A600",
47 "h c #D6A900",
48 "j c #D8AC00",
49 "k c #DAAD00",
50 "l c #DEB000",
51 "z c #DEB100",
52 "x c #E0B100",
53 "c c #E0B200",
54 "v c #E7B900",
55 "b c #E8B800",
56 "n c #E9B900",
57 "m c #EABB00",
58 "M c #EEBE00",
59 "N c #EFBE00",
60 "B c #EFBF00",
61 "V c #F5C400",
62 "C c #F6C500",
63 "Z c #F8C700",
64 "A c #F9C800",
65 "S c #FAC800",
66 "D c #FECC00",
67 "F c #FFCD00",
68 "G c #FFCE00",
69 "H c #FFCF00",
70 "J c #FFD000",
71 "K c #FED100",
72 "L c #FFD100",
73 "P c #FED200",
74 "I c #FED300",
75 "U c #FED400",
76 "Y c #FED500",
77 "T c #FED600",
78 "R c #FED700",
79 "E c #FDD800",
80 "W c #FDD900",
81 "Q c #FED800",
82 "! c #FDDA00",
83 "~ c #FDDB00",
84 "^ c #FDDC00",
85 "/ c #FDDD00",
86 "( c #FDDE00",
87 ") c #FCDF00",
88 "_ c #FDDF00",
89 "` c #FCE000",
90 "' c #FCE100",
91 "] c #FCE200",
92 "[ c #FCE300",
93 "{ c #FBE600",
94 "} c #FBE700",
95 "| c #FCE400",
96 " . c #FCE500",
97 ".. c #FCE600",
98 "X. c #FBE800",
99 "o. c #FBE900",
100 "O. c #FBEA00",
101 "+. c #FBEB00",
102 "@. c #FBEC00",
103 "#. c #FAED00",
104 "$. c #FBED00",
105 "%. c #FAEE00",
106 "&. c #FAEF00",
107 "*. c #FAF000",
108 "=. c #FAF100",
109 "-. c #FAF200",
110 ";. c #FAF300",
111 ":. c #F9F400",
112 ">. c #F9F500",
113 ",. c #FAF400",
114 "<. c #F9F600",
115 "1. c #F9F700",
116 "2. c #F9F800",
117 "3. c #F9F900",
118 "4. c #F9FA00",
119 "5. c #F8FB00",
120 "6. c #F9FB00",
121 "7. c #F8FC00",
122 "8. c #F8FD00",
123 "9. c #F8FE00",
124 "0. c #F8FF00",
125 "q. c None",
126 /* pixels */
127 "q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O O q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.",
128 "q.q.q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O q.q.q.q.q.q.q.q.q.q.q.q.q.",
129 "q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.",
130 "q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.",
131 "q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.",
132 "q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.",
133 "q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.",
134 "q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.",
135 "q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.",
136 "q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O O X X X X X X X X X X X X X X X X X X X X X X X q.q.q.",
137 "q.q.q.X X X X X X X X X X X X X X X X X X X X @ X $ 2 w i s h h h h h h j h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h h s i w 2 $ X X O X X X X X X X X X X X X X X X X X X X q.q.q.",
138 "q.q.X X X X X X X X X X X X X X X X X X X X $ 7 c D D D J D J D D D D D D D D J D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D D D D D D D D J D D D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D J D D D D D D J D D D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D D D D D D D D J D D D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D J D D J D D D D D c 7 $ X X X X X X X X X X X X X X X X X X X X q.q.",
139 "q.q.X X X X X X X X X X X X X X X X X X - y S D D D D D D D D D J D D D J D D D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D J D J D D J D D D J D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D D D D D D J D D D J D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D J D J D D J D D D J D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D D D D D D J D D D J D D S y - O X X X X X X X X X X X X X X X X X q.q.",
140 "q.X X X X X X X X X X X X X X X O O O 7 C D J D D J D J J D J D D D D J D D D J D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D D D D D D J D D D J D D D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D J D J D D J D D D J D D D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D D D D D D J D D D J D D D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D J D J D D J D D D J D D D D D Z 6 O O O X X X X X X X X X X X X X X X q.",
141 "q.X X X X X X X X X X X X X X X O $ h D D D J D J D D D D D D J J D J D J D J D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D J D D D D D D D D D D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D J D D D D D D D D D D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D D D J D D D D D D D D J D J D D g $ O X X X X X X X X X X X X X X X q.",
142 "q.X X X X X X X X X X X X X X X - m D D D J D D D D D J J D D D D D D D D D D D D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D D D J D D J D J D J D J D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D J D D D D J D J D J D J D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D D D J D D J D J D J D J D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D J D D D D J D J D J D J D D D D D D m , X X X X X X X X X X X X X X X q.",
143 "O X X X X X X X X X X X X X O , V D D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D D D V , X X X X X X X X X X X X X X X ",
144 "X X X X X X X X X X X X X X $ m D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D v $ X X X X X X X X X X X X X X ",
145 "X X X X X X X X X X X X X O s D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J J D D s X X X X X X X X X X X X X X ",
146 "X X X X X X X X X X X X X 6 D D D D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D D D D D 4 X X X X X X X X X X X X X ",
147 "X X X X X X X X X X X X - C D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D D D J J D D D J D C - X X X X X X X X X X X X ",
148 "X X X X X X X X X X X X y J D J D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D D D D J D D D t X X X X X X X X X X X X ",
149 "X X X X X X X X X X O - S D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J J D J D J D J S $ X X X X X X X X X X X ",
150 "X X X X X X X X X X X 9 D D D J D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D 6 O X X X X X X X X X X ",
151 "X X X X X X X X X X X c D D J D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J J D D D D D J D J D J D z O X X X X X X X X X X ",
152 "X X X X X X X X X X $ D D J D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D D D D J D J D D D D D D D $ X X X X X X X X X X ",
153 "X X X X X X X X X X 2 D D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D J D J J D J D D D D D D D J D D 2 X X X X X X X X X X ",
154 "X X X X X X X X X O w D D J D J D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D J D D D D D D D D D D J D J D J D D D 0 X X X X X X X X X X ",
155 "X X X X X X X X X X i D J D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J J D D D J D J D D D D D D i O X X X X X X X X X ",
156 "X X X X X X X X X X g D D D D J D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D D D D J D D D D D J D J D s O X X X X X X X X X ",
157 "X X X X X X X X X X k D J D J D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J J D J D D D J D J D D D D k X X X X X X X X X X ",
158 "X X X X X X X X X X k D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D D D D D D D D D D J D D D D D J D k X X X X X X X X X X ",
159 "X X X X X X X X X X l D D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J D D D D D J D D D D D J D D D D D J D l X X X X X X X X X X ",
160 "X X X X X X X X X o k D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ",
161 "X X X X X X X X X X k D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ",
162 "X X X X X X X X X X l D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D J D D D D D J D D D J D J D D D D D D k X X X X X X X X X X ",
163 "X X X X X X X X X X k D D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D J D D D J D D D D D J D J D J D D D l X X X X X X X X X X ",
164 "X X X X X X X X X X k D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D J D D D J D J D D D D D D D J D D k X X X X X X X X X X ",
165 "X X X X X X X X X X k D D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D J D D D J D J D D D J D J D D D D D D D k o X X X X X X X X X ",
166 "X X X X X X X X X X l D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D J D D D D D J D D D D D J D J D J D D l X X X X X X X X X X ",
167 "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D D D D D D D J D D D D J D J D D k X X X X X X X X X X ",
168 "X X X X X X X X X X k D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D J D D D J D J D J D D D J D J D D D D D D k X X X X X X X X X X ",
169 "X X X X X X X X X X k J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D J D D D J D J D J D D D J D D J D D l X X X X X X X X X X ",
170 "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D D J D D D D D D D J D D D D J D D D k X X X X X X X X X X ",
171 "X X X X X X X X X X k D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D J D D D J D D D J D D D J D D D D D D J k X X X X X X X X X X ",
172 "X X X X X X X X X X k D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D J D D D J D D D J D D D J D D J D J D k X X X X X X X X X X ",
173 "X X X X X X X X X X k J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ",
174 "X X X X X X X X X X k D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D J D J D J D J D J D J D J D D D D J D k X X X X X X X X X X ",
175 "X X X X X X X X X X k D D D D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D J D J D D D J D J D D J D J D J D D J D J D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ",
176 "X X X X X X X X X X l D D J D J J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D J D D D D D J D D D D D D D D D D D J D D D D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ",
177 "X X X X X X X X X X k D J D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D J D J D D D J D D J D D D D J D D D J D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ",
178 "X X X X X X X X X X k D D D D J J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D J D J D D D D D J D D D D J &.=.J D D D J D D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ",
179 "X X X X X X X X X X k D D D D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D J D D D D D J D D D J T 3.0.0.3.T D J D J D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ",
180 "X X X X X X X X X O k J D J D J J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D D J D D D J D J D D D D T 3.0.0.0.0.3.J D D D D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ",
181 "X X X X X X X X X X k D J D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D D J D D D J D J J 1.0.0.0.0.0.0.1.J D J D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ",
182 "X X X X X X X X X X k D D D D J J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D D J D J D D D J D D D $.0.0.0.0.0.0.0.0.&.J D D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ",
183 "X X X X X X X X X X k D D D D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D J D J D D D D D / 0.0.0.0.0.0.0.0.0.0./ D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ",
184 "X X X X X X X X X X l D D J D J J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D J D D D D D J D J 0.0.0.0.0.0.0.0.0.0.0.3.T D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ",
185 "X X X X X X X X X X k D J D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D D J D J D D =.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ",
186 "X X X X X X X X X X k D D D D J J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D J D J D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0./ J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ",
187 "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D J D J D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ",
188 "X X X X X X X X X O k J D J D J J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D J D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ",
189 "X X X X X X X X X X k D J D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ",
190 "X X X X X X X X X X k D D D D J J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D J D D D T 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ",
191 "X X X X X X X X X X k D D J D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D D J X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ",
192 "X X X X X X X X X X k D D D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D J D J D J D J D J D J D J D J D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ",
193 "X X X X X X X X X X k J D D D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D J D D D D J D D D J D D D J D D D J J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ",
194 "X X X X X X X X X X k D J D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D J D J ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D D J D D D J D D D J D D D J D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ",
195 "X X X X X X X X X X k D J D J D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D D J D D D J D J D J D D D J D J J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ",
196 "X X X X X X X X X X k D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D D J D D D D D D D J D D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ",
197 "X X X X X X X X X X l D D D J D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D J ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D D J D D D D D D D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ",
198 "X X X X X X X X X X k D D J D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.D J D J D D D J D J D J D D D J D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ",
199 "X X X X X X X X X X k D J D D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D J D D D D D D J D J D D D J J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ",
200 "X X X X X X X X X X k D D D D J D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D J D J D D D D J D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ",
201 "X X X X X X X X X X k D J D J D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D J D D D D J D D D J D J J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ",
202 "X X X X X X X X X X k J D D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D J D D J D D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ",
203 "X X X X X X X X X X k D D D J D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D D D D D D J D J D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ",
204 "X X X X X X X X X X l D D J D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D J D J D D D D J D J D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ",
205 "X X X X X X X X X X k D D D D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J J D D D D J D D D D D J J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ",
206 "X X X X X X X X X X k D D J D J D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D J D D J D J D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ",
207 "X X X X X X X X X X l D D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D J D D D D D J D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D J D J D D D J D J J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ",
208 "X X X X X X X X X o k D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D J D J D J D J D J D J D J D J D D J D D D D D J D D D D D J D D D D J D J D D D J D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D D J D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ",
209 "X X X X X X X X X X k D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J J D D D J D D D J D D D J D D D D D D D D J D D D J D J D D D D J D J D D D D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D J D D D D D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ",
210 "X X X X X X X X X X l D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D D D J D D D J D D D J D D D J J D J D D D J D D D D D J D J D D D D D D J D J J J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D J D J D D D J D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ",
211 "X X X X X X X X X X k D D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J J D J D D D J D J D J D D D J D D D D J D D D J D D D D D J D D J D D D J D J D D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D D J D D D J J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ",
212 "X X X X X X X X X X k D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D D D J D D D D D D D J D D J D D D J D D D J D J D D D J D D D D J D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! J D D D J D D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ",
213 "X X X X X X X X X X k D D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D J D D D D D D D J D D D D D D J D J D J D J D D D J D D D D J D J D D D D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D D J D J D J J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ",
214 "X X X X X X X X X X l D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D J D D D J D J D J D D D J D J D D D D D D D D J D D D J D J D D D D D D J D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.o.D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ",
215 "X X X X X X X X X X k D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J J D D D J D J D D D J D J D D D D D D D D D D D D D D J D J D D D J D J D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D J D J D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ",
216 "X X X X X X X X X X k D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J D J D J D J D J J D D D D D J D D D D D J J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.T D D D D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ",
217 "X X X X X X X X X X k J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J J D J D D D J D D D D D J D J D J D D D J D D D D J D J D D D D D J D D J 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.J D J D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ",
218 "X X X X X X X X X X k D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D D J D J D D D ! &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&./ D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ",
219 "X X X X X X X X X X k D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D T ` &.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=...! D D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ",
220 "X X X X X X X X X X k D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D J D J D D D D D J D D D J D J D D D D D D D D J D ! ` =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.=.` T J D J D J D D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ",
221 "X X X X X X X X X X k J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J J D D D D D J D D D D D J D D D D D J D D J ! { =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.o./ J D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ",
222 "X X X X X X X X X X k D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D J D J D D D J D J D D D D D T ` $.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.&...! D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ",
223 "X X X X X X X X X X k D D D D D D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J J D J D D D D D D J D D J ! ..=.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.=...! J D D D D D D D D J D D D D J D J D J D J D D D D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ",
224 "X X X X X X X X X X l D D J D J J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D J D J / o.=.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.X.` T D D D D D D D D D D D D D D D D J D J D J D J D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ",
225 "X X X X X X X X X X k D J D D D D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D D J D J ` &.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.&.` J J D D D D J D D D J D D D D D J D D D J D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ",
226 "X X X X X X X X X X k D D D D J J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D D J ! X.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.&./ J D D J D D D J D J D D D J D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ",
227 "X X X X X X X X X X k D D D D D D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D T ..=.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1...J D D D D D D J D D D J D J D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ",
228 "X X X X X X X X X O k J D J D J J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J ` 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1...J D D D D J D D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ",
229 "X X X X X X X X X X k D J D D D D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D T &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.T D D D D D J D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ",
230 "X X X X X X X X X X k D D D D J J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J D D D J D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ",
231 "X X X X X X X X X X k D D D D D D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J J D D D D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D J D D D J D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ",
232 "X X X X X X X X X X l D D J D J J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D D D D J D J D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D D J D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ",
233 "X X X X X X X X X X k D J D D D D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J J D J D D D D X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J D D J D J D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ",
234 "X X X X X X X X X X k D D D D J J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D D D D D D J D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ",
235 "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J J D D D J D J D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ",
236 "X X X X X X X X X O k J D J D J J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D D D D J D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ",
237 "X X X X X X X X X X k D J D D D D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J J D J D D D J D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ",
238 "X X X X X X X X X X k D D D D J J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D D D D D D J D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ",
239 "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D J X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D J D D D J D J D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ",
240 "X X X X X X X X X X k D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D D J D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.J D D D J D D D D D J D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ",
241 "X X X X X X X X X X k J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D D J 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D J D J D J D D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ",
242 "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D D J D J D T 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D J D D D D D D D J D J D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ",
243 "X X X X X X X X X X k D J D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D J D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D J D D D D D D D J D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ",
244 "X X X X X X X X X X k D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D D J D D D D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J D D D J D J D J D D D J D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ",
245 "X X X X X X X X X X l D D D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D D J D D D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D D D D D D D D J D D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ",
246 "X X X X X X X X X X k D D J D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D D J D J D D J D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.J D D J D J D J D J D D D J D J D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ",
247 "X X X X X X X X X X k D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D D D D D D D D D D D D J D J D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ",
248 "X X X X X X X X X X k D D D D J J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.T D J J D J D J D J D J D D D D D J D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ",
249 "X X X X X X X X X X k D J D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D D J D D D J D J D J D D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ",
250 "X X X X X X X X X X k J D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D J D D D J D D D D D D D J D J D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ",
251 "X X X X X X X X X X k D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` J D D D D D J D D D J D J D D D D D J D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ",
252 "X X X X X X X X X X l D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D J D J D D D J D D D D D J D J D D D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ",
253 "X X X X X X X X X X k D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D J D D D D D J D D D D D J D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ",
254 "X X X X X X X X X X k D D J D J J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D J =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D J D J D D D J D J D D D J D J D D D J D J D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ",
255 "X X X X X X X X X X l D D J D J J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J D J D J D J J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J k X X X X X X X X X X ",
256 "X X X X X X X X X o k D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.T D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D k X X X X X X X X X X ",
257 "X X X X X X X X X X k D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D D D J D D D J ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D k X X X X X X X X X X ",
258 "X X X X X X X X X X l D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D D D J D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D k X X X X X X X X X X ",
259 "X X X X X X X X X X k D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D J D D D D D D D J ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J k X X X X X X X X X X ",
260 "X X X X X X X X X X k D J D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J J D D D J D J D J D D D J X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.{ J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D k X X X X X X X X X X ",
261 "X X X X X X X X X X k D D D D J J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D J D J D D D J D J D J D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D D k X X X X X X X X X X ",
262 "X X X X X X X X X X l D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D J D D D D D D D D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D l X X X X X X X X X X ",
263 "X X X X X X X X X X k D D J D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D D D D D J D D J D J D D T 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D J D J D D k X X X X X X X X X X ",
264 "X X X X X X X X X X k D D D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D J D J D D D D J D D D D D J ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D D D k X X X X X X X X X X ",
265 "X X X X X X X X X X k J D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D D J D J D D D D J D J D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D l X X X X X X X X X X ",
266 "X X X X X X X X X X k D J D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J J D J D D D D D D J D J D D D D D D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D J D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D D D k X X X X X X X X X X ",
267 "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D J D J D D D J D D J D D D D D D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D D D D J k X X X X X X X X X X ",
268 "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D J D D D D J D D D J D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! J D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D J D J D k X X X X X X X X X X ",
269 "X X X X X X X X X X l D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D J D D D J D J D D D D J D D D J D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D k X X X X X X X X X X ",
270 "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D D D D D D J D J D D D J D D D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D k X X X X X X X X X X ",
271 "X X X X X X X X X X k D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J J D D D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D J D D J D J D J D J D J D J D J D J J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ",
272 "X X X X X X X X X X l D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J J D D D J D J D D D J D J D D D D D D J $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D J D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ",
273 "X X X X X X X X X X k D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D J D J D D D J D D D D D J D J J D J D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ",
274 "X X X X X X X X X X k D D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D J D D D J D J D D D D D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D J D J D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ",
275 "X X X X X X X X X X k D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D J D D D J D D D J D J D D D J J D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D D J D D D D D D D J D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ",
276 "X X X X X X X X X O k J D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D J D D D J D D D D D J D D D D D D J 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D J J D D D J D J D J D D D J D J D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ",
277 "X X X X X X X X X X k D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D J D D D J D J J D D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D J D D J D J D D D J D J D J D D D J J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ",
278 "X X X X X X X X X X k D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J J D J D J D J D D D J D D D D D D D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D D D D D D D J D D D D D D D J D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ",
279 "X X X X X X X X X X k D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D J D J D J D J D J D D D D D J D D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D D D J D D D D D J D D D D D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ",
280 "X X X X X X X X X X l D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D J D J D D D J D J T 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D J D D D J D J D D D J D J D D D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ",
281 "X X X X X X X X X X k D J D D D J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D J D D D J D D D D D D D J D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D J D D D D D J D J D D D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ",
282 "X X X X X X X X X X k D D D D J D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D J D D D J D J D J D D D D D J D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D D J D J D D D D D J D D D J D J D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ",
283 "X X X X X X X X X X k D D D D D J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D J D D D D D J D J D D D J D D J ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D J D J D J D D D J D D D D D J D J J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ",
284 "X X X X X X X X X O k J D J D J D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J J D D D J D J D D D D D J D D D D J D X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D D D D D D D J D D D J D J D D D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ",
285 "X X X X X X X X X X k D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D J D J D D D J D J D D D J D J D D D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D J D J D D D J D J D D D J D J D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ",
286 "X X X X X X X X X X k D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D J D D D D D J D D D D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ",
287 "X X X X X X X X X X k D D J D D D D D J D D D D D J D D D D D J J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D J D D D D D J D D D D D J D D D D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D D D J D D D D D J D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ",
288 "X X X X X X X X X X k D D D J D J D D D J D J D D D J D J D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D J D J D D D J D J D D D J D J D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.D D J J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ",
289 "X X X X X X X X X X k J D D D D D J D J D D D J D D D D D J D J J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D D D J D J D D D J D D D D D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D D D D D J D D D D D J D J D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ",
290 "X X X X X X X X X X k D J D J D D D D D J D D D J D J D D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J J D J D D D D D J D D D J D J D J D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D J J D D D J D J D D D D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ",
291 "X X X X X X X X X X k D J D J D D J D D D J D D D J D J D D D J J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D J D J D D D J D D D D D J D J D D T 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D D D D J D J D J D D D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ",
292 "X X X X X X X X X X k D D D D D D D J D D D J D D D D D J D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D J D D D J D J D D D D D J D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D J D J D D D D D D D J D D D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ",
293 "X X X X X X X X X X l D D D J D D D D D D D D D D J D D D J D J J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D J D D D J D J D D D J D J D D D J ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D D J D J D D D D D D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ",
294 "X X X X X X X X X X k D D J D D J D J D J D J D D D J D D D D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D D J D D D D D J D D D D D J D D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J J D D D D D J D J D J D J D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ",
295 "X X X X X X X X X X k D J D D D D J D J D J D J D J D D D D D J J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D D J D D D D D D D J D D D D D D { 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D D D D D D D J D D D J D J D J D J D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ",
296 "X X X X X X X X X X k D D D D J D D D D D D D D D D J D J D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J J D D D J D J D J D D D J D J D D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.J D J D J D D D J D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ",
297 "X X X X X X X X X X k D J D J D D J D D D J D D D D D D D J D J J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D J D J D D D J D J D J D D D J D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D D J D D D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ",
298 "X X X X X X X X X X k J D D D D D D J D D D J D J D J D D D D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D J D D D D D D D J D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D J D D D J D J D D D J D D D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ",
299 "X X X X X X X X X X k D D D J D D D D J D D D D D J D J D D D J J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D J D D D J D D D J D D D J D D J D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D D D D J D J D D D J D D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ",
300 "X X X X X X X X X X l D D J D D J D D D J D J D D D D D J D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D J D D D J D D D J D D D J D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.D D J D J D D D D D J D D D J D J D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ",
301 "X X X X X X X X X X k D D D D D D J D J D D D J D J D D D J D J J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&./ T T ` &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D J D D D J D J D D D J D J D D D J D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ",
302 "X X X X X X X X X X k D D J D J D D D D J D D D D D J D D D D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J J D J D J D J D J D J D J D J D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.` J D D D D D D D ` =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D J D D D D D J D D D D D J D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ",
303 "X X X X X X X X X X l D D J D J D D D J D D D D D J D D D D D J J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.! D J D J D J D D J D D D T X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ",
304 "X X X X X X X X X o k D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.` J D D D D D D D D D J D D D J D D D ` 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D J D J D D D J D J D D D J D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ",
305 "X X X X X X X X X X k D D J D D D J D J D D D J D D D D D J D J J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.! D D D D D D D D J D D D D D D D J D J J D D ! &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D D D J D J D D D J D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ",
306 "X X X X X X X X X X l D D D J D D D D D J D D D J D J D D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.T D D D D J D D J D D D J D D J D J D D D D D D D J D J ..3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D J D J D D D D D J D D D J D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ",
307 "X X X X X X X X X X k D D D D D D J D D D J D D D J D J D D D J J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3...D D D D D D J D J D J D D D D D D J D J D D D J D D J D D D D J / 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D J D J D D D J D D D D D J D J D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ",
308 "X X X X X X X X X X k D J D J D D D J D D D J D D D D D J D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.! D J D D D J D J D D D D D D J D J D D D D D J D D D D J D D D J D D D D ! =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D D J D D D J D J D D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ",
309 "X X X X X X X X X X k D D D D J D D D D D D D D D J D D D J D J J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.{ T D D J D J D D D D D D D D D J D D D D J D J D D D J D J D D D D J D D D D D D D J o.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D J D D D J D J D D D J D J D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ",
310 "X X X X X X X X X X l D J D D D J D J D J D J D D D J D D D D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.` J D D D D D D D D D J D J D J D J D D J D D D D D J D D D D D D J D J D D J D J D D J D D J ` 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D J D D D D D J D D D D D J D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ",
311 "X X X X X X X X X X k D D J D D D J D J D J D J D J D D D D D J J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.! D J D J D J D J D D D J D D D D D D D D D D J D D D D D J D D D D D D D J D D D D D J D D D J D J D ! $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D J D D D D D D D J D D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ",
312 "X X X X X X X X X X k D D D J D D D D D D D D D D D J D J D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3...J D J D D D D D D D D D D J D D D J D J J D J D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D D J ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D J D D D J D J D J D D D J D J D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ",
313 "X X X X X X X X X X k J D D D D D J D D D J D D D D D D D J D J J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.=./ J D D D D D D D J D D D J D D D D D J D D D D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D D D D D D D J / =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D J D J D D D J D J D J D D D J D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ",
314 "X X X X X X X X X X k D J D J D D D J D D D J D J D J D D D D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D T 0.0.0.0.0.0.0.0.0.0.0.3.` J J D D D D D J D D J D D D J D D D J D J D D D J J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D J D D J D D D D D J J ` 1.0.0.0.0.0.0.0.0.0.0.0.J D D D D D J D D D D D D D J D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ",
315 "X X X X X X X X X X k D D J D J D D D J D D D D D J D J D D D J J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D 0.0.0.0.0.0.0.0.0.$.T D D J J D D D J D J D D D D D J D D D J D J D D D D D D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D J J D D D J D D D D D D ! X.0.0.0.0.0.0.0.0.3.J D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ",
316 "X X X X X X X X X X k D D D D D J D D D J D J D D D D D J D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D X.0.0.0.0.1...! D D D D D D D D D J D D D D D J D J D D D J D D D D D J D J J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D D D D D D J D D D J J D D D D D ! X.1.0.0.0.0.X.D D D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ",
317 "X X X X X X X X X X k J D J D D D J D J D D D J D J D D D J D J J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D ` ` ! J D D D D D D J D J J D J D D D J D J D D D J D J D D D J D J D D D D D D J D J D D D D D D D D D D D D D D D D D D D J D J D J D J J D J D J D J D D J D J D D D D D J ! ` / J D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ",
318 "X X X X X X X X X X k D D D J D D D D D J D D D D D J D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D J D D J D D J D D D D D D D D D D J D D D D D J D D D D D J D D D D D J J D D D D D J D J D J D J D J D J D J D J D J D D D D D D D D D D D D D D D D D D D D D D J D J D D D D D D D J J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ",
319 "X X X X X X X X X X k D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ",
320 "X X X X X X X X X X l D D J D J J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ",
321 "X X X X X X X X X X k D J D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ",
322 "X X X X X X X X X X k D D D D J J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ",
323 "X X X X X X X X X X k D D D D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ",
324 "X X X X X X X X X O k J D J D J J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ",
325 "X X X X X X X X X X k D J D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ",
326 "X X X X X X X X X X k D D D D J J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ",
327 "X X X X X X X X X X k D D D D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ",
328 "X X X X X X X X X X l D D J D J J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ",
329 "X X X X X X X X X X k D J D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ",
330 "X X X X X X X X X X k D D D D J J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ",
331 "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ",
332 "X X X X X X X X X O k J D J D J J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ",
333 "X X X X X X X X X X k D J D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ",
334 "X X X X X X X X X X k D D D D J J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ",
335 "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ",
336 "X X X X X X X X X X k D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ",
337 "X X X X X X X X X X k J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ",
338 "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ",
339 "X X X X X X X X X X k D J D J D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ",
340 "X X X X X X X X X X k D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ",
341 "X X X X X X X X X X l D D D J D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ",
342 "X X X X X X X X X X k D D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ",
343 "X X X X X X X X X X k D J D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ",
344 "X X X X X X X X X X k D D D D J J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ",
345 "X X X X X X X X X X k D J D J D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ",
346 "X X X X X X X X X X k J D D D D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ",
347 "X X X X X X X X X X k D D D J D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ",
348 "X X X X X X X X X X l D D J D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ",
349 "X X X X X X X X X X k D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ",
350 "X X X X X X X X X X k D D J D J J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ",
351 "X X X X X X X X X X k D D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J D D D D D D D D D D J D D D D D J D l o X X X X X X X X X ",
352 "X X X X X X X X X X k J D J D J D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J J D J D D D J D J D D D D k X X X X X X X X X X ",
353 "X X X X X X X X X X s D J D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D J D D D D D D J D D D D D J D J D s X X X X X X X X X X ",
354 "X X X X X X X X X X i J D D D J D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D J D D D J J D D D J D J D D D D D D i X X X X X X X X X X ",
355 "X X X X X X X X X X w D D D J D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D J D D D D D D D D D D J D J D J D D D w X X X X X X X X X X ",
356 "X X X X X X X X X X 2 D D J D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D D J D J J D J D D D D D D D J D D 2 X X X X X X X X X X ",
357 "X X X X X X X X X X $ D D D D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D J D J D D D D D D J D J D D D D D D D $ O X X X X X X X X X ",
358 "X X X X X X X X X X O c D J D J D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D D D D D J J D D D D D J D J D J D z X X X X X X X X X X X ",
359 "X X X X X X X X X X X 7 D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D J D D D D D D D D D D D J D D D 6 X X X X X X X X X X X ",
360 "X X X X X X X X X X X $ S D D J D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D J D J D D D J D J D J J D J D D D D Z $ X X X X X X X X X X X ",
361 "X X X X X X X X X X X X y D J D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D J D D D J D J D J D D D D D D J D D D t X X X X X X X X X X X X ",
362 "X X X X X X X X X X X X - C D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D J D D D D D D D J J D D D D J C $ X X X X X X X X X X X X ",
363 "X X X X X X X X X X X X X 6 D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D J D D D J D D D J D D D D D D J 4 X X X X X X X X X X X X X ",
364 "X X X X X X X X X X X X X X p D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D D D J D D D J D D D J D D D g X X X X X X X X X X X X X X ",
365 "X X X X X X X X X X X X X X $ m D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D v $ X X X X X X X X X X X X X o ",
366 "O X X X X X X X X X X X X X X - V D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D J D J D J D J D J D J D V ; X X X X X X X X X X X X X X X ",
367 "q.X X X X X X X X X X X X X X X , v D J D D D J D J D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D m < X X X X X X X X X X X X X X X q.",
368 "q.X X X X X X X X X X X X X X X X $ s D J D D D D D J D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D J D J D J D J D J D J D D s # X X X X X X X X X X X X X X X X q.",
369 "q.O X X X X X X X X X X X X X X X X O 4 C D D J D D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D D J D D D J D D D C 4 O X X X X X X X X X X X X X X X X X q.",
370 "q.q.X X X X X X X X X X X X X X X X X X $ y S D J D J D J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D J D D D J D D D D S y $ X X X X X X X X X X X X X X X X X X q.q.",
371 "q.q.X X X X X X X X X X X X X X X X X X X X $ 7 z D D D D D D D D D J D D D D D D D J D D D D D D J D D D J D D J D D D D D D D D D D D J D D D D D D D D J D D D D J D D D D D D D J D D D D D D J D D D J D D J D D D D D D D D D D D J D D D D D D D D J D D D D J D D D D D D D J D D D D D D J D D D J D D J D D D D D D D D D D D D D D D D D D D D J D D D D J D D D J D D D J D D D D D D J D D D J D D J D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D z 6 $ X X X X X X X X X X X X X X X X X X X X q.q.",
372 "q.q.q.X X X X X X X X X X X X X X X X X X X X X X $ 2 0 i s h h h h h h h h j h h h h h h h j h h h h h h h h h h h h h j h h j h h j h h h h h h j h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h h j h h j h h j h h h h h h j h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h h j h h j h h j h h h j h h j h h h h h h h h h h h h h h h h h h h h j h h h h h h h h h h h h h j h h j h h j h j h h h h j h h h h h h h h s i 0 2 $ X O X X X X X X X X X X X X X X X X X X X X q.q.q.",
373 "q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.",
374 "q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.",
375 "q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.",
376 "q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.",
377 "q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.",
378 "q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.",
379 "q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.",
380 "q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.",
381 "q.q.q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.q.q.",
382 "q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q."
383 };
+0
-84
source/misc/icons/blockattack32.xpm less more
0 /* XPM */
1 static char *blockattack32[] = {
2 /* columns rows colors chars-per-pixel */
3 "32 32 46 1 ",
4 " c #644600",
5 ". c #654600",
6 "X c #906C00",
7 "o c #916D00",
8 "O c #C99D00",
9 "+ c #C99E00",
10 "@ c #D4A700",
11 "# c #D6A900",
12 "$ c #FECC00",
13 "% c #FFCD00",
14 "& c #FFCE00",
15 "* c #FFCF00",
16 "= c #FFD000",
17 "- c #FED200",
18 "; c #FED400",
19 ": c #FED700",
20 "> c #FDD800",
21 ", c #FED800",
22 "< c #FDDC00",
23 "1 c #FDDD00",
24 "2 c #FDDE00",
25 "3 c #FCDF00",
26 "4 c #FBE700",
27 "5 c #FCE500",
28 "6 c #FCE600",
29 "7 c #FBE800",
30 "8 c #FBE900",
31 "9 c #FBEA00",
32 "0 c #FBEB00",
33 "q c #FBEC00",
34 "w c #FAED00",
35 "e c #FBED00",
36 "r c #FAF000",
37 "t c #FAF100",
38 "y c #FAF200",
39 "u c #F9F400",
40 "i c #F9F500",
41 "p c #FAF400",
42 "a c #F9F800",
43 "s c #F9F900",
44 "d c #F9FA00",
45 "f c #F9FB00",
46 "g c #F8FD00",
47 "h c #F8FE00",
48 "j c #F8FF00",
49 "k c None",
50 /* pixels */
51 "k..............................k",
52 "..o+########################+X..",
53 ".o%%%%%%%%%%%%%%%%%%%%%%%%%%%%X.",
54 ".+%%%%%%%%%%%%%%%%%%%%%%%%%%%%+.",
55 ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.",
56 ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.",
57 ".@%%%%%%%%%%%%%,,%%%%%%%%%%%%%@.",
58 ".@%%%%%%%%%%%%-dd-%%%%%%%%%%%%@.",
59 ".@%%%%%%%%%%%%0hh0%%%%%%%%%%%%@.",
60 ".@%%%%%%%%%%%,hhhh,%%%%%%%%%%%@.",
61 ".@%%%%%%%%%%%ihhhhi%%%%%%%%%%%@.",
62 ".@%%%%%%%%-3thhhhhhq3-%%%%%%%%@.",
63 ".@%%%%%30dhhhhhhhhhhhhdq3%%%%%@.",
64 ".@%%%%%dhhhhhhhhhhhhhhhhd%%%%%@.",
65 ".@%%%%%:hhhhhhhhhhhhhhhh:%%%%%@.",
66 ".@%%%%%%3hhhhhhhhhhhhhh3%%%%%%@.",
67 ".@%%%%%%%5hhhhhhhhhhhh5%%%%%%%#.",
68 ".@%%%%%%%%thhhhhhhhhht%%%%%%%%@.",
69 ".@%%%%%%%%5hhhhhhhhhh5%%%%%%%%@.",
70 ".@%%%%%%%%9hhhhhhhhhh0%%%%%%%%@.",
71 ".@%%%%%%%%qjhhhhhhhhhq%%%%%%%%@.",
72 ".@%%%%%%%%tjhhhhhhhhht%%%%%%%%@.",
73 ".@%%%%%%%%ihht3%%3thht%%%%%%%%@.",
74 ".@%%%%%%%%04-%$%%%%-00%%%%%%%%@.",
75 ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.",
76 ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.",
77 ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.",
78 ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.",
79 ".+%%%%%%%%%%%%%%%%%%%%%%%%%%%%O ",
80 ".X%%%%%%%%%%%%%%%%%%%%%%%%%%%%X.",
81 "..o+########################+o..",
82 "k..............................k"
83 };
+0
-108
source/misc/icons/blockattack48.xpm less more
0 /* XPM */
1 static char *blockattack48[] = {
2 /* columns rows colors chars-per-pixel */
3 "48 48 54 1 ",
4 " c #654600",
5 ". c #654700",
6 "X c #6C4C00",
7 "o c #6D4C00",
8 "O c #6C4D00",
9 "+ c #6F4F00",
10 "@ c #715100",
11 "# c #8D6A00",
12 "$ c #8E6A00",
13 "% c #8F6A00",
14 "& c #8F6B00",
15 "* c #E5B600",
16 "= c #E6B700",
17 "- c #E7B800",
18 "; c #FECC00",
19 ": c #FFCD00",
20 "> c #FFCE00",
21 ", c #FFCF00",
22 "< c #FFD000",
23 "1 c #FED100",
24 "2 c #FED200",
25 "3 c #FED300",
26 "4 c #FED400",
27 "5 c #FED500",
28 "6 c #FDD800",
29 "7 c #FDD900",
30 "8 c #FED800",
31 "9 c #FDDA00",
32 "0 c #FDDC00",
33 "q c #FDDE00",
34 "w c #FDDF00",
35 "e c #FCE000",
36 "r c #FCE200",
37 "t c #FCE300",
38 "y c #FBE600",
39 "u c #FBE700",
40 "i c #FCE400",
41 "p c #FCE600",
42 "a c #FBE800",
43 "s c #FBE900",
44 "d c #FBEA00",
45 "f c #FBEB00",
46 "g c #FAEE00",
47 "h c #FAEF00",
48 "j c #FAF000",
49 "k c #FAF100",
50 "l c #F9F500",
51 "z c #FAF400",
52 "x c #F9F600",
53 "c c #F9F800",
54 "v c #F8FC00",
55 "b c #F8FE00",
56 "n c #F8FF00",
57 "m c None",
58 /* pixels */
59 "mm mm",
60 "m O@O++++++++++++++++++++++++++++++++++O m",
61 " &-<;;;<;;;<;<;;;;;<;;;<;<;;;;;<;;;<;<;<;-& ",
62 " &;;;;;;;<;;;;;<;<;;;<;;;;;<;<;;;<;;;;;;;;;;& ",
63 " -;;;;;;<;<;;;;;;;<;;;<;;;;;<;;;<;<;;;;;<;;;- ",
64 " O<;;<;<;;;;<;<;<;;;<;;;<;<;;;<;;;;;<;<;;;<;<;O ",
65 " @<;<;;;;<;;;;;<;<;<;<;<;;;<;;;;;<;;;;;<;;;;;<@ ",
66 " @;;;;;<;;<;<;;;;;;;;;;;<;;;<;<;;;<;<;;;<;<;;;@ ",
67 " @;;;<;<;<;;;<;<;<;<;<;;;;;;;;;<;<;<;;;<;;;;;;@ ",
68 " @;;;;;;;;<;;;;;;;;;;;;55;<;<;;;;;;;<;;;<;<;<;@ ",
69 ".@<;;<;;;;;;;<;;;<;;;<;cc<;;;<;<;<;;;<;<;;;<;;@ ",
70 ".@;;;;<;<;<;;;<;;;<;;;fnnf;;;;;;;;<;;;;;<;;;<;@ ",
71 ".@;<;;;<;;;<;;;<;;;<;9nnnn9;;;;<;<;<;;;;;<;;;<@ ",
72 " @;;<;;;<;;;<;;;<;;;;xnnnnx;<;;;;;;;<;<;;;<;;;@ ",
73 " @;<;<;<;<;<;<;<;;;<rnnnnnnr;<;<;<;;;;;<;;;;;<@ ",
74 " @;;;;;;;;;;;;;;;<;<nnnnnnnn5;;;;;<;<;;;<;<;;;@ ",
75 ".@;<;<;<<;;;;<;;<;;knnnnnnnnk;;;;;;;;<;;<;<;;<@ ",
76 ".@;;;;;;;;;;;;;<qscnnnnnnnnnncfq<;<;;;;<;;;;;;@ ",
77 " @;;;<;;;;;<rfcnnnnnnnnnnnnnnnnnnxfq<;;;;;<;;<@ ",
78 " @<;;;<;;<pnnnnnnnnnnnnnnnnnnnnnnnnnnp;;;<;;;;@ ",
79 " @;;;;;;;;qnnnnnnnnnnnnnnnnnnnnnnnnnnq<;<;;;<;@ ",
80 " @<;<;<;;<;pnnnnnnnnnnnnnnnnnnnnnnnnp;;;;;;<;;@.",
81 " @;;;;;<;<;;hnnnnnnnnnnnnnnnnnnnnnnk;;<;<;<;<;@.",
82 " @<;<;;;;;;;;xnnnnnnnnnnnnnnnnnnnnx<;;;;;;;;;;@.",
83 " @;<;<;;;<;<;<xnnnnnnnnnnnnnnnnnnx<;;;<;;;;;;;@ ",
84 " @;;;;<;;;;;<;5nnnnnnnnnnnnnnnnnn5;;;<;;<;<;<;@ ",
85 " @;<;;;;;<;;;<;rnnnnnnnnnnnnnnnnr;<;;;;;;;;<;;@ ",
86 " @;;<;<;;;<;;;;9nnnnnnnnnnnnnnnn9;;;;<;<<;;;<;@ ",
87 " @;;;<;;;<;<;;;9nnnnnnnnnnnnnnnn9;;;;;;;;<;;;<@ ",
88 " @<;;;<;;;;;<;;qnnnnnnnnnnnnnnnnq;;<<;<;;;<;;;@ ",
89 " @;<;;;;;<;;;;;pnnnnnnnnnnnnnnnnr;;;;;;<;;;;;<@ ",
90 " @;;<;<;;;<;<;;pnnnnnnnnnnnnnnnnf;<;<;;;<;<;;;@ ",
91 " @;;;<;<;;;<;<;fnnnnnnnxxnnnnnnnf;;;;<;<;;;<;<@ ",
92 " @<;;;;;<;;;;;;knnnncf5<;5pnnnnnh;;;;;;;<;;;;;@ ",
93 " @;;;<;;;<;<;;;knnxp<;<;<;;<rxnnk<;<;<;;;<;<;;@ ",
94 " @<;;;<;;;;;;;;rp9;;;;;;;;;;;;9fr;;;;;<;;;;;<;@ ",
95 " @;<;;;<<;<;;;;;;<;<;;;;;;<;;;<;;;;<;;;<;;;;;<@ ",
96 " @;;<;;;;;;;;<;<;;;;<;<;;<;;;<;;;;;;<;;;<;<;;;@ ",
97 " @;<;<;<;;<;<;;;;<;;;;;<;;;;;;;;;<;<;<;<;;;<;;@ ",
98 " @;;;;;;;<;;;;;<;;<;<;;;;<;<;<;<;;;;;;;;<;;;<;@ ",
99 ".@;;<;<;;;<;;;;;;<;<;;;<;<;<;<;<;;;;;;;;;;;<;<@ ",
100 ".@;<;;;;;<;;;<;<;;;;<;;;;;;;;;;;<;<;<;<;<;;;;;@ ",
101 ".O;;;;<;;;;;<;;;;<;;;<;<;<;;;<;;;;;<;;;<;<;<;;O ",
102 " -;;<;;;<;<;;;<;;<;;;;;;;<;;;<;<;;;<;;;;;;;;= ",
103 " &;;;;;;;;;;;;;;<;<;;;;;;;<;;;;;<;;;<;<;;;;;& ",
104 " &-;;<;<;;;<;<;;;;<;<;<;;;;;<;;;<;;;;;<;;=&. .",
105 "m O++@+++++@+++++++++++@+++@O++++++++++O m",
106 "mm . .mm"
107 };
+0
-134
source/misc/icons/blockattack64.xpm less more
0 /* XPM */
1 static char *blockattack64[] = {
2 /* columns rows colors chars-per-pixel */
3 "64 64 64 1 ",
4 " c #654500",
5 ". c #644600",
6 "X c #654600",
7 "o c #694A00",
8 "O c #6A4A00",
9 "+ c #8F6A00",
10 "@ c #8F6B00",
11 "# c #906C00",
12 "$ c #936F00",
13 "% c #957000",
14 "& c #967100",
15 "* c #A57E00",
16 "= c #A67F00",
17 "- c #A78000",
18 "; c #A98200",
19 ": c #AD8500",
20 "> c #EFBE00",
21 ", c #EFBF00",
22 "< c #F0C000",
23 "1 c #FECC00",
24 "2 c #FFCD00",
25 "3 c #FFCE00",
26 "4 c #FFCF00",
27 "5 c #FFD000",
28 "6 c #FED100",
29 "7 c #FED200",
30 "8 c #FED300",
31 "9 c #FED400",
32 "0 c #FED600",
33 "q c #FED700",
34 "w c #FDD800",
35 "e c #FDD900",
36 "r c #FDDA00",
37 "t c #FDDB00",
38 "y c #FDDC00",
39 "u c #FDDD00",
40 "i c #FDDE00",
41 "p c #FCE100",
42 "a c #FCE200",
43 "s c #FCE300",
44 "d c #FBE600",
45 "f c #FBE700",
46 "g c #FCE400",
47 "h c #FCE500",
48 "j c #FCE600",
49 "k c #FBE800",
50 "l c #FBE900",
51 "z c #FBEA00",
52 "x c #FBEB00",
53 "c c #FAEF00",
54 "v c #FAF000",
55 "b c #FAF100",
56 "n c #FAF200",
57 "m c #F9F400",
58 "M c #F9F500",
59 "N c #FAF400",
60 "B c #F9F600",
61 "V c #F9F700",
62 "C c #F9F900",
63 "Z c #F9FA00",
64 "A c #F8FD00",
65 "S c #F8FE00",
66 "D c #F8FF00",
67 "F c None",
68 /* pixels */
69 "FFF...XXXX...XXX...XXX...XXX...XXX...XXX...XXX...XXX...XXXXXXFFF",
70 "FF....XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXXX.XXFF",
71 "FX...O#=::::::::::::::::::::::::::::::::::::::::::::::::;#O.XXXF",
72 ".XX.&<2222222222222222222222222222222222222222222222222222,$XXXX",
73 "XX.&22222222222222222222222222222222222222222222222222222221&..X",
74 "XXO<22222222222222222222222222222222222222222222222222222222,OXX",
75 "XX#2222222222222222222222222222222222222222222222222222222221#XX",
76 "XX=2222222222222222222222222222222222222222222222222222222222=XX",
77 "..;2222222222222222222222222222222222222222222222222222222222;..",
78 "..;2222222222222222222222222222222222222222222222222222222222;..",
79 ".X;2222222222222222222222222222222222222222222222222222222222;.X",
80 "XX;2222222222222222222222222222222222222222222222222222222222;XX",
81 "XX;2222222222222222222222222222272222222222222222222222222222;..",
82 "XX;2222222222222222222222222222MM2222222222222222222222222222;..",
83 "..;222222222222222222222222222kDDk222222222222222222222222222;.X",
84 "..;22222222222222222222222222tDDDDt22222222222222222222222222;XX",
85 ".X;22222222222222222222222227MDDDDM22222222222222222222222222;..",
86 "XX;2222222222222222222222222gDDDDDDg2222222222222222222222222;..",
87 "XX;2222222222222222222222229DDDDDDDD7222222222222222222222222;.X",
88 "XX;222222222222222222222222xDDDDDDDDx222222222222222222222222;XX",
89 "..;22222222222222222222222tDDDDDDDDDDt22222222222222222222222;..",
90 "..;22222222222222222222227CDDDDDDDDDDC72222222222222222222222;..",
91 ".X;2222222222222222222227xDDDDDDDDDDDDx7222222222222222222222;.X",
92 "XX;222222222222222227ykMDDDDDDDDDDDDDDDDMky722222222222222222;XX",
93 "XX;22222222222227yxCDDDDDDDDDDDDDDDDDDDDDDDDMxy72222222222222;..",
94 "XX;22222222222gMDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDMs22222222222;..",
95 "..;22222222229DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD72222222222;.X",
96 "..;22222222222zDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDk22222222222;XX",
97 ".X;222222222222MDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDM222222222222;..",
98 "XX;2222222222227CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC7222222222222;..",
99 "XX;22222222222229DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD92222222222222;.X",
100 "XX;22222222222222yDDDDDDDDDDDDDDDDDDDDDDDDDDDDy22222222222222;XX",
101 "..;222222222222222aDDDDDDDDDDDDDDDDDDDDDDDDDDa222222222222222;..",
102 "..;2222222222222222kDDDDDDDDDDDDDDDDDDDDDDDDg2222222222222222-..",
103 "..;22222222222222222xDDDDDDDDDDDDDDDDDDDDDDb22222222222222222;..",
104 "..;222222222222222227DDDDDDDDDDDDDDDDDDDDDD722222222222222222;.O",
105 "O.;222222222222222222DDDDDDDDDDDDDDDDDDDDDD222222222222222222;..",
106 "..;222222222222222221DDDDDDDDDDDDDDDDDDDDDD122222222222222222;..",
107 "..;222222222222222227DDDDDDDDDDDDDDDDDDDDDD722222222222222222;.X",
108 "..;222222222222222229DDDDDDDDDDDDDDDDDDDDDD922222222222222222;XX",
109 ".X;22222222222222222tDDDDDDDDDDDDDDDDDDDDDDt22222222222222222;..",
110 "XX;22222222222222222yDDDDDDDDDDDDDDDDDDDDDDy22222222222222222;..",
111 "XX;22222222222222222aDDDDDDDDDDDDDDDDDDDDDDa22222222222222222;.X",
112 "XX;22222222222222222aDDDDDDDDDDxxDDDDDDDDDDa22222222222222222;XX",
113 "..;22222222222222222gDDDDDDDMs2227aCDDDDDDDg22222222222222222;..",
114 "..;22222222222222222kDDDDDxy22222222yxDDDDDk22222222222222222;..",
115 ".X;22222222222222222kDDCg92222222222227gCDDg22222222222222222;.X",
116 "XX;222222222222222229gt222222222222222222tgt22222222222222222;XX",
117 "XX;2222222222222222222222222222222222222222222222222222222222;..",
118 "XX;2222222222222222222222222222222222222222222222222222222222;..",
119 "..;2222222222222222222222222222222222222222222222222222222222;.X",
120 "..;2222222222222222222222222222222222222222222222222222222222;XX",
121 ".X;2222222222222222222222222222222222222222222222222222222222;..",
122 "XX;2222222222222222222222222222222222222222222222222222222222;..",
123 "XX;2222222222222222222222222222222222222222222222222222222222;.X",
124 "XX;2222222222222222222222222222222222222222222222222222222222;XX",
125 "..=2222222222222222222222222222222222222222222222222222222222=..",
126 "..#2222222222222222222222222222222222222222222222222222222222+..",
127 "XXO,22222222222222222222222222222222222222222222222222222222,O..",
128 "XX.$12222222222222222222222222222222222222222222222222222222$XX.",
129 "XXXX&,2222222222222222222222222222222222222222222222222211,$.XXX",
130 "FXXX.O#=::::::::::::::::::::::::::::::::::::::::::::::::=#OXXXXF",
131 "FFXXXXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXXFF",
132 "FFFXXXX...XXX...XXX...XXX...XXX...XXX...XXX...XXX...XXXXXXXXXFFF"
133 };
44 # Move to script's directory
55 cd "`dirname "$0"`"
66
7 # Get the kernel/architecture information
8 ARCH=`uname -m`
9
10 # Set the libpath and pick the proper binary
11 if [ "$ARCH" == "x86_64" ]; then
12 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./x86_64/
13 ./x86_64/blockattack "$@"
14 else
15 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./x86/
16 ./x86/blockattack "$@"
17 fi
7 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./x86_64/
8 ./x86_64/blockattack "$@"
99
1010 rm -rf staging
1111 mkdir -p staging/$ARCHIVENAME/x86_64
12 mkdir -p staging/$ARCHIVENAME/x86
1312 mkdir -p staging/$ARCHIVENAME/docs
13 mkdir -p staging/$ARCHIVENAME/mods
1414 cp blockattack_standalone_launcher staging/$ARCHIVENAME/blockattack
1515 cp README.txt staging/$ARCHIVENAME/README
1616 chmod +x staging/$ARCHIVENAME/blockattack
1717
1818 cd ../../..
1919
20 docker build -f source/misc/docker/Dockerfile.Ubuntu12.04build_Standalone . -t blockattack_test
20 docker build -f source/misc/docker/Dockerfile.Ubuntu16.04build_Standalone . -t blockattack_test
2121
2222 echo Copying to: $(pwd)/source/misc/standalone/staging/$ARCHIVENAME
2323
3232
3333 docker run -it --rm -v $(pwd)/source/misc/standalone/staging/$ARCHIVENAME/:/output blockattack_test /bin/bash -c "cp -r /staging/blockattack-game/source/misc/translation/locale /output/ && \
3434 cp /staging/blockattack-game/Game/blockattack.data /output/ && \
35 cp /staging/blockattack-game/Game/mods/1.3.0.bricks.data /output/mods/ && \
3536 cp -r /staging/blockattack-game/source/misc/icons /output/ && \
3637 cp /staging/blockattack-game/COPYING /output/ && \
3738 cp /staging/blockattack-game/man/blockattack.man /output/docs/ && \
3839 cp /staging/blockattack-game/README.md /output/docs/README_ORG.md && \
3940 chown -R 1000 /output"
4041
41 scp source/misc/standalone/compile_requirements.sh blockattack_build:/
42 scp source/misc/standalone/install_requirements.sh blockattack_build:/
43 ssh blockattack_build /install_requirements.sh
44 ssh blockattack_build /compile_requirements.sh
45 ssh blockattack_build rm -rf /staging/blockattack-game
46 scp -r . blockattack_build:/staging/blockattack-game
47 ssh blockattack_build rm -f /staging/blockattack-game/CMakeCache.txt
48
49 ssh blockattack_build "BLOCKATTACK_VERSION=2.2.0-SNAPSHOT && cd /staging/blockattack-game && \
50 ./packdata.sh && \
51 cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/ && \
52 cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/sago/ && \
53 cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/ && \
54 cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/sago/ && \
55 cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make clean && make"
56
57 OUTPUT=$(pwd)/source/misc/standalone/staging/$ARCHIVENAME/
58
59 scp blockattack_build:/staging/blockattack-game/Game/blockattack $OUTPUT/x86/ && \
60 scp blockattack_build:/usr/local/lib/libSDL2-2.0.so.0 $OUTPUT/x86/ && \
61 scp blockattack_build:/usr/local/lib/libphysfs.so.1 $OUTPUT/x86/ && \
62 scp blockattack_build:/usr/local/lib/libSDL2_mixer-2.0.so.0 $OUTPUT/x86/ && \
63 scp blockattack_build:/usr/local/lib/libSDL2_ttf-2.0.so.0 $OUTPUT/x86/ && \
64 scp blockattack_build:/usr/lib/i386-linux-gnu/libfreetype.so.6 $OUTPUT/x86/ && \
65 scp blockattack_build:/lib/i386-linux-gnu/libpng12.so.0 $OUTPUT/x86/ && \
66 scp blockattack_build:/usr/local/lib/libSDL2_image-2.0.so.0 $OUTPUT/x86/
67
6842 exit 0
69
70 docker build -f source/misc/docker/Dockerfile.Ubuntu12.04build_Standalone32 . -t blockattack_test
71
72 docker run -it --rm -v $(pwd)/source/misc/standalone/staging/$ARCHIVENAME/:/output blockattack_test /bin/bash -c "cp /staging/blockattack-game/Game/blockattack /output/x86/ && \
73 cp /usr/local/lib/libSDL2-2.0.so.0 /output/x86/ && \
74 cp /usr/local/lib/libphysfs.so.1 /output/x86/ && \
75 cp /usr/local/lib/libSDL2_mixer-2.0.so.0 /output/x86/ && \
76 cp /usr/local/lib/libSDL2_ttf-2.0.so.0 /output/x86/ && \
77 cp /usr/lib/i386-linux-gnu/libfreetype.so.6 /output/x86/ && \
78 cp /lib/i386-linux-gnu/libpng12.so.0 /output/x86/ && \
79 cp /usr/local/lib/libSDL2_image-2.0.so.0 /output/x86/"
80
81 cd source/misc/standalone/staging/
82 tar -cvjSf "$ARCHIVENAME.tar.bz2" "$ARCHIVENAME"
11 set -e
22 set -x
33
4 mkdir -p /staging/deps && cd /staging/deps && curl https://libsdl.org/release/SDL2-2.0.12.tar.gz | tar -zx && cd SDL2-2.0.12 && ls -lrt
5 cd /staging/deps/SDL2-2.0.12 && ./configure --enable-shared --enable-static && make && make install
4 mkdir -p /staging/deps && cd /staging/deps && curl https://libsdl.org/release/SDL2-2.0.16.tar.gz | tar -zx && cd SDL2-2.0.16 && ls -lrt
5 cd /staging/deps/SDL2-2.0.16 && ./configure --enable-shared --enable-static && make && make install
66
77 #https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.5.tar.gz
88 mkdir -p /staging/deps && cd /staging/deps && curl https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.5.tar.gz | tar -zx && cd SDL2_image-2.0.5 && ls -lrt
66 msgstr ""
77 "Project-Id-Version: \n"
88 "Report-Msgid-Bugs-To: \n"
9 "POT-Creation-Date: 2020-06-27 14:06+0200\n"
10 "PO-Revision-Date: 2020-06-27 14:08+0200\n"
9 "POT-Creation-Date: 2021-10-18 21:20+0200\n"
10 "PO-Revision-Date: 2021-10-18 21:21+0200\n"
1111 "Last-Translator: Poul Sander <poul@poulsander.com>\n"
1212 "Language-Team: \n"
1313 "Language: da\n"
1414 "MIME-Version: 1.0\n"
1515 "Content-Type: text/plain; charset=UTF-8\n"
1616 "Content-Transfer-Encoding: 8bit\n"
17 "X-Generator: Poedit 2.0.6\n"
17 "X-Generator: Poedit 2.3\n"
1818 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
1919
20 #: ../../code/DialogBox.cpp:94
20 #: ../../code/DialogBox.cpp:131
2121 msgid "Enter to accept"
2222 msgstr "Bekræft med Enter"
2323
24 #: ../../code/DialogBox.cpp:95
24 #: ../../code/DialogBox.cpp:132
2525 msgid "Esc to cancel"
2626 msgstr "Annuller med Esc"
2727
28 #: ../../code/HelpAboutState.cpp:68
28 #: ../../code/HelpAboutState.cpp:62
2929 msgid "No audio driver"
3030 msgstr "Ingen lyd driver"
3131
32 #: ../../code/HelpAboutState.cpp:71
32 #: ../../code/HelpAboutState.cpp:65
3333 msgid "Name:"
3434 msgstr "Navn:"
3535
36 #: ../../code/HelpAboutState.cpp:71 ../../code/main.cpp:329
36 #: ../../code/HelpAboutState.cpp:65 ../../code/main.cpp:337
3737 msgid "Block Attack - Rise of the Blocks"
3838 msgstr "Block Attack - Blokkenes opstand"
3939
40 #: ../../code/HelpAboutState.cpp:72
40 #: ../../code/HelpAboutState.cpp:66
4141 msgid "Original name:"
4242 msgstr "Originalt navn:"
4343
44 #: ../../code/HelpAboutState.cpp:73
44 #: ../../code/HelpAboutState.cpp:67
4545 msgid "Version:"
4646 msgstr "Version:"
4747
48 #: ../../code/HelpAboutState.cpp:74
48 #: ../../code/HelpAboutState.cpp:68
4949 msgid "Homepage:"
5050 msgstr "Hjemmeside:"
5151
52 #: ../../code/HelpAboutState.cpp:75
52 #: ../../code/HelpAboutState.cpp:69
5353 msgid "Github page:"
5454 msgstr "Github side:"
5555
56 #: ../../code/HelpAboutState.cpp:76
56 #: ../../code/HelpAboutState.cpp:70
5757 msgid "SDL render:"
5858 msgstr "SDL render:"
5959
60 #: ../../code/HelpAboutState.cpp:77
60 #: ../../code/HelpAboutState.cpp:71
6161 msgid "SDL audio driver:"
6262 msgstr "SDL lyd driver:"
6363
64 #: ../../code/HelpAboutState.cpp:78
64 #: ../../code/HelpAboutState.cpp:72
6565 msgid "SDL compiled version:"
6666 msgstr "SDL kompileret version:"
6767
68 #: ../../code/HelpAboutState.cpp:79
68 #: ../../code/HelpAboutState.cpp:73
6969 msgid "SDL linked version:"
7070 msgstr "SDL lænket version:"
7171
72 #: ../../code/HelpAboutState.cpp:80
72 #: ../../code/HelpAboutState.cpp:74
7373 msgid "Save folder:"
7474 msgstr "Mappe til gemte spil:"
7575
76 #: ../../code/HelpAboutState.cpp:81
76 #: ../../code/HelpAboutState.cpp:75
7777 msgid "Locale:"
7878 msgstr "Lokalitet:"
7979
80 #: ../../code/HelpAboutState.cpp:82 ../../code/menudef.cpp:414
80 #: ../../code/HelpAboutState.cpp:76 ../../code/menudef.cpp:549
8181 msgid "About"
8282 msgstr "Om"
8383
84 #: ../../code/HelpGamepadState.cpp:52
85 msgid "Move cursor"
86 msgstr "Flyt markøren"
87
88 #: ../../code/HelpGamepadState.cpp:53
89 msgid "Push line"
90 msgstr "Skub linje"
91
92 #: ../../code/HelpGamepadState.cpp:54
93 msgid "Back (Menu)"
94 msgstr "Tilbage (Menu)"
95
96 #: ../../code/HelpGamepadState.cpp:55
97 msgid "Switch"
98 msgstr "Skift"
99
100 #: ../../code/HelpGamepadState.cpp:56
101 msgid "Confirm"
102 msgstr "Bekræft"
103
104 #: ../../code/HelpGamepadState.cpp:57
84 #: ../../code/HelpGamepadState.cpp:35
10585 msgid ""
10686 "Only SDL2 compatible controllers are supported!\n"
10787 "Supported controllers: "
10989 "Kun SDL2 kompatible kontrollere er understøttet!\n"
11090 "Understøttede kontrollere: "
11191
92 #: ../../code/HelpGamepadState.cpp:47
93 msgid "Move cursor"
94 msgstr "Flyt markøren"
95
96 #: ../../code/HelpGamepadState.cpp:48
97 msgid "Push line"
98 msgstr "Skub linje"
99
100 #: ../../code/HelpGamepadState.cpp:49
101 msgid "Back (Menu)"
102 msgstr "Tilbage (Menu)"
103
104 #: ../../code/HelpGamepadState.cpp:50
105 msgid "Switch"
106 msgstr "Skift"
107
108 #: ../../code/HelpGamepadState.cpp:51
109 msgid "Confirm"
110 msgstr "Bekræft"
111
112112 #: ../../code/HelpHowtoState.cpp:125
113113 msgid "Switch block horizontally"
114114 msgstr "Skift blokke horisontalt"
129129 msgid "Create a chain effect"
130130 msgstr "Lav en kæde effekt"
131131
132 #: ../../code/levelselect.cpp:86
132 #: ../../code/levelselect.cpp:84
133133 msgid "Select Puzzle"
134134 msgstr "Vælg gåde"
135135
136 #: ../../code/levelselect.cpp:89
136 #: ../../code/levelselect.cpp:87
137137 msgid "Stage Clear Level Select"
138138 msgstr "Vælg Stage Clear-bane"
139139
140 #: ../../code/levelselect.cpp:195
140 #: ../../code/levelselect.cpp:193
141141 #, c-format
142142 msgid "Best score: %i"
143143 msgstr "Bedste resultat: %i"
144144
145 #: ../../code/levelselect.cpp:196
145 #: ../../code/levelselect.cpp:194
146146 #, c-format
147147 msgid "Time used: %s"
148148 msgstr "Tid brugt: %s"
149149
150 #: ../../code/levelselect.cpp:199
150 #: ../../code/levelselect.cpp:197
151151 #, c-format
152152 msgid "Time used: %d : %02d"
153153 msgstr "Tid brugt: %d : %02d"
154154
155 #: ../../code/levelselect.cpp:204
155 #: ../../code/levelselect.cpp:202
156156 #, c-format
157157 msgid "Total score: %i in %i:%02i"
158158 msgstr "Sammenlagt: %i på %i:%02i"
159159
160 #: ../../code/main.cpp:158
160 #: ../../code/main.cpp:164
161161 msgid "GAME OVER"
162162 msgstr "SPILLET ER SLUT"
163163
164 #: ../../code/main.cpp:159
164 #: ../../code/main.cpp:165
165165 msgid "WINNER"
166166 msgstr "VINDER"
167167
168 #: ../../code/main.cpp:160
168 #: ../../code/main.cpp:166
169169 msgid "DRAW"
170170 msgstr "UAFGJORT"
171171
172 #: ../../code/main.cpp:497 ../../code/main.cpp:628
172 #: ../../code/main.cpp:491 ../../code/main.cpp:622
173173 msgid "AI"
174174 msgstr "Computer"
175175
176 #: ../../code/main.cpp:500
176 #: ../../code/main.cpp:494
177177 msgid "Playing field"
178178 msgstr "Spilleflade"
179179
180 #: ../../code/main.cpp:574
180 #: ../../code/main.cpp:568
181181 msgid "Time Trial"
182182 msgstr "På tid"
183183
184 #: ../../code/main.cpp:575
184 #: ../../code/main.cpp:569
185185 msgid "Score as much as possible in 2 minutes"
186186 msgstr "Se hvor mange point du kan opnå på 2 minutter"
187187
188 #: ../../code/main.cpp:579
188 #: ../../code/main.cpp:573
189189 msgid "Stage Clear"
190190 msgstr "Stage Clear"
191191
192 #: ../../code/main.cpp:580
192 #: ../../code/main.cpp:574
193193 msgid "You must clear a number of lines. Speed is rapidly increased."
194194 msgstr "Fjern et specifik antal linjer. Hastigheden stiger hurtigt."
195195
196 #: ../../code/main.cpp:583
196 #: ../../code/main.cpp:577
197197 msgid "Puzzle"
198198 msgstr "Gåde"
199199
200 #: ../../code/main.cpp:584
200 #: ../../code/main.cpp:578
201201 msgid "Clear the entire board with a limited number of moves."
202202 msgstr "Fjern alle blokke med et begrænset antal flyt."
203203
204 #: ../../code/main.cpp:587
204 #: ../../code/main.cpp:581
205205 msgid "Endless"
206206 msgstr "Evighed"
207207
208 #: ../../code/main.cpp:588
208 #: ../../code/main.cpp:582
209209 msgid "Score as much as possible. No time limit."
210210 msgstr "Opnå så mange point som muligt. Ingen tidsbegrænsning."
211211
212 #: ../../code/main.cpp:598
212 #: ../../code/main.cpp:592
213213 msgid "Objective:"
214214 msgstr "Formål:"
215215
216 #: ../../code/main.cpp:608
216 #: ../../code/main.cpp:602
217217 msgid "Movement keys:"
218218 msgstr "Bevægelsestaster:"
219219
220 #: ../../code/main.cpp:610
220 #: ../../code/main.cpp:604
221221 msgid "Switch: "
222222 msgstr "Skift: "
223223
224 #: ../../code/main.cpp:612
224 #: ../../code/main.cpp:606
225225 msgid "Restart: "
226226 msgstr "Genstart: "
227227
228 #: ../../code/main.cpp:615
228 #: ../../code/main.cpp:609
229229 msgid "Push line: "
230230 msgstr "Skub linje: "
231231
232 #: ../../code/main.cpp:1050
232 #: ../../code/main.cpp:1073
233233 msgid "Player 2"
234234 msgstr "Spiller 2"
235235
236 #: ../../code/menudef.cpp:62
236 #: ../../code/menudef.cpp:59
237237 msgid "Up arrow"
238238 msgstr "Pil op"
239239
240 #: ../../code/menudef.cpp:65
240 #: ../../code/menudef.cpp:62
241241 msgid "Down arrow"
242242 msgstr "Pil ned"
243243
244 #: ../../code/menudef.cpp:68
244 #: ../../code/menudef.cpp:65
245245 msgid "Left arrow"
246246 msgstr "Pil venstre"
247247
248 #: ../../code/menudef.cpp:71
248 #: ../../code/menudef.cpp:68
249249 msgid "Right arrow"
250250 msgstr "Pil højre"
251251
252 #: ../../code/menudef.cpp:74
252 #: ../../code/menudef.cpp:71
253253 msgid "Right Ctrl"
254254 msgstr "Højre Ctrl"
255255
256 #: ../../code/menudef.cpp:77
256 #: ../../code/menudef.cpp:74
257257 msgid "Left Ctrl"
258258 msgstr "Venstre Ctrl"
259259
260 #: ../../code/menudef.cpp:80
260 #: ../../code/menudef.cpp:77
261261 msgid "Right shift"
262262 msgstr "Højre skift"
263263
264 #: ../../code/menudef.cpp:83
264 #: ../../code/menudef.cpp:80
265265 msgid "Left shift"
266266 msgstr "Venstre skift"
267267
268 #: ../../code/menudef.cpp:86
268 #: ../../code/menudef.cpp:83
269269 msgid "Right alt"
270270 msgstr "AltGr"
271271
272 #: ../../code/menudef.cpp:89
272 #: ../../code/menudef.cpp:86
273273 msgid "Left alt"
274274 msgstr "Alt"
275275
276 #: ../../code/menudef.cpp:92
276 #: ../../code/menudef.cpp:89
277277 msgid "Return"
278278 msgstr "Enter"
279279
280 #: ../../code/menudef.cpp:95
280 #: ../../code/menudef.cpp:92
281281 msgid "Space"
282282 msgstr "Mellemrum"
283283
284 #: ../../code/menudef.cpp:162
284 #: ../../code/menudef.cpp:149
285 #, c-format
286 msgid "Volume: %d%%"
287 msgstr "Lydstyrke: %d%%"
288
289 #: ../../code/menudef.cpp:194
290 msgid "Test sound"
291 msgstr "Test lydeffekter"
292
293 #: ../../code/menudef.cpp:210
294 msgid "Test music"
295 msgstr "Test musik"
296
297 #: ../../code/menudef.cpp:244
285298 msgid "Single Player Endless"
286299 msgstr "En spiller - Evighed"
287300
288 #: ../../code/menudef.cpp:169
301 #: ../../code/menudef.cpp:251
289302 msgid "Slow"
290303 msgstr "Langsom"
291304
292 #: ../../code/menudef.cpp:170
305 #: ../../code/menudef.cpp:252
293306 msgid "Fast"
294307 msgstr "Hurtig"
295308
296 #: ../../code/menudef.cpp:171
309 #: ../../code/menudef.cpp:253
297310 msgid "Faster"
298311 msgstr "Hurtigere"
299312
300 #: ../../code/menudef.cpp:172
313 #: ../../code/menudef.cpp:254
301314 msgid "Even faster"
302315 msgstr "Endnu hurtigere"
303316
304 #: ../../code/menudef.cpp:173
317 #: ../../code/menudef.cpp:255
305318 msgid "Fastest"
306319 msgstr "Hurtigst"
307320
308 #: ../../code/menudef.cpp:215
321 #: ../../code/menudef.cpp:297
309322 msgid "Always use software render: On"
310323 msgstr "Brug altid software tilstand: Til"
311324
312 #: ../../code/menudef.cpp:216
325 #: ../../code/menudef.cpp:298
313326 msgid "Always use software render: Off"
314327 msgstr "Brug altid software tilstand: Fra"
315328
316 #: ../../code/menudef.cpp:220
317 msgid "Music: On"
318 msgstr "Musik: Til"
319
320 #: ../../code/menudef.cpp:220
329 #: ../../code/menudef.cpp:324
330 msgid "Music: "
331 msgstr "Musik: "
332
333 #: ../../code/menudef.cpp:327
321334 msgid "Music: Off"
322335 msgstr "Musik: Fra"
323336
324 #: ../../code/menudef.cpp:224
325 msgid "Sound: On"
326 msgstr "Lyd: Til"
327
328 #: ../../code/menudef.cpp:224
337 #: ../../code/menudef.cpp:335
338 msgid "Sound: "
339 msgstr "Lyd: "
340
341 #: ../../code/menudef.cpp:338
329342 msgid "Sound: Off"
330343 msgstr "Lyd: Fra"
331344
332 #: ../../code/menudef.cpp:228
345 #: ../../code/menudef.cpp:343
333346 msgid "Fullscreen: On"
334347 msgstr "Fuldskærm: Til"
335348
336 #: ../../code/menudef.cpp:228
349 #: ../../code/menudef.cpp:343
337350 msgid "Fullscreen: Off"
338351 msgstr "Fuldskærm: Fra"
339352
340 #: ../../code/menudef.cpp:261
353 #: ../../code/menudef.cpp:355
354 msgid "Music volume"
355 msgstr "Musik lydstyrke"
356
357 #: ../../code/menudef.cpp:363
358 msgid "Sound volume"
359 msgstr "Effekt lydstyrke"
360
361 #: ../../code/menudef.cpp:378
341362 msgid "Enter player 1 name:"
342363 msgstr "Indtast navnet på spiller 1:"
343364
344 #: ../../code/menudef.cpp:267
365 #: ../../code/menudef.cpp:384
345366 msgid "Enter player 2 name:"
346367 msgstr "Indtast navnet på spiller 2:"
347368
348 #: ../../code/menudef.cpp:277
369 #: ../../code/menudef.cpp:394
349370 msgid "Change key bindings"
350371 msgstr "Skift taster"
351372
352 #: ../../code/menudef.cpp:278
373 #: ../../code/menudef.cpp:395
353374 msgid "Left"
354375 msgstr "Venstre"
355376
356 #: ../../code/menudef.cpp:279
377 #: ../../code/menudef.cpp:396
357378 msgid "Right"
358379 msgstr "Højre"
359380
360 #: ../../code/menudef.cpp:280
381 #: ../../code/menudef.cpp:397
361382 msgid "Up"
362383 msgstr "Op"
363384
364 #: ../../code/menudef.cpp:281
385 #: ../../code/menudef.cpp:398
365386 msgid "Down"
366387 msgstr "Ned"
367388
368 #: ../../code/menudef.cpp:282
389 #: ../../code/menudef.cpp:399
369390 msgid "Push"
370391 msgstr "Skub"
371392
372 #: ../../code/menudef.cpp:283
393 #: ../../code/menudef.cpp:400
373394 msgid "Change"
374395 msgstr "Skift"
375396
376 #: ../../code/menudef.cpp:302
397 #: ../../code/menudef.cpp:419 ../../code/menudef.cpp:450
398 msgid "Player configuration"
399 msgstr "Spiller konfiguration"
400
401 #: ../../code/menudef.cpp:423
402 msgid "Change player 1's name"
403 msgstr "Skift navn på spiller 1"
404
405 #: ../../code/menudef.cpp:425
406 msgid "Change player 2's name"
407 msgstr "Skift navn på spiller 2"
408
409 #: ../../code/menudef.cpp:427
410 msgid "Change player 1's keys"
411 msgstr "Tildel taster til spiller 1"
412
413 #: ../../code/menudef.cpp:429
414 msgid "Change player 2's keys"
415 msgstr "Tildel taster til spiller 2"
416
417 #: ../../code/menudef.cpp:443
377418 msgid "Configuration"
378419 msgstr "Konfiguration"
379420
380 #: ../../code/menudef.cpp:314
381 msgid "Change player 1's name"
382 msgstr "Skift navn på spiller 1"
383
384 #: ../../code/menudef.cpp:316
385 msgid "Change player 2's name"
386 msgstr "Skift navn på spiller 2"
387
388 #: ../../code/menudef.cpp:318
389 msgid "Change player 1's keys"
390 msgstr "Tildel taster til spiller 1"
391
392 #: ../../code/menudef.cpp:320
393 msgid "Change player 2's keys"
394 msgstr "Tildel taster til spiller 2"
395
396 #: ../../code/menudef.cpp:333
421 #: ../../code/menudef.cpp:452
422 msgid "Configure mods"
423 msgstr "Mods"
424
425 #: ../../code/menudef.cpp:468
397426 msgid "Single player VS"
398427 msgstr "En spiller - VS"
399428
400 #: ../../code/menudef.cpp:349
429 #: ../../code/menudef.cpp:484
401430 msgid "Very easy"
402431 msgstr "Meget let"
403432
404 #: ../../code/menudef.cpp:350
433 #: ../../code/menudef.cpp:485
405434 msgid "Easy"
406435 msgstr "Let"
407436
408 #: ../../code/menudef.cpp:351
437 #: ../../code/menudef.cpp:486
409438 msgid "Below normal"
410439 msgstr "Under normal"
411440
412 #: ../../code/menudef.cpp:352
441 #: ../../code/menudef.cpp:487
413442 msgid "Normal"
414443 msgstr "Normal"
415444
416 #: ../../code/menudef.cpp:353
445 #: ../../code/menudef.cpp:488
417446 msgid "Above normal"
418447 msgstr "Over normal"
419448
420 #: ../../code/menudef.cpp:354
449 #: ../../code/menudef.cpp:489
421450 msgid "Hard"
422451 msgstr "Svær"
423452
424 #: ../../code/menudef.cpp:355
453 #: ../../code/menudef.cpp:490
425454 msgid "Hardest"
426455 msgstr "Meget svær"
427456
428 #: ../../code/menudef.cpp:367
457 #: ../../code/menudef.cpp:502
429458 msgid "Multiplayer"
430459 msgstr "Flerspiller"
431460
432 #: ../../code/menudef.cpp:369
461 #: ../../code/menudef.cpp:504
433462 msgid "Two player - time trial"
434463 msgstr "To spillere - På tid"
435464
436 #: ../../code/menudef.cpp:371
465 #: ../../code/menudef.cpp:506
437466 msgid "Two player - vs"
438467 msgstr "To spillere - VS"
439468
440 #: ../../code/menudef.cpp:395 ../../code/menudef.cpp:410
469 #: ../../code/menudef.cpp:530 ../../code/menudef.cpp:545
441470 msgid "Credits"
442471 msgstr "Bidragydere"
443472
444 #: ../../code/menudef.cpp:400 ../../code/menudef.cpp:471
473 #: ../../code/menudef.cpp:535 ../../code/menudef.cpp:608
445474 msgid "Help"
446475 msgstr "Hjælp"
447476
448 #: ../../code/menudef.cpp:402
477 #: ../../code/menudef.cpp:537
449478 msgid "How to"
450479 msgstr "Guide"
451480
452 #: ../../code/menudef.cpp:406
481 #: ../../code/menudef.cpp:541
453482 msgid "Gamepad"
454483 msgstr "Spilkontroller"
455484
456 #: ../../code/menudef.cpp:421 ../../code/menudef.cpp:463
485 #: ../../code/menudef.cpp:556 ../../code/menudef.cpp:600
457486 msgid "Single player"
458487 msgstr "Enkeltspiller"
459488
460 #: ../../code/menudef.cpp:423
489 #: ../../code/menudef.cpp:558
461490 msgid "Single player - endless"
462491 msgstr "En spiller - Evighed"
463492
464 #: ../../code/menudef.cpp:425
493 #: ../../code/menudef.cpp:560
465494 msgid "Single player - time trial"
466495 msgstr "En spiller - På tid"
467496
468 #: ../../code/menudef.cpp:427
497 #: ../../code/menudef.cpp:562
469498 msgid "Single player - stage clear"
470499 msgstr "En spiller - Stage Clear"
471500
472 #: ../../code/menudef.cpp:429
501 #: ../../code/menudef.cpp:564
473502 msgid "Single player - puzzle mode"
474503 msgstr "En spiller - Gåde"
475504
476 #: ../../code/menudef.cpp:431
505 #: ../../code/menudef.cpp:566
477506 msgid "Single player - vs"
478507 msgstr "En spiller - VS"
479508
480 #: ../../code/menudef.cpp:446
509 #: ../../code/menudef.cpp:581
481510 msgid "Game did not shutdown as it should"
482511 msgstr "Spillet blev ikke afsluttet korrekt"
483512
484 #: ../../code/menudef.cpp:449
513 #: ../../code/menudef.cpp:584
485514 msgid "Use software renderer this time"
486515 msgstr "Brug software tilstand denne gang"
487516
488 #: ../../code/menudef.cpp:450
517 #: ../../code/menudef.cpp:585
489518 msgid "Always use software renderer"
490519 msgstr "Start altid i software tilstand"
491520
492 #: ../../code/menudef.cpp:461
521 #: ../../code/menudef.cpp:598
493522 msgid "Block Attack - Rise of the blocks"
494523 msgstr "Block Attack - Blokkenes opstand"
495524
496 #: ../../code/menudef.cpp:465
525 #: ../../code/menudef.cpp:602
497526 msgid "Multi player"
498527 msgstr "Flere spillere"
499528
500 #: ../../code/menudef.cpp:467
529 #: ../../code/menudef.cpp:604
501530 msgid "Configure"
502531 msgstr "Instillinger"
503532
504 #: ../../code/menudef.cpp:469
533 #: ../../code/menudef.cpp:606
505534 msgid "Highscores"
506535 msgstr "Bedste resultater"
507536
508 #: ../../code/MenuSystem.cpp:159 ../../code/MenuSystem.cpp:167
509 #: ../../code/MenuSystem.cpp:179 ../../code/ScoresDisplay.cpp:220
537 #: ../../code/MenuSystem.cpp:147 ../../code/MenuSystem.cpp:152
538 #: ../../code/MenuSystem.cpp:161 ../../code/ScoresDisplay.cpp:220
510539 msgid "Back"
511540 msgstr "Tilbage"
512541
513 #: ../../code/MenuSystem.cpp:170 ../../code/MenuSystem.cpp:182
542 #: ../../code/MenuSystem.cpp:155 ../../code/MenuSystem.cpp:164
514543 msgid "Exit"
515544 msgstr "Afslut"
516545
517 #: ../../code/os.cpp:101
546 #: ../../code/ModConfigMenuState.cpp:90
547 msgid "Mod config"
548 msgstr "Mods"
549
550 #: ../../code/ModConfigMenuState.cpp:93
551 msgid "Yes"
552 msgstr "Ja"
553
554 #: ../../code/ModConfigMenuState.cpp:93
555 msgid "No"
556 msgstr "Nej"
557
558 #: ../../code/os.cpp:103
518559 msgid "Player 1"
519560 msgstr "Spiller 1"
520561
623664 msgid "Skip"
624665 msgstr "Spring over"
625666
626 #: ../../code/BlockGameSdl.inc:328
667 #: ../../code/BlockGameSdl.inc:420
627668 msgid "Moves left: "
628669 msgstr "Træk tilbage: "
629670
630 #: ../../code/BlockGameSdl.inc:351
671 #: ../../code/BlockGameSdl.inc:443
631672 msgid "Last puzzle"
632673 msgstr "Sidste gåde"
633674
634 #: ../../code/BlockGameSdl.inc:371
675 #: ../../code/BlockGameSdl.inc:463
635676 msgid "Last stage"
636677 msgstr "Sidste bane"
637678
643684 #, c-format
644685 msgid "Showing content of: %s"
645686 msgstr "Viser indhold af: %s"
687
688 #, fuzzy
689 #~| msgid "Sound: Off"
690 #~ msgid "Volume: Off"
691 #~ msgstr "Lyd: Fra"
77 msgstr ""
88 "Project-Id-Version: PACKAGE VERSION\n"
99 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2020-06-27 14:06+0200\n"
10 "POT-Creation-Date: 2021-10-18 21:20+0200\n"
1111 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1212 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313 "Language-Team: LANGUAGE <LL@li.org>\n"
1616 "Content-Type: text/plain; charset=CHARSET\n"
1717 "Content-Transfer-Encoding: 8bit\n"
1818
19 #: ../../code/DialogBox.cpp:94
19 #: ../../code/DialogBox.cpp:131
2020 msgid "Enter to accept"
2121 msgstr ""
2222
23 #: ../../code/DialogBox.cpp:95
23 #: ../../code/DialogBox.cpp:132
2424 msgid "Esc to cancel"
2525 msgstr ""
2626
27 #: ../../code/HelpAboutState.cpp:62
28 msgid "No audio driver"
29 msgstr ""
30
31 #: ../../code/HelpAboutState.cpp:65
32 msgid "Name:"
33 msgstr ""
34
35 #: ../../code/HelpAboutState.cpp:65 ../../code/main.cpp:337
36 msgid "Block Attack - Rise of the Blocks"
37 msgstr ""
38
39 #: ../../code/HelpAboutState.cpp:66
40 msgid "Original name:"
41 msgstr ""
42
43 #: ../../code/HelpAboutState.cpp:67
44 msgid "Version:"
45 msgstr ""
46
2747 #: ../../code/HelpAboutState.cpp:68
28 msgid "No audio driver"
48 msgid "Homepage:"
49 msgstr ""
50
51 #: ../../code/HelpAboutState.cpp:69
52 msgid "Github page:"
53 msgstr ""
54
55 #: ../../code/HelpAboutState.cpp:70
56 msgid "SDL render:"
2957 msgstr ""
3058
3159 #: ../../code/HelpAboutState.cpp:71
32 msgid "Name:"
33 msgstr ""
34
35 #: ../../code/HelpAboutState.cpp:71 ../../code/main.cpp:329
36 msgid "Block Attack - Rise of the Blocks"
60 msgid "SDL audio driver:"
3761 msgstr ""
3862
3963 #: ../../code/HelpAboutState.cpp:72
40 msgid "Original name:"
64 msgid "SDL compiled version:"
4165 msgstr ""
4266
4367 #: ../../code/HelpAboutState.cpp:73
44 msgid "Version:"
68 msgid "SDL linked version:"
4569 msgstr ""
4670
4771 #: ../../code/HelpAboutState.cpp:74
48 msgid "Homepage:"
72 msgid "Save folder:"
4973 msgstr ""
5074
5175 #: ../../code/HelpAboutState.cpp:75
52 msgid "Github page:"
53 msgstr ""
54
55 #: ../../code/HelpAboutState.cpp:76
56 msgid "SDL render:"
57 msgstr ""
58
59 #: ../../code/HelpAboutState.cpp:77
60 msgid "SDL audio driver:"
61 msgstr ""
62
63 #: ../../code/HelpAboutState.cpp:78
64 msgid "SDL compiled version:"
65 msgstr ""
66
67 #: ../../code/HelpAboutState.cpp:79
68 msgid "SDL linked version:"
69 msgstr ""
70
71 #: ../../code/HelpAboutState.cpp:80
72 msgid "Save folder:"
73 msgstr ""
74
75 #: ../../code/HelpAboutState.cpp:81
7676 msgid "Locale:"
7777 msgstr ""
7878
79 #: ../../code/HelpAboutState.cpp:82 ../../code/menudef.cpp:414
79 #: ../../code/HelpAboutState.cpp:76 ../../code/menudef.cpp:549
8080 msgid "About"
8181 msgstr ""
8282
83 #: ../../code/HelpGamepadState.cpp:52
84 msgid "Move cursor"
85 msgstr ""
86
87 #: ../../code/HelpGamepadState.cpp:53
88 msgid "Push line"
89 msgstr ""
90
91 #: ../../code/HelpGamepadState.cpp:54
92 msgid "Back (Menu)"
93 msgstr ""
94
95 #: ../../code/HelpGamepadState.cpp:55
96 msgid "Switch"
97 msgstr ""
98
99 #: ../../code/HelpGamepadState.cpp:56
100 msgid "Confirm"
101 msgstr ""
102
103 #: ../../code/HelpGamepadState.cpp:57
83 #: ../../code/HelpGamepadState.cpp:35
10484 msgid ""
10585 "Only SDL2 compatible controllers are supported!\n"
10686 "Supported controllers: "
10787 msgstr ""
10888
89 #: ../../code/HelpGamepadState.cpp:47
90 msgid "Move cursor"
91 msgstr ""
92
93 #: ../../code/HelpGamepadState.cpp:48
94 msgid "Push line"
95 msgstr ""
96
97 #: ../../code/HelpGamepadState.cpp:49
98 msgid "Back (Menu)"
99 msgstr ""
100
101 #: ../../code/HelpGamepadState.cpp:50
102 msgid "Switch"
103 msgstr ""
104
105 #: ../../code/HelpGamepadState.cpp:51
106 msgid "Confirm"
107 msgstr ""
108
109109 #: ../../code/HelpHowtoState.cpp:125
110110 msgid "Switch block horizontally"
111111 msgstr ""
126126 msgid "Create a chain effect"
127127 msgstr ""
128128
129 #: ../../code/levelselect.cpp:86
129 #: ../../code/levelselect.cpp:84
130130 msgid "Select Puzzle"
131131 msgstr ""
132132
133 #: ../../code/levelselect.cpp:89
133 #: ../../code/levelselect.cpp:87
134134 msgid "Stage Clear Level Select"
135135 msgstr ""
136136
137 #: ../../code/levelselect.cpp:195
137 #: ../../code/levelselect.cpp:193
138138 #, c-format
139139 msgid "Best score: %i"
140140 msgstr ""
141141
142 #: ../../code/levelselect.cpp:196
142 #: ../../code/levelselect.cpp:194
143143 #, c-format
144144 msgid "Time used: %s"
145145 msgstr ""
146146
147 #: ../../code/levelselect.cpp:199
147 #: ../../code/levelselect.cpp:197
148148 #, c-format
149149 msgid "Time used: %d : %02d"
150150 msgstr ""
151151
152 #: ../../code/levelselect.cpp:204
152 #: ../../code/levelselect.cpp:202
153153 #, c-format
154154 msgid "Total score: %i in %i:%02i"
155155 msgstr ""
156156
157 #: ../../code/main.cpp:158
157 #: ../../code/main.cpp:164
158158 msgid "GAME OVER"
159159 msgstr ""
160160
161 #: ../../code/main.cpp:159
161 #: ../../code/main.cpp:165
162162 msgid "WINNER"
163163 msgstr ""
164164
165 #: ../../code/main.cpp:160
165 #: ../../code/main.cpp:166
166166 msgid "DRAW"
167167 msgstr ""
168168
169 #: ../../code/main.cpp:497 ../../code/main.cpp:628
169 #: ../../code/main.cpp:491 ../../code/main.cpp:622
170170 msgid "AI"
171171 msgstr ""
172172
173 #: ../../code/main.cpp:500
173 #: ../../code/main.cpp:494
174174 msgid "Playing field"
175175 msgstr ""
176176
177 #: ../../code/main.cpp:568
178 msgid "Time Trial"
179 msgstr ""
180
181 #: ../../code/main.cpp:569
182 msgid "Score as much as possible in 2 minutes"
183 msgstr ""
184
185 #: ../../code/main.cpp:573
186 msgid "Stage Clear"
187 msgstr ""
188
177189 #: ../../code/main.cpp:574
178 msgid "Time Trial"
179 msgstr ""
180
181 #: ../../code/main.cpp:575
182 msgid "Score as much as possible in 2 minutes"
183 msgstr ""
184
185 #: ../../code/main.cpp:579
186 msgid "Stage Clear"
187 msgstr ""
188
189 #: ../../code/main.cpp:580
190190 msgid "You must clear a number of lines. Speed is rapidly increased."
191191 msgstr ""
192192
193 #: ../../code/main.cpp:583
193 #: ../../code/main.cpp:577
194194 msgid "Puzzle"
195195 msgstr ""
196196
197 #: ../../code/main.cpp:584
197 #: ../../code/main.cpp:578
198198 msgid "Clear the entire board with a limited number of moves."
199199 msgstr ""
200200
201 #: ../../code/main.cpp:587
201 #: ../../code/main.cpp:581
202202 msgid "Endless"
203203 msgstr ""
204204
205 #: ../../code/main.cpp:588
205 #: ../../code/main.cpp:582
206206 msgid "Score as much as possible. No time limit."
207207 msgstr ""
208208
209 #: ../../code/main.cpp:598
209 #: ../../code/main.cpp:592
210210 msgid "Objective:"
211211 msgstr ""
212212
213 #: ../../code/main.cpp:608
213 #: ../../code/main.cpp:602
214214 msgid "Movement keys:"
215215 msgstr ""
216216
217 #: ../../code/main.cpp:610
217 #: ../../code/main.cpp:604
218218 msgid "Switch: "
219219 msgstr ""
220220
221 #: ../../code/main.cpp:612
221 #: ../../code/main.cpp:606
222222 msgid "Restart: "
223223 msgstr ""
224224
225 #: ../../code/main.cpp:615
225 #: ../../code/main.cpp:609
226226 msgid "Push line: "
227227 msgstr ""
228228
229 #: ../../code/main.cpp:1050
229 #: ../../code/main.cpp:1073
230230 msgid "Player 2"
231231 msgstr ""
232232
233 #: ../../code/menudef.cpp:59
234 msgid "Up arrow"
235 msgstr ""
236
233237 #: ../../code/menudef.cpp:62
234 msgid "Up arrow"
238 msgid "Down arrow"
235239 msgstr ""
236240
237241 #: ../../code/menudef.cpp:65
238 msgid "Down arrow"
242 msgid "Left arrow"
239243 msgstr ""
240244
241245 #: ../../code/menudef.cpp:68
242 msgid "Left arrow"
246 msgid "Right arrow"
243247 msgstr ""
244248
245249 #: ../../code/menudef.cpp:71
246 msgid "Right arrow"
250 msgid "Right Ctrl"
247251 msgstr ""
248252
249253 #: ../../code/menudef.cpp:74
250 msgid "Right Ctrl"
254 msgid "Left Ctrl"
251255 msgstr ""
252256
253257 #: ../../code/menudef.cpp:77
254 msgid "Left Ctrl"
258 msgid "Right shift"
255259 msgstr ""
256260
257261 #: ../../code/menudef.cpp:80
258 msgid "Right shift"
262 msgid "Left shift"
259263 msgstr ""
260264
261265 #: ../../code/menudef.cpp:83
262 msgid "Left shift"
266 msgid "Right alt"
263267 msgstr ""
264268
265269 #: ../../code/menudef.cpp:86
266 msgid "Right alt"
270 msgid "Left alt"
267271 msgstr ""
268272
269273 #: ../../code/menudef.cpp:89
270 msgid "Left alt"
274 msgid "Return"
271275 msgstr ""
272276
273277 #: ../../code/menudef.cpp:92
274 msgid "Return"
275 msgstr ""
276
277 #: ../../code/menudef.cpp:95
278278 msgid "Space"
279279 msgstr ""
280280
281 #: ../../code/menudef.cpp:162
281 #: ../../code/menudef.cpp:149
282 #, c-format
283 msgid "Volume: %d%%"
284 msgstr ""
285
286 #: ../../code/menudef.cpp:194
287 msgid "Test sound"
288 msgstr ""
289
290 #: ../../code/menudef.cpp:210
291 msgid "Test music"
292 msgstr ""
293
294 #: ../../code/menudef.cpp:244
282295 msgid "Single Player Endless"
283296 msgstr ""
284297
285 #: ../../code/menudef.cpp:169
298 #: ../../code/menudef.cpp:251
286299 msgid "Slow"
287300 msgstr ""
288301
289 #: ../../code/menudef.cpp:170
302 #: ../../code/menudef.cpp:252
290303 msgid "Fast"
291304 msgstr ""
292305
293 #: ../../code/menudef.cpp:171
306 #: ../../code/menudef.cpp:253
294307 msgid "Faster"
295308 msgstr ""
296309
297 #: ../../code/menudef.cpp:172
310 #: ../../code/menudef.cpp:254
298311 msgid "Even faster"
299312 msgstr ""
300313
301 #: ../../code/menudef.cpp:173
314 #: ../../code/menudef.cpp:255
302315 msgid "Fastest"
303316 msgstr ""
304317
305 #: ../../code/menudef.cpp:215
318 #: ../../code/menudef.cpp:297
306319 msgid "Always use software render: On"
307320 msgstr ""
308321
309 #: ../../code/menudef.cpp:216
322 #: ../../code/menudef.cpp:298
310323 msgid "Always use software render: Off"
311324 msgstr ""
312325
313 #: ../../code/menudef.cpp:220
314 msgid "Music: On"
315 msgstr ""
316
317 #: ../../code/menudef.cpp:220
326 #: ../../code/menudef.cpp:324
327 msgid "Music: "
328 msgstr ""
329
330 #: ../../code/menudef.cpp:327
318331 msgid "Music: Off"
319332 msgstr ""
320333
321 #: ../../code/menudef.cpp:224
322 msgid "Sound: On"
323 msgstr ""
324
325 #: ../../code/menudef.cpp:224
334 #: ../../code/menudef.cpp:335
335 msgid "Sound: "
336 msgstr ""
337
338 #: ../../code/menudef.cpp:338
326339 msgid "Sound: Off"
327340 msgstr ""
328341
329 #: ../../code/menudef.cpp:228
342 #: ../../code/menudef.cpp:343
330343 msgid "Fullscreen: On"
331344 msgstr ""
332345
333 #: ../../code/menudef.cpp:228
346 #: ../../code/menudef.cpp:343
334347 msgid "Fullscreen: Off"
335348 msgstr ""
336349
337 #: ../../code/menudef.cpp:261
350 #: ../../code/menudef.cpp:355
351 msgid "Music volume"
352 msgstr ""
353
354 #: ../../code/menudef.cpp:363
355 msgid "Sound volume"
356 msgstr ""
357
358 #: ../../code/menudef.cpp:378
338359 msgid "Enter player 1 name:"
339360 msgstr ""
340361
341 #: ../../code/menudef.cpp:267
362 #: ../../code/menudef.cpp:384
342363 msgid "Enter player 2 name:"
343364 msgstr ""
344365
345 #: ../../code/menudef.cpp:277
366 #: ../../code/menudef.cpp:394
346367 msgid "Change key bindings"
347368 msgstr ""
348369
349 #: ../../code/menudef.cpp:278
370 #: ../../code/menudef.cpp:395
350371 msgid "Left"
351372 msgstr ""
352373
353 #: ../../code/menudef.cpp:279
374 #: ../../code/menudef.cpp:396
354375 msgid "Right"
355376 msgstr ""
356377
357 #: ../../code/menudef.cpp:280
378 #: ../../code/menudef.cpp:397
358379 msgid "Up"
359380 msgstr ""
360381
361 #: ../../code/menudef.cpp:281
382 #: ../../code/menudef.cpp:398
362383 msgid "Down"
363384 msgstr ""
364385
365 #: ../../code/menudef.cpp:282
386 #: ../../code/menudef.cpp:399
366387 msgid "Push"
367388 msgstr ""
368389
369 #: ../../code/menudef.cpp:283
390 #: ../../code/menudef.cpp:400
370391 msgid "Change"
371392 msgstr ""
372393
373 #: ../../code/menudef.cpp:302
394 #: ../../code/menudef.cpp:419 ../../code/menudef.cpp:450
395 msgid "Player configuration"
396 msgstr ""
397
398 #: ../../code/menudef.cpp:423
399 msgid "Change player 1's name"
400 msgstr ""
401
402 #: ../../code/menudef.cpp:425
403 msgid "Change player 2's name"
404 msgstr ""
405
406 #: ../../code/menudef.cpp:427
407 msgid "Change player 1's keys"
408 msgstr ""
409
410 #: ../../code/menudef.cpp:429
411 msgid "Change player 2's keys"
412 msgstr ""
413
414 #: ../../code/menudef.cpp:443
374415 msgid "Configuration"
375416 msgstr ""
376417
377 #: ../../code/menudef.cpp:314
378 msgid "Change player 1's name"
379 msgstr ""
380
381 #: ../../code/menudef.cpp:316
382 msgid "Change player 2's name"
383 msgstr ""
384
385 #: ../../code/menudef.cpp:318
386 msgid "Change player 1's keys"
387 msgstr ""
388
389 #: ../../code/menudef.cpp:320
390 msgid "Change player 2's keys"
391 msgstr ""
392
393 #: ../../code/menudef.cpp:333
418 #: ../../code/menudef.cpp:452
419 msgid "Configure mods"
420 msgstr ""
421
422 #: ../../code/menudef.cpp:468
394423 msgid "Single player VS"
395424 msgstr ""
396425
397 #: ../../code/menudef.cpp:349
426 #: ../../code/menudef.cpp:484
398427 msgid "Very easy"
399428 msgstr ""
400429
401 #: ../../code/menudef.cpp:350
430 #: ../../code/menudef.cpp:485
402431 msgid "Easy"
403432 msgstr ""
404433
405 #: ../../code/menudef.cpp:351
434 #: ../../code/menudef.cpp:486
406435 msgid "Below normal"
407436 msgstr ""
408437
409 #: ../../code/menudef.cpp:352
438 #: ../../code/menudef.cpp:487
410439 msgid "Normal"
411440 msgstr ""
412441
413 #: ../../code/menudef.cpp:353
442 #: ../../code/menudef.cpp:488
414443 msgid "Above normal"
415444 msgstr ""
416445
417 #: ../../code/menudef.cpp:354
446 #: ../../code/menudef.cpp:489
418447 msgid "Hard"
419448 msgstr ""
420449
421 #: ../../code/menudef.cpp:355
450 #: ../../code/menudef.cpp:490
422451 msgid "Hardest"
423452 msgstr ""
424453
425 #: ../../code/menudef.cpp:367
454 #: ../../code/menudef.cpp:502
426455 msgid "Multiplayer"
427456 msgstr ""
428457
429 #: ../../code/menudef.cpp:369
458 #: ../../code/menudef.cpp:504
430459 msgid "Two player - time trial"
431460 msgstr ""
432461
433 #: ../../code/menudef.cpp:371
462 #: ../../code/menudef.cpp:506
434463 msgid "Two player - vs"
435464 msgstr ""
436465
437 #: ../../code/menudef.cpp:395 ../../code/menudef.cpp:410
466 #: ../../code/menudef.cpp:530 ../../code/menudef.cpp:545
438467 msgid "Credits"
439468 msgstr ""
440469
441 #: ../../code/menudef.cpp:400 ../../code/menudef.cpp:471
470 #: ../../code/menudef.cpp:535 ../../code/menudef.cpp:608
442471 msgid "Help"
443472 msgstr ""
444473
445 #: ../../code/menudef.cpp:402
474 #: ../../code/menudef.cpp:537
446475 msgid "How to"
447476 msgstr ""
448477
449 #: ../../code/menudef.cpp:406
478 #: ../../code/menudef.cpp:541
450479 msgid "Gamepad"
451480 msgstr ""
452481
453 #: ../../code/menudef.cpp:421 ../../code/menudef.cpp:463
482 #: ../../code/menudef.cpp:556 ../../code/menudef.cpp:600
454483 msgid "Single player"
455484 msgstr ""
456485
457 #: ../../code/menudef.cpp:423
486 #: ../../code/menudef.cpp:558
458487 msgid "Single player - endless"
459488 msgstr ""
460489
461 #: ../../code/menudef.cpp:425
490 #: ../../code/menudef.cpp:560
462491 msgid "Single player - time trial"
463492 msgstr ""
464493
465 #: ../../code/menudef.cpp:427
494 #: ../../code/menudef.cpp:562
466495 msgid "Single player - stage clear"
467496 msgstr ""
468497
469 #: ../../code/menudef.cpp:429
498 #: ../../code/menudef.cpp:564
470499 msgid "Single player - puzzle mode"
471500 msgstr ""
472501
473 #: ../../code/menudef.cpp:431
502 #: ../../code/menudef.cpp:566
474503 msgid "Single player - vs"
475504 msgstr ""
476505
477 #: ../../code/menudef.cpp:446
506 #: ../../code/menudef.cpp:581
478507 msgid "Game did not shutdown as it should"
479508 msgstr ""
480509
481 #: ../../code/menudef.cpp:449
510 #: ../../code/menudef.cpp:584
482511 msgid "Use software renderer this time"
483512 msgstr ""
484513
485 #: ../../code/menudef.cpp:450
514 #: ../../code/menudef.cpp:585
486515 msgid "Always use software renderer"
487516 msgstr ""
488517
489 #: ../../code/menudef.cpp:461
518 #: ../../code/menudef.cpp:598
490519 msgid "Block Attack - Rise of the blocks"
491520 msgstr ""
492521
493 #: ../../code/menudef.cpp:465
522 #: ../../code/menudef.cpp:602
494523 msgid "Multi player"
495524 msgstr ""
496525
497 #: ../../code/menudef.cpp:467
526 #: ../../code/menudef.cpp:604
498527 msgid "Configure"
499528 msgstr ""
500529
501 #: ../../code/menudef.cpp:469
530 #: ../../code/menudef.cpp:606
502531 msgid "Highscores"
503532 msgstr ""
504533
505 #: ../../code/MenuSystem.cpp:159 ../../code/MenuSystem.cpp:167
506 #: ../../code/MenuSystem.cpp:179 ../../code/ScoresDisplay.cpp:220
534 #: ../../code/MenuSystem.cpp:147 ../../code/MenuSystem.cpp:152
535 #: ../../code/MenuSystem.cpp:161 ../../code/ScoresDisplay.cpp:220
507536 msgid "Back"
508537 msgstr ""
509538
510 #: ../../code/MenuSystem.cpp:170 ../../code/MenuSystem.cpp:182
539 #: ../../code/MenuSystem.cpp:155 ../../code/MenuSystem.cpp:164
511540 msgid "Exit"
512541 msgstr ""
513542
514 #: ../../code/os.cpp:101
543 #: ../../code/ModConfigMenuState.cpp:90
544 msgid "Mod config"
545 msgstr ""
546
547 #: ../../code/ModConfigMenuState.cpp:93
548 msgid "Yes"
549 msgstr ""
550
551 #: ../../code/ModConfigMenuState.cpp:93
552 msgid "No"
553 msgstr ""
554
555 #: ../../code/os.cpp:103
515556 msgid "Player 1"
516557 msgstr ""
517558
620661 msgid "Skip"
621662 msgstr ""
622663
623 #: ../../code/BlockGameSdl.inc:328
664 #: ../../code/BlockGameSdl.inc:420
624665 msgid "Moves left: "
625666 msgstr ""
626667
627 #: ../../code/BlockGameSdl.inc:351
668 #: ../../code/BlockGameSdl.inc:443
628669 msgid "Last puzzle"
629670 msgstr ""
630671
631 #: ../../code/BlockGameSdl.inc:371
672 #: ../../code/BlockGameSdl.inc:463
632673 msgid "Last stage"
633674 msgstr ""
634675
+0
-327
source/misc/travis_help/utf8_v2_3_4/source/utf8/checked.h less more
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include "core.h"
31 #include <stdexcept>
32
33 namespace utf8
34 {
35 // Base for the exceptions that may be thrown from the library
36 class exception : public ::std::exception {
37 };
38
39 // Exceptions that may be thrown from the library functions.
40 class invalid_code_point : public exception {
41 uint32_t cp;
42 public:
43 invalid_code_point(uint32_t cp) : cp(cp) {}
44 virtual const char* what() const throw() { return "Invalid code point"; }
45 uint32_t code_point() const {return cp;}
46 };
47
48 class invalid_utf8 : public exception {
49 uint8_t u8;
50 public:
51 invalid_utf8 (uint8_t u) : u8(u) {}
52 virtual const char* what() const throw() { return "Invalid UTF-8"; }
53 uint8_t utf8_octet() const {return u8;}
54 };
55
56 class invalid_utf16 : public exception {
57 uint16_t u16;
58 public:
59 invalid_utf16 (uint16_t u) : u16(u) {}
60 virtual const char* what() const throw() { return "Invalid UTF-16"; }
61 uint16_t utf16_word() const {return u16;}
62 };
63
64 class not_enough_room : public exception {
65 public:
66 virtual const char* what() const throw() { return "Not enough space"; }
67 };
68
69 /// The library API - functions intended to be called by the users
70
71 template <typename octet_iterator>
72 octet_iterator append(uint32_t cp, octet_iterator result)
73 {
74 if (!utf8::internal::is_code_point_valid(cp))
75 throw invalid_code_point(cp);
76
77 if (cp < 0x80) // one octet
78 *(result++) = static_cast<uint8_t>(cp);
79 else if (cp < 0x800) { // two octets
80 *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0);
81 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
82 }
83 else if (cp < 0x10000) { // three octets
84 *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0);
85 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
86 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
87 }
88 else { // four octets
89 *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0);
90 *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f) | 0x80);
91 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
92 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
93 }
94 return result;
95 }
96
97 template <typename octet_iterator, typename output_iterator>
98 output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement)
99 {
100 while (start != end) {
101 octet_iterator sequence_start = start;
102 internal::utf_error err_code = utf8::internal::validate_next(start, end);
103 switch (err_code) {
104 case internal::UTF8_OK :
105 for (octet_iterator it = sequence_start; it != start; ++it)
106 *out++ = *it;
107 break;
108 case internal::NOT_ENOUGH_ROOM:
109 throw not_enough_room();
110 case internal::INVALID_LEAD:
111 out = utf8::append (replacement, out);
112 ++start;
113 break;
114 case internal::INCOMPLETE_SEQUENCE:
115 case internal::OVERLONG_SEQUENCE:
116 case internal::INVALID_CODE_POINT:
117 out = utf8::append (replacement, out);
118 ++start;
119 // just one replacement mark for the sequence
120 while (start != end && utf8::internal::is_trail(*start))
121 ++start;
122 break;
123 }
124 }
125 return out;
126 }
127
128 template <typename octet_iterator, typename output_iterator>
129 inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)
130 {
131 static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd);
132 return utf8::replace_invalid(start, end, out, replacement_marker);
133 }
134
135 template <typename octet_iterator>
136 uint32_t next(octet_iterator& it, octet_iterator end)
137 {
138 uint32_t cp = 0;
139 internal::utf_error err_code = utf8::internal::validate_next(it, end, cp);
140 switch (err_code) {
141 case internal::UTF8_OK :
142 break;
143 case internal::NOT_ENOUGH_ROOM :
144 throw not_enough_room();
145 case internal::INVALID_LEAD :
146 case internal::INCOMPLETE_SEQUENCE :
147 case internal::OVERLONG_SEQUENCE :
148 throw invalid_utf8(*it);
149 case internal::INVALID_CODE_POINT :
150 throw invalid_code_point(cp);
151 }
152 return cp;
153 }
154
155 template <typename octet_iterator>
156 uint32_t peek_next(octet_iterator it, octet_iterator end)
157 {
158 return utf8::next(it, end);
159 }
160
161 template <typename octet_iterator>
162 uint32_t prior(octet_iterator& it, octet_iterator start)
163 {
164 // can't do much if it == start
165 if (it == start)
166 throw not_enough_room();
167
168 octet_iterator end = it;
169 // Go back until we hit either a lead octet or start
170 while (utf8::internal::is_trail(*(--it)))
171 if (it == start)
172 throw invalid_utf8(*it); // error - no lead byte in the sequence
173 return utf8::peek_next(it, end);
174 }
175
176 /// Deprecated in versions that include "prior"
177 template <typename octet_iterator>
178 uint32_t previous(octet_iterator& it, octet_iterator pass_start)
179 {
180 octet_iterator end = it;
181 while (utf8::internal::is_trail(*(--it)))
182 if (it == pass_start)
183 throw invalid_utf8(*it); // error - no lead byte in the sequence
184 octet_iterator temp = it;
185 return utf8::next(temp, end);
186 }
187
188 template <typename octet_iterator, typename distance_type>
189 void advance (octet_iterator& it, distance_type n, octet_iterator end)
190 {
191 for (distance_type i = 0; i < n; ++i)
192 utf8::next(it, end);
193 }
194
195 template <typename octet_iterator>
196 typename std::iterator_traits<octet_iterator>::difference_type
197 distance (octet_iterator first, octet_iterator last)
198 {
199 typename std::iterator_traits<octet_iterator>::difference_type dist;
200 for (dist = 0; first < last; ++dist)
201 utf8::next(first, last);
202 return dist;
203 }
204
205 template <typename u16bit_iterator, typename octet_iterator>
206 octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
207 {
208 while (start != end) {
209 uint32_t cp = utf8::internal::mask16(*start++);
210 // Take care of surrogate pairs first
211 if (utf8::internal::is_lead_surrogate(cp)) {
212 if (start != end) {
213 uint32_t trail_surrogate = utf8::internal::mask16(*start++);
214 if (utf8::internal::is_trail_surrogate(trail_surrogate))
215 cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
216 else
217 throw invalid_utf16(static_cast<uint16_t>(trail_surrogate));
218 }
219 else
220 throw invalid_utf16(static_cast<uint16_t>(cp));
221
222 }
223 // Lone trail surrogate
224 else if (utf8::internal::is_trail_surrogate(cp))
225 throw invalid_utf16(static_cast<uint16_t>(cp));
226
227 result = utf8::append(cp, result);
228 }
229 return result;
230 }
231
232 template <typename u16bit_iterator, typename octet_iterator>
233 u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
234 {
235 while (start != end) {
236 uint32_t cp = utf8::next(start, end);
237 if (cp > 0xffff) { //make a surrogate pair
238 *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET);
239 *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
240 }
241 else
242 *result++ = static_cast<uint16_t>(cp);
243 }
244 return result;
245 }
246
247 template <typename octet_iterator, typename u32bit_iterator>
248 octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
249 {
250 while (start != end)
251 result = utf8::append(*(start++), result);
252
253 return result;
254 }
255
256 template <typename octet_iterator, typename u32bit_iterator>
257 u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
258 {
259 while (start != end)
260 (*result++) = utf8::next(start, end);
261
262 return result;
263 }
264
265 // The iterator class
266 template <typename octet_iterator>
267 class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
268 octet_iterator it;
269 octet_iterator range_start;
270 octet_iterator range_end;
271 public:
272 iterator () {}
273 explicit iterator (const octet_iterator& octet_it,
274 const octet_iterator& range_start,
275 const octet_iterator& range_end) :
276 it(octet_it), range_start(range_start), range_end(range_end)
277 {
278 if (it < range_start || it > range_end)
279 throw std::out_of_range("Invalid utf-8 iterator position");
280 }
281 // the default "big three" are OK
282 octet_iterator base () const { return it; }
283 uint32_t operator * () const
284 {
285 octet_iterator temp = it;
286 return utf8::next(temp, range_end);
287 }
288 bool operator == (const iterator& rhs) const
289 {
290 if (range_start != rhs.range_start || range_end != rhs.range_end)
291 throw std::logic_error("Comparing utf-8 iterators defined with different ranges");
292 return (it == rhs.it);
293 }
294 bool operator != (const iterator& rhs) const
295 {
296 return !(operator == (rhs));
297 }
298 iterator& operator ++ ()
299 {
300 utf8::next(it, range_end);
301 return *this;
302 }
303 iterator operator ++ (int)
304 {
305 iterator temp = *this;
306 utf8::next(it, range_end);
307 return temp;
308 }
309 iterator& operator -- ()
310 {
311 utf8::prior(it, range_start);
312 return *this;
313 }
314 iterator operator -- (int)
315 {
316 iterator temp = *this;
317 utf8::prior(it, range_start);
318 return temp;
319 }
320 }; // class iterator
321
322 } // namespace utf8
323
324 #endif //header guard
325
326
+0
-329
source/misc/travis_help/utf8_v2_3_4/source/utf8/core.h less more
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include <iterator>
31
32 namespace utf8
33 {
34 // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers
35 // You may need to change them to match your system.
36 // These typedefs have the same names as ones from cstdint, or boost/cstdint
37 typedef unsigned char uint8_t;
38 typedef unsigned short uint16_t;
39 typedef unsigned int uint32_t;
40
41 // Helper code - not intended to be directly called by the library users. May be changed at any time
42 namespace internal
43 {
44 // Unicode constants
45 // Leading (high) surrogates: 0xd800 - 0xdbff
46 // Trailing (low) surrogates: 0xdc00 - 0xdfff
47 const uint16_t LEAD_SURROGATE_MIN = 0xd800u;
48 const uint16_t LEAD_SURROGATE_MAX = 0xdbffu;
49 const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u;
50 const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu;
51 const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10);
52 const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN;
53
54 // Maximum valid value for a Unicode code point
55 const uint32_t CODE_POINT_MAX = 0x0010ffffu;
56
57 template<typename octet_type>
58 inline uint8_t mask8(octet_type oc)
59 {
60 return static_cast<uint8_t>(0xff & oc);
61 }
62 template<typename u16_type>
63 inline uint16_t mask16(u16_type oc)
64 {
65 return static_cast<uint16_t>(0xffff & oc);
66 }
67 template<typename octet_type>
68 inline bool is_trail(octet_type oc)
69 {
70 return ((utf8::internal::mask8(oc) >> 6) == 0x2);
71 }
72
73 template <typename u16>
74 inline bool is_lead_surrogate(u16 cp)
75 {
76 return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX);
77 }
78
79 template <typename u16>
80 inline bool is_trail_surrogate(u16 cp)
81 {
82 return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);
83 }
84
85 template <typename u16>
86 inline bool is_surrogate(u16 cp)
87 {
88 return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);
89 }
90
91 template <typename u32>
92 inline bool is_code_point_valid(u32 cp)
93 {
94 return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp));
95 }
96
97 template <typename octet_iterator>
98 inline typename std::iterator_traits<octet_iterator>::difference_type
99 sequence_length(octet_iterator lead_it)
100 {
101 uint8_t lead = utf8::internal::mask8(*lead_it);
102 if (lead < 0x80)
103 return 1;
104 else if ((lead >> 5) == 0x6)
105 return 2;
106 else if ((lead >> 4) == 0xe)
107 return 3;
108 else if ((lead >> 3) == 0x1e)
109 return 4;
110 else
111 return 0;
112 }
113
114 template <typename octet_difference_type>
115 inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length)
116 {
117 if (cp < 0x80) {
118 if (length != 1)
119 return true;
120 }
121 else if (cp < 0x800) {
122 if (length != 2)
123 return true;
124 }
125 else if (cp < 0x10000) {
126 if (length != 3)
127 return true;
128 }
129
130 return false;
131 }
132
133 enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT};
134
135 /// Helper for get_sequence_x
136 template <typename octet_iterator>
137 utf_error increase_safely(octet_iterator& it, octet_iterator end)
138 {
139 if (++it == end)
140 return NOT_ENOUGH_ROOM;
141
142 if (!utf8::internal::is_trail(*it))
143 return INCOMPLETE_SEQUENCE;
144
145 return UTF8_OK;
146 }
147
148 #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;}
149
150 /// get_sequence_x functions decode utf-8 sequences of the length x
151 template <typename octet_iterator>
152 utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point)
153 {
154 if (it == end)
155 return NOT_ENOUGH_ROOM;
156
157 code_point = utf8::internal::mask8(*it);
158
159 return UTF8_OK;
160 }
161
162 template <typename octet_iterator>
163 utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point)
164 {
165 if (it == end)
166 return NOT_ENOUGH_ROOM;
167
168 code_point = utf8::internal::mask8(*it);
169
170 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
171
172 code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f);
173
174 return UTF8_OK;
175 }
176
177 template <typename octet_iterator>
178 utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point)
179 {
180 if (it == end)
181 return NOT_ENOUGH_ROOM;
182
183 code_point = utf8::internal::mask8(*it);
184
185 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
186
187 code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
188
189 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
190
191 code_point += (*it) & 0x3f;
192
193 return UTF8_OK;
194 }
195
196 template <typename octet_iterator>
197 utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point)
198 {
199 if (it == end)
200 return NOT_ENOUGH_ROOM;
201
202 code_point = utf8::internal::mask8(*it);
203
204 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
205
206 code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
207
208 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
209
210 code_point += (utf8::internal::mask8(*it) << 6) & 0xfff;
211
212 UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
213
214 code_point += (*it) & 0x3f;
215
216 return UTF8_OK;
217 }
218
219 #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR
220
221 template <typename octet_iterator>
222 utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point)
223 {
224 // Save the original value of it so we can go back in case of failure
225 // Of course, it does not make much sense with i.e. stream iterators
226 octet_iterator original_it = it;
227
228 uint32_t cp = 0;
229 // Determine the sequence length based on the lead octet
230 typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type;
231 const octet_difference_type length = utf8::internal::sequence_length(it);
232
233 // Get trail octets and calculate the code point
234 utf_error err = UTF8_OK;
235 switch (length) {
236 case 0:
237 return INVALID_LEAD;
238 case 1:
239 err = utf8::internal::get_sequence_1(it, end, cp);
240 break;
241 case 2:
242 err = utf8::internal::get_sequence_2(it, end, cp);
243 break;
244 case 3:
245 err = utf8::internal::get_sequence_3(it, end, cp);
246 break;
247 case 4:
248 err = utf8::internal::get_sequence_4(it, end, cp);
249 break;
250 }
251
252 if (err == UTF8_OK) {
253 // Decoding succeeded. Now, security checks...
254 if (utf8::internal::is_code_point_valid(cp)) {
255 if (!utf8::internal::is_overlong_sequence(cp, length)){
256 // Passed! Return here.
257 code_point = cp;
258 ++it;
259 return UTF8_OK;
260 }
261 else
262 err = OVERLONG_SEQUENCE;
263 }
264 else
265 err = INVALID_CODE_POINT;
266 }
267
268 // Failure branch - restore the original value of the iterator
269 it = original_it;
270 return err;
271 }
272
273 template <typename octet_iterator>
274 inline utf_error validate_next(octet_iterator& it, octet_iterator end) {
275 uint32_t ignored;
276 return utf8::internal::validate_next(it, end, ignored);
277 }
278
279 } // namespace internal
280
281 /// The library API - functions intended to be called by the users
282
283 // Byte order mark
284 const uint8_t bom[] = {0xef, 0xbb, 0xbf};
285
286 template <typename octet_iterator>
287 octet_iterator find_invalid(octet_iterator start, octet_iterator end)
288 {
289 octet_iterator result = start;
290 while (result != end) {
291 utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end);
292 if (err_code != internal::UTF8_OK)
293 return result;
294 }
295 return result;
296 }
297
298 template <typename octet_iterator>
299 inline bool is_valid(octet_iterator start, octet_iterator end)
300 {
301 return (utf8::find_invalid(start, end) == end);
302 }
303
304 template <typename octet_iterator>
305 inline bool starts_with_bom (octet_iterator it, octet_iterator end)
306 {
307 return (
308 ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) &&
309 ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) &&
310 ((it != end) && (utf8::internal::mask8(*it)) == bom[2])
311 );
312 }
313
314 //Deprecated in release 2.3
315 template <typename octet_iterator>
316 inline bool is_bom (octet_iterator it)
317 {
318 return (
319 (utf8::internal::mask8(*it++)) == bom[0] &&
320 (utf8::internal::mask8(*it++)) == bom[1] &&
321 (utf8::internal::mask8(*it)) == bom[2]
322 );
323 }
324 } // namespace utf8
325
326 #endif // header guard
327
328
+0
-228
source/misc/travis_help/utf8_v2_3_4/source/utf8/unchecked.h less more
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include "core.h"
31
32 namespace utf8
33 {
34 namespace unchecked
35 {
36 template <typename octet_iterator>
37 octet_iterator append(uint32_t cp, octet_iterator result)
38 {
39 if (cp < 0x80) // one octet
40 *(result++) = static_cast<uint8_t>(cp);
41 else if (cp < 0x800) { // two octets
42 *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0);
43 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
44 }
45 else if (cp < 0x10000) { // three octets
46 *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0);
47 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
48 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
49 }
50 else { // four octets
51 *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0);
52 *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80);
53 *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
54 *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
55 }
56 return result;
57 }
58
59 template <typename octet_iterator>
60 uint32_t next(octet_iterator& it)
61 {
62 uint32_t cp = utf8::internal::mask8(*it);
63 typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it);
64 switch (length) {
65 case 1:
66 break;
67 case 2:
68 it++;
69 cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
70 break;
71 case 3:
72 ++it;
73 cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
74 ++it;
75 cp += (*it) & 0x3f;
76 break;
77 case 4:
78 ++it;
79 cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
80 ++it;
81 cp += (utf8::internal::mask8(*it) << 6) & 0xfff;
82 ++it;
83 cp += (*it) & 0x3f;
84 break;
85 }
86 ++it;
87 return cp;
88 }
89
90 template <typename octet_iterator>
91 uint32_t peek_next(octet_iterator it)
92 {
93 return utf8::unchecked::next(it);
94 }
95
96 template <typename octet_iterator>
97 uint32_t prior(octet_iterator& it)
98 {
99 while (utf8::internal::is_trail(*(--it))) ;
100 octet_iterator temp = it;
101 return utf8::unchecked::next(temp);
102 }
103
104 // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous)
105 template <typename octet_iterator>
106 inline uint32_t previous(octet_iterator& it)
107 {
108 return utf8::unchecked::prior(it);
109 }
110
111 template <typename octet_iterator, typename distance_type>
112 void advance (octet_iterator& it, distance_type n)
113 {
114 for (distance_type i = 0; i < n; ++i)
115 utf8::unchecked::next(it);
116 }
117
118 template <typename octet_iterator>
119 typename std::iterator_traits<octet_iterator>::difference_type
120 distance (octet_iterator first, octet_iterator last)
121 {
122 typename std::iterator_traits<octet_iterator>::difference_type dist;
123 for (dist = 0; first < last; ++dist)
124 utf8::unchecked::next(first);
125 return dist;
126 }
127
128 template <typename u16bit_iterator, typename octet_iterator>
129 octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
130 {
131 while (start != end) {
132 uint32_t cp = utf8::internal::mask16(*start++);
133 // Take care of surrogate pairs first
134 if (utf8::internal::is_lead_surrogate(cp)) {
135 uint32_t trail_surrogate = utf8::internal::mask16(*start++);
136 cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
137 }
138 result = utf8::unchecked::append(cp, result);
139 }
140 return result;
141 }
142
143 template <typename u16bit_iterator, typename octet_iterator>
144 u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
145 {
146 while (start < end) {
147 uint32_t cp = utf8::unchecked::next(start);
148 if (cp > 0xffff) { //make a surrogate pair
149 *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET);
150 *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
151 }
152 else
153 *result++ = static_cast<uint16_t>(cp);
154 }
155 return result;
156 }
157
158 template <typename octet_iterator, typename u32bit_iterator>
159 octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
160 {
161 while (start != end)
162 result = utf8::unchecked::append(*(start++), result);
163
164 return result;
165 }
166
167 template <typename octet_iterator, typename u32bit_iterator>
168 u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
169 {
170 while (start < end)
171 (*result++) = utf8::unchecked::next(start);
172
173 return result;
174 }
175
176 // The iterator class
177 template <typename octet_iterator>
178 class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
179 octet_iterator it;
180 public:
181 iterator () {}
182 explicit iterator (const octet_iterator& octet_it): it(octet_it) {}
183 // the default "big three" are OK
184 octet_iterator base () const { return it; }
185 uint32_t operator * () const
186 {
187 octet_iterator temp = it;
188 return utf8::unchecked::next(temp);
189 }
190 bool operator == (const iterator& rhs) const
191 {
192 return (it == rhs.it);
193 }
194 bool operator != (const iterator& rhs) const
195 {
196 return !(operator == (rhs));
197 }
198 iterator& operator ++ ()
199 {
200 ::std::advance(it, utf8::internal::sequence_length(it));
201 return *this;
202 }
203 iterator operator ++ (int)
204 {
205 iterator temp = *this;
206 ::std::advance(it, utf8::internal::sequence_length(it));
207 return temp;
208 }
209 iterator& operator -- ()
210 {
211 utf8::unchecked::prior(it);
212 return *this;
213 }
214 iterator operator -- (int)
215 {
216 iterator temp = *this;
217 utf8::unchecked::prior(it);
218 return temp;
219 }
220 }; // class iterator
221
222 } // namespace utf8::unchecked
223 } // namespace utf8
224
225
226 #endif // header guard
227
+0
-34
source/misc/travis_help/utf8_v2_3_4/source/utf8.h less more
0 // Copyright 2006 Nemanja Trifunovic
1
2 /*
3 Permission is hereby granted, free of charge, to any person or organization
4 obtaining a copy of the software and accompanying documentation covered by
5 this license (the "Software") to use, reproduce, display, distribute,
6 execute, and transmit the Software, and to prepare derivative works of the
7 Software, and to permit third-parties to whom the Software is furnished to
8 do so, all subject to the following:
9
10 The copyright notices in the Software and this entire statement, including
11 the above license grant, this restriction and the following disclaimer,
12 must be included in all copies of the Software, in whole or in part, and
13 all derivative works of the Software, unless such copies or derivative
14 works are solely in the form of machine-executable object code generated by
15 a source language processor.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
28 #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
29
30 #include "utf8/checked.h"
31 #include "utf8/unchecked.h"
32
33 #endif // header guard
+0
-9
travis_build.script less more
0 #! /bin/bash
1 set -e
2
3 # First check for formatting errors
4 bash source/misc/lint/runLint.sh
5
6 docker build -f source/misc/docker/Dockerfile.Fedora25build . -t blockattack_test
7 #docker build -f source/misc/docker/Dockerfile.Ubuntu14.04build . -t blockattack_test
8 docker build -f source/misc/docker/Dockerfile.WindoesBuild . -t blockattack_test
11
22 ; HM NIS Edit Wizard helper defines
33 !define PRODUCT_NAME "Block Attack - Rise Of the Blocks"
4 !define PRODUCT_VERSION "2.6.0"
4 !define PRODUCT_VERSION "2.7.0"
55 !define PRODUCT_PUBLISHER "Poul Sander"
66 !define PRODUCT_WEB_SITE "http://www.blockattack.net"
77 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\blockattack.exe"
6161 File "..\Game\blockattack.data"
6262 SetOutPath "$INSTDIR"
6363 File "..\Game\COPYING.TXT"
64 SetOutPath "$INSTDIR\mods"
65 File "..\Game\mods\1.3.0.bricks.data"
6466 SetOutPath "$INSTDIR\locale\da\LC_MESSAGES"
6567 File "../source/misc/translation/locale/da/LC_MESSAGES/blockattack_roftb.mo"
6668 SetOutPath "$INSTDIR"
222224 Delete "$INSTDIR\gfx\iDraw.png"
223225 Delete "$INSTDIR\gfx\bOff.png"
224226 Delete "$INSTDIR\gfx\mouse.png"
227 Delete "$INSTDIR\mods\1.3.0.bricks.data"
225228 Delete "$INSTDIR\music\bgMusic.ogg"
226229 Delete "$INSTDIR\music\highbeat.ogg"
227230 Delete "$INSTDIR\res\puzzle.levels"
271274 RMDir "$INSTDIR\gfx\animations"
272275 RMDir "$INSTDIR\gfx"
273276 RMDir "$INSTDIR\docs"
277 RMDir "$INSTDIR\mods"
274278 RMDir /r "$INSTDIR\locale"
275279 RMDir "$INSTDIR"
276280