
December 19, 2022 9 minute read
NOTE: Today’s sample project is actually a small playground to play around with AStarGrid2D, so there’s a bit more going on than usual, but it should let you really see what this class can offer.
If you’ve used Godot’s AStar2D class, then you’ll know that while it’s a perfectly serviceable, all-purpose solution, it can leave a bit to be desired for grid-based games due to its generic nature. You have to manually add each cell, the connections to surrounding cells, and indirectly lookup cells (whether by a hash function, the get_closest_point function, etc) since node ids are arbitrary as far as the algorithm is concerned.
New to Godot 4, though, is the AStarGrid2D class, which implements A* pathfinding specifically for 2D grids and brings along a few useful features, including some performance improvements.
Setting everything up is as easy as creating an instance, defining the size of the grid and its cells (allowing you to get both the grid cell and actual position of the nodes in a path), and then calling update() to prepare it for pathfinding with these parameters. This example from the Godot docs shows it nicely:
xvar astar_grid = AStarGrid2D.new()astar_grid.size = Vector2i(32, 32)astar_grid.cell_size = Vector2(16, 16)astar_grid.update()
# prints (0, 0), (1, 1), (2, 2), (3, 3), (3, 4)print(astar_grid.get_id_path(Vector2i(0, 0), Vector2i(3, 4)))# prints (0, 0), (16, 16), (32, 32), (48, 48), (48, 64)print(astar_grid.get_point_path(Vector2i(0, 0), Vector2i(3, 4)))You’ll also notice that cell ids aren’t arbitrary in AStarGrid2D, but are simply the locations of the cell in the grid, making it easy to match up with tilemaps and other grid solutions.
By default, all cells are connected to one another, which is a bit boring. To mark a cell as impassable, you can call set_point_solid() and set the cell value to true:
xxxxxxxxxxvar astar_grid = AStarGrid2D.new()astar_grid.size = Vector2i(32, 32)astar_grid.cell_size = Vector2(16, 16)astar_grid.update()
astar_grid.set_point_solid(Vector2i(1, 1), true)
# prints (0, 0), (0, 1), (1, 2), (2, 3), (3, 4)print(astar_grid.get_id_path(Vector2i(0, 0), Vector2i(3, 4))) There’s three properties that drive how the optimal solution is found: the default heuristic, use of diagonals, and jumping. The why and how of A* pathfinding is a discussion for another time, so I’ll be keeping things fairly high level and just focused on usage here. If you do want to dive in further in the meantime, Red Blob Games has some great articles on A* pathfinding.
The heuristic determines how the optimal path is calculated, and the options are listed, with the formulas, in the docs. We can choose the heuristic to use by setting astar_grid.default_heuristic. I’m only going to give a very brief overview of the available heuristics here, but if you want to dive deeper there’s a great article on A* heuristics by Amit Patel.
Manhattan: For uses where diagonal movement is not allowed. Calculates the travel cost using right corners between nodes.
Chebyshev: Useful for diagonal movement that’s snapped to the grid. Ie movement in eight directions: north, south, east, west, northeast, southeast, northwest, southwest. Diagonal movement costs the same as orthogonal movement
Octile: Another diagonal movement heuristic for moving along the grid. Diagonal movement cost slightly more than orthogonal movement.
Euclidean: Useful when diagonal movement is allowed at any angle (ie you want to move over a grid, but don’t need to snap to it perfectly). Calculates the cost using the straight line distance between nodes.
Other than Manhattan distance, which is the obviously different one since it doesn’t allow for diagonal movement, these heuristics can seem pretty similar, and you may often find their output to not be that different, but the differences will appear in the right circumstances so play around with them and see what makes the most sense for your game. And if that’s not a good enough answer, here’s what Amit recommends: Manhattan for four-directional movement, Octile or Chebyshev for eight-directional movement, and anything other than Manhattan if movement is allowed in any direction.
The diagonal_mode property determines how valid diagonal movement is determined. We once again have four options to choose from:
Always: Any diagonal movement between two open cells is allowed.
Never: Movement will always be orthogonal and diagonally located neighbors will not be taken into consideration.
At least one walkable: At least one cell must be open along the diagonal path. This prevents trying to walk between the corners of two walls, for instance.
Only if no obstacles: No obstacles can exist around a diagonal. This will prevent moving diagonally along an obstacle.
The jumping_enabled setting enables Jump Point Searching, which is an established method for optimizing A* pathfinding for the uniformly weighted grid that AStarGrid2D uses. Because this algorithm “jumps” over open areas, you’re only returned the location of each jump as opposed to a list of every cell along the path when this mode is enabled, but this mode can give you a nice performance improvement, especially in fairly open maps.
And that’s it for the AStarGrid2D class. Not a lot to it, which is what makes is so much nicer to work with in a grid-based context compared to the AStar2D class. Really, the only downside to it is that you must use a grid with uniform costs, which works great for basic pathfinding but may not always result in the best solution for more complicated uses where you want to discourage, but not prevent, traversing certain cells. In such an instance, you’ll want to go with the AStar2D class or roll your own solution.
I’ve covered most of what the AStarGrid2D class has to offer, but there is a little bit more you may want to know about so be sure to check out the docs to learn more or go play with the sample project to see everything I’ve discussed in action.
xxxxxxxxxx├── .cursor/├── project.godot└── src/├── markers/│ ├── goal.png│ ├── green.png│ ├── marker.gd│ └── marker.gd.uid├── sample_scene.gd├── sample_scene.gd.uid├── sample_scene.tscn├── theme.tres├── tilemap/│ ├── game_map.gd│ ├── game_map.gd.uid│ ├── path.png│ └── tileset.png├── ui.gd└── ui.gd.uid
xxxxxxxxxx; Engine configuration file.; It's best edited using the editor UI and not directly,; since the parameters that go here are not all obvious.;; Format:; [section] ; section goes between []; param=value ; assign values to parametersconfig_version=5[application]config/name="astargrid2d"run/main_scene="res://src/sample_scene.tscn"config/features=PackedStringArray("4.4", "Forward Plus")config/icon="res://icon.svg"[display]window/size/viewport_width=1920window/size/viewport_height=1080window/stretch/mode="canvas_items"[rendering]environment/defaults/default_clear_color=Color(0.160784, 0.156863, 0.192157, 1)
xxxxxxxxxxextends Node2D@onready var game_map = $game_map@onready var path = $path@onready var start = $start@onready var goal = $goal@onready var ui = $uivar astar_grid: AStarGrid2Dvar start_cell: Vector2ivar end_cell: Vector2ifunc _ready() -> void:ui.options_updated.connect(_on_options_updated)_init_grid()_update_grid_from_tilemap()find_path()func _on_layout_updated() -> void:_update_grid_from_tilemap()find_path()# Updates the map when options are changed# These items do not require calling "update" on our AStarGrid2D instancefunc _on_options_updated(heuristic: AStarGrid2D.Heuristic, diagonal: AStarGrid2D.DiagonalMode, jump: bool) -> void:astar_grid.default_compute_heuristic = heuristicastar_grid.default_estimate_heuristic = heuristicastar_grid.diagonal_mode = diagonalastar_grid.jumping_enabled = jumpfind_path()func _on_marker_positions_updated() -> void:var new_start_cell = game_map.local_to_map(start.position)var new_end_cell = game_map.local_to_map(goal.position)if new_start_cell != start_cell or new_end_cell != end_cell:find_path()# Create an AStarGrid2D instance from the size of the game map# Note that fundamental changes like size and cell_size require# calling update() on the grid before it is usablefunc _init_grid() -> void:astar_grid = AStarGrid2D.new()astar_grid.size = game_map.get_used_rect().sizeastar_grid.cell_size = game_map.tile_set.tile_sizeastar_grid.update()# Look up each grid cell in our AStarGrid2D instance# and set it to solid based on whether or not it is a wall in the game mapfunc _update_grid_from_tilemap() -> void:for i in range(astar_grid.size.x):for j in range(astar_grid.size.y):var id = Vector2i(i, j)# If game_map does not have a cell source id >= 0# then we're looking at an invalid locationif game_map.get_cell_source_id(id) >= 0:var tile_type = game_map.get_cell_tile_data(id).get_custom_data('tile_type')astar_grid.set_point_solid(Vector2i(i, j), tile_type == 'wall')# If looking at a location outside of the game map,# default to marking the cell solid so the player can't navigate# outside of the game map.# Shouldn't be an issue in this demo since grid size comes from map size# but something to keep in mind.else:astar_grid.set_point_solid(Vector2i(i, j), true)func find_path() -> void:path.clear()start_cell = game_map.local_to_map(start.position)end_cell = game_map.local_to_map(goal.position)if start_cell == end_cell or !astar_grid.is_in_boundsv(start_cell) or !astar_grid.is_in_boundsv(end_cell):returnvar id_path = astar_grid.get_id_path(start_cell, end_cell)for id in id_path:path.set_cell(id, 1, Vector2(0, 0))
xxxxxxxxxxuid://ctrsjt8b4mha8
xxxxxxxxxx[gd_scene load_steps=15 format=4 uid="uid://buuwryprckyrx"][ext_resource type="Script" uid="uid://ctrsjt8b4mha8" path="res://src/sample_scene.gd" id="1_tsqfi"][ext_resource type="Texture2D" uid="uid://cpvwh0udxgsve" path="res://src/tilemap/tileset.png" id="2_542cw"][ext_resource type="Texture2D" uid="uid://mjcvc1iyyau4" path="res://src/tilemap/path.png" id="3_c6l1u"][ext_resource type="Script" uid="uid://bdb5itbs6ksuk" path="res://src/tilemap/game_map.gd" id="3_ykcs8"][ext_resource type="Script" uid="uid://bbfru21u0j3ix" path="res://src/markers/marker.gd" id="4_k1u0s"][ext_resource type="Texture2D" uid="uid://cshkbh1p3qlus" path="res://src/markers/green.png" id="4_yakwo"][ext_resource type="Texture2D" uid="uid://bweuae1dla5c6" path="res://src/markers/goal.png" id="5_gft71"][ext_resource type="Script" uid="uid://cvan140ai0hk" path="res://src/ui.gd" id="8_xa30u"][ext_resource type="Theme" uid="uid://lwqeu1efvt2g" path="res://src/theme.tres" id="9_8s141"][sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_6pank"]texture = ExtResource("2_542cw")texture_region_size = Vector2i(32, 32)0:0/0 = 00:0/0/custom_data_0 = "wall"1:0/0 = 01:0/0/custom_data_0 = "floor"[sub_resource type="TileSet" id="TileSet_gunhg"]tile_size = Vector2i(32, 32)custom_data_layer_0/name = "tile_type"custom_data_layer_0/type = 4sources/0 = SubResource("TileSetAtlasSource_6pank")[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_fi3fv"]texture = ExtResource("3_c6l1u")texture_region_size = Vector2i(32, 32)0:0/0 = 0[sub_resource type="TileSet" id="TileSet_l176x"]tile_size = Vector2i(32, 32)sources/1 = SubResource("TileSetAtlasSource_fi3fv")[sub_resource type="RectangleShape2D" id="RectangleShape2D_r8hg7"]size = Vector2(32, 32)[node name="sample_scene" type="Node2D"]script = ExtResource("1_tsqfi")[node name="game_map" type="TileMapLayer" parent="."]use_parent_material = truetile_map_data = PackedByteArray("AAABAAEAAAAAAAAAAAABAAIAAAAAAAAAAAABAAMAAAAAAAAAAAABAAQAAAAAAAAAAAABAAcAAAAAAAAAAAABAAgAAAAAAAAAAAABAAkAAAAAAAAAAAABAAoAAAAAAAAAAAABAAsAAAAAAAAAAAABAAwAAAAAAAAAAAABAA0AAAAAAAAAAAABAA4AAAAAAAAAAAABAA8AAAAAAAAAAAABABAAAAAAAAAAAAABABEAAAAAAAAAAAABABIAAAAAAAAAAAABABMAAAAAAAAAAAABABQAAAAAAAAAAAABABUAAAAAAAAAAAACAAEAAAAAAAAAAAACAAIAAAABAAAAAAACAAMAAAABAAAAAAACAAQAAAABAAAAAAACAAUAAAABAAAAAAACAAYAAAABAAAAAAACAAcAAAABAAAAAAACAAgAAAABAAAAAAACAAkAAAABAAAAAAACAAoAAAABAAAAAAACAAsAAAABAAAAAAACAAwAAAABAAAAAAACAA0AAAABAAAAAAACAA4AAAAAAAAAAAACAA8AAAAAAAAAAAACABAAAAABAAAAAAACABEAAAABAAAAAAACABIAAAABAAAAAAACABMAAAABAAAAAAACABQAAAABAAAAAAACABUAAAABAAAAAAADAAEAAAAAAAAAAAADAAIAAAABAAAAAAADAAMAAAABAAAAAAADAAQAAAABAAAAAAADAAUAAAABAAAAAAADAAYAAAABAAAAAAADAAcAAAABAAAAAAADAAgAAAABAAAAAAADAAkAAAABAAAAAAADAAoAAAABAAAAAAADAAsAAAABAAAAAAADAAwAAAABAAAAAAADAA0AAAABAAAAAAADAA4AAAAAAAAAAAADAA8AAAAAAAAAAAADABAAAAABAAAAAAADABEAAAABAAAAAAADABIAAAABAAAAAAADABMAAAABAAAAAAADABQAAAABAAAAAAADABUAAAABAAAAAAAEAAEAAAAAAAAAAAAEAAIAAAABAAAAAAAEAAMAAAABAAAAAAAEAAQAAAABAAAAAAAEAAUAAAABAAAAAAAEAAYAAAABAAAAAAAEAAcAAAABAAAAAAAEAAgAAAABAAAAAAAEAAkAAAABAAAAAAAEAAoAAAABAAAAAAAEAAsAAAABAAAAAAAEAAwAAAABAAAAAAAEAA0AAAABAAAAAAAEAA4AAAAAAAAAAAAEAA8AAAAAAAAAAAAEABAAAAABAAAAAAAEABEAAAABAAAAAAAEABIAAAABAAAAAAAEABMAAAABAAAAAAAEABQAAAABAAAAAAAEABUAAAABAAAAAAAFAAEAAAAAAAAAAAAFAAIAAAABAAAAAAAFAAMAAAABAAAAAAAFAAQAAAABAAAAAAAFAAUAAAABAAAAAAAFAAYAAAABAAAAAAAFAAcAAAABAAAAAAAFAAgAAAABAAAAAAAFAAkAAAABAAAAAAAFAAoAAAABAAAAAAAFAAsAAAABAAAAAAAFAAwAAAABAAAAAAAFAA0AAAABAAAAAAAFAA4AAAAAAAAAAAAFAA8AAAAAAAAAAAAFABAAAAABAAAAAAAFABEAAAABAAAAAAAFABIAAAABAAAAAAAFABMAAAABAAAAAAAFABQAAAABAAAAAAAFABUAAAABAAAAAAAGAAEAAAAAAAAAAAAGAAIAAAABAAAAAAAGAAMAAAABAAAAAAAGAAQAAAABAAAAAAAGAAUAAAABAAAAAAAGAAYAAAABAAAAAAAGAAcAAAABAAAAAAAGAAgAAAABAAAAAAAGAAkAAAABAAAAAAAGAAoAAAABAAAAAAAGAAsAAAABAAAAAAAGAAwAAAABAAAAAAAGAA0AAAABAAAAAAAGAA4AAAABAAAAAAAGAA8AAAABAAAAAAAGABAAAAABAAAAAAAGABEAAAABAAAAAAAGABIAAAABAAAAAAAGABMAAAABAAAAAAAGABQAAAABAAAAAAAGABUAAAABAAAAAAAHAAEAAAAAAAAAAAAHAAIAAAABAAAAAAAHAAMAAAABAAAAAAAHAAQAAAABAAAAAAAHAAUAAAABAAAAAAAHAAYAAAABAAAAAAAHAAcAAAABAAAAAAAHAAgAAAABAAAAAAAHAAkAAAABAAAAAAAHAAoAAAABAAAAAAAHAAsAAAABAAAAAAAHAAwAAAABAAAAAAAHAA0AAAABAAAAAAAHAA8AAAABAAAAAAAHABAAAAABAAAAAAAHABEAAAABAAAAAAAHABIAAAABAAAAAAAHABMAAAABAAAAAAAHABQAAAABAAAAAAAHABUAAAABAAAAAAABAAYAAAAAAAAAAAABAAUAAAAAAAAAAAAHABYAAAABAAAAAAAGABYAAAABAAAAAAAFABYAAAABAAAAAAAEABYAAAABAAAAAAADABYAAAABAAAAAAACABYAAAABAAAAAAABABYAAAAAAAAAAAABABcAAAAAAAAAAAABABgAAAAAAAAAAAABABkAAAAAAAAAAAABABoAAAAAAAAAAAABABsAAAAAAAAAAAABABwAAAAAAAAAAAABAB0AAAAAAAAAAAABAB4AAAAAAAAAAAABAB8AAAAAAAAAAAABACAAAAAAAAAAAAACACAAAAAAAAAAAAACAB8AAAABAAAAAAACAB4AAAABAAAAAAACAB0AAAABAAAAAAACABwAAAABAAAAAAACABsAAAABAAAAAAACABoAAAABAAAAAAACABkAAAABAAAAAAACABgAAAABAAAAAAACABcAAAABAAAAAAADABcAAAABAAAAAAADABgAAAABAAAAAAADABkAAAABAAAAAAADABoAAAABAAAAAAADABsAAAABAAAAAAADABwAAAABAAAAAAADAB0AAAABAAAAAAADAB4AAAABAAAAAAADAB8AAAABAAAAAAADACAAAAAAAAAAAAAEACAAAAAAAAAAAAAEAB8AAAABAAAAAAAEAB4AAAABAAAAAAAEAB0AAAABAAAAAAAEABwAAAABAAAAAAAEABsAAAABAAAAAAAEABoAAAABAAAAAAAEABkAAAABAAAAAAAEABgAAAABAAAAAAAEABcAAAABAAAAAAAFABcAAAABAAAAAAAFABgAAAABAAAAAAAFABkAAAABAAAAAAAFABoAAAABAAAAAAAFABsAAAABAAAAAAAFABwAAAABAAAAAAAFAB0AAAABAAAAAAAFAB4AAAABAAAAAAAFAB8AAAABAAAAAAAFACAAAAAAAAAAAAAGACAAAAAAAAAAAAAGAB8AAAABAAAAAAAGAB4AAAABAAAAAAAGAB0AAAABAAAAAAAGABwAAAABAAAAAAAGABsAAAABAAAAAAAGABoAAAABAAAAAAAGABkAAAABAAAAAAAGABgAAAABAAAAAAAGABcAAAABAAAAAAAHABcAAAABAAAAAAAHABgAAAABAAAAAAAHABkAAAABAAAAAAAHABoAAAABAAAAAAAHABsAAAABAAAAAAAHABwAAAABAAAAAAAHAB0AAAABAAAAAAAHAB4AAAABAAAAAAAHAB8AAAABAAAAAAAHACAAAAAAAAAAAAAIAAEAAAAAAAAAAAAIAAIAAAABAAAAAAAIAAMAAAABAAAAAAAIAAQAAAABAAAAAAAIAAUAAAABAAAAAAAIAAYAAAABAAAAAAAIAAcAAAABAAAAAAAIAAgAAAABAAAAAAAIAAkAAAABAAAAAAAIAAoAAAABAAAAAAAIAAsAAAABAAAAAAAIAAwAAAABAAAAAAAIAA4AAAAAAAAAAAAIAA8AAAAAAAAAAAAIABAAAAABAAAAAAAIABEAAAABAAAAAAAIABIAAAABAAAAAAAIABMAAAABAAAAAAAIABQAAAABAAAAAAAIABUAAAABAAAAAAAIABYAAAABAAAAAAAIABcAAAABAAAAAAAIABgAAAABAAAAAAAIABkAAAABAAAAAAAIABoAAAABAAAAAAAIABsAAAABAAAAAAAIABwAAAABAAAAAAAIAB0AAAABAAAAAAAIAB4AAAABAAAAAAAIAB8AAAABAAAAAAAIACAAAAAAAAAAAAAJAAEAAAAAAAAAAAAJAAIAAAABAAAAAAAJAAMAAAABAAAAAAAJAAQAAAABAAAAAAAJAAUAAAABAAAAAAAJAAYAAAABAAAAAAAJAAcAAAABAAAAAAAJAAgAAAABAAAAAAAJAAkAAAABAAAAAAAJAA0AAAABAAAAAAAJAA4AAAAAAAAAAAAJAA8AAAAAAAAAAAAJABAAAAABAAAAAAAJABEAAAABAAAAAAAJABIAAAABAAAAAAAJABMAAAABAAAAAAAJABQAAAABAAAAAAAJABUAAAABAAAAAAAJABYAAAABAAAAAAAJABcAAAABAAAAAAAJABgAAAABAAAAAAAJABkAAAABAAAAAAAJABoAAAABAAAAAAAJABsAAAABAAAAAAAJABwAAAABAAAAAAAJAB0AAAABAAAAAAAJAB4AAAABAAAAAAAJAB8AAAABAAAAAAAJACAAAAAAAAAAAAAKAAEAAAAAAAAAAAAKAAIAAAABAAAAAAAKAAMAAAABAAAAAAAKAAQAAAABAAAAAAAKAAUAAAABAAAAAAAKAAYAAAABAAAAAAAKAAoAAAABAAAAAAAKAAsAAAABAAAAAAAKAAwAAAABAAAAAAAKAA0AAAABAAAAAAAKAA4AAAAAAAAAAAAKAA8AAAAAAAAAAAAKABAAAAABAAAAAAAKABEAAAABAAAAAAAKABIAAAABAAAAAAAKABMAAAABAAAAAAAKABQAAAABAAAAAAAKABUAAAABAAAAAAAKABYAAAABAAAAAAAKABcAAAABAAAAAAAKABgAAAABAAAAAAAKABkAAAABAAAAAAAKABoAAAABAAAAAAAKABsAAAABAAAAAAAKABwAAAABAAAAAAAKAB0AAAABAAAAAAAKAB4AAAABAAAAAAAKAB8AAAABAAAAAAAKACAAAAAAAAAAAAALAAEAAAAAAAAAAAALAAIAAAABAAAAAAALAAMAAAABAAAAAAALAAQAAAABAAAAAAALAAUAAAABAAAAAAALAAgAAAABAAAAAAALAAkAAAABAAAAAAALAAoAAAABAAAAAAALAAsAAAABAAAAAAALAAwAAAABAAAAAAALAA0AAAABAAAAAAALAA4AAAAAAAAAAAALAA8AAAAAAAAAAAALABAAAAABAAAAAAALABEAAAABAAAAAAALABIAAAABAAAAAAALABMAAAABAAAAAAALABQAAAABAAAAAAALABUAAAABAAAAAAALABYAAAABAAAAAAALABcAAAABAAAAAAALABgAAAABAAAAAAALABkAAAABAAAAAAALABoAAAABAAAAAAALABsAAAABAAAAAAALABwAAAABAAAAAAALAB0AAAABAAAAAAALAB4AAAABAAAAAAALAB8AAAABAAAAAAALACAAAAAAAAAAAAAMAAEAAAAAAAAAAAAMAAIAAAAAAAAAAAAMAAMAAAAAAAAAAAAMAAQAAAAAAAAAAAAMAAUAAAAAAAAAAAAMAAYAAAAAAAAAAAAMAAcAAAAAAAAAAAAMAAgAAAAAAAAAAAAMAAkAAAAAAAAAAAAMAAoAAAAAAAAAAAAMAAsAAAAAAAAAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAAAAAAMAA4AAAAAAAAAAAAMAA8AAAAAAAAAAAAMABAAAAABAAAAAAAMABEAAAABAAAAAAAMABIAAAABAAAAAAAMABMAAAABAAAAAAAMABQAAAABAAAAAAAMABUAAAABAAAAAAAMABYAAAABAAAAAAAMABcAAAABAAAAAAAMABgAAAABAAAAAAAMABkAAAABAAAAAAAMABoAAAABAAAAAAAMABsAAAABAAAAAAAMABwAAAABAAAAAAAMAB0AAAABAAAAAAAMAB4AAAABAAAAAAAMAB8AAAABAAAAAAAMACAAAAAAAAAAAAANAAEAAAAAAAAAAAANAAIAAAAAAAAAAAANAAMAAAAAAAAAAAANAAQAAAAAAAAAAAANAAUAAAAAAAAAAAANAAYAAAAAAAAAAAANAAcAAAAAAAAAAAANAAkAAAAAAAAAAAANAAoAAAAAAAAAAAANAAsAAAAAAAAAAAANAAwAAAAAAAAAAAANAA0AAAAAAAAAAAANAA4AAAAAAAAAAAANAA8AAAAAAAAAAAANABAAAAABAAAAAAANABEAAAABAAAAAAANABIAAAABAAAAAAANABMAAAABAAAAAAANABQAAAABAAAAAAANABUAAAABAAAAAAANABYAAAABAAAAAAANABcAAAABAAAAAAANABgAAAABAAAAAAANABkAAAABAAAAAAANABoAAAABAAAAAAANABsAAAABAAAAAAANABwAAAABAAAAAAANAB0AAAABAAAAAAANAB4AAAABAAAAAAANAB8AAAABAAAAAAANACAAAAAAAAAAAAAOAAEAAAAAAAAAAAAOAAIAAAABAAAAAAAOAAMAAAABAAAAAAAOAAQAAAABAAAAAAAOAAUAAAABAAAAAAAOAAYAAAABAAAAAAAOAAcAAAABAAAAAAAOAAgAAAABAAAAAAAOAAkAAAABAAAAAAAOAAoAAAABAAAAAAAOAAsAAAABAAAAAAAOAAwAAAABAAAAAAAOAA0AAAABAAAAAAAOAA4AAAABAAAAAAAOAA8AAAABAAAAAAAOABAAAAABAAAAAAAOABEAAAABAAAAAAAOABIAAAABAAAAAAAOABMAAAABAAAAAAAOABQAAAABAAAAAAAOABUAAAABAAAAAAAOABYAAAABAAAAAAAOABcAAAABAAAAAAAOABgAAAABAAAAAAAOABkAAAABAAAAAAAOABoAAAABAAAAAAAOABsAAAABAAAAAAAOABwAAAABAAAAAAAOAB0AAAABAAAAAAAOAB4AAAABAAAAAAAOAB8AAAABAAAAAAAOACAAAAAAAAAAAAAPAAEAAAAAAAAAAAAPAAIAAAABAAAAAAAPAAMAAAABAAAAAAAPAAQAAAABAAAAAAAPAAUAAAABAAAAAAAPAAYAAAABAAAAAAAPAAcAAAABAAAAAAAPAAgAAAABAAAAAAAPAAkAAAABAAAAAAAPAAoAAAABAAAAAAAPAAsAAAABAAAAAAAPAAwAAAABAAAAAAAPAA0AAAABAAAAAAAPAA4AAAABAAAAAAAPAA8AAAABAAAAAAAPABAAAAABAAAAAAAPABEAAAABAAAAAAAPABIAAAABAAAAAAAPABMAAAABAAAAAAAPABQAAAABAAAAAAAPABUAAAABAAAAAAAPABYAAAABAAAAAAAPABcAAAABAAAAAAAPABgAAAABAAAAAAAPABkAAAABAAAAAAAPABoAAAABAAAAAAAPABsAAAABAAAAAAAPABwAAAABAAAAAAAPAB0AAAABAAAAAAAPAB4AAAABAAAAAAAPAB8AAAABAAAAAAAPACAAAAAAAAAAAAAQAAEAAAAAAAAAAAAQAAIAAAAAAAAAAAAQAAMAAAAAAAAAAAAQAAQAAAAAAAAAAAAQAAUAAAAAAAAAAAAQAAYAAAAAAAAAAAAQAAcAAAAAAAAAAAAQAAgAAAAAAAAAAAAQAAkAAAAAAAAAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAAQAAwAAAAAAAAAAAAQAA0AAAAAAAAAAAAQAA4AAAAAAAAAAAAQAA8AAAAAAAAAAAAQABAAAAAAAAAAAAAQABEAAAAAAAAAAAAQABIAAAAAAAAAAAAQABMAAAAAAAAAAAAQABQAAAAAAAAAAAAQABUAAAAAAAAAAAAQABYAAAAAAAAAAAAQABcAAAAAAAAAAAAQABgAAAABAAAAAAAQABkAAAABAAAAAAAQABoAAAABAAAAAAAQABsAAAABAAAAAAAQABwAAAABAAAAAAAQAB0AAAABAAAAAAAQAB4AAAABAAAAAAAQAB8AAAABAAAAAAAQACAAAAAAAAAAAAARAAEAAAAAAAAAAAARAAIAAAAAAAAAAAARAAMAAAAAAAAAAAARAAQAAAAAAAAAAAARAAUAAAAAAAAAAAARAAYAAAAAAAAAAAARAAcAAAAAAAAAAAARAAgAAAAAAAAAAAARAAkAAAAAAAAAAAARAAoAAAAAAAAAAAARAAsAAAAAAAAAAAARAAwAAAAAAAAAAAARAA0AAAAAAAAAAAARAA4AAAAAAAAAAAARAA8AAAAAAAAAAAARABAAAAAAAAAAAAARABEAAAAAAAAAAAARABIAAAAAAAAAAAARABMAAAAAAAAAAAARABQAAAAAAAAAAAARABUAAAAAAAAAAAARABYAAAAAAAAAAAARABcAAAAAAAAAAAARABgAAAABAAAAAAARABkAAAABAAAAAAARABoAAAABAAAAAAARABsAAAABAAAAAAARABwAAAABAAAAAAARAB0AAAABAAAAAAARAB4AAAABAAAAAAARAB8AAAABAAAAAAARACAAAAAAAAAAAAASAAEAAAAAAAAAAAASAAIAAAAAAAAAAAASAAMAAAAAAAAAAAASAAQAAAAAAAAAAAASAAUAAAAAAAAAAAASAAYAAAAAAAAAAAASAAcAAAAAAAAAAAASAAgAAAAAAAAAAAASAAkAAAAAAAAAAAASAAoAAAAAAAAAAAASAAsAAAAAAAAAAAASAAwAAAAAAAAAAAASAA0AAAAAAAAAAAASAA4AAAAAAAAAAAASAA8AAAAAAAAAAAASABAAAAAAAAAAAAASABEAAAAAAAAAAAASABIAAAAAAAAAAAASABMAAAAAAAAAAAASABQAAAAAAAAAAAASABUAAAAAAAAAAAASABYAAAAAAAAAAAASABcAAAAAAAAAAAASABgAAAABAAAAAAASABkAAAABAAAAAAASABoAAAABAAAAAAASABsAAAABAAAAAAASABwAAAABAAAAAAASAB0AAAABAAAAAAASAB4AAAABAAAAAAASAB8AAAABAAAAAAASACAAAAAAAAAAAAATAAEAAAAAAAAAAAATAAIAAAABAAAAAAATAAMAAAABAAAAAAATAAQAAAABAAAAAAATAAUAAAABAAAAAAATAAYAAAABAAAAAAATAAcAAAABAAAAAAATAAgAAAABAAAAAAATAAkAAAABAAAAAAATAAoAAAABAAAAAAATAAsAAAABAAAAAAATAAwAAAABAAAAAAATAA0AAAABAAAAAAATAA4AAAABAAAAAAATAA8AAAABAAAAAAATABAAAAABAAAAAAATABEAAAABAAAAAAATABIAAAABAAAAAAATABMAAAABAAAAAAATABQAAAABAAAAAAATABUAAAABAAAAAAATABYAAAABAAAAAAATABcAAAABAAAAAAATABgAAAABAAAAAAATABkAAAABAAAAAAATABoAAAABAAAAAAATABsAAAABAAAAAAATABwAAAABAAAAAAATAB0AAAABAAAAAAATAB4AAAABAAAAAAATAB8AAAABAAAAAAATACAAAAAAAAAAAAAUAAEAAAAAAAAAAAAUAAIAAAABAAAAAAAUAAMAAAABAAAAAAAUAAQAAAABAAAAAAAUAAUAAAABAAAAAAAUAAYAAAABAAAAAAAUAAcAAAABAAAAAAAUAAgAAAABAAAAAAAUAAkAAAABAAAAAAAUAAoAAAABAAAAAAAUAAsAAAABAAAAAAAUAAwAAAABAAAAAAAUAA0AAAABAAAAAAAUAA4AAAABAAAAAAAUAA8AAAABAAAAAAAUABAAAAABAAAAAAAUABEAAAABAAAAAAAUABIAAAABAAAAAAAUABMAAAABAAAAAAAUABQAAAABAAAAAAAUABUAAAABAAAAAAAUABYAAAABAAAAAAAUABcAAAABAAAAAAAUABgAAAABAAAAAAAUABkAAAABAAAAAAAUABoAAAABAAAAAAAUABsAAAABAAAAAAAUABwAAAABAAAAAAAUAB0AAAABAAAAAAAUAB4AAAABAAAAAAAUAB8AAAABAAAAAAAUACAAAAAAAAAAAAAVAAEAAAAAAAAAAAAVAAIAAAABAAAAAAAVAAMAAAABAAAAAAAVAAQAAAABAAAAAAAVAAUAAAABAAAAAAAVAAYAAAABAAAAAAAVAAcAAAABAAAAAAAVAAgAAAABAAAAAAAVAAkAAAABAAAAAAAVAAoAAAABAAAAAAAVAAsAAAABAAAAAAAVAAwAAAABAAAAAAAVAA0AAAABAAAAAAAVAA4AAAABAAAAAAAVAA8AAAABAAAAAAAVABAAAAABAAAAAAAVABEAAAABAAAAAAAVABIAAAABAAAAAAAVABMAAAABAAAAAAAVABQAAAABAAAAAAAVABUAAAABAAAAAAAVABYAAAABAAAAAAAVABcAAAABAAAAAAAVABgAAAABAAAAAAAVABkAAAABAAAAAAAVABoAAAABAAAAAAAVABsAAAABAAAAAAAVABwAAAABAAAAAAAVAB0AAAABAAAAAAAVAB4AAAABAAAAAAAVAB8AAAABAAAAAAAVACAAAAAAAAAAAAAWAAEAAAAAAAAAAAAWAAIAAAABAAAAAAAWAAMAAAABAAAAAAAWAAQAAAABAAAAAAAWAAUAAAABAAAAAAAWAAYAAAABAAAAAAAWAAcAAAABAAAAAAAWAAgAAAABAAAAAAAWAAkAAAABAAAAAAAWAAoAAAABAAAAAAAWAAsAAAABAAAAAAAWAAwAAAABAAAAAAAWAA0AAAABAAAAAAAWAA4AAAABAAAAAAAWAA8AAAABAAAAAAAWABAAAAABAAAAAAAWABEAAAABAAAAAAAWABIAAAAAAAAAAAAWABMAAAAAAAAAAAAWABQAAAABAAAAAAAWABUAAAABAAAAAAAWABYAAAABAAAAAAAWABcAAAABAAAAAAAWABgAAAABAAAAAAAWABkAAAABAAAAAAAWABoAAAABAAAAAAAWABsAAAABAAAAAAAWABwAAAABAAAAAAAWAB0AAAABAAAAAAAWAB4AAAABAAAAAAAWAB8AAAABAAAAAAAWACAAAAAAAAAAAAAXAAEAAAAAAAAAAAAXAAIAAAABAAAAAAAXAAMAAAABAAAAAAAXAAQAAAABAAAAAAAXAAUAAAABAAAAAAAXAAYAAAABAAAAAAAXAAcAAAABAAAAAAAXAAgAAAABAAAAAAAXAAkAAAABAAAAAAAXAAoAAAABAAAAAAAXAAsAAAABAAAAAAAXAAwAAAABAAAAAAAXAA0AAAABAAAAAAAXAA4AAAABAAAAAAAXAA8AAAABAAAAAAAXABAAAAABAAAAAAAXABEAAAAAAAAAAAAXABIAAAAAAAAAAAAXABMAAAAAAAAAAAAXABQAAAAAAAAAAAAXABUAAAABAAAAAAAXABYAAAABAAAAAAAXABcAAAABAAAAAAAXABgAAAABAAAAAAAXABkAAAABAAAAAAAXABoAAAABAAAAAAAXABsAAAABAAAAAAAXABwAAAABAAAAAAAXAB0AAAABAAAAAAAXAB4AAAABAAAAAAAXAB8AAAABAAAAAAAXACAAAAAAAAAAAAAYAAEAAAAAAAAAAAAYAAIAAAABAAAAAAAYAAMAAAABAAAAAAAYAAQAAAABAAAAAAAYAAUAAAABAAAAAAAYAAYAAAABAAAAAAAYAAcAAAABAAAAAAAYAAgAAAABAAAAAAAYAAkAAAABAAAAAAAYAAoAAAABAAAAAAAYAAsAAAABAAAAAAAYAAwAAAABAAAAAAAYAA0AAAABAAAAAAAYAA4AAAABAAAAAAAYAA8AAAABAAAAAAAYABAAAAABAAAAAAAYABEAAAAAAAAAAAAYABIAAAAAAAAAAAAYABMAAAAAAAAAAAAYABQAAAAAAAAAAAAYABUAAAABAAAAAAAYABYAAAABAAAAAAAYABcAAAABAAAAAAAYABgAAAABAAAAAAAYABkAAAABAAAAAAAYABoAAAABAAAAAAAYABsAAAABAAAAAAAYABwAAAABAAAAAAAYAB0AAAABAAAAAAAYAB4AAAABAAAAAAAYAB8AAAABAAAAAAAYACAAAAAAAAAAAAAZAAEAAAAAAAAAAAAZAAIAAAABAAAAAAAZAAMAAAABAAAAAAAZAAQAAAABAAAAAAAZAAUAAAABAAAAAAAZAAYAAAABAAAAAAAZAAcAAAABAAAAAAAZAAgAAAABAAAAAAAZAAkAAAABAAAAAAAZAAoAAAABAAAAAAAZAAsAAAABAAAAAAAZAAwAAAABAAAAAAAZAA0AAAABAAAAAAAZAA4AAAABAAAAAAAZAA8AAAABAAAAAAAZABAAAAABAAAAAAAZABEAAAABAAAAAAAZABIAAAAAAAAAAAAZABMAAAAAAAAAAAAZABQAAAABAAAAAAAZABUAAAABAAAAAAAZABYAAAABAAAAAAAZABcAAAABAAAAAAAZABgAAAABAAAAAAAZABkAAAABAAAAAAAZABoAAAABAAAAAAAZABsAAAABAAAAAAAZABwAAAABAAAAAAAZAB0AAAABAAAAAAAZAB4AAAABAAAAAAAZAB8AAAABAAAAAAAZACAAAAAAAAAAAAAaAAEAAAAAAAAAAAAaAAIAAAABAAAAAAAaAAMAAAABAAAAAAAaAAQAAAABAAAAAAAaAAUAAAABAAAAAAAaAAYAAAABAAAAAAAaAAcAAAABAAAAAAAaAAgAAAABAAAAAAAaAAkAAAABAAAAAAAaAAoAAAABAAAAAAAaAAsAAAABAAAAAAAaAAwAAAABAAAAAAAaAA0AAAABAAAAAAAaAA4AAAABAAAAAAAaAA8AAAABAAAAAAAaABAAAAABAAAAAAAaABEAAAABAAAAAAAaABIAAAABAAAAAAAaABMAAAABAAAAAAAaABQAAAABAAAAAAAaABUAAAABAAAAAAAaABYAAAABAAAAAAAaABcAAAABAAAAAAAaABgAAAABAAAAAAAaABkAAAABAAAAAAAaABoAAAABAAAAAAAaABsAAAABAAAAAAAaABwAAAABAAAAAAAaAB0AAAABAAAAAAAaAB4AAAABAAAAAAAaAB8AAAABAAAAAAAaACAAAAAAAAAAAAAbAAEAAAAAAAAAAAAbAAIAAAABAAAAAAAbAAMAAAABAAAAAAAbAAQAAAABAAAAAAAbAAUAAAABAAAAAAAbAAYAAAABAAAAAAAbAAcAAAABAAAAAAAbAAgAAAABAAAAAAAbAAkAAAABAAAAAAAbAAoAAAABAAAAAAAbAAsAAAABAAAAAAAbAAwAAAABAAAAAAAbAA0AAAABAAAAAAAbAA4AAAABAAAAAAAbAA8AAAABAAAAAAAbABAAAAABAAAAAAAbABEAAAABAAAAAAAbABIAAAABAAAAAAAbABMAAAABAAAAAAAbABQAAAABAAAAAAAbABUAAAABAAAAAAAbABYAAAABAAAAAAAbABcAAAABAAAAAAAbABgAAAABAAAAAAAbABkAAAABAAAAAAAbABoAAAABAAAAAAAbABsAAAABAAAAAAAbABwAAAABAAAAAAAbAB0AAAABAAAAAAAbAB4AAAABAAAAAAAbAB8AAAABAAAAAAAbACAAAAAAAAAAAAAcAAEAAAAAAAAAAAAcAAIAAAABAAAAAAAcAAMAAAABAAAAAAAcAAQAAAABAAAAAAAcAAUAAAABAAAAAAAcAAYAAAABAAAAAAAcAAcAAAABAAAAAAAcAAgAAAABAAAAAAAcAAkAAAABAAAAAAAcAAoAAAABAAAAAAAcAAsAAAABAAAAAAAcAAwAAAABAAAAAAAcAA0AAAABAAAAAAAcAA4AAAABAAAAAAAcAA8AAAABAAAAAAAcABAAAAABAAAAAAAcABEAAAABAAAAAAAcABIAAAABAAAAAAAcABMAAAABAAAAAAAcABQAAAABAAAAAAAcABUAAAABAAAAAAAcABYAAAABAAAAAAAcABcAAAABAAAAAAAcABgAAAABAAAAAAAcABkAAAABAAAAAAAcABoAAAABAAAAAAAcABsAAAABAAAAAAAcABwAAAABAAAAAAAcAB0AAAABAAAAAAAcAB4AAAABAAAAAAAcAB8AAAABAAAAAAAcACAAAAAAAAAAAAAdAAEAAAAAAAAAAAAdAAIAAAABAAAAAAAdAAMAAAABAAAAAAAdAAQAAAABAAAAAAAdAAUAAAABAAAAAAAdAAYAAAABAAAAAAAdAAcAAAABAAAAAAAdAAgAAAABAAAAAAAdAAkAAAABAAAAAAAdAAoAAAABAAAAAAAdAAsAAAABAAAAAAAdAAwAAAABAAAAAAAdAA0AAAAAAAAAAAAdAA4AAAAAAAAAAAAdAA8AAAAAAAAAAAAdABAAAAAAAAAAAAAdABEAAAAAAAAAAAAdABIAAAAAAAAAAAAdABMAAAAAAAAAAAAdABQAAAAAAAAAAAAdABUAAAAAAAAAAAAdABYAAAAAAAAAAAAdABcAAAAAAAAAAAAdABgAAAAAAAAAAAAdABkAAAAAAAAAAAAdABoAAAAAAAAAAAAdABsAAAAAAAAAAAAdABwAAAAAAAAAAAAdAB0AAAAAAAAAAAAdAB4AAAAAAAAAAAAdAB8AAAAAAAAAAAAdACAAAAAAAAAAAAAeAAEAAAAAAAAAAAAeAAIAAAABAAAAAAAeAAMAAAABAAAAAAAeAAQAAAABAAAAAAAeAAUAAAABAAAAAAAeAAYAAAABAAAAAAAeAAcAAAABAAAAAAAeAAgAAAABAAAAAAAeAAkAAAABAAAAAAAeAAoAAAABAAAAAAAeAAsAAAABAAAAAAAeAAwAAAABAAAAAAAeAA0AAAAAAAAAAAAeAA4AAAAAAAAAAAAeAA8AAAAAAAAAAAAeABAAAAAAAAAAAAAeABEAAAAAAAAAAAAeABIAAAAAAAAAAAAeABMAAAAAAAAAAAAeABQAAAAAAAAAAAAeABUAAAAAAAAAAAAeABYAAAAAAAAAAAAeABcAAAAAAAAAAAAeABgAAAAAAAAAAAAeABkAAAAAAAAAAAAeABoAAAAAAAAAAAAeABsAAAAAAAAAAAAeABwAAAAAAAAAAAAeAB0AAAAAAAAAAAAeAB4AAAAAAAAAAAAeAB8AAAAAAAAAAAAeACAAAAAAAAAAAAAfAAEAAAAAAAAAAAAfAAIAAAABAAAAAAAfAAMAAAABAAAAAAAfAAQAAAABAAAAAAAfAAUAAAABAAAAAAAfAAYAAAABAAAAAAAfAAcAAAABAAAAAAAfAAgAAAABAAAAAAAfAAkAAAABAAAAAAAfAAoAAAABAAAAAAAfAAsAAAABAAAAAAAfAAwAAAABAAAAAAAfAA0AAAAAAAAAAAAfAA4AAAAAAAAAAAAfAA8AAAAAAAAAAAAfABAAAAAAAAAAAAAfABEAAAAAAAAAAAAfABIAAAAAAAAAAAAfABMAAAAAAAAAAAAfABQAAAAAAAAAAAAfABUAAAAAAAAAAAAfABYAAAAAAAAAAAAfABcAAAAAAAAAAAAfABgAAAAAAAAAAAAfABkAAAAAAAAAAAAfABoAAAAAAAAAAAAfABsAAAAAAAAAAAAfABwAAAAAAAAAAAAfAB0AAAAAAAAAAAAfAB4AAAAAAAAAAAAfAB8AAAAAAAAAAAAfACAAAAAAAAAAAAAgAAEAAAAAAAAAAAAgAAIAAAABAAAAAAAgAAMAAAABAAAAAAAgAAQAAAABAAAAAAAgAAUAAAABAAAAAAAgAAYAAAABAAAAAAAgAAcAAAABAAAAAAAgAAgAAAABAAAAAAAgAAkAAAABAAAAAAAgAAoAAAABAAAAAAAgAAsAAAABAAAAAAAgAAwAAAABAAAAAAAgAA0AAAABAAAAAAAgAA4AAAABAAAAAAAgAA8AAAABAAAAAAAgABAAAAABAAAAAAAgABEAAAABAAAAAAAgABIAAAABAAAAAAAgABMAAAABAAAAAAAgABQAAAABAAAAAAAgABUAAAABAAAAAAAgABYAAAABAAAAAAAgABcAAAABAAAAAAAgABgAAAABAAAAAAAgABkAAAABAAAAAAAgABoAAAABAAAAAAAgABsAAAABAAAAAAAgABwAAAABAAAAAAAgAB0AAAABAAAAAAAgAB4AAAABAAAAAAAgAB8AAAABAAAAAAAgACAAAAAAAAAAAAAhAAEAAAAAAAAAAAAhAAIAAAABAAAAAAAhAAMAAAABAAAAAAAhAAQAAAABAAAAAAAhAAUAAAABAAAAAAAhAAYAAAABAAAAAAAhAAcAAAABAAAAAAAhAAgAAAABAAAAAAAhAAkAAAABAAAAAAAhAAoAAAABAAAAAAAhAAsAAAABAAAAAAAhAAwAAAABAAAAAAAhAA0AAAABAAAAAAAhAA4AAAABAAAAAAAhAA8AAAABAAAAAAAhABAAAAABAAAAAAAhABEAAAABAAAAAAAhABIAAAABAAAAAAAhABMAAAABAAAAAAAhABQAAAABAAAAAAAhABUAAAABAAAAAAAhABYAAAABAAAAAAAhABcAAAABAAAAAAAhABgAAAABAAAAAAAhABkAAAABAAAAAAAhABoAAAABAAAAAAAhABsAAAABAAAAAAAhABwAAAABAAAAAAAhAB0AAAABAAAAAAAhAB4AAAABAAAAAAAhAB8AAAABAAAAAAAhACAAAAAAAAAAAAAiAAEAAAAAAAAAAAAiAAIAAAABAAAAAAAiAAMAAAABAAAAAAAiAAQAAAABAAAAAAAiAAUAAAABAAAAAAAiAAYAAAABAAAAAAAiAAcAAAABAAAAAAAiAAgAAAABAAAAAAAiAAkAAAABAAAAAAAiAAoAAAABAAAAAAAiAAsAAAABAAAAAAAiAAwAAAABAAAAAAAiAA0AAAABAAAAAAAiAA4AAAABAAAAAAAiAA8AAAABAAAAAAAiABAAAAABAAAAAAAiABEAAAABAAAAAAAiABIAAAABAAAAAAAiABMAAAABAAAAAAAiABQAAAABAAAAAAAiABUAAAABAAAAAAAiABYAAAABAAAAAAAiABcAAAABAAAAAAAiABgAAAABAAAAAAAiABkAAAABAAAAAAAiABoAAAABAAAAAAAiABsAAAABAAAAAAAiABwAAAABAAAAAAAiAB0AAAABAAAAAAAiAB4AAAABAAAAAAAiAB8AAAABAAAAAAAiACAAAAAAAAAAAAAjAAEAAAAAAAAAAAAjAAIAAAABAAAAAAAjAAMAAAABAAAAAAAjAAQAAAABAAAAAAAjAAUAAAABAAAAAAAjAAYAAAABAAAAAAAjAAcAAAABAAAAAAAjAAgAAAABAAAAAAAjAAkAAAABAAAAAAAjAAoAAAABAAAAAAAjAAsAAAABAAAAAAAjAAwAAAABAAAAAAAjAA0AAAABAAAAAAAjAA4AAAABAAAAAAAjAA8AAAABAAAAAAAjABAAAAABAAAAAAAjABEAAAABAAAAAAAjABIAAAABAAAAAAAjABMAAAABAAAAAAAjABQAAAABAAAAAAAjABUAAAABAAAAAAAjABYAAAABAAAAAAAjABcAAAABAAAAAAAjABgAAAABAAAAAAAjABkAAAABAAAAAAAjABoAAAABAAAAAAAjABsAAAABAAAAAAAjABwAAAABAAAAAAAjAB0AAAABAAAAAAAjAB4AAAABAAAAAAAjAB8AAAABAAAAAAAjACAAAAAAAAAAAAAkAAEAAAAAAAAAAAAkAAIAAAABAAAAAAAkAAMAAAABAAAAAAAkAAQAAAABAAAAAAAkAAUAAAABAAAAAAAkAAYAAAABAAAAAAAkAAcAAAABAAAAAAAkAAgAAAABAAAAAAAkAAkAAAABAAAAAAAkAAoAAAABAAAAAAAkAAsAAAABAAAAAAAkAAwAAAABAAAAAAAkAA0AAAABAAAAAAAkAA4AAAABAAAAAAAkAA8AAAABAAAAAAAkABAAAAABAAAAAAAkABEAAAABAAAAAAAkABIAAAABAAAAAAAkABMAAAABAAAAAAAkABQAAAABAAAAAAAkABUAAAABAAAAAAAkABYAAAABAAAAAAAkABcAAAABAAAAAAAkABgAAAABAAAAAAAkABkAAAABAAAAAAAkABoAAAABAAAAAAAkABsAAAABAAAAAAAkABwAAAABAAAAAAAkAB0AAAABAAAAAAAkAB4AAAABAAAAAAAkAB8AAAABAAAAAAAkACAAAAAAAAAAAAAlAAEAAAAAAAAAAAAlAAIAAAABAAAAAAAlAAMAAAABAAAAAAAlAAQAAAABAAAAAAAlAAUAAAABAAAAAAAlAAYAAAABAAAAAAAlAAcAAAABAAAAAAAlAAgAAAABAAAAAAAlAAkAAAABAAAAAAAlAAoAAAABAAAAAAAlAAsAAAABAAAAAAAlAAwAAAABAAAAAAAlAA0AAAABAAAAAAAlAA4AAAAAAAAAAAAlAA8AAAAAAAAAAAAlABAAAAABAAAAAAAlABEAAAABAAAAAAAlABIAAAABAAAAAAAlABMAAAABAAAAAAAlABQAAAABAAAAAAAlABUAAAABAAAAAAAlABYAAAABAAAAAAAlABcAAAABAAAAAAAlABgAAAABAAAAAAAlABkAAAABAAAAAAAlABoAAAABAAAAAAAlABsAAAABAAAAAAAlABwAAAABAAAAAAAlAB0AAAABAAAAAAAlAB4AAAABAAAAAAAlAB8AAAABAAAAAAAlACAAAAAAAAAAAAAmAAEAAAAAAAAAAAAmAAIAAAABAAAAAAAmAAMAAAABAAAAAAAmAAQAAAABAAAAAAAmAAUAAAABAAAAAAAmAAYAAAABAAAAAAAmAAcAAAABAAAAAAAmAAgAAAABAAAAAAAmAAkAAAABAAAAAAAmAAoAAAABAAAAAAAmAAsAAAABAAAAAAAmAAwAAAABAAAAAAAmAA0AAAAAAAAAAAAmAA4AAAAAAAAAAAAmAA8AAAAAAAAAAAAmABAAAAAAAAAAAAAmABEAAAABAAAAAAAmABIAAAABAAAAAAAmABMAAAABAAAAAAAmABQAAAABAAAAAAAmABUAAAABAAAAAAAmABYAAAABAAAAAAAmABcAAAABAAAAAAAmABgAAAABAAAAAAAmABkAAAABAAAAAAAmABoAAAABAAAAAAAmABsAAAABAAAAAAAmABwAAAABAAAAAAAmAB0AAAABAAAAAAAmAB4AAAABAAAAAAAmAB8AAAABAAAAAAAmACAAAAAAAAAAAAAnAAEAAAAAAAAAAAAnAAIAAAABAAAAAAAnAAMAAAABAAAAAAAnAAQAAAABAAAAAAAnAAUAAAABAAAAAAAnAAYAAAABAAAAAAAnAAcAAAABAAAAAAAnAAgAAAABAAAAAAAnAAkAAAABAAAAAAAnAAoAAAABAAAAAAAnAAsAAAABAAAAAAAnAAwAAAAAAAAAAAAnAA0AAAAAAAAAAAAnAA4AAAAAAAAAAAAnAA8AAAAAAAAAAAAnABAAAAAAAAAAAAAnABEAAAAAAAAAAAAnABIAAAABAAAAAAAnABMAAAABAAAAAAAnABQAAAABAAAAAAAnABUAAAABAAAAAAAnABYAAAABAAAAAAAnABcAAAABAAAAAAAnABgAAAABAAAAAAAnABkAAAABAAAAAAAnABoAAAABAAAAAAAnABsAAAABAAAAAAAnABwAAAABAAAAAAAnAB0AAAABAAAAAAAnAB4AAAABAAAAAAAnAB8AAAABAAAAAAAnACAAAAAAAAAAAAAoAAEAAAAAAAAAAAAoAAIAAAABAAAAAAAoAAMAAAABAAAAAAAoAAQAAAABAAAAAAAoAAUAAAABAAAAAAAoAAYAAAABAAAAAAAoAAcAAAABAAAAAAAoAAgAAAABAAAAAAAoAAkAAAABAAAAAAAoAAoAAAABAAAAAAAoAAsAAAABAAAAAAAoAAwAAAABAAAAAAAoAA0AAAAAAAAAAAAoAA4AAAAAAAAAAAAoAA8AAAAAAAAAAAAoABAAAAAAAAAAAAAoABEAAAABAAAAAAAoABIAAAABAAAAAAAoABMAAAABAAAAAAAoABQAAAABAAAAAAAoABUAAAABAAAAAAAoABYAAAABAAAAAAAoABcAAAABAAAAAAAoABgAAAABAAAAAAAoABkAAAABAAAAAAAoABoAAAABAAAAAAAoABsAAAABAAAAAAAoABwAAAABAAAAAAAoAB0AAAABAAAAAAAoAB4AAAABAAAAAAAoAB8AAAABAAAAAAAoACAAAAAAAAAAAAApAAEAAAAAAAAAAAApAAIAAAABAAAAAAApAAMAAAABAAAAAAApAAQAAAABAAAAAAApAAUAAAABAAAAAAApAAYAAAABAAAAAAApAAcAAAABAAAAAAApAAgAAAABAAAAAAApAAkAAAABAAAAAAApAAoAAAABAAAAAAApAAsAAAABAAAAAAApAAwAAAABAAAAAAApAA0AAAABAAAAAAApAA4AAAAAAAAAAAApAA8AAAAAAAAAAAApABAAAAABAAAAAAApABEAAAABAAAAAAApABIAAAABAAAAAAApABMAAAABAAAAAAApABQAAAABAAAAAAApABUAAAABAAAAAAApABYAAAABAAAAAAApABcAAAABAAAAAAApABgAAAABAAAAAAApABkAAAABAAAAAAApABoAAAABAAAAAAApABsAAAABAAAAAAApABwAAAABAAAAAAApAB0AAAABAAAAAAApAB4AAAABAAAAAAApAB8AAAABAAAAAAApACAAAAAAAAAAAAAqAAEAAAAAAAAAAAAqAAIAAAABAAAAAAAqAAMAAAABAAAAAAAqAAQAAAABAAAAAAAqAAUAAAABAAAAAAAqAAYAAAABAAAAAAAqAAcAAAABAAAAAAAqAAgAAAABAAAAAAAqAAkAAAABAAAAAAAqAAoAAAABAAAAAAAqAAsAAAABAAAAAAAqAAwAAAABAAAAAAAqAA0AAAABAAAAAAAqAA4AAAABAAAAAAAqAA8AAAABAAAAAAAqABAAAAABAAAAAAAqABEAAAABAAAAAAAqABIAAAABAAAAAAAqABMAAAABAAAAAAAqABQAAAABAAAAAAAqABUAAAABAAAAAAAqABYAAAABAAAAAAAqABcAAAABAAAAAAAqABgAAAABAAAAAAAqABkAAAABAAAAAAAqABoAAAABAAAAAAAqABsAAAABAAAAAAAqABwAAAABAAAAAAAqAB0AAAABAAAAAAAqAB4AAAABAAAAAAAqAB8AAAABAAAAAAAqACAAAAAAAAAAAAArAAEAAAAAAAAAAAArAAIAAAABAAAAAAArAAMAAAABAAAAAAArAAQAAAABAAAAAAArAAUAAAABAAAAAAArAAYAAAABAAAAAAArAAcAAAABAAAAAAArAAgAAAABAAAAAAArAAkAAAABAAAAAAArAAoAAAABAAAAAAArAAsAAAABAAAAAAArAAwAAAABAAAAAAArAA0AAAABAAAAAAArAA4AAAABAAAAAAArAA8AAAABAAAAAAArABAAAAABAAAAAAArABEAAAABAAAAAAArABIAAAABAAAAAAArABMAAAABAAAAAAArABQAAAABAAAAAAArABUAAAABAAAAAAArABYAAAABAAAAAAArABcAAAABAAAAAAArABgAAAABAAAAAAArABkAAAABAAAAAAArABoAAAABAAAAAAArABsAAAABAAAAAAArABwAAAABAAAAAAArAB0AAAABAAAAAAArAB4AAAABAAAAAAArAB8AAAABAAAAAAArACAAAAAAAAAAAAAsAAEAAAAAAAAAAAAsAAIAAAABAAAAAAAsAAMAAAABAAAAAAAsAAQAAAABAAAAAAAsAAUAAAABAAAAAAAsAAYAAAABAAAAAAAsAAcAAAABAAAAAAAsAAgAAAABAAAAAAAsAAkAAAABAAAAAAAsAAoAAAABAAAAAAAsAAsAAAABAAAAAAAsAAwAAAABAAAAAAAsAA0AAAABAAAAAAAsAA4AAAABAAAAAAAsAA8AAAABAAAAAAAsABAAAAABAAAAAAAsABEAAAABAAAAAAAsABIAAAABAAAAAAAsABMAAAABAAAAAAAsABQAAAABAAAAAAAsABUAAAABAAAAAAAsABYAAAABAAAAAAAsABcAAAABAAAAAAAsABgAAAABAAAAAAAsABkAAAABAAAAAAAsABoAAAABAAAAAAAsABsAAAABAAAAAAAsABwAAAABAAAAAAAsAB0AAAABAAAAAAAsAB4AAAABAAAAAAAsAB8AAAABAAAAAAAsACAAAAAAAAAAAAAtAAEAAAAAAAAAAAAtAAIAAAABAAAAAAAtAAMAAAABAAAAAAAtAAQAAAABAAAAAAAtAAUAAAABAAAAAAAtAAYAAAABAAAAAAAtAAcAAAABAAAAAAAtAAgAAAABAAAAAAAtAAkAAAABAAAAAAAtAAoAAAABAAAAAAAtAAsAAAABAAAAAAAtAAwAAAABAAAAAAAtAA0AAAABAAAAAAAtAA4AAAABAAAAAAAtAA8AAAABAAAAAAAtABAAAAABAAAAAAAtABEAAAABAAAAAAAtABIAAAABAAAAAAAtABMAAAABAAAAAAAtABQAAAABAAAAAAAtABUAAAABAAAAAAAtABYAAAABAAAAAAAtABcAAAABAAAAAAAtABgAAAABAAAAAAAtABkAAAABAAAAAAAtABoAAAABAAAAAAAtABsAAAABAAAAAAAtABwAAAABAAAAAAAtAB0AAAABAAAAAAAtAB4AAAABAAAAAAAtAB8AAAABAAAAAAAtACAAAAAAAAAAAAAuAAEAAAAAAAAAAAAuAAIAAAABAAAAAAAuAAMAAAABAAAAAAAuAAQAAAABAAAAAAAuAAUAAAABAAAAAAAuAAYAAAABAAAAAAAuAAcAAAABAAAAAAAuAAgAAAABAAAAAAAuAAkAAAABAAAAAAAuAAoAAAABAAAAAAAuAAsAAAABAAAAAAAuAAwAAAABAAAAAAAuAA0AAAABAAAAAAAuAA4AAAABAAAAAAAuAA8AAAABAAAAAAAuABAAAAABAAAAAAAuABEAAAABAAAAAAAuABIAAAABAAAAAAAuABMAAAABAAAAAAAuABQAAAABAAAAAAAuABUAAAABAAAAAAAuABYAAAABAAAAAAAuABcAAAABAAAAAAAuABgAAAABAAAAAAAuABkAAAABAAAAAAAuABoAAAABAAAAAAAuABsAAAABAAAAAAAuABwAAAABAAAAAAAuAB0AAAABAAAAAAAuAB4AAAABAAAAAAAuAB8AAAABAAAAAAAuACAAAAAAAAAAAAAvAAEAAAAAAAAAAAAvAAIAAAABAAAAAAAvAAMAAAABAAAAAAAvAAQAAAABAAAAAAAvAAUAAAABAAAAAAAvAAYAAAABAAAAAAAvAAcAAAABAAAAAAAvAAgAAAABAAAAAAAvAAkAAAABAAAAAAAvAAoAAAABAAAAAAAvAAsAAAAAAAAAAAAvAAwAAAAAAAAAAAAvAA0AAAAAAAAAAAAvAA4AAAAAAAAAAAAvAA8AAAAAAAAAAAAvABAAAAABAAAAAAAvABEAAAABAAAAAAAvABIAAAAAAAAAAAAvABMAAAAAAAAAAAAvABQAAAAAAAAAAAAvABUAAAAAAAAAAAAvABYAAAABAAAAAAAvABcAAAABAAAAAAAvABgAAAABAAAAAAAvABkAAAABAAAAAAAvABoAAAABAAAAAAAvABsAAAABAAAAAAAvABwAAAABAAAAAAAvAB0AAAABAAAAAAAvAB4AAAABAAAAAAAvAB8AAAABAAAAAAAvACAAAAAAAAAAAAAwAAEAAAAAAAAAAAAwAAIAAAABAAAAAAAwAAMAAAABAAAAAAAwAAQAAAABAAAAAAAwAAUAAAABAAAAAAAwAAYAAAABAAAAAAAwAAcAAAABAAAAAAAwAAgAAAABAAAAAAAwAAkAAAABAAAAAAAwAAoAAAABAAAAAAAwAAsAAAAAAAAAAAAwAAwAAAAAAAAAAAAwAA0AAAAAAAAAAAAwAA4AAAAAAAAAAAAwAA8AAAAAAAAAAAAwABAAAAABAAAAAAAwABEAAAABAAAAAAAwABIAAAAAAAAAAAAwABMAAAAAAAAAAAAwABQAAAAAAAAAAAAwABUAAAAAAAAAAAAwABYAAAABAAAAAAAwABcAAAABAAAAAAAwABgAAAABAAAAAAAwABkAAAABAAAAAAAwABoAAAABAAAAAAAwABsAAAABAAAAAAAwABwAAAABAAAAAAAwAB0AAAABAAAAAAAwAB4AAAABAAAAAAAwAB8AAAABAAAAAAAwACAAAAAAAAAAAAAxAAEAAAAAAAAAAAAxAAIAAAABAAAAAAAxAAMAAAABAAAAAAAxAAQAAAABAAAAAAAxAAUAAAABAAAAAAAxAAYAAAABAAAAAAAxAAcAAAABAAAAAAAxAAgAAAABAAAAAAAxAAkAAAABAAAAAAAxAAoAAAABAAAAAAAxAAsAAAAAAAAAAAAxAAwAAAAAAAAAAAAxAA0AAAABAAAAAAAxAA4AAAABAAAAAAAxAA8AAAABAAAAAAAxABAAAAABAAAAAAAxABEAAAABAAAAAAAxABIAAAABAAAAAAAxABMAAAABAAAAAAAxABQAAAAAAAAAAAAxABUAAAAAAAAAAAAxABYAAAABAAAAAAAxABcAAAABAAAAAAAxABgAAAABAAAAAAAxABkAAAABAAAAAAAxABoAAAABAAAAAAAxABsAAAABAAAAAAAxABwAAAABAAAAAAAxAB0AAAABAAAAAAAxAB4AAAABAAAAAAAxAB8AAAABAAAAAAAxACAAAAAAAAAAAAAyAAEAAAAAAAAAAAAyAAIAAAABAAAAAAAyAAMAAAABAAAAAAAyAAQAAAABAAAAAAAyAAUAAAABAAAAAAAyAAYAAAABAAAAAAAyAAcAAAABAAAAAAAyAAgAAAABAAAAAAAyAAkAAAABAAAAAAAyAAoAAAABAAAAAAAyAAsAAAAAAAAAAAAyAAwAAAAAAAAAAAAyAA0AAAABAAAAAAAyAA4AAAABAAAAAAAyAA8AAAABAAAAAAAyABAAAAABAAAAAAAyABEAAAABAAAAAAAyABIAAAABAAAAAAAyABMAAAABAAAAAAAyABQAAAAAAAAAAAAyABUAAAAAAAAAAAAyABYAAAABAAAAAAAyABcAAAABAAAAAAAyABgAAAABAAAAAAAyABkAAAABAAAAAAAyABoAAAABAAAAAAAyABsAAAABAAAAAAAyABwAAAABAAAAAAAyAB0AAAABAAAAAAAyAB4AAAABAAAAAAAyAB8AAAABAAAAAAAyACAAAAAAAAAAAAAzAAEAAAAAAAAAAAAzAAIAAAABAAAAAAAzAAMAAAABAAAAAAAzAAQAAAABAAAAAAAzAAUAAAABAAAAAAAzAAYAAAABAAAAAAAzAAcAAAABAAAAAAAzAAgAAAABAAAAAAAzAAkAAAABAAAAAAAzAAoAAAABAAAAAAAzAAsAAAAAAAAAAAAzAAwAAAAAAAAAAAAzAA0AAAABAAAAAAAzAA4AAAABAAAAAAAzAA8AAAABAAAAAAAzABAAAAABAAAAAAAzABEAAAABAAAAAAAzABIAAAABAAAAAAAzABMAAAABAAAAAAAzABQAAAAAAAAAAAAzABUAAAAAAAAAAAAzABYAAAABAAAAAAAzABcAAAABAAAAAAAzABgAAAABAAAAAAAzABkAAAABAAAAAAAzABoAAAABAAAAAAAzABsAAAABAAAAAAAzABwAAAABAAAAAAAzAB0AAAABAAAAAAAzAB4AAAABAAAAAAAzAB8AAAABAAAAAAAzACAAAAAAAAAAAAA0AAEAAAAAAAAAAAA0AAIAAAABAAAAAAA0AAMAAAABAAAAAAA0AAQAAAABAAAAAAA0AAUAAAABAAAAAAA0AAYAAAABAAAAAAA0AAcAAAABAAAAAAA0AAgAAAABAAAAAAA0AAkAAAABAAAAAAA0AAoAAAABAAAAAAA0AAsAAAAAAAAAAAA0AAwAAAAAAAAAAAA0AA0AAAABAAAAAAA0AA4AAAABAAAAAAA0AA8AAAABAAAAAAA0ABAAAAABAAAAAAA0ABEAAAABAAAAAAA0ABIAAAABAAAAAAA0ABMAAAABAAAAAAA0ABQAAAAAAAAAAAA0ABUAAAAAAAAAAAA0ABYAAAABAAAAAAA0ABcAAAABAAAAAAA0ABgAAAABAAAAAAA0ABkAAAABAAAAAAA0ABoAAAABAAAAAAA0ABsAAAABAAAAAAA0ABwAAAABAAAAAAA0AB0AAAABAAAAAAA0AB4AAAABAAAAAAA0AB8AAAABAAAAAAA0ACAAAAAAAAAAAAA1AAEAAAAAAAAAAAA1AAIAAAABAAAAAAA1AAMAAAABAAAAAAA1AAQAAAABAAAAAAA1AAUAAAABAAAAAAA1AAYAAAABAAAAAAA1AAcAAAABAAAAAAA1AAgAAAABAAAAAAA1AAkAAAABAAAAAAA1AAoAAAABAAAAAAA1AAsAAAAAAAAAAAA1AAwAAAAAAAAAAAA1AA0AAAABAAAAAAA1AA4AAAABAAAAAAA1AA8AAAABAAAAAAA1ABAAAAABAAAAAAA1ABEAAAABAAAAAAA1ABIAAAABAAAAAAA1ABMAAAABAAAAAAA1ABQAAAAAAAAAAAA1ABUAAAAAAAAAAAA1ABYAAAABAAAAAAA1ABcAAAABAAAAAAA1ABgAAAABAAAAAAA1ABkAAAABAAAAAAA1ABoAAAABAAAAAAA1ABsAAAABAAAAAAA1ABwAAAABAAAAAAA1AB0AAAABAAAAAAA1AB4AAAABAAAAAAA1AB8AAAABAAAAAAA1ACAAAAAAAAAAAAA2AAEAAAAAAAAAAAA2AAIAAAABAAAAAAA2AAMAAAABAAAAAAA2AAQAAAABAAAAAAA2AAUAAAABAAAAAAA2AAYAAAABAAAAAAA2AAcAAAABAAAAAAA2AAgAAAABAAAAAAA2AAkAAAABAAAAAAA2AAoAAAABAAAAAAA2AAsAAAAAAAAAAAA2AAwAAAAAAAAAAAA2AA0AAAABAAAAAAA2AA4AAAABAAAAAAA2AA8AAAABAAAAAAA2ABAAAAABAAAAAAA2ABEAAAABAAAAAAA2ABIAAAABAAAAAAA2ABMAAAABAAAAAAA2ABQAAAAAAAAAAAA2ABUAAAAAAAAAAAA2ABYAAAABAAAAAAA2ABcAAAABAAAAAAA2ABgAAAABAAAAAAA2ABkAAAABAAAAAAA2ABoAAAABAAAAAAA2ABsAAAABAAAAAAA2ABwAAAABAAAAAAA2AB0AAAABAAAAAAA2AB4AAAABAAAAAAA2AB8AAAABAAAAAAA2ACAAAAAAAAAAAAA3AAEAAAAAAAAAAAA3AAIAAAABAAAAAAA3AAMAAAABAAAAAAA3AAQAAAABAAAAAAA3AAUAAAABAAAAAAA3AAYAAAABAAAAAAA3AAcAAAABAAAAAAA3AAgAAAABAAAAAAA3AAkAAAABAAAAAAA3AAoAAAABAAAAAAA3AAsAAAAAAAAAAAA3AAwAAAAAAAAAAAA3AA0AAAABAAAAAAA3AA4AAAABAAAAAAA3AA8AAAABAAAAAAA3ABAAAAABAAAAAAA3ABEAAAABAAAAAAA3ABIAAAABAAAAAAA3ABMAAAABAAAAAAA3ABQAAAAAAAAAAAA3ABUAAAAAAAAAAAA3ABYAAAABAAAAAAA3ABcAAAABAAAAAAA3ABgAAAABAAAAAAA3ABkAAAABAAAAAAA3ABoAAAABAAAAAAA3ABsAAAABAAAAAAA3ABwAAAABAAAAAAA3AB0AAAABAAAAAAA3AB4AAAABAAAAAAA3AB8AAAABAAAAAAA3ACAAAAAAAAAAAAA4AAEAAAAAAAAAAAA4AAIAAAABAAAAAAA4AAMAAAABAAAAAAA4AAQAAAABAAAAAAA4AAUAAAABAAAAAAA4AAYAAAABAAAAAAA4AAcAAAABAAAAAAA4AAgAAAABAAAAAAA4AAkAAAABAAAAAAA4AAoAAAABAAAAAAA4AAsAAAAAAAAAAAA4AAwAAAAAAAAAAAA4AA0AAAABAAAAAAA4AA4AAAABAAAAAAA4AA8AAAABAAAAAAA4ABAAAAABAAAAAAA4ABEAAAABAAAAAAA4ABIAAAABAAAAAAA4ABMAAAABAAAAAAA4ABQAAAAAAAAAAAA4ABUAAAAAAAAAAAA4ABYAAAABAAAAAAA4ABcAAAABAAAAAAA4ABgAAAABAAAAAAA4ABkAAAABAAAAAAA4ABoAAAABAAAAAAA4ABsAAAABAAAAAAA4ABwAAAABAAAAAAA4AB0AAAABAAAAAAA4AB4AAAABAAAAAAA4AB8AAAABAAAAAAA4ACAAAAAAAAAAAAA5AAEAAAAAAAAAAAA5AAIAAAABAAAAAAA5AAMAAAABAAAAAAA5AAQAAAABAAAAAAA5AAUAAAABAAAAAAA5AAYAAAABAAAAAAA5AAcAAAABAAAAAAA5AAgAAAABAAAAAAA5AAkAAAABAAAAAAA5AAoAAAABAAAAAAA5AAsAAAAAAAAAAAA5AAwAAAAAAAAAAAA5AA0AAAABAAAAAAA5AA4AAAABAAAAAAA5AA8AAAABAAAAAAA5ABAAAAABAAAAAAA5ABEAAAABAAAAAAA5ABIAAAABAAAAAAA5ABMAAAABAAAAAAA5ABQAAAAAAAAAAAA5ABUAAAAAAAAAAAA5ABYAAAABAAAAAAA5ABcAAAABAAAAAAA5ABgAAAABAAAAAAA5ABkAAAABAAAAAAA5ABoAAAABAAAAAAA5ABsAAAABAAAAAAA5ABwAAAABAAAAAAA5AB0AAAABAAAAAAA5AB4AAAABAAAAAAA5AB8AAAABAAAAAAA5ACAAAAAAAAAAAAA6AAEAAAAAAAAAAAA6AAIAAAAAAAAAAAA6AAMAAAAAAAAAAAA6AAQAAAAAAAAAAAA6AAUAAAAAAAAAAAA6AAYAAAAAAAAAAAA6AAcAAAAAAAAAAAA6AAgAAAAAAAAAAAA6AAkAAAAAAAAAAAA6AAoAAAAAAAAAAAA6AAsAAAAAAAAAAAA6AAwAAAAAAAAAAAA6AA0AAAAAAAAAAAA6AA4AAAAAAAAAAAA6AA8AAAAAAAAAAAA6ABAAAAAAAAAAAAA6ABEAAAAAAAAAAAA6ABIAAAAAAAAAAAA6ABMAAAAAAAAAAAA6ABQAAAAAAAAAAAA6ABUAAAAAAAAAAAA6ABYAAAAAAAAAAAA6ABcAAAAAAAAAAAA6ABgAAAAAAAAAAAA6ABkAAAAAAAAAAAA6ABoAAAAAAAAAAAA6ABsAAAAAAAAAAAA6ABwAAAAAAAAAAAA6AB0AAAAAAAAAAAA6AB4AAAAAAAAAAAA6AB8AAAAAAAAAAAA6ACAAAAAAAAAAAAANAAgAAAAAAAAAAAAIAA0AAAABAAAAAAAJAAwAAAABAAAAAAAJAAsAAAABAAAAAAAJAAoAAAABAAAAAAAKAAkAAAABAAAAAAAKAAgAAAABAAAAAAAKAAcAAAABAAAAAAALAAcAAAABAAAAAAALAAYAAAABAAAAAAAHAA4AAAABAAAAAAA7ACAAAAAAAAAAAAA6ACEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB0AAAAAAAAAAAAAABwAAAAAAAAAAAAAABsAAAAAAAAAAAAAABoAAAAAAAAAAAAAABkAAAAAAAAAAAAAABgAAAAAAAAAAAAAABcAAAAAAAAAAAAAABYAAAAAAAAAAAAAABUAAAAAAAAAAAAAABQAAAAAAAAAAAAAABMAAAAAAAAAAAAAABIAAAAAAAAA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")tile_set = SubResource("TileSet_gunhg")rendering_quadrant_size = 32script = ExtResource("3_ykcs8")[node name="path" type="TileMapLayer" parent="."]use_parent_material = truetile_set = SubResource("TileSet_l176x")rendering_quadrant_size = 32[node name="start" type="Area2D" parent="."]position = Vector2(231, 243)script = ExtResource("4_k1u0s")metadata/_edit_group_ = true[node name="icon" type="Sprite2D" parent="start"]texture = ExtResource("4_yakwo")[node name="collision" type="CollisionShape2D" parent="start"]shape = SubResource("RectangleShape2D_r8hg7")[node name="goal" type="Area2D" parent="."]position = Vector2(1724, 532)script = ExtResource("4_k1u0s")metadata/_edit_group_ = true[node name="icon" type="Sprite2D" parent="goal"]texture = ExtResource("5_gft71")[node name="collision" type="CollisionShape2D" parent="goal"]shape = SubResource("RectangleShape2D_r8hg7")[node name="ui" type="CanvasLayer" parent="."]script = ExtResource("8_xa30u")[node name="controls_container" type="MarginContainer" parent="ui"]anchors_preset = 10anchor_right = 1.0offset_bottom = 42.0grow_horizontal = 2mouse_filter = 0theme = ExtResource("9_8s141")[node name="controls" type="HBoxContainer" parent="ui/controls_container"]layout_mode = 2size_flags_horizontal = 4size_flags_vertical = 0mouse_filter = 0alignment = 1[node name="instructions" type="Label" parent="ui/controls_container/controls"]layout_mode = 2text = "LMB to place wall, RMB to erase"[node name="heuristic" type="HBoxContainer" parent="ui/controls_container/controls"]layout_mode = 2theme_override_constants/separation = 10[node name="label" type="Label" parent="ui/controls_container/controls/heuristic"]layout_mode = 2size_flags_vertical = 1text = "Heuristic:"horizontal_alignment = 1vertical_alignment = 1[node name="options" type="OptionButton" parent="ui/controls_container/controls/heuristic"]layout_mode = 2selected = 0item_count = 4popup/item_0/text = "Euclidean"popup/item_0/id = 0popup/item_1/text = "Manhattan"popup/item_1/id = 1popup/item_2/text = "Octile"popup/item_2/id = 2popup/item_3/text = "Chebyshev"popup/item_3/id = 3[node name="diagonal" type="HBoxContainer" parent="ui/controls_container/controls"]layout_mode = 2theme_override_constants/separation = 10[node name="label" type="Label" parent="ui/controls_container/controls/diagonal"]layout_mode = 2size_flags_vertical = 1text = "Diagonal Mode:"horizontal_alignment = 1vertical_alignment = 1[node name="options" type="OptionButton" parent="ui/controls_container/controls/diagonal"]layout_mode = 2selected = 0item_count = 4popup/item_0/text = "Always"popup/item_0/id = 0popup/item_1/text = "Never"popup/item_1/id = 1popup/item_2/text = "At least one walkable"popup/item_2/id = 2popup/item_3/text = "Only if no obstacles"popup/item_3/id = 3[node name="jump" type="CheckButton" parent="ui/controls_container/controls"]layout_mode = 2text = "Jump"[connection signal="layout_updated" from="game_map" to="." method="_on_layout_updated"][connection signal="position_updated" from="start" to="." method="_on_marker_positions_updated"][connection signal="position_updated" from="goal" to="." method="_on_marker_positions_updated"][connection signal="item_selected" from="ui/controls_container/controls/heuristic/options" to="ui" method="_on_options_changed" unbinds=1][connection signal="item_selected" from="ui/controls_container/controls/diagonal/options" to="ui" method="_on_options_changed" unbinds=1][connection signal="toggled" from="ui/controls_container/controls/jump" to="ui" method="_on_options_changed" unbinds=1]
xxxxxxxxxx[gd_resource type="Theme" load_steps=2 format=3 uid="uid://lwqeu1efvt2g"][sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jocnp"]bg_color = Color(0, 0, 0, 0.501961)draw_center = false[resource]default_font_size = 24HBoxContainer/constants/separation = 100MarginContainer/constants/margin_bottom = 8MarginContainer/constants/margin_left = 88MarginContainer/constants/margin_right = 0MarginContainer/constants/margin_top = 8PanelContainer/styles/panel = SubResource("StyleBoxFlat_jocnp")
xxxxxxxxxxextends CanvasLayersignal options_updated(heuristic, diagonal, jump)@onready var heuristic = $controls_container/controls/heuristic/options@onready var diagonal = $controls_container/controls/diagonal/options@onready var jump = $controls_container/controls/jumpfunc _on_options_changed() -> void:emit_signal('options_updated', heuristic.selected, diagonal.selected, jump.button_pressed)
xxxxxxxxxxuid://cvan140ai0hk
xxxxxxxxxxError reading src\markers\goal.png: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
xxxxxxxxxxError reading src\markers\green.png: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
xxxxxxxxxxextends Area2Dsignal position_updatedvar is_dragging := falsevar is_mouse_over := false# Called when the node enters the scene tree for the first time.func _ready() -> void:connect('mouse_entered', _on_mouse_entered)connect('mouse_exited', _on_mouse_exited)func _unhandled_input(event: InputEvent) -> void:if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_MASK_LEFT:is_dragging = event.pressed and is_mouse_overif is_dragging:get_viewport().set_input_as_handled()returnif event is InputEventMouseMotion and is_dragging:global_position = get_global_mouse_position()emit_signal('position_updated')func _on_mouse_entered() -> void:is_mouse_over = truefunc _on_mouse_exited() -> void:is_mouse_over = false
xxxxxxxxxxuid://bbfru21u0j3ix
xxxxxxxxxxextends TileMapLayersignal layout_updatedvar is_placing_wall := falsevar is_dragging := falsevar last_mouse_cell: Vector2ifunc _unhandled_input(event: InputEvent) -> void:if event is InputEventMouseButton:# LMB to place walls, RMB to removeis_placing_wall = event.button_index == MOUSE_BUTTON_MASK_LEFTis_dragging = event.pressedif is_dragging:last_mouse_cell = local_to_map(get_local_mouse_position())set_cell_to_drag_value(last_mouse_cell)layout_updated.emit()returnif event is InputEventMouseMotion and is_dragging:var current_cell = local_to_map(get_local_mouse_position())var line = get_line(last_mouse_cell, current_cell)for point in line:set_cell_to_drag_value(point)if line.size() > 0:layout_updated.emit()last_mouse_cell = current_cellfunc set_cell_to_drag_value(cell: Vector2i) -> void:var value = 0if !is_placing_wall:value = 1set_cell(cell, 0, Vector2i(value, 0))func get_line(start: Vector2i, end: Vector2i) -> Array:var points = []var delta = end - startvar n = max(abs(delta.x), abs(delta.y))for step in range(n):var t = step / nvar lerp_point = Vector2(start).lerp(Vector2(end), t)var rounded_point = lerp_point.floor()points.append(rounded_point)points.append(end)return points
xxxxxxxxxxuid://bdb5itbs6ksuk
xxxxxxxxxxError reading src\tilemap\path.png: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
Error reading src\tilemap\tileset.png: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte